upload-safety 0.2.1 → 0.3.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 (45) hide show
  1. package/README.md +38 -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/check-upload.js +1 -1
  7. package/dist/check-upload.js.map +1 -1
  8. package/dist/heif-metadata.d.ts +8 -0
  9. package/dist/heif-metadata.d.ts.map +1 -1
  10. package/dist/heif-metadata.js +1 -1
  11. package/dist/heif-metadata.js.map +1 -1
  12. package/dist/media-formats.d.ts +45 -0
  13. package/dist/media-formats.d.ts.map +1 -0
  14. package/dist/media-formats.js +457 -0
  15. package/dist/media-formats.js.map +1 -0
  16. package/dist/photo-metadata.d.ts +4 -2
  17. package/dist/photo-metadata.d.ts.map +1 -1
  18. package/dist/photo-metadata.js +29 -2
  19. package/dist/photo-metadata.js.map +1 -1
  20. package/dist/rtf-content.d.ts +12 -0
  21. package/dist/rtf-content.d.ts.map +1 -0
  22. package/dist/rtf-content.js +175 -0
  23. package/dist/rtf-content.js.map +1 -0
  24. package/dist/upload-allowlist.d.ts +19 -8
  25. package/dist/upload-allowlist.d.ts.map +1 -1
  26. package/dist/upload-allowlist.js +119 -23
  27. package/dist/upload-allowlist.js.map +1 -1
  28. package/dist/video-formats.d.ts +24 -0
  29. package/dist/video-formats.d.ts.map +1 -0
  30. package/dist/video-formats.js +269 -0
  31. package/dist/video-formats.js.map +1 -0
  32. package/dist/zip-entries.d.ts +8 -0
  33. package/dist/zip-entries.d.ts.map +1 -1
  34. package/dist/zip-entries.js +29 -2
  35. package/dist/zip-entries.js.map +1 -1
  36. package/package.json +6 -3
  37. package/src/archive-content.ts +306 -0
  38. package/src/check-upload.ts +1 -1
  39. package/src/heif-metadata.ts +2 -2
  40. package/src/media-formats.ts +478 -0
  41. package/src/photo-metadata.ts +30 -2
  42. package/src/rtf-content.ts +178 -0
  43. package/src/upload-allowlist.ts +145 -27
  44. package/src/video-formats.ts +287 -0
  45. package/src/zip-entries.ts +33 -3
