@beignet/core 0.0.32 → 0.0.34
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/CHANGELOG.md +42 -0
- package/README.md +409 -34
- package/dist/application/index.d.ts.map +1 -1
- package/dist/application/index.js +63 -47
- package/dist/application/index.js.map +1 -1
- package/dist/contracts/contract-builder.d.ts +0 -4
- package/dist/contracts/contract-builder.d.ts.map +1 -1
- package/dist/contracts/contract-builder.js +0 -6
- package/dist/contracts/contract-builder.js.map +1 -1
- package/dist/events/index.d.ts +6 -0
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +20 -10
- package/dist/events/index.js.map +1 -1
- package/dist/flags/index.d.ts +0 -4
- package/dist/flags/index.d.ts.map +1 -1
- package/dist/flags/index.js +0 -4
- package/dist/flags/index.js.map +1 -1
- package/dist/jobs/index.d.ts +415 -4
- package/dist/jobs/index.d.ts.map +1 -1
- package/dist/jobs/index.js +392 -3
- package/dist/jobs/index.js.map +1 -1
- package/dist/notifications/index.d.ts +194 -10
- package/dist/notifications/index.d.ts.map +1 -1
- package/dist/notifications/index.js +397 -59
- package/dist/notifications/index.js.map +1 -1
- package/dist/outbox/index.d.ts +150 -1
- package/dist/outbox/index.d.ts.map +1 -1
- package/dist/outbox/index.js +170 -1
- package/dist/outbox/index.js.map +1 -1
- package/dist/ports/events.d.ts +2 -2
- package/dist/ports/index.d.ts +7 -2
- package/dist/ports/index.d.ts.map +1 -1
- package/dist/ports/index.js +2 -1
- package/dist/ports/index.js.map +1 -1
- package/dist/providers/instrumentation.d.ts +4 -0
- package/dist/providers/instrumentation.d.ts.map +1 -1
- package/dist/providers/instrumentation.js.map +1 -1
- package/dist/providers/provider.d.ts +1 -1
- package/dist/schedules/index.d.ts +8 -7
- package/dist/schedules/index.d.ts.map +1 -1
- package/dist/schedules/index.js +47 -16
- package/dist/schedules/index.js.map +1 -1
- package/dist/server/hooks/index.d.ts +1 -0
- package/dist/server/hooks/index.d.ts.map +1 -1
- package/dist/server/hooks/index.js +1 -0
- package/dist/server/hooks/index.js.map +1 -1
- package/dist/server/hooks/rate-limit.d.ts +26 -13
- package/dist/server/hooks/rate-limit.d.ts.map +1 -1
- package/dist/server/hooks/rate-limit.js +28 -34
- package/dist/server/hooks/rate-limit.js.map +1 -1
- package/dist/server/hooks/security.d.ts +179 -0
- package/dist/server/hooks/security.d.ts.map +1 -0
- package/dist/server/hooks/security.js +225 -0
- package/dist/server/hooks/security.js.map +1 -0
- package/dist/server/index.d.ts +8 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +8 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/instrumentation.d.ts.map +1 -1
- package/dist/server/instrumentation.js +22 -6
- package/dist/server/instrumentation.js.map +1 -1
- package/dist/server/request-context.d.ts +4 -0
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/request-context.js +3 -0
- package/dist/server/request-context.js.map +1 -1
- package/dist/server/runtime-integrity.d.ts +84 -0
- package/dist/server/runtime-integrity.d.ts.map +1 -0
- package/dist/server/runtime-integrity.js +160 -0
- package/dist/server/runtime-integrity.js.map +1 -0
- package/dist/server/server.d.ts +10 -10
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +75 -11
- package/dist/server/server.js.map +1 -1
- package/dist/server/trusted-proxy.d.ts +77 -0
- package/dist/server/trusted-proxy.d.ts.map +1 -0
- package/dist/server/trusted-proxy.js +129 -0
- package/dist/server/trusted-proxy.js.map +1 -0
- package/dist/tasks/index.d.ts +6 -7
- package/dist/tasks/index.d.ts.map +1 -1
- package/dist/tasks/index.js +22 -5
- package/dist/tasks/index.js.map +1 -1
- package/dist/tenancy/index.d.ts +41 -0
- package/dist/tenancy/index.d.ts.map +1 -0
- package/dist/tenancy/index.js +34 -0
- package/dist/tenancy/index.js.map +1 -0
- package/dist/testing/index.d.ts +1 -1
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +1 -0
- package/dist/testing/index.js.map +1 -1
- package/dist/tracing/execution.d.ts +14 -0
- package/dist/tracing/execution.d.ts.map +1 -0
- package/dist/tracing/execution.js +17 -0
- package/dist/tracing/execution.js.map +1 -0
- package/dist/tracing/index.d.ts +49 -0
- package/dist/tracing/index.d.ts.map +1 -1
- package/dist/tracing/index.js +59 -0
- package/dist/tracing/index.js.map +1 -1
- package/dist/uploads/client.d.ts.map +1 -1
- package/dist/uploads/client.js +44 -6
- package/dist/uploads/client.js.map +1 -1
- package/dist/uploads/index.d.ts +71 -0
- package/dist/uploads/index.d.ts.map +1 -1
- package/dist/uploads/index.js +344 -15
- package/dist/uploads/index.js.map +1 -1
- package/dist/webhooks/index.d.ts +55 -4
- package/dist/webhooks/index.d.ts.map +1 -1
- package/dist/webhooks/index.js +106 -2
- package/dist/webhooks/index.js.map +1 -1
- package/package.json +5 -5
- package/skills/app-architecture/SKILL.md +31 -2
- package/src/application/index.ts +88 -56
- package/src/contracts/contract-builder.ts +0 -7
- package/src/events/index.ts +27 -14
- package/src/flags/index.ts +0 -5
- package/src/jobs/index.ts +895 -7
- package/src/notifications/index.ts +678 -70
- package/src/outbox/index.ts +358 -2
- package/src/ports/events.ts +2 -2
- package/src/ports/index.ts +17 -1
- package/src/providers/instrumentation.ts +4 -0
- package/src/providers/provider.ts +1 -1
- package/src/schedules/index.ts +60 -26
- package/src/server/hooks/index.ts +10 -0
- package/src/server/hooks/rate-limit.ts +52 -46
- package/src/server/hooks/security.ts +503 -0
- package/src/server/index.ts +8 -0
- package/src/server/instrumentation.ts +25 -5
- package/src/server/request-context.ts +7 -0
- package/src/server/runtime-integrity.ts +322 -0
- package/src/server/server.ts +88 -35
- package/src/server/trusted-proxy.ts +249 -0
- package/src/tasks/index.ts +29 -12
- package/src/tenancy/index.ts +55 -0
- package/src/testing/index.ts +2 -0
- package/src/tracing/execution.ts +37 -0
- package/src/tracing/index.ts +137 -0
- package/src/uploads/client.ts +65 -6
- package/src/uploads/index.ts +539 -14
- package/src/webhooks/index.ts +238 -9
package/dist/uploads/index.d.ts
CHANGED
|
@@ -29,6 +29,43 @@ export interface UploadFileIntent {
|
|
|
29
29
|
* File size in bytes.
|
|
30
30
|
*/
|
|
31
31
|
size: number;
|
|
32
|
+
/**
|
|
33
|
+
* Optional expected checksum for this file. Direct uploads use this to
|
|
34
|
+
* verify the object bytes during completion.
|
|
35
|
+
*/
|
|
36
|
+
checksum?: UploadFileChecksum;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Checksum algorithms supported by Beignet upload verification.
|
|
40
|
+
*/
|
|
41
|
+
export type UploadChecksumAlgorithm = "sha256";
|
|
42
|
+
/**
|
|
43
|
+
* Expected or computed file checksum.
|
|
44
|
+
*/
|
|
45
|
+
export interface UploadFileChecksum {
|
|
46
|
+
/**
|
|
47
|
+
* Hash algorithm used for the checksum.
|
|
48
|
+
*/
|
|
49
|
+
algorithm: UploadChecksumAlgorithm;
|
|
50
|
+
/**
|
|
51
|
+
* Lowercase hex digest.
|
|
52
|
+
*/
|
|
53
|
+
value: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Checksum verification requested by an upload definition.
|
|
57
|
+
*/
|
|
58
|
+
export interface UploadChecksumRequirement {
|
|
59
|
+
/**
|
|
60
|
+
* Hash algorithm to compute.
|
|
61
|
+
*/
|
|
62
|
+
algorithm: UploadChecksumAlgorithm;
|
|
63
|
+
/**
|
|
64
|
+
* Whether direct upload preparation/completion must include a checksum.
|
|
65
|
+
*
|
|
66
|
+
* @default true
|
|
67
|
+
*/
|
|
68
|
+
required?: boolean;
|
|
32
69
|
}
|
|
33
70
|
/**
|
|
34
71
|
* Constraints for files accepted by an upload definition.
|
|
@@ -58,6 +95,18 @@ export interface UploadFileConstraints {
|
|
|
58
95
|
* Cache-Control value written to storage.
|
|
59
96
|
*/
|
|
60
97
|
cacheControl?: string;
|
|
98
|
+
/**
|
|
99
|
+
* Verify supported MIME types against file signatures instead of trusting
|
|
100
|
+
* only the client-declared content type.
|
|
101
|
+
*
|
|
102
|
+
* @default "signature"
|
|
103
|
+
*/
|
|
104
|
+
contentTypeVerification?: "signature" | false;
|
|
105
|
+
/**
|
|
106
|
+
* Request checksum verification for direct uploads and expose the requirement
|
|
107
|
+
* through the upload manifest so browser clients can send expected digests.
|
|
108
|
+
*/
|
|
109
|
+
checksum?: UploadChecksumRequirement;
|
|
61
110
|
}
|
|
62
111
|
/**
|
|
63
112
|
* Parsed file intent with a generated upload id and storage key.
|
|
@@ -190,6 +239,22 @@ export interface UploadFileHookArgs<Metadata, Ctx> extends UploadHookArgs<Metada
|
|
|
190
239
|
export interface UploadCompleteHookArgs<Metadata, Ctx> extends UploadHookArgs<Metadata, Ctx> {
|
|
191
240
|
files: CompletedUploadFile[];
|
|
192
241
|
}
|
|
242
|
+
/**
|
|
243
|
+
* Arguments passed to `verifyFile(...)` after a file exists in storage and
|
|
244
|
+
* before `onComplete(...)` runs.
|
|
245
|
+
*/
|
|
246
|
+
export interface UploadVerifyFileHookArgs<Metadata, Ctx> extends UploadHookArgs<Metadata, Ctx> {
|
|
247
|
+
file: CompletedUploadFile;
|
|
248
|
+
storage: StoragePort;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Verification result accepted by `verifyFile(...)`.
|
|
252
|
+
*/
|
|
253
|
+
export type UploadFileVerificationResult = boolean | undefined | {
|
|
254
|
+
valid: boolean;
|
|
255
|
+
reason?: string;
|
|
256
|
+
details?: unknown;
|
|
257
|
+
};
|
|
193
258
|
/**
|
|
194
259
|
* Upload definition options.
|
|
195
260
|
*/
|
|
@@ -224,6 +289,11 @@ export interface DefineUploadOptions<MetadataSchema extends StandardSchema, Ctx,
|
|
|
224
289
|
* Add storage metadata for one file.
|
|
225
290
|
*/
|
|
226
291
|
storageMetadata?(args: UploadFileHookArgs<InferSchemaOutput<MetadataSchema>, Ctx>): MaybePromise<StorageMetadata>;
|
|
292
|
+
/**
|
|
293
|
+
* Run after a file exists in storage and before `onComplete(...)`. Use this
|
|
294
|
+
* for app-owned scanning, moderation, or quarantine decisions.
|
|
295
|
+
*/
|
|
296
|
+
verifyFile?(args: UploadVerifyFileHookArgs<InferSchemaOutput<MetadataSchema>, Ctx>): MaybePromise<UploadFileVerificationResult>;
|
|
227
297
|
/**
|
|
228
298
|
* Run after files exist in storage.
|
|
229
299
|
*/
|
|
@@ -242,6 +312,7 @@ export interface UploadDef<Name extends string = string, MetadataSchema extends
|
|
|
242
312
|
authorize?(args: UploadFileHookArgs<InferSchemaOutput<MetadataSchema>, Ctx>): MaybePromise<UploadAuthorizeResult>;
|
|
243
313
|
key(args: UploadFileHookArgs<InferSchemaOutput<MetadataSchema>, Ctx>): MaybePromise<string>;
|
|
244
314
|
storageMetadata?(args: UploadFileHookArgs<InferSchemaOutput<MetadataSchema>, Ctx>): MaybePromise<StorageMetadata>;
|
|
315
|
+
verifyFile?(args: UploadVerifyFileHookArgs<InferSchemaOutput<MetadataSchema>, Ctx>): MaybePromise<UploadFileVerificationResult>;
|
|
245
316
|
onComplete?(args: UploadCompleteHookArgs<InferSchemaOutput<MetadataSchema>, Ctx>): MaybePromise<Result>;
|
|
246
317
|
}
|
|
247
318
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/uploads/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/uploads/index.ts"],"names":[],"mappings":"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"}
|
package/dist/uploads/index.js
CHANGED
|
@@ -122,6 +122,7 @@ export function defineUpload(name, options) {
|
|
|
122
122
|
...(options.storageMetadata
|
|
123
123
|
? { storageMetadata: options.storageMetadata }
|
|
124
124
|
: {}),
|
|
125
|
+
...(options.verifyFile ? { verifyFile: options.verifyFile } : {}),
|
|
125
126
|
...(options.onComplete ? { onComplete: options.onComplete } : {}),
|
|
126
127
|
};
|
|
127
128
|
}
|
|
@@ -243,7 +244,9 @@ export function createUploadRouter(options) {
|
|
|
243
244
|
const parsed = parsePrepareInput(uploadName, input);
|
|
244
245
|
const ctx = await resolveCtx();
|
|
245
246
|
const metadata = await parseMetadata(upload, parsed.metadata);
|
|
246
|
-
assertFiles(upload, parsed.files
|
|
247
|
+
assertFiles(upload, parsed.files, {
|
|
248
|
+
requireChecksum: Boolean(options.signer),
|
|
249
|
+
});
|
|
247
250
|
const files = [];
|
|
248
251
|
for (const file of parsed.files) {
|
|
249
252
|
const uploadId = id();
|
|
@@ -308,7 +311,7 @@ export function createUploadRouter(options) {
|
|
|
308
311
|
const parsed = parseCompleteInput(uploadName, input);
|
|
309
312
|
const ctx = await resolveCtx();
|
|
310
313
|
const metadata = await parseMetadata(upload, parsed.metadata);
|
|
311
|
-
assertFiles(upload, parsed.files);
|
|
314
|
+
assertFiles(upload, parsed.files, { requireChecksum: true });
|
|
312
315
|
const files = [];
|
|
313
316
|
for (const file of parsed.files) {
|
|
314
317
|
await assertAuthorized(upload, {
|
|
@@ -332,14 +335,29 @@ export function createUploadRouter(options) {
|
|
|
332
335
|
},
|
|
333
336
|
});
|
|
334
337
|
}
|
|
335
|
-
const object =
|
|
338
|
+
const object = needsUploadBodyVerification(upload, file)
|
|
339
|
+
? await options.storage.get(file.key)
|
|
340
|
+
: await options.storage.stat(file.key);
|
|
336
341
|
if (!object) {
|
|
337
342
|
throw new UploadObjectNotFoundError({
|
|
338
343
|
message: `Uploaded object "${file.key}" was not found.`,
|
|
339
344
|
});
|
|
340
345
|
}
|
|
341
346
|
assertStoredObject(upload, file, object);
|
|
342
|
-
|
|
347
|
+
const verified = await verifyStoredUploadFile(upload, file, object);
|
|
348
|
+
const completedObject = storageObjectMetadata(object);
|
|
349
|
+
const completedFile = {
|
|
350
|
+
...file,
|
|
351
|
+
...(verified.checksum ? { checksum: verified.checksum } : {}),
|
|
352
|
+
object: completedObject,
|
|
353
|
+
};
|
|
354
|
+
await assertVerifiedFile(upload, {
|
|
355
|
+
ctx,
|
|
356
|
+
metadata,
|
|
357
|
+
file: completedFile,
|
|
358
|
+
storage: options.storage,
|
|
359
|
+
});
|
|
360
|
+
files.push(completedFile);
|
|
343
361
|
}
|
|
344
362
|
const result = await upload.onComplete?.({ ctx, metadata, files });
|
|
345
363
|
instrumentation.custom({
|
|
@@ -376,45 +394,57 @@ export function createUploadRouter(options) {
|
|
|
376
394
|
const metadata = await parseMetadata(definition, metadataFromFormData(input.formData));
|
|
377
395
|
const webFiles = filesFromFormData(input.formData);
|
|
378
396
|
const intents = webFiles.map(fileIntentFromFile);
|
|
379
|
-
assertFiles(definition, intents);
|
|
397
|
+
assertFiles(definition, intents, { requireChecksum: false });
|
|
380
398
|
const completed = [];
|
|
381
399
|
for (const [index, file] of webFiles.entries()) {
|
|
382
400
|
const intent = intents[index];
|
|
383
401
|
if (!intent)
|
|
384
402
|
continue;
|
|
403
|
+
const verified = await verifyBlobUploadFile(definition, intent, file);
|
|
404
|
+
const verifiedIntent = {
|
|
405
|
+
...intent,
|
|
406
|
+
...(verified.checksum ? { checksum: verified.checksum } : {}),
|
|
407
|
+
};
|
|
385
408
|
const uploadId = id();
|
|
386
409
|
await assertAuthorized(definition, {
|
|
387
410
|
ctx,
|
|
388
411
|
metadata,
|
|
389
|
-
file:
|
|
412
|
+
file: verifiedIntent,
|
|
390
413
|
uploadId,
|
|
391
414
|
});
|
|
392
415
|
const key = await definition.key({
|
|
393
416
|
ctx,
|
|
394
417
|
metadata,
|
|
395
|
-
file:
|
|
418
|
+
file: verifiedIntent,
|
|
396
419
|
uploadId,
|
|
397
420
|
});
|
|
398
421
|
const storageMetadata = (await definition.storageMetadata?.({
|
|
399
422
|
ctx,
|
|
400
423
|
metadata,
|
|
401
|
-
file:
|
|
424
|
+
file: verifiedIntent,
|
|
402
425
|
uploadId,
|
|
403
426
|
})) ?? {};
|
|
404
427
|
const object = await options.storage.put(key, file, {
|
|
405
|
-
contentType:
|
|
428
|
+
contentType: verifiedIntent.contentType,
|
|
406
429
|
...(definition.file.cacheControl !== undefined
|
|
407
430
|
? { cacheControl: definition.file.cacheControl }
|
|
408
431
|
: {}),
|
|
409
432
|
metadata: storageMetadata,
|
|
410
433
|
visibility: definition.file.visibility ?? "private",
|
|
411
434
|
});
|
|
412
|
-
|
|
413
|
-
...
|
|
435
|
+
const completedFile = {
|
|
436
|
+
...verifiedIntent,
|
|
414
437
|
uploadId,
|
|
415
438
|
key,
|
|
416
439
|
object,
|
|
440
|
+
};
|
|
441
|
+
await assertVerifiedFile(definition, {
|
|
442
|
+
ctx,
|
|
443
|
+
metadata,
|
|
444
|
+
file: completedFile,
|
|
445
|
+
storage: options.storage,
|
|
417
446
|
});
|
|
447
|
+
completed.push(completedFile);
|
|
418
448
|
}
|
|
419
449
|
const result = await definition.onComplete?.({
|
|
420
450
|
ctx,
|
|
@@ -652,7 +682,7 @@ async function parseMetadata(upload, input) {
|
|
|
652
682
|
}
|
|
653
683
|
throw new Error("Invalid Standard Schema result: missing value");
|
|
654
684
|
}
|
|
655
|
-
function assertFiles(upload, files) {
|
|
685
|
+
function assertFiles(upload, files, options = {}) {
|
|
656
686
|
const maxFiles = upload.file.maxFiles ?? 1;
|
|
657
687
|
if (files.length === 0 || files.length > maxFiles) {
|
|
658
688
|
throw new InvalidUploadFileError({
|
|
@@ -667,8 +697,11 @@ function assertFiles(upload, files) {
|
|
|
667
697
|
details: { file },
|
|
668
698
|
});
|
|
669
699
|
}
|
|
700
|
+
assertFileChecksum(upload, file, options);
|
|
670
701
|
if (upload.file.contentTypes?.length &&
|
|
671
|
-
!upload.file.contentTypes
|
|
702
|
+
!upload.file.contentTypes
|
|
703
|
+
.map(normalizeContentType)
|
|
704
|
+
.includes(normalizeContentType(file.contentType))) {
|
|
672
705
|
throw new InvalidUploadFileError({
|
|
673
706
|
status: 415,
|
|
674
707
|
message: `Upload "${upload.name}" does not accept "${file.contentType}".`,
|
|
@@ -691,6 +724,300 @@ function assertFiles(upload, files) {
|
|
|
691
724
|
}
|
|
692
725
|
}
|
|
693
726
|
}
|
|
727
|
+
function assertFileChecksum(upload, file, options) {
|
|
728
|
+
const requirement = upload.file.checksum;
|
|
729
|
+
if (!requirement && !file.checksum)
|
|
730
|
+
return;
|
|
731
|
+
const configuredAlgorithm = requirement?.algorithm;
|
|
732
|
+
if (configuredAlgorithm && configuredAlgorithm !== "sha256") {
|
|
733
|
+
throw new InvalidUploadFileError({
|
|
734
|
+
message: `Upload "${upload.name}" uses an unsupported checksum algorithm.`,
|
|
735
|
+
details: {
|
|
736
|
+
algorithm: configuredAlgorithm,
|
|
737
|
+
},
|
|
738
|
+
});
|
|
739
|
+
}
|
|
740
|
+
const required = requirement
|
|
741
|
+
? requirement.required !== false && options.requireChecksum === true
|
|
742
|
+
: false;
|
|
743
|
+
if (!file.checksum) {
|
|
744
|
+
if (!required)
|
|
745
|
+
return;
|
|
746
|
+
throw new InvalidUploadFileError({
|
|
747
|
+
message: `Upload "${upload.name}" requires a sha256 checksum for "${file.name}".`,
|
|
748
|
+
details: {
|
|
749
|
+
fileName: file.name,
|
|
750
|
+
algorithm: "sha256",
|
|
751
|
+
},
|
|
752
|
+
});
|
|
753
|
+
}
|
|
754
|
+
if (file.checksum.algorithm !== "sha256" ||
|
|
755
|
+
!isSha256Hex(file.checksum.value)) {
|
|
756
|
+
throw new InvalidUploadFileError({
|
|
757
|
+
message: `Upload "${upload.name}" received an invalid checksum for "${file.name}".`,
|
|
758
|
+
details: {
|
|
759
|
+
fileName: file.name,
|
|
760
|
+
checksum: file.checksum,
|
|
761
|
+
},
|
|
762
|
+
});
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
const UPLOAD_SIGNATURE_MAX_BYTES = 512;
|
|
766
|
+
function needsUploadBodyVerification(upload, file) {
|
|
767
|
+
return (needsUploadChecksumVerification(upload, file) ||
|
|
768
|
+
needsUploadContentTypeVerification(upload, file));
|
|
769
|
+
}
|
|
770
|
+
function needsUploadChecksumVerification(upload, file) {
|
|
771
|
+
return Boolean(file.checksum ||
|
|
772
|
+
(upload.file.checksum && upload.file.checksum.required !== false));
|
|
773
|
+
}
|
|
774
|
+
function needsUploadContentTypeVerification(upload, file) {
|
|
775
|
+
if (upload.file.contentTypeVerification === false)
|
|
776
|
+
return false;
|
|
777
|
+
if (hasContentTypeSignature(file.contentType))
|
|
778
|
+
return true;
|
|
779
|
+
return Boolean(upload.file.contentTypes?.some((contentType) => hasContentTypeSignature(contentType)));
|
|
780
|
+
}
|
|
781
|
+
async function verifyBlobUploadFile(upload, file, blob) {
|
|
782
|
+
if (!needsUploadBodyVerification(upload, file))
|
|
783
|
+
return {};
|
|
784
|
+
const needsChecksum = needsUploadChecksumVerification(upload, file);
|
|
785
|
+
const bytes = needsChecksum
|
|
786
|
+
? new Uint8Array(await blob.arrayBuffer())
|
|
787
|
+
: new Uint8Array(await blob.slice(0, UPLOAD_SIGNATURE_MAX_BYTES).arrayBuffer());
|
|
788
|
+
assertUploadContentTypeSignature(upload, file, bytes);
|
|
789
|
+
if (!needsChecksum)
|
|
790
|
+
return {};
|
|
791
|
+
const checksum = await createUploadChecksum(bytes);
|
|
792
|
+
assertUploadChecksum(upload, file, checksum);
|
|
793
|
+
return { checksum };
|
|
794
|
+
}
|
|
795
|
+
async function verifyStoredUploadFile(upload, file, object) {
|
|
796
|
+
if (!needsUploadBodyVerification(upload, file))
|
|
797
|
+
return {};
|
|
798
|
+
if (!("bytes" in object)) {
|
|
799
|
+
throw new InvalidUploadFileError({
|
|
800
|
+
message: `Uploaded object "${object.key}" must be readable for verification.`,
|
|
801
|
+
details: {
|
|
802
|
+
key: object.key,
|
|
803
|
+
},
|
|
804
|
+
});
|
|
805
|
+
}
|
|
806
|
+
const needsChecksum = needsUploadChecksumVerification(upload, file);
|
|
807
|
+
const bytes = needsChecksum
|
|
808
|
+
? await object.bytes()
|
|
809
|
+
: await readObjectPrefix(object, UPLOAD_SIGNATURE_MAX_BYTES);
|
|
810
|
+
assertUploadContentTypeSignature(upload, file, bytes);
|
|
811
|
+
if (!needsChecksum)
|
|
812
|
+
return {};
|
|
813
|
+
const checksum = await createUploadChecksum(bytes);
|
|
814
|
+
assertUploadChecksum(upload, file, checksum);
|
|
815
|
+
return { checksum };
|
|
816
|
+
}
|
|
817
|
+
function storageObjectMetadata(object) {
|
|
818
|
+
return {
|
|
819
|
+
key: object.key,
|
|
820
|
+
size: object.size,
|
|
821
|
+
...(object.contentType !== undefined
|
|
822
|
+
? { contentType: object.contentType }
|
|
823
|
+
: {}),
|
|
824
|
+
...(object.cacheControl !== undefined
|
|
825
|
+
? { cacheControl: object.cacheControl }
|
|
826
|
+
: {}),
|
|
827
|
+
metadata: object.metadata,
|
|
828
|
+
visibility: object.visibility,
|
|
829
|
+
lastModified: object.lastModified,
|
|
830
|
+
};
|
|
831
|
+
}
|
|
832
|
+
function assertUploadContentTypeSignature(upload, file, bytes) {
|
|
833
|
+
if (upload.file.contentTypeVerification === false)
|
|
834
|
+
return;
|
|
835
|
+
const declaredContentType = normalizeContentType(file.contentType);
|
|
836
|
+
const acceptedContentTypes = upload.file.contentTypes?.map(normalizeContentType) ?? [];
|
|
837
|
+
const detectedContentType = detectSupportedContentType(bytes);
|
|
838
|
+
if (detectedContentType &&
|
|
839
|
+
acceptedContentTypes.length > 0 &&
|
|
840
|
+
!acceptedContentTypes.includes(detectedContentType)) {
|
|
841
|
+
throw new InvalidUploadFileError({
|
|
842
|
+
status: 415,
|
|
843
|
+
message: `Upload "${upload.name}" does not accept detected content type "${detectedContentType}".`,
|
|
844
|
+
details: {
|
|
845
|
+
fileName: file.name,
|
|
846
|
+
declaredContentType,
|
|
847
|
+
detectedContentType,
|
|
848
|
+
acceptedContentTypes,
|
|
849
|
+
},
|
|
850
|
+
});
|
|
851
|
+
}
|
|
852
|
+
if (hasContentTypeSignature(declaredContentType) &&
|
|
853
|
+
!matchesContentTypeSignature(declaredContentType, bytes)) {
|
|
854
|
+
throw new InvalidUploadFileError({
|
|
855
|
+
status: 415,
|
|
856
|
+
message: `Upload "${upload.name}" content type "${declaredContentType}" does not match the file bytes.`,
|
|
857
|
+
details: {
|
|
858
|
+
fileName: file.name,
|
|
859
|
+
expectedContentType: declaredContentType,
|
|
860
|
+
detectedContentType: detectedContentType ?? "unknown",
|
|
861
|
+
},
|
|
862
|
+
});
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
function assertUploadChecksum(upload, file, actual) {
|
|
866
|
+
if (!file.checksum)
|
|
867
|
+
return;
|
|
868
|
+
if (file.checksum.value.toLowerCase() === actual.value)
|
|
869
|
+
return;
|
|
870
|
+
throw new InvalidUploadFileError({
|
|
871
|
+
message: `Upload "${upload.name}" checksum does not match "${file.name}".`,
|
|
872
|
+
details: {
|
|
873
|
+
fileName: file.name,
|
|
874
|
+
algorithm: "sha256",
|
|
875
|
+
expected: file.checksum.value.toLowerCase(),
|
|
876
|
+
actual: actual.value,
|
|
877
|
+
},
|
|
878
|
+
});
|
|
879
|
+
}
|
|
880
|
+
async function assertVerifiedFile(upload, args) {
|
|
881
|
+
if (!upload.verifyFile)
|
|
882
|
+
return;
|
|
883
|
+
const result = await upload.verifyFile(args);
|
|
884
|
+
const invalid = result === false ||
|
|
885
|
+
(typeof result === "object" &&
|
|
886
|
+
result !== null &&
|
|
887
|
+
"valid" in result &&
|
|
888
|
+
result.valid === false);
|
|
889
|
+
if (!invalid)
|
|
890
|
+
return;
|
|
891
|
+
throw new InvalidUploadFileError({
|
|
892
|
+
message: typeof result === "object" && result?.reason
|
|
893
|
+
? result.reason
|
|
894
|
+
: `Upload "${upload.name}" file "${args.file.name}" did not pass verification.`,
|
|
895
|
+
details: typeof result === "object" && "details" in result
|
|
896
|
+
? result.details
|
|
897
|
+
: {
|
|
898
|
+
fileName: args.file.name,
|
|
899
|
+
key: args.file.key,
|
|
900
|
+
},
|
|
901
|
+
});
|
|
902
|
+
}
|
|
903
|
+
async function readObjectPrefix(object, maxBytes) {
|
|
904
|
+
const reader = object.stream().getReader();
|
|
905
|
+
const chunks = [];
|
|
906
|
+
let total = 0;
|
|
907
|
+
try {
|
|
908
|
+
while (total < maxBytes) {
|
|
909
|
+
const result = await reader.read();
|
|
910
|
+
if (result.done)
|
|
911
|
+
break;
|
|
912
|
+
const remaining = maxBytes - total;
|
|
913
|
+
const chunk = result.value.byteLength > remaining
|
|
914
|
+
? result.value.slice(0, remaining)
|
|
915
|
+
: result.value;
|
|
916
|
+
chunks.push(chunk);
|
|
917
|
+
total += chunk.byteLength;
|
|
918
|
+
if (result.value.byteLength > remaining)
|
|
919
|
+
break;
|
|
920
|
+
}
|
|
921
|
+
}
|
|
922
|
+
finally {
|
|
923
|
+
await reader.cancel().catch(() => undefined);
|
|
924
|
+
reader.releaseLock();
|
|
925
|
+
}
|
|
926
|
+
const bytes = new Uint8Array(total);
|
|
927
|
+
let offset = 0;
|
|
928
|
+
for (const chunk of chunks) {
|
|
929
|
+
bytes.set(chunk, offset);
|
|
930
|
+
offset += chunk.byteLength;
|
|
931
|
+
}
|
|
932
|
+
return bytes;
|
|
933
|
+
}
|
|
934
|
+
async function createUploadChecksum(bytes) {
|
|
935
|
+
if (!globalThis.crypto?.subtle) {
|
|
936
|
+
throw new InvalidUploadFileError({
|
|
937
|
+
message: "Upload checksum verification requires Web Crypto.",
|
|
938
|
+
});
|
|
939
|
+
}
|
|
940
|
+
const buffer = new ArrayBuffer(bytes.byteLength);
|
|
941
|
+
new Uint8Array(buffer).set(bytes);
|
|
942
|
+
const digest = await globalThis.crypto.subtle.digest("SHA-256", buffer);
|
|
943
|
+
return {
|
|
944
|
+
algorithm: "sha256",
|
|
945
|
+
value: bytesToHex(new Uint8Array(digest)),
|
|
946
|
+
};
|
|
947
|
+
}
|
|
948
|
+
function bytesToHex(bytes) {
|
|
949
|
+
return [...bytes].map((byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
950
|
+
}
|
|
951
|
+
function isSha256Hex(value) {
|
|
952
|
+
return /^[a-f0-9]{64}$/i.test(value);
|
|
953
|
+
}
|
|
954
|
+
function normalizeContentType(contentType) {
|
|
955
|
+
return contentType.split(";")[0]?.trim().toLowerCase() ?? "";
|
|
956
|
+
}
|
|
957
|
+
function hasContentTypeSignature(contentType) {
|
|
958
|
+
return SIGNATURE_CONTENT_TYPES.has(normalizeContentType(contentType));
|
|
959
|
+
}
|
|
960
|
+
function matchesContentTypeSignature(contentType, bytes) {
|
|
961
|
+
const normalized = normalizeContentType(contentType);
|
|
962
|
+
switch (normalized) {
|
|
963
|
+
case "application/pdf":
|
|
964
|
+
return startsWithBytes(bytes, [0x25, 0x50, 0x44, 0x46, 0x2d]);
|
|
965
|
+
case "application/zip":
|
|
966
|
+
return (startsWithBytes(bytes, [0x50, 0x4b, 0x03, 0x04]) ||
|
|
967
|
+
startsWithBytes(bytes, [0x50, 0x4b, 0x05, 0x06]) ||
|
|
968
|
+
startsWithBytes(bytes, [0x50, 0x4b, 0x07, 0x08]));
|
|
969
|
+
case "image/gif":
|
|
970
|
+
return (startsWithAscii(bytes, "GIF87a") || startsWithAscii(bytes, "GIF89a"));
|
|
971
|
+
case "image/jpeg":
|
|
972
|
+
return startsWithBytes(bytes, [0xff, 0xd8, 0xff]);
|
|
973
|
+
case "image/png":
|
|
974
|
+
return startsWithBytes(bytes, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
|
|
975
|
+
case "image/svg+xml":
|
|
976
|
+
return looksLikeSvg(bytes);
|
|
977
|
+
case "image/webp":
|
|
978
|
+
return (startsWithAscii(bytes, "RIFF") &&
|
|
979
|
+
bytes.length >= 12 &&
|
|
980
|
+
asciiAt(bytes, 8, 4) === "WEBP");
|
|
981
|
+
default:
|
|
982
|
+
return false;
|
|
983
|
+
}
|
|
984
|
+
}
|
|
985
|
+
function detectSupportedContentType(bytes) {
|
|
986
|
+
for (const contentType of SIGNATURE_CONTENT_TYPES) {
|
|
987
|
+
if (matchesContentTypeSignature(contentType, bytes))
|
|
988
|
+
return contentType;
|
|
989
|
+
}
|
|
990
|
+
return undefined;
|
|
991
|
+
}
|
|
992
|
+
const SIGNATURE_CONTENT_TYPES = new Set([
|
|
993
|
+
"application/pdf",
|
|
994
|
+
"application/zip",
|
|
995
|
+
"image/gif",
|
|
996
|
+
"image/jpeg",
|
|
997
|
+
"image/png",
|
|
998
|
+
"image/svg+xml",
|
|
999
|
+
"image/webp",
|
|
1000
|
+
]);
|
|
1001
|
+
function startsWithBytes(bytes, prefix) {
|
|
1002
|
+
if (bytes.length < prefix.length)
|
|
1003
|
+
return false;
|
|
1004
|
+
return prefix.every((byte, index) => bytes[index] === byte);
|
|
1005
|
+
}
|
|
1006
|
+
function startsWithAscii(bytes, prefix) {
|
|
1007
|
+
return asciiAt(bytes, 0, prefix.length) === prefix;
|
|
1008
|
+
}
|
|
1009
|
+
function asciiAt(bytes, offset, length) {
|
|
1010
|
+
return String.fromCharCode(...bytes.slice(offset, offset + length));
|
|
1011
|
+
}
|
|
1012
|
+
function looksLikeSvg(bytes) {
|
|
1013
|
+
const text = new TextDecoder()
|
|
1014
|
+
.decode(bytes)
|
|
1015
|
+
.replace(/^\uFEFF/, "")
|
|
1016
|
+
.trimStart()
|
|
1017
|
+
.toLowerCase();
|
|
1018
|
+
return (text.startsWith("<svg") ||
|
|
1019
|
+
(text.startsWith("<?xml") && text.includes("<svg")));
|
|
1020
|
+
}
|
|
694
1021
|
async function assertAuthorized(upload, args) {
|
|
695
1022
|
if (!upload.authorize) {
|
|
696
1023
|
if ((upload.access ?? "protected") === "public")
|
|
@@ -737,7 +1064,8 @@ function assertStoredObject(upload, file, object) {
|
|
|
737
1064
|
}
|
|
738
1065
|
if (object.contentType &&
|
|
739
1066
|
file.contentType &&
|
|
740
|
-
object.contentType !==
|
|
1067
|
+
normalizeContentType(object.contentType) !==
|
|
1068
|
+
normalizeContentType(file.contentType)) {
|
|
741
1069
|
throw new InvalidUploadFileError({
|
|
742
1070
|
message: `Uploaded object "${object.key}" content type does not match the prepared file.`,
|
|
743
1071
|
details: {
|
|
@@ -771,9 +1099,10 @@ function filesFromFormData(formData) {
|
|
|
771
1099
|
return files;
|
|
772
1100
|
}
|
|
773
1101
|
function fileIntentFromFile(file) {
|
|
1102
|
+
const contentType = normalizeContentType(file.type) || "application/octet-stream";
|
|
774
1103
|
return {
|
|
775
1104
|
name: file.name,
|
|
776
|
-
contentType
|
|
1105
|
+
contentType,
|
|
777
1106
|
size: file.size,
|
|
778
1107
|
};
|
|
779
1108
|
}
|