@contember/engine-s3-plugin 1.2.1 → 1.3.0-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/Config.d.ts +2 -3
- package/dist/src/Config.d.ts.map +1 -1
- package/dist/src/Config.js.map +1 -1
- package/dist/src/S3ConfigProcessor.d.ts +2 -2
- package/dist/src/S3ConfigProcessor.d.ts.map +1 -1
- package/dist/src/S3ConfigProcessor.js.map +1 -1
- package/dist/src/S3ObjectAuthorizator.d.ts +22 -0
- package/dist/src/S3ObjectAuthorizator.d.ts.map +1 -0
- package/dist/src/S3ObjectAuthorizator.js +48 -0
- package/dist/src/S3ObjectAuthorizator.js.map +1 -0
- package/dist/src/S3SchemaContributor.d.ts +11 -5
- package/dist/src/S3SchemaContributor.d.ts.map +1 -1
- package/dist/src/S3SchemaContributor.js +61 -85
- package/dist/src/S3SchemaContributor.js.map +1 -1
- package/dist/src/S3SchemaTypes.d.ts +21 -0
- package/dist/src/S3SchemaTypes.d.ts.map +1 -0
- package/dist/src/S3SchemaTypes.js +65 -0
- package/dist/src/S3SchemaTypes.js.map +1 -0
- package/dist/src/S3Service.d.ts +10 -10
- package/dist/src/S3Service.d.ts.map +1 -1
- package/dist/src/S3Service.js +40 -37
- package/dist/src/S3Service.js.map +1 -1
- package/dist/src/S3Signer.d.ts +1 -1
- package/dist/src/S3Signer.d.ts.map +1 -1
- package/dist/src/S3Signer.js +1 -1
- package/dist/src/S3Signer.js.map +1 -1
- package/dist/src/index.d.ts +6 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +7 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/tsconfig.tsbuildinfo +1 -1
- package/dist/tests/cases/authorizator.test.d.ts +2 -0
- package/dist/tests/cases/authorizator.test.d.ts.map +1 -0
- package/dist/tests/cases/authorizator.test.js +21 -0
- package/dist/tests/cases/authorizator.test.js.map +1 -0
- package/dist/tests/cases/signRequest.test.js +14 -5
- package/dist/tests/cases/signRequest.test.js.map +1 -1
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/src/Config.ts +1 -2
- package/src/S3ConfigProcessor.ts +2 -2
- package/src/S3ObjectAuthorizator.ts +63 -0
- package/src/S3SchemaContributor.ts +51 -109
- package/src/S3SchemaTypes.ts +89 -0
- package/src/S3Service.ts +51 -43
- package/src/S3Signer.ts +2 -2
- package/src/index.ts +9 -7
- package/src/tsconfig.json +3 -9
- package/tests/cases/authorizator.test.ts +22 -0
- package/tests/cases/signRequest.test.ts +18 -18
- package/tests/tsconfig.json +1 -3
- package/tsconfig.json +2 -6
- package/dist/src/ObjectKeyVerifier.d.ts +0 -3
- package/dist/src/ObjectKeyVerifier.d.ts.map +0 -1
- package/dist/src/ObjectKeyVerifier.js +0 -18
- package/dist/src/ObjectKeyVerifier.js.map +0 -1
- package/src/ObjectKeyVerifier.ts +0 -14
- package/types/sign3/index.d.ts +0 -8
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { test, assert } from 'vitest'
|
|
2
|
+
import { S3ObjectAuthorizator } from '../../src'
|
|
3
|
+
|
|
4
|
+
test('required read pattern', () => {
|
|
5
|
+
const authorizator = new S3ObjectAuthorizator([], [{ pattern: 'foo/**' }])
|
|
6
|
+
assert.doesNotThrow(() => authorizator.verifyReadAccess({ key: 'foo/lorem.jpg' }))
|
|
7
|
+
assert.throw(() => authorizator.verifyReadAccess({ key: 'lorem.jpg' }), 'Read access forbidden for object key lorem.jpg')
|
|
8
|
+
})
|
|
9
|
+
|
|
10
|
+
test('required upload pattern', () => {
|
|
11
|
+
const authorizator = new S3ObjectAuthorizator([{ pattern: 'foo/**' }], [])
|
|
12
|
+
assert.doesNotThrow(() => authorizator.verifyUploadAccess({ key: 'foo/lorem.jpg', size: null }))
|
|
13
|
+
assert.throw(() => authorizator.verifyUploadAccess({ key: 'lorem.jpg', size: null }), 'Upload access forbidden for object key lorem.jpg')
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
test('max upload size', () => {
|
|
18
|
+
const authorizator = new S3ObjectAuthorizator([{ pattern: '**', maxSize: 1024 }], [])
|
|
19
|
+
assert.doesNotThrow(() => authorizator.verifyUploadAccess({ key: 'lorem.jpg', size: 1000 }))
|
|
20
|
+
assert.throw(() => authorizator.verifyUploadAccess({ key: 'lorem.jpg', size: null }), 'File size must be provided')
|
|
21
|
+
assert.throw(() => authorizator.verifyUploadAccess({ key: 'lorem.jpg', size: 2048 }), 'Uploaded file is too large')
|
|
22
|
+
})
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { test, assert } from 'vitest'
|
|
2
|
-
import {
|
|
1
|
+
import { test, assert, expect } from 'vitest'
|
|
2
|
+
import { S3ObjectAuthorizator, S3Service } from '../../src'
|
|
3
3
|
|
|
4
4
|
const mocked = new Date('2021-07-02 17:22')
|
|
5
5
|
const constantUuid = '9fce3907-ff2b-45bb-b4ce-eff5527dd315'
|
|
@@ -17,38 +17,38 @@ const createS3Service = (bucket: string, prefix = '') => new S3Service(
|
|
|
17
17
|
uuid: () => constantUuid,
|
|
18
18
|
now: () => mocked,
|
|
19
19
|
},
|
|
20
|
+
new S3ObjectAuthorizator([{ pattern: '**' }], [{ pattern: '**' }]),
|
|
20
21
|
)
|
|
21
22
|
|
|
22
23
|
|
|
23
24
|
test('sign s3 request', () => {
|
|
24
25
|
const service = createS3Service('test')
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
'https://test.s3.eu-central-1.amazonaws.com/foo.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=test%2F20210702%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210702T172200Z&X-Amz-Expires=3600&X-Amz-Signature=00e912fe0383066802fc6c0f93ffb223320ca143992385fe69070bbb87c758dc&X-Amz-SignedHeaders=host',
|
|
28
|
-
)
|
|
26
|
+
const signed = service.getSignedReadUrl({ objectKey: 'foo.jpg', expiration: null })
|
|
27
|
+
expect(signed.url).toMatchInlineSnapshot('"https://test.s3.eu-central-1.amazonaws.com/foo.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=test%2F20210702%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210702T172200Z&X-Amz-Expires=3600&X-Amz-Signature=00e912fe0383066802fc6c0f93ffb223320ca143992385fe69070bbb87c758dc&X-Amz-SignedHeaders=host"')
|
|
29
28
|
})
|
|
30
29
|
|
|
31
30
|
test('sign s3 request - prefix', () => {
|
|
32
31
|
const service = createS3Service('test', 'lorem')
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
'https://test.s3.eu-central-1.amazonaws.com/lorem/foo.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=test%2F20210702%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210702T172200Z&X-Amz-Expires=3600&X-Amz-Signature=f6c69dc306422c2b3242c9d9d42147336817720ffae249af8bd91cc7062e9f6d&X-Amz-SignedHeaders=host',
|
|
36
|
-
)
|
|
32
|
+
const signed = service.getSignedReadUrl({ objectKey: 'lorem/foo.jpg', expiration: null })
|
|
33
|
+
expect(signed.url).toMatchInlineSnapshot('"https://test.s3.eu-central-1.amazonaws.com/lorem/foo.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=test%2F20210702%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210702T172200Z&X-Amz-Expires=3600&X-Amz-Signature=f6c69dc306422c2b3242c9d9d42147336817720ffae249af8bd91cc7062e9f6d&X-Amz-SignedHeaders=host"')
|
|
37
34
|
})
|
|
38
35
|
|
|
39
36
|
test('sign upload', () => {
|
|
40
37
|
const service = createS3Service('test')
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
`https://test.s3.eu-central-1.amazonaws.com/${constantUuid}.bin?Cache-Control=immutable&Content-Type=foo.jpg&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=test%2F20210702%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210702T172200Z&X-Amz-Expires=1800&X-Amz-Signature=d33b2d6574fca41d7f707fd3d4695712380f78a0e9e0b0ace3fc12d7a4606bc2&X-Amz-SignedHeaders=cache-control%3Bhost%3Bx-amz-acl&x-amz-acl=public-read`,
|
|
44
|
-
)
|
|
38
|
+
const signed = service.getSignedUploadUrl({ contentType: 'image/jpeg', acl: 'PUBLIC_READ', expiration: 1800, contentDisposition: null, extension: null, fileName: null, prefix: null, suffix: null, size: null })
|
|
39
|
+
expect(signed.url).toMatchInlineSnapshot('"https://test.s3.eu-central-1.amazonaws.com/9fce3907-ff2b-45bb-b4ce-eff5527dd315.jpeg?Cache-Control=immutable&Content-Type=image%2Fjpeg&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=test%2F20210702%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210702T172200Z&X-Amz-Expires=1800&X-Amz-Signature=fcd00b967054c19a2ee64b59e31d61e032ea086dcf2f0d8c36a883971c469c99&X-Amz-SignedHeaders=cache-control%3Bhost%3Bx-amz-acl&x-amz-acl=public-read"')
|
|
45
40
|
})
|
|
46
41
|
|
|
42
|
+
test('sign upload #2', () => {
|
|
43
|
+
const service = createS3Service('test')
|
|
44
|
+
const signed = service.getSignedUploadUrl({ contentType: 'image/jpeg', acl: 'PUBLIC_READ', expiration: 1800, contentDisposition: 'INLINE', extension: 'jpeg', fileName: 'foo-bar.jpeg', prefix: 'foo', suffix: 'bar', size: null })
|
|
45
|
+
expect(signed.url).toMatchInlineSnapshot('"https://test.s3.eu-central-1.amazonaws.com/foo/9fce3907-ff2b-45bb-b4ce-eff5527dd315bar.jpeg?Cache-Control=immutable&Content-Type=image%2Fjpeg&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=test%2F20210702%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210702T172200Z&X-Amz-Expires=1800&X-Amz-Signature=979a93bca65a98ce6b2bf97d2bf2afe7d5f2fa805f7d596187675416c86a3bd5&X-Amz-SignedHeaders=cache-control%3Bcontent-disposition%3Bhost%3Bx-amz-acl&x-amz-acl=public-read"')
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
|
|
47
49
|
test('bucket with dot', () => {
|
|
48
50
|
const service = createS3Service('test.foo')
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
'https://s3.eu-central-1.amazonaws.com/test.foo/foo.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=test%2F20210702%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210702T172200Z&X-Amz-Expires=3600&X-Amz-Signature=811a809196e60413e0e54e51d3dd91ab73ad1482b61e5371864d25d43ba642ff&X-Amz-SignedHeaders=host',
|
|
52
|
-
)
|
|
51
|
+
const signed = service.getSignedReadUrl({ objectKey: 'foo.jpg', expiration: null })
|
|
52
|
+
expect(signed.url).toMatchInlineSnapshot('"https://s3.eu-central-1.amazonaws.com/test.foo/foo.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=test%2F20210702%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210702T172200Z&X-Amz-Expires=3600&X-Amz-Signature=811a809196e60413e0e54e51d3dd91ab73ad1482b61e5371864d25d43ba642ff&X-Amz-SignedHeaders=host"')
|
|
53
53
|
})
|
|
54
54
|
|
package/tests/tsconfig.json
CHANGED
package/tsconfig.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ObjectKeyVerifier.d.ts","sourceRoot":"","sources":["../../src/ObjectKeyVerifier.ts"],"names":[],"mappings":"AAGA,oBAAY,iBAAiB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;AAErD,eAAO,MAAM,uBAAuB,aAAc,MAAM,EAAE,KAAG,iBAQ5D,CAAA"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.createObjectKeyVerifier = void 0;
|
|
7
|
-
const picomatch_1 = __importDefault(require("picomatch"));
|
|
8
|
-
const graphql_utils_1 = require("@contember/graphql-utils");
|
|
9
|
-
const createObjectKeyVerifier = (patterns) => {
|
|
10
|
-
const matchers = patterns.map(it => (0, picomatch_1.default)(it));
|
|
11
|
-
return key => {
|
|
12
|
-
if (!matchers.find(it => it(key))) {
|
|
13
|
-
throw new graphql_utils_1.ForbiddenError(`You are not allowed to use object key ${key}`);
|
|
14
|
-
}
|
|
15
|
-
};
|
|
16
|
-
};
|
|
17
|
-
exports.createObjectKeyVerifier = createObjectKeyVerifier;
|
|
18
|
-
//# sourceMappingURL=ObjectKeyVerifier.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ObjectKeyVerifier.js","sourceRoot":"","sources":["../../src/ObjectKeyVerifier.ts"],"names":[],"mappings":";;;;;;AAAA,0DAAuC;AACvC,4DAAyD;AAIlD,MAAM,uBAAuB,GAAG,CAAC,QAAkB,EAAqB,EAAE;IAChF,MAAM,QAAQ,GAAc,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAA,mBAAE,EAAC,EAAE,CAAC,CAAC,CAAA;IAEtD,OAAO,GAAG,CAAC,EAAE;QACZ,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE;YAClC,MAAM,IAAI,8BAAc,CAAC,yCAAyC,GAAG,EAAE,CAAC,CAAA;SACxE;IACF,CAAC,CAAA;AACF,CAAC,CAAA;AARY,QAAA,uBAAuB,2BAQnC"}
|
package/src/ObjectKeyVerifier.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import pm, { Matcher } from 'picomatch'
|
|
2
|
-
import { ForbiddenError } from '@contember/graphql-utils'
|
|
3
|
-
|
|
4
|
-
export type ObjectKeyVerifier = (key: string) => void
|
|
5
|
-
|
|
6
|
-
export const createObjectKeyVerifier = (patterns: string[]): ObjectKeyVerifier => {
|
|
7
|
-
const matchers: Matcher[] = patterns.map(it => pm(it))
|
|
8
|
-
|
|
9
|
-
return key => {
|
|
10
|
-
if (!matchers.find(it => it(key))) {
|
|
11
|
-
throw new ForbiddenError(`You are not allowed to use object key ${key}`)
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
}
|
package/types/sign3/index.d.ts
DELETED