@@ -0,0 +1,269 @@
1
+ /**
2
+ * Checks the structure of MP4, MOV, M4A and WebM 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 elements become `Void`
6
+ * elements of the same length.
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
+ /** The elements a cluster may hold; the first other ID ends a cluster of unknown size. */
120
+ const CLUSTER_CHILDREN = new Set([0xe7, 0x5854, 0xa7, 0xab, 0xa3, 0xa0, 0xaf, VOID, 0xbf]);
121
+ const MAX_VINT_LENGTH = 8;
122
+ /** The EBML element at `offset` within `[offset, limit)`, or null when its header or size does not read. */
123
+ function readElement(bytes, offset, limit) {
124
+ if (offset >= limit) {
125
+ return null;
126
+ }
127
+ const idLength = Math.clz32(bytes[offset]) - 23;
128
+ const sizeOffset = offset + idLength;
129
+ if (idLength < 1 || idLength > 4 || sizeOffset >= limit) {
130
+ return null;
131
+ }
132
+ const sizeLength = Math.clz32(bytes[sizeOffset]) - 23;
133
+ const data = sizeOffset + sizeLength;
134
+ if (sizeLength < 1 || sizeLength > MAX_VINT_LENGTH || data > limit) {
135
+ return null;
136
+ }
137
+ let size = BigInt(bytes[sizeOffset] & (0xff >> sizeLength));
138
+ for (let index = 1; index < sizeLength; index++) {
139
+ size = (size << 8n) | BigInt(bytes[sizeOffset + index]);
140
+ }
141
+ const id = bytes.readUIntBE(offset, idLength);
142
+ // All bits set means "unknown size".
143
+ if (size === (1n << BigInt(7 * sizeLength)) - 1n) {
144
+ return { id, start: offset, data, end: null };
145
+ }
146
+ return size > BigInt(limit - data) ? null : { id, start: offset, data, end: data + Number(size) };
147
+ }
148
+ /** The children of a master element, all of known size, or null when they do not read. */
149
+ function readChildren(bytes, parent) {
150
+ const children = [];
151
+ for (let offset = parent.data; offset < parent.end;) {
152
+ const child = readElement(bytes, offset, parent.end);
153
+ if (!child || child.end === null || children.length === MAX_ELEMENTS) {
154
+ return null;
155
+ }
156
+ children.push(child);
157
+ offset = child.end;
158
+ }
159
+ return children;
160
+ }
161
+ /** Where a cluster of unknown size ends: at the first element that is not a cluster child, or at `limit`. */
162
+ function findClusterEnd(bytes, cluster, limit) {
163
+ let offset = cluster.data;
164
+ while (offset < limit) {
165
+ const child = readElement(bytes, offset, limit);
166
+ if (!child) {
167
+ return null;
168
+ }
169
+ if (!CLUSTER_CHILDREN.has(child.id)) {
170
+ return offset;
171
+ }
172
+ if (child.end === null) {
173
+ return null;
174
+ }
175
+ offset = child.end;
176
+ }
177
+ return limit;
178
+ }
179
+ /** The smallest EBML size field that makes a `Void` element exactly `total` bytes, or null when none fits. */
180
+ function voidElement(total) {
181
+ for (let width = 1; width <= MAX_VINT_LENGTH; width++) {
182
+ const payload = total - 1 - width;
183
+ // An all-ones size means "unknown", so the largest value of each width is not usable.
184
+ if (payload >= 0 && BigInt(payload) < (1n << BigInt(7 * width)) - 1n) {
185
+ return Buffer.concat([Buffer.from([VOID]), sizeBytes(payload, width), Buffer.alloc(payload)]);
186
+ }
187
+ }
188
+ return null;
189
+ }
190
+ /** An EBML size of `width` bytes holding `value`. */
191
+ function sizeBytes(value, width) {
192
+ const bytes = Buffer.alloc(width);
193
+ let rest = BigInt(value) | (1n << BigInt(7 * width));
194
+ for (let index = width - 1; index >= 0; index--) {
195
+ bytes[index] = Number(rest & 0xffn);
196
+ rest >>= 8n;
197
+ }
198
+ return bytes;
199
+ }
200
+ /**
201
+ * The WebM file with its Tags, Attachments and Title overwritten by `Void` elements of the same
202
+ * length, the input itself when there was nothing to remove, or null when it is not a WebM
203
+ * (`matroska` is refused) or its elements do not read. A cluster of unknown size, as live
204
+ * recorders write, ends at the first element a cluster cannot hold.
205
+ */
206
+ export function stripWebm(content) {
207
+ const header = readElement(content, 0, content.length);
208
+ if (!header || header.id !== EBML_HEADER || header.end === null) {
209
+ return null;
210
+ }
211
+ const headerChildren = readChildren(content, header);
212
+ const docType = headerChildren?.find((child) => child.id === DOC_TYPE);
213
+ if (!docType || content.toString('latin1', docType.data, docType.end).replace(/\0+$/, '') !== WEBM_DOC_TYPE) {
214
+ return null;
215
+ }
216
+ const segment = readElement(content, header.end, content.length);
217
+ if (!segment || segment.id !== SEGMENT || (segment.end ?? content.length) !== content.length) {
218
+ return null;
219
+ }
220
+ const segmentEnd = content.length;
221
+ const voids = [];
222
+ let hasInfo = false;
223
+ let hasTracks = false;
224
+ let count = 0;
225
+ for (let offset = segment.data; offset < segmentEnd;) {
226
+ const element = readElement(content, offset, segmentEnd);
227
+ if (!element || ++count > MAX_ELEMENTS) {
228
+ return null;
229
+ }
230
+ let end = element.end;
231
+ if (end === null) {
232
+ end = element.id === CLUSTER ? findClusterEnd(content, element, segmentEnd) : null;
233
+ if (end === null) {
234
+ return null;
235
+ }
236
+ }
237
+ if (element.id === TAGS || element.id === ATTACHMENTS) {
238
+ voids.push([element.start, end]);
239
+ }
240
+ else if (element.id === INFO) {
241
+ hasInfo = true;
242
+ const children = readChildren(content, { ...element, end });
243
+ if (!children) {
244
+ return null;
245
+ }
246
+ voids.push(...children.filter((child) => child.id === TITLE).map((child) => [child.start, child.end]));
247
+ }
248
+ else if (element.id === TRACKS) {
249
+ hasTracks = true;
250
+ }
251
+ offset = end;
252
+ }
253
+ if (!hasInfo || !hasTracks) {
254
+ return null;
255
+ }
256
+ if (voids.length === 0) {
257
+ return content;
258
+ }
259
+ const stripped = Buffer.from(content);
260
+ for (const [start, end] of voids) {
261
+ const element = voidElement(end - start);
262
+ if (!element) {
263
+ return null;
264
+ }
265
+ element.copy(stripped, start);
266
+ }
267
+ return stripped;
268
+ }
269
+ //# 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.3.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)",