upload-safety 0.2.1 → 0.4.0

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.
Files changed (50) hide show
  1. package/README.md +39 -7
  2. package/dist/archive-content.d.ts +15 -0
  3. package/dist/archive-content.d.ts.map +1 -0
  4. package/dist/archive-content.js +277 -0
  5. package/dist/archive-content.js.map +1 -0
  6. package/dist/asf-media.d.ts +22 -0
  7. package/dist/asf-media.d.ts.map +1 -0
  8. package/dist/asf-media.js +159 -0
  9. package/dist/asf-media.js.map +1 -0
  10. package/dist/check-upload.js +1 -1
  11. package/dist/check-upload.js.map +1 -1
  12. package/dist/heif-metadata.d.ts +8 -0
  13. package/dist/heif-metadata.d.ts.map +1 -1
  14. package/dist/heif-metadata.js +1 -1
  15. package/dist/heif-metadata.js.map +1 -1
  16. package/dist/media-formats.d.ts +51 -0
  17. package/dist/media-formats.d.ts.map +1 -0
  18. package/dist/media-formats.js +498 -0
  19. package/dist/media-formats.js.map +1 -0
  20. package/dist/photo-metadata.d.ts +4 -2
  21. package/dist/photo-metadata.d.ts.map +1 -1
  22. package/dist/photo-metadata.js +39 -2
  23. package/dist/photo-metadata.js.map +1 -1
  24. package/dist/rtf-content.d.ts +12 -0
  25. package/dist/rtf-content.d.ts.map +1 -0
  26. package/dist/rtf-content.js +175 -0
  27. package/dist/rtf-content.js.map +1 -0
  28. package/dist/upload-allowlist.d.ts +19 -8
  29. package/dist/upload-allowlist.d.ts.map +1 -1
  30. package/dist/upload-allowlist.js +136 -23
  31. package/dist/upload-allowlist.js.map +1 -1
  32. package/dist/video-formats.d.ts +33 -0
  33. package/dist/video-formats.d.ts.map +1 -0
  34. package/dist/video-formats.js +373 -0
  35. package/dist/video-formats.js.map +1 -0
  36. package/dist/zip-entries.d.ts +8 -0
  37. package/dist/zip-entries.d.ts.map +1 -1
  38. package/dist/zip-entries.js +29 -2
  39. package/dist/zip-entries.js.map +1 -1
  40. package/package.json +6 -3
  41. package/src/archive-content.ts +306 -0
  42. package/src/asf-media.ts +184 -0
  43. package/src/check-upload.ts +1 -1
  44. package/src/heif-metadata.ts +2 -2
  45. package/src/media-formats.ts +522 -0
  46. package/src/photo-metadata.ts +40 -2
  47. package/src/rtf-content.ts +178 -0
  48. package/src/upload-allowlist.ts +162 -27
  49. package/src/video-formats.ts +398 -0
  50. package/src/zip-entries.ts +33 -3
@@ -0,0 +1,373 @@
1
+ /**
2
+ * Checks the structure of MP4, MOV, M4A, WebM, Matroska and AVI files and removes their metadata (GPS,
3
+ * titles, cover art, XMP) without moving a byte, so sample offsets and cluster positions stay
4
+ * valid and a large video is not re-encoded. Boxes and elements are overwritten in place:
5
+ * ISOBMFF boxes become `free` boxes with a zeroed payload, WebM and Matroska elements become
6
+ * `Void` elements of the same length and AVI chunks become zeroed `JUNK` chunks.
7
+ *
8
+ * Limitation: metadata stored as samples in a timed metadata track (GoPro GPMF, DJI, Apple
9
+ * `mebx`) lives in `mdat` or in clusters, which are never touched, so it stays.
10
+ */
11
+ import { readBoxes, readFtypBrands } from './heif-metadata.js';
12
+ /** Bounds far above real files that keep a crafted one cheap. */
13
+ const MAX_ELEMENTS = 10_000;
14
+ const MAX_DEPTH = 16;
15
+ const FTYP = 'ftyp';
16
+ const MOOV = 'moov';
17
+ const QUICKTIME_BRAND = 'qt ';
18
+ /** Top-level boxes an old QuickTime movie without `ftyp` may start with. */
19
+ const QUICKTIME_FIRST_BOXES = new Set(['moov', 'mdat', 'wide', 'free', 'skip', 'pnot']);
20
+ /** Boxes that only hold other boxes and may hide metadata further down. */
21
+ const CONTAINER_BOXES = new Set(['moov', 'trak', 'mdia', 'minf', 'stbl', 'edts', 'dinf', 'mvex', 'moof', 'traf']);
22
+ const METADATA_BOXES = new Set(['udta', 'meta', 'uuid', 'XMP_']);
23
+ /** Top-level boxes holding metadata; `udta` and `XMP_` only occur inside `moov`. */
24
+ const TOP_LEVEL_METADATA_BOXES = new Set(['meta', 'uuid']);
25
+ const FREE_TYPE = Buffer.from('free', 'latin1');
26
+ const LARGE_SIZE = 1;
27
+ const SMALL_HEADER = 8;
28
+ const LARGE_HEADER = 16;
29
+ /** The file offset of each box's header start, which `Box` does not record: boxes follow each other. */
30
+ function headerStarts(boxes, start) {
31
+ return boxes.map((_box, index) => (index === 0 ? start : boxes[index - 1].end));
32
+ }
33
+ /**
34
+ * Collects the byte ranges to overwrite below `[start, end)`; each range is a box's type and
35
+ * payload. Returns false when a box does not read, nesting is too deep or there are too many boxes.
36
+ */
37
+ function collectMetadataBoxes(bytes, start, end, depth, budget, found) {
38
+ const boxes = readBoxes(bytes, start, end);
39
+ if (!boxes || depth > MAX_DEPTH) {
40
+ return false;
41
+ }
42
+ budget.left -= boxes.length;
43
+ if (budget.left < 0) {
44
+ return false;
45
+ }
46
+ const starts = headerStarts(boxes, start);
47
+ for (const [index, box] of boxes.entries()) {
48
+ if (METADATA_BOXES.has(box.type)) {
49
+ found.push([starts[index], box.end]);
50
+ }
51
+ else if (CONTAINER_BOXES.has(box.type)) {
52
+ if (!collectMetadataBoxes(bytes, box.start, box.end, depth + 1, budget, found)) {
53
+ return false;
54
+ }
55
+ }
56
+ }
57
+ return true;
58
+ }
59
+ /** Turns the box at `[start, end)` into a `free` box and zeroes its payload, keeping its size field. */
60
+ function freeBox(bytes, start, end) {
61
+ const header = bytes.readUInt32BE(start) === LARGE_SIZE ? LARGE_HEADER : SMALL_HEADER;
62
+ FREE_TYPE.copy(bytes, start + 4);
63
+ bytes.fill(0, start + header, end);
64
+ }
65
+ /**
66
+ * The ISO media file (MP4, MOV, M4A) with its metadata boxes overwritten, the input itself when
67
+ * there was nothing to remove, or null when its boxes do not read, it has no single `moov` or it
68
+ * names none of `brands`. `brands` null means a QuickTime movie, which may lack `ftyp`.
69
+ */
70
+ export function stripIsoMedia(content, brands) {
71
+ const boxes = readBoxes(content, 0, content.length);
72
+ if (!boxes || boxes.length === 0) {
73
+ return null;
74
+ }
75
+ const first = boxes[0].type;
76
+ if (brands === null) {
77
+ const fileBrands = readFtypBrands(content);
78
+ if (first === FTYP ? !fileBrands.includes(QUICKTIME_BRAND) : !QUICKTIME_FIRST_BOXES.has(first)) {
79
+ return null;
80
+ }
81
+ }
82
+ else if (first !== FTYP || !readFtypBrands(content).some((brand) => brands.includes(brand))) {
83
+ return null;
84
+ }
85
+ if (boxes.filter((box) => box.type === MOOV).length !== 1) {
86
+ return null;
87
+ }
88
+ const found = [];
89
+ const starts = headerStarts(boxes, 0);
90
+ const budget = { left: MAX_ELEMENTS - boxes.length };
91
+ for (const [index, box] of boxes.entries()) {
92
+ if (TOP_LEVEL_METADATA_BOXES.has(box.type)) {
93
+ found.push([starts[index], box.end]);
94
+ }
95
+ else if (CONTAINER_BOXES.has(box.type) && !collectMetadataBoxes(content, box.start, box.end, 1, budget, found)) {
96
+ return null;
97
+ }
98
+ }
99
+ if (found.length === 0) {
100
+ return content;
101
+ }
102
+ const stripped = Buffer.from(content);
103
+ for (const [start, end] of found) {
104
+ freeBox(stripped, start, end);
105
+ }
106
+ return stripped;
107
+ }
108
+ const EBML_HEADER = 0x1a45dfa3;
109
+ const DOC_TYPE = 0x4282;
110
+ const SEGMENT = 0x18538067;
111
+ const INFO = 0x1549a966;
112
+ const TRACKS = 0x1654ae6b;
113
+ const TAGS = 0x1254c367;
114
+ const ATTACHMENTS = 0x1941a469;
115
+ const CLUSTER = 0x1f43b675;
116
+ const TITLE = 0x7ba9;
117
+ const VOID = 0xec;
118
+ const WEBM_DOC_TYPE = 'webm';
119
+ const MATROSKA_DOC_TYPE = 'matroska';
120
+ /** The elements a cluster may hold; the first other ID ends a cluster of unknown size. */
121
+ const CLUSTER_CHILDREN = new Set([0xe7, 0x5854, 0xa7, 0xab, 0xa3, 0xa0, 0xaf, VOID, 0xbf]);
122
+ const MAX_VINT_LENGTH = 8;
123
+ /** The EBML element at `offset` within `[offset, limit)`, or null when its header or size does not read. */
124
+ function readElement(bytes, offset, limit) {
125
+ if (offset >= limit) {
126
+ return null;
127
+ }
128
+ const idLength = Math.clz32(bytes[offset]) - 23;
129
+ const sizeOffset = offset + idLength;
130
+ if (idLength < 1 || idLength > 4 || sizeOffset >= limit) {
131
+ return null;
132
+ }
133
+ const sizeLength = Math.clz32(bytes[sizeOffset]) - 23;
134
+ const data = sizeOffset + sizeLength;
135
+ if (sizeLength < 1 || sizeLength > MAX_VINT_LENGTH || data > limit) {
136
+ return null;
137
+ }
138
+ let size = BigInt(bytes[sizeOffset] & (0xff >> sizeLength));
139
+ for (let index = 1; index < sizeLength; index++) {
140
+ size = (size << 8n) | BigInt(bytes[sizeOffset + index]);
141
+ }
142
+ const id = bytes.readUIntBE(offset, idLength);
143
+ // All bits set means "unknown size".
144
+ if (size === (1n << BigInt(7 * sizeLength)) - 1n) {
145
+ return { id, start: offset, data, end: null };
146
+ }
147
+ return size > BigInt(limit - data) ? null : { id, start: offset, data, end: data + Number(size) };
148
+ }
149
+ /** The children of a master element, all of known size, or null when they do not read. */
150
+ function readChildren(bytes, parent) {
151
+ const children = [];
152
+ for (let offset = parent.data; offset < parent.end;) {
153
+ const child = readElement(bytes, offset, parent.end);
154
+ if (!child || child.end === null || children.length === MAX_ELEMENTS) {
155
+ return null;
156
+ }
157
+ children.push(child);
158
+ offset = child.end;
159
+ }
160
+ return children;
161
+ }
162
+ /** Where a cluster of unknown size ends: at the first element that is not a cluster child, or at `limit`. */
163
+ function findClusterEnd(bytes, cluster, limit) {
164
+ let offset = cluster.data;
165
+ while (offset < limit) {
166
+ const child = readElement(bytes, offset, limit);
167
+ if (!child) {
168
+ return null;
169
+ }
170
+ if (!CLUSTER_CHILDREN.has(child.id)) {
171
+ return offset;
172
+ }
173
+ if (child.end === null) {
174
+ return null;
175
+ }
176
+ offset = child.end;
177
+ }
178
+ return limit;
179
+ }
180
+ /** The smallest EBML size field that makes a `Void` element exactly `total` bytes, or null when none fits. */
181
+ function voidElement(total) {
182
+ for (let width = 1; width <= MAX_VINT_LENGTH; width++) {
183
+ const payload = total - 1 - width;
184
+ // An all-ones size means "unknown", so the largest value of each width is not usable.
185
+ if (payload >= 0 && BigInt(payload) < (1n << BigInt(7 * width)) - 1n) {
186
+ return Buffer.concat([Buffer.from([VOID]), sizeBytes(payload, width), Buffer.alloc(payload)]);
187
+ }
188
+ }
189
+ return null;
190
+ }
191
+ /** An EBML size of `width` bytes holding `value`. */
192
+ function sizeBytes(value, width) {
193
+ const bytes = Buffer.alloc(width);
194
+ let rest = BigInt(value) | (1n << BigInt(7 * width));
195
+ for (let index = width - 1; index >= 0; index--) {
196
+ bytes[index] = Number(rest & 0xffn);
197
+ rest >>= 8n;
198
+ }
199
+ return bytes;
200
+ }
201
+ /**
202
+ * The WebM or Matroska file with its Tags, Attachments (in Matroska they can hold any file) and Title
203
+ * overwritten by `Void` elements of the same length, the input itself when there was nothing to remove,
204
+ * or null when its DocType is not allowed or its elements do not read. `webm` allows only WebM;
205
+ * `matroska` allows both, as a WebM file is a Matroska file. A cluster of unknown size, as live
206
+ * recorders write, ends at the first element a cluster cannot hold.
207
+ */
208
+ export function stripMatroska(content, docType) {
209
+ const header = readElement(content, 0, content.length);
210
+ if (!header || header.id !== EBML_HEADER || header.end === null) {
211
+ return null;
212
+ }
213
+ const headerChildren = readChildren(content, header);
214
+ const docTypeElement = headerChildren?.find((child) => child.id === DOC_TYPE);
215
+ if (!docTypeElement) {
216
+ return null;
217
+ }
218
+ const found = content.toString('latin1', docTypeElement.data, docTypeElement.end).replace(/\0+$/, '');
219
+ if (found !== WEBM_DOC_TYPE && !(docType === 'matroska' && found === MATROSKA_DOC_TYPE)) {
220
+ return null;
221
+ }
222
+ const segment = readElement(content, header.end, content.length);
223
+ if (!segment || segment.id !== SEGMENT || (segment.end ?? content.length) !== content.length) {
224
+ return null;
225
+ }
226
+ const segmentEnd = content.length;
227
+ const voids = [];
228
+ let hasInfo = false;
229
+ let hasTracks = false;
230
+ let count = 0;
231
+ for (let offset = segment.data; offset < segmentEnd;) {
232
+ const element = readElement(content, offset, segmentEnd);
233
+ if (!element || ++count > MAX_ELEMENTS) {
234
+ return null;
235
+ }
236
+ let end = element.end;
237
+ if (end === null) {
238
+ end = element.id === CLUSTER ? findClusterEnd(content, element, segmentEnd) : null;
239
+ if (end === null) {
240
+ return null;
241
+ }
242
+ }
243
+ if (element.id === TAGS || element.id === ATTACHMENTS) {
244
+ voids.push([element.start, end]);
245
+ }
246
+ else if (element.id === INFO) {
247
+ hasInfo = true;
248
+ const children = readChildren(content, { ...element, end });
249
+ if (!children) {
250
+ return null;
251
+ }
252
+ voids.push(...children.filter((child) => child.id === TITLE).map((child) => [child.start, child.end]));
253
+ }
254
+ else if (element.id === TRACKS) {
255
+ hasTracks = true;
256
+ }
257
+ offset = end;
258
+ }
259
+ if (!hasInfo || !hasTracks) {
260
+ return null;
261
+ }
262
+ if (voids.length === 0) {
263
+ return content;
264
+ }
265
+ const stripped = Buffer.from(content);
266
+ for (const [start, end] of voids) {
267
+ const element = voidElement(end - start);
268
+ if (!element) {
269
+ return null;
270
+ }
271
+ element.copy(stripped, start);
272
+ }
273
+ return stripped;
274
+ }
275
+ const RIFF_HEADER_SIZE = 12;
276
+ const RIFF_CHUNK_HEADER_SIZE = 8;
277
+ const MAX_AVI_CHUNKS = 100_000;
278
+ const MAX_AVI_DEPTH = 8;
279
+ const AVI_FORM = 'AVI ';
280
+ const AVI_EXTENSION_FORM = 'AVIX';
281
+ const JUNK = 'JUNK';
282
+ const LIST = 'LIST';
283
+ /** Chunks that hold text, XMP or vendor data; the `INFO` list is handled apart because it is a list. */
284
+ const AVI_METADATA_CHUNKS = new Set(['IDIT', 'ISMP', '_PMX', 'strd', 'strn']);
285
+ /** Whether `[start, end)` of `bytes` is already a `JUNK` chunk of zeros, so blanking it changes nothing. */
286
+ function isBlankJunk(bytes, start, end) {
287
+ return bytes.toString('latin1', start, start + 4) === JUNK && !bytes.subarray(start + RIFF_CHUNK_HEADER_SIZE, end).some((byte) => byte !== 0);
288
+ }
289
+ /**
290
+ * Walks the RIFF chunks tiling `[start, end)` and records the ones to blank. Returns false when a chunk runs
291
+ * past its parent, bytes are left over, or the limits on chunks and depth are exceeded.
292
+ */
293
+ function walkAvi(bytes, start, end, depth, parent, firstRiff, state) {
294
+ if (depth > MAX_AVI_DEPTH) {
295
+ return false;
296
+ }
297
+ let offset = start;
298
+ while (offset < end) {
299
+ if (++state.chunks > MAX_AVI_CHUNKS || offset + RIFF_CHUNK_HEADER_SIZE > end) {
300
+ return false;
301
+ }
302
+ const type = bytes.toString('latin1', offset, offset + 4);
303
+ const size = bytes.readUInt32LE(offset + 4);
304
+ const dataStart = offset + RIFF_CHUNK_HEADER_SIZE;
305
+ if (size > end - dataStart) {
306
+ return false;
307
+ }
308
+ const next = Math.min(dataStart + size + (size & 1), end);
309
+ if (type === LIST) {
310
+ if (size < 4) {
311
+ return false;
312
+ }
313
+ const listType = bytes.toString('latin1', dataStart, dataStart + 4);
314
+ if (listType === 'INFO') {
315
+ state.blanks.push([offset, next]);
316
+ }
317
+ else if (listType === 'movi') {
318
+ state.hasMovie ||= firstRiff;
319
+ }
320
+ else if (!walkAvi(bytes, dataStart + 4, dataStart + size, depth + 1, listType, firstRiff, state)) {
321
+ return false;
322
+ }
323
+ }
324
+ else if (AVI_METADATA_CHUNKS.has(type) || type === JUNK) {
325
+ state.blanks.push([offset, next]);
326
+ }
327
+ else if (type === 'avih' && parent === 'hdrl') {
328
+ state.hasHeader ||= firstRiff;
329
+ }
330
+ offset = next;
331
+ }
332
+ return true;
333
+ }
334
+ /**
335
+ * The AVI with its `INFO` lists and its `IDIT`, `ISMP`, `_PMX` (XMP), `strd` (vendor data) and `strn`
336
+ * chunks, and the contents of `JUNK` chunks, overwritten by zeroed `JUNK` chunks of the same size, the input
337
+ * itself when there was nothing to remove, or null when the chunks do not read, the first RIFF lacks `hdrl`
338
+ * with `avih` or `movi`, or bytes follow the last RIFF. OpenDML `AVIX` RIFFs after the first are read the
339
+ * same way. No byte moves, so the `idx1` offsets stay valid; `movi` and `idx1` are never touched.
340
+ */
341
+ export function stripAvi(content) {
342
+ const state = { chunks: 0, hasHeader: false, hasMovie: false, blanks: [] };
343
+ let offset = 0;
344
+ for (let riffs = 0; offset < content.length; riffs++) {
345
+ if (offset + RIFF_HEADER_SIZE > content.length || content.toString('latin1', offset, offset + 4) !== 'RIFF') {
346
+ return null;
347
+ }
348
+ const form = content.toString('latin1', offset + 8, offset + 12);
349
+ if (form !== (riffs === 0 ? AVI_FORM : AVI_EXTENSION_FORM)) {
350
+ return null;
351
+ }
352
+ const size = content.readUInt32LE(offset + 4);
353
+ const end = offset + RIFF_CHUNK_HEADER_SIZE + size;
354
+ if (size < 4 || end > content.length || !walkAvi(content, offset + RIFF_HEADER_SIZE, end, 0, form, riffs === 0, state)) {
355
+ return null;
356
+ }
357
+ offset = Math.min(end + (size & 1), content.length);
358
+ }
359
+ if (!state.hasHeader || !state.hasMovie) {
360
+ return null;
361
+ }
362
+ const changes = state.blanks.filter(([start, end]) => !isBlankJunk(content, start, end));
363
+ if (changes.length === 0) {
364
+ return content;
365
+ }
366
+ const stripped = Buffer.from(content);
367
+ for (const [start, end] of changes) {
368
+ stripped.write(JUNK, start, 'latin1');
369
+ stripped.fill(0, start + RIFF_CHUNK_HEADER_SIZE, end);
370
+ }
371
+ return stripped;
372
+ }
373
+ //# sourceMappingURL=video-formats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video-formats.js","sourceRoot":"","sources":["../src/video-formats.ts"],"names":[],"mappings":"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"}
@@ -13,12 +13,20 @@ export interface ZipEntry {
13
13
  localHeaderOffset: number;
14
14
  /** Where the entry's (compressed) data starts, past its local header. */
15
15
  dataOffset: number;
16
+ /** Whether a Unix-made archive marks the entry as a symbolic link. */
17
+ symlink: boolean;
16
18
  }
17
19
  /** Upper bounds that keep a crafted archive from passing as a document. */
18
20
  export declare const MAX_ZIP_ENTRIES = 2000;
19
21
  export declare const MAX_ZIP_UNCOMPRESSED_BYTES: number;
20
22
  export declare const MAX_ZIP_ENTRY_UNCOMPRESSED_BYTES: number;
23
+ export declare function isSafeName(name: string): boolean;
21
24
  export declare function readZipEntries(content: Buffer): ZipEntry[] | null;
25
+ /**
26
+ * Whether the central directory marks any entry as encrypted, for telling a password-protected
27
+ * archive apart from a malformed one after {@link readZipEntries} returned null.
28
+ */
29
+ export declare function hasEncryptedZipEntry(content: Buffer): boolean;
22
30
  /**
23
31
  * The uncompressed bytes of an entry from {@link readZipEntries}, or null when
24
32
  * they do not inflate or exceed `maxBytes`.
@@ -1 +1 @@
1
- {"version":3,"file":"zip-entries.d.ts","sourceRoot":"","sources":["../src/zip-entries.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,QAAQ;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,yEAAyE;IACzE,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,2EAA2E;AAC3E,eAAO,MAAM,eAAe,OAAO,CAAC;AAGpC,eAAO,MAAM,0BAA0B,QAAoB,CAAC;AAC5D,eAAO,MAAM,gCAAgC,QAAoB,CAAC;AAoFlE,wBAAgB,cAAc,CAAE,OAAO,EAAE,MAAM,GAAI,QAAQ,EAAE,GAAG,IAAI,CAwFnE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAI,MAAM,GAAG,IAAI,CAapG;AA4BD;;;GAGG;AACH,wBAAgB,eAAe,CAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAI,OAAO,GAAG,IAAI,CAMlI"}
1
+ {"version":3,"file":"zip-entries.d.ts","sourceRoot":"","sources":["../src/zip-entries.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,QAAQ;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,yEAAyE;IACzE,UAAU,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,OAAO,EAAE,OAAO,CAAC;CACjB;AAED,2EAA2E;AAC3E,eAAO,MAAM,eAAe,OAAO,CAAC;AAGpC,eAAO,MAAM,0BAA0B,QAAoB,CAAC;AAC5D,eAAO,MAAM,gCAAgC,QAAoB,CAAC;AAmFlE,wBAAgB,UAAU,CAAE,IAAI,EAAE,MAAM,GAAI,OAAO,CAElD;AAED,wBAAgB,cAAc,CAAE,OAAO,EAAE,MAAM,GAAI,QAAQ,EAAE,GAAG,IAAI,CA0FnE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAE,OAAO,EAAE,MAAM,GAAI,OAAO,CAiB/D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAI,MAAM,GAAG,IAAI,CAapG;AA4BD;;;GAGG;AACH,wBAAgB,eAAe,CAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAI,OAAO,GAAG,IAAI,CAMlI"}
@@ -23,6 +23,9 @@ const DATA_DESCRIPTOR_FLAG = 0x0008;
23
23
  const DATA_DESCRIPTOR_SIGNATURE = 0x08074b50;
24
24
  const DATA_DESCRIPTOR_SIZE = 12;
25
25
  const UTF8_NAME_FLAG = 0x0800;
26
+ const UNIX_HOST = 3;
27
+ const UNIX_FILE_TYPE_MASK = 0o170000;
28
+ const UNIX_SYMLINK = 0o120000;
26
29
  const STORED = 0;
27
30
  const DEFLATED = 8;
28
31
  /**
@@ -77,7 +80,7 @@ function findEntrySpan(content, entry, nameBytes, directoryOffset) {
77
80
  }
78
81
  // Windows unpackers also take `\` for a separator and `C:` for a drive.
79
82
  const ROOTED_NAME = /^(?:[/\\]|[a-z]:)/i;
80
- function isSafeName(name) {
83
+ export function isSafeName(name) {
81
84
  return name.length > 0 && !ROOTED_NAME.test(name) && !name.includes('\0') && !name.split(/[/\\]/).includes('..');
82
85
  }
83
86
  export function readZipEntries(content) {
@@ -120,6 +123,8 @@ export function readZipEntries(content) {
120
123
  const nameLength = content.readUInt16LE(position + 28);
121
124
  const next = position + CENTRAL_HEADER_SIZE + nameLength + content.readUInt16LE(position + 30) + content.readUInt16LE(position + 32);
122
125
  const localHeaderOffset = content.readUInt32LE(position + 42);
126
+ const symlink = content[position + 5] === UNIX_HOST &&
127
+ (content.readUInt32LE(position + 38) >>> 16 & UNIX_FILE_TYPE_MASK) === UNIX_SYMLINK;
123
128
  if (next > directoryEnd || localHeaderOffset >= directoryOffset ||
124
129
  flags & ENCRYPTED_FLAG || (method !== STORED && method !== DEFLATED) ||
125
130
  compressedSize === 0xffffffff || uncompressedSize === 0xffffffff || localHeaderOffset === 0xffffffff) {
@@ -144,7 +149,7 @@ export function readZipEntries(content) {
144
149
  }
145
150
  names.add(name.toLowerCase());
146
151
  entries.push({
147
- name, method, compressedSize, uncompressedSize, localHeaderOffset, dataOffset: span.dataStart,
152
+ name, method, compressedSize, uncompressedSize, localHeaderOffset, dataOffset: span.dataStart, symlink,
148
153
  });
149
154
  spans.push({ start: localHeaderOffset, end: span.end });
150
155
  position = next;
@@ -163,6 +168,28 @@ export function readZipEntries(content) {
163
168
  }
164
169
  return covered === directoryOffset ? entries : null;
165
170
  }
171
+ /**
172
+ * Whether the central directory marks any entry as encrypted, for telling a password-protected
173
+ * archive apart from a malformed one after {@link readZipEntries} returned null.
174
+ */
175
+ export function hasEncryptedZipEntry(content) {
176
+ const eocd = findEndOfCentralDirectory(content);
177
+ if (eocd < 0) {
178
+ return false;
179
+ }
180
+ const directoryEnd = Math.min(eocd, content.readUInt32LE(eocd + 16) + content.readUInt32LE(eocd + 12));
181
+ let position = content.readUInt32LE(eocd + 16);
182
+ for (let index = 0; index < content.readUInt16LE(eocd + 10); index++) {
183
+ if (position + CENTRAL_HEADER_SIZE > directoryEnd || content.readUInt32LE(position) !== CENTRAL_HEADER_SIGNATURE) {
184
+ return false;
185
+ }
186
+ if (content.readUInt16LE(position + 8) & ENCRYPTED_FLAG) {
187
+ return true;
188
+ }
189
+ position += CENTRAL_HEADER_SIZE + content.readUInt16LE(position + 28) + content.readUInt16LE(position + 30) + content.readUInt16LE(position + 32);
190
+ }
191
+ return false;
192
+ }
166
193
  /**
167
194
  * The uncompressed bytes of an entry from {@link readZipEntries}, or null when
168
195
  * they do not inflate or exceed `maxBytes`.
@@ -1 +1 @@
1
- {"version":3,"file":"zip-entries.js","sourceRoot":"","sources":["../src/zip-entries.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"zip-entries.js","sourceRoot":"","sources":["../src/zip-entries.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "upload-safety",
3
- "version": "0.2.1",
4
- "description": "Server-side upload checks for Node: extension/MIME allowlist, magic bytes, refusal of macros, embedded objects, DDE, PDF scripts, CSV formulas and encrypted files, metadata stripping for JPEG, PNG, WebP, HEIC and AVIF.",
3
+ "version": "0.4.0",
4
+ "description": "Server-side upload checks for Node: extension/MIME allowlist, magic bytes, refusal of macros, embedded objects, DDE, PDF scripts, CSV formulas and encrypted files, metadata stripping for photos, audio and video, and opt-in RTF and archive checks.",
5
5
  "keywords": [
6
6
  "upload",
7
7
  "file-upload",
@@ -18,7 +18,10 @@
18
18
  "heic",
19
19
  "webp",
20
20
  "avif",
21
- "csv-injection"
21
+ "csv-injection",
22
+ "rtf",
23
+ "zip",
24
+ "mp4"
22
25
  ],
23
26
  "license": "MIT",
24
27
  "author": "Simon Halimonov (https://www.simonhalimonov.com)",