upload-safety 0.1.0 → 0.2.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.
@@ -1,14 +1,16 @@
1
1
  /**
2
2
  * Strict allowlist + validation for document uploads: PDF, MS Office (also the
3
- * legacy formats), LibreOffice, and JPG/PNG. Validation happens on three axes: file
3
+ * legacy formats), LibreOffice, photos (JPEG, PNG, WebP, HEIC/HEIF, AVIF) and CSV and text. Validation happens on three axes: file
4
4
  * extension, declared MIME type, and the actual content, i.e. the magic-byte
5
5
  * signature plus the parts a file of that kind always has. Extension and MIME
6
6
  * alone are trivially spoofed.
7
7
  */
8
8
  import { inspectExcelGlobals } from './excel-macro-sheets.js';
9
+ import { readFtypBrands } from './heif-metadata.js';
9
10
  import { readOleDirectory } from './ole-streams.js';
10
11
  import { inspectPdf } from './pdf-active-content.js';
11
12
  import { hasPowerPointCode, isEncryptedPowerPoint } from './powerpoint-vba.js';
13
+ import { inspectText } from './text-content.js';
12
14
  import { stripXmlMarkup } from './xml-markup.js';
13
15
  import { readZipEntries, readZipEntryData, startsWithBytes } from './zip-entries.js';
14
16
  const ooxml = (mainPart) => ['[content_types].xml', mainPart];
@@ -303,6 +305,8 @@ const ODT = 'application/vnd.oasis.opendocument.text';
303
305
  const ODS = 'application/vnd.oasis.opendocument.spreadsheet';
304
306
  const ODP = 'application/vnd.oasis.opendocument.presentation';
305
307
  const JPEG = { magic: 'jpeg', mimeTypes: ['image/jpeg', 'image/pjpeg'] };
308
+ // HEIC is HEIF with HEVC images; `mif1` names HEIF without saying which codec. Sequences (`msf1`, `hevc`, `hevx`, `avis`) are left out.
309
+ const HEVC_BRANDS = ['heic', 'heix', 'heim', 'heis'];
306
310
  // OOXML (docx/xlsx/pptx) and OpenDocument (odt/ods/odp) files are ZIP
307
311
  // containers; legacy Office formats (doc/xls/ppt) are OLE compound files.
308
312
  const ALLOWED_TYPES = [
@@ -346,6 +350,15 @@ const ALLOWED_TYPES = [
346
350
  { extension: 'jpg', ...JPEG },
347
351
  { extension: 'jpeg', ...JPEG },
348
352
  { extension: 'png', magic: 'png', mimeTypes: ['image/png'] },
353
+ { extension: 'webp', magic: 'webp', mimeTypes: ['image/webp'] },
354
+ { extension: 'heic', magic: 'isobmff', mimeTypes: ['image/heic'], brands: HEVC_BRANDS },
355
+ { extension: 'heif', magic: 'isobmff', mimeTypes: ['image/heif', 'image/heic'], brands: [...HEVC_BRANDS, 'mif1'] },
356
+ { extension: 'avif', magic: 'isobmff', mimeTypes: ['image/avif'], brands: ['avif'] },
357
+ // Windows names the type of a CSV file after Excel.
358
+ {
359
+ extension: 'csv', magic: 'text', mimeTypes: ['text/csv', 'application/vnd.ms-excel', 'application/csv', 'text/x-csv', 'text/comma-separated-values', 'text/plain'],
360
+ },
361
+ { extension: 'txt', magic: 'text', mimeTypes: ['text/plain'] },
349
362
  ];
350
363
  const TYPE_BY_EXTENSION = new Map(ALLOWED_TYPES.map((type) => [type.extension, type]));
351
364
  export const ALLOWED_EXTENSIONS = ALLOWED_TYPES.map((type) => type.extension);
@@ -460,6 +473,12 @@ const MAGIC_SIGNATURES = {
460
473
  jpeg: (bytes) => startsWith(bytes, [0xff, 0xd8, 0xff]),
461
474
  // "\x89PNG\r\n\x1A\n"
462
475
  png: (bytes) => startsWith(bytes, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]),
476
+ // "RIFF", the size, "WEBP"
477
+ webp: (bytes) => startsWith(bytes, [0x52, 0x49, 0x46, 0x46]) && bytes.length >= 12 &&
478
+ startsWith(bytes.subarray(8), [0x57, 0x45, 0x42, 0x50]),
479
+ // A box size, then "ftyp"
480
+ isobmff: (bytes) => bytes.length >= 8 && startsWith(bytes.subarray(4), [0x66, 0x74, 0x79, 0x70]),
481
+ text: () => true,
463
482
  };
464
483
  /**
465
484
  * Checks once that a file's bytes are what `extension` claims: the signature
@@ -480,6 +499,13 @@ export function inspectFileContent(extension, bytes) {
480
499
  if (allowed.oleStreams) {
481
500
  return inspectOleFile(content, allowed.extension, allowed.oleStreams);
482
501
  }
502
+ if (allowed.magic === 'text') {
503
+ return inspectText(content, allowed.extension === 'csv');
504
+ }
505
+ if (allowed.brands) {
506
+ const brands = readFtypBrands(content);
507
+ return allowed.brands.some((brand) => brands.includes(brand)) ? 'valid' : 'mismatch';
508
+ }
483
509
  if (!allowed.zipEntries) {
484
510
  return 'valid';
485
511
  }
@@ -1 +1 @@
1
- {"version":3,"file":"upload-allowlist.js","sourceRoot":"","sources":["../src/upload-allowlist.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"upload-allowlist.js","sourceRoot":"","sources":["../src/upload-allowlist.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.1.0",
4
- "description": "Server-side upload checks for Node: extension/MIME allowlist, magic bytes, refusal of macros, embedded objects, DDE, PDF scripts and encrypted files, photo metadata stripping.",
3
+ "version": "0.2.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 JPEG, PNG, WebP, HEIC and AVIF.",
5
5
  "keywords": [
6
6
  "upload",
7
7
  "file-upload",
@@ -14,7 +14,11 @@
14
14
  "ooxml",
15
15
  "pdf",
16
16
  "exif",
17
- "metadata"
17
+ "metadata",
18
+ "heic",
19
+ "webp",
20
+ "avif",
21
+ "csv-injection"
18
22
  ],
19
23
  "license": "MIT",
20
24
  "author": "Simon Halimonov (https://www.simonhalimonov.com)",
@@ -0,0 +1,232 @@
1
+ /**
2
+ * Removes EXIF and XMP from a HEIF still image (HEIC, AVIF) without moving a byte. The item
3
+ * locations are byte offsets that dropping data would shift, so the items are overwritten in
4
+ * place instead: EXIF with an empty TIFF block, XMP with spaces. The orientation lives in the
5
+ * `irot` and `imir` properties, which stay. Image sequences (`moov`) are refused.
6
+ */
7
+
8
+ interface Box {
9
+ type: string;
10
+ /** Where the box's content starts, past its header. */
11
+ start: number;
12
+ end: number;
13
+ }
14
+
15
+ /** Bounds far above real files that keep a crafted one cheap. */
16
+ const MAX_BOXES = 10_000;
17
+ const MAX_ITEMS = 100_000;
18
+
19
+ const XMP_CONTENT_TYPE = 'application/rdf+xml';
20
+ /** An EXIF item: the offset of the TIFF header (0), then a big-endian TIFF block with an empty IFD0. */
21
+ const EMPTY_EXIF = Buffer.from( '00000000' + '4d4d002a00000008' + '0000' + '00000000', 'hex' );
22
+ const SPACE = 0x20;
23
+
24
+ /** The boxes in `[start, end)`, or null when one runs past it or there are too many. */
25
+ function readBoxes( bytes: Buffer, start: number, end: number ): Box[] | null {
26
+ const boxes: Box[] = [];
27
+ for ( let offset = start; offset < end; ) {
28
+ if ( offset + 8 > end || boxes.length === MAX_BOXES ) {
29
+ return null;
30
+ }
31
+ let size = bytes.readUInt32BE( offset );
32
+ let header = 8;
33
+ if ( size === 1 ) {
34
+ const large = offset + 16 <= end ? bytes.readBigUInt64BE( offset + 8 ) : undefined;
35
+ if ( large === undefined || large > BigInt( end - offset ) ) {
36
+ return null;
37
+ }
38
+ size = Number( large );
39
+ header = 16;
40
+ } else if ( size === 0 ) {
41
+ // Runs to the end of the file.
42
+ size = end - offset;
43
+ }
44
+ const type = bytes.toString( 'latin1', offset + 4, offset + 8 );
45
+ header += type === 'uuid' ? 16 : 0;
46
+ if ( size < header || offset + size > end ) {
47
+ return null;
48
+ }
49
+ boxes.push( { type, start: offset + header, end: offset + size } );
50
+ offset += size;
51
+ }
52
+ return boxes;
53
+ }
54
+
55
+ /** Reads the fields of a box's content in order; any read past its end throws. */
56
+ class FieldReader {
57
+ position: number;
58
+ private readonly bytes: Buffer;
59
+ private readonly end: number;
60
+
61
+ constructor( bytes: Buffer, box: Box ) {
62
+ this.bytes = bytes;
63
+ this.position = box.start;
64
+ this.end = box.end;
65
+ }
66
+
67
+ /** An unsigned big-endian integer of 0, 1, 2, 4 or 8 bytes. */
68
+ uint( size: number ): number {
69
+ if ( this.position + size > this.end ) {
70
+ throw new RangeError( 'Box field past its end' );
71
+ }
72
+ const value = size === 8 ? Number( this.bytes.readBigUInt64BE( this.position ) ) : size === 0 ? 0 : this.bytes.readUIntBE( this.position, size );
73
+ this.position += size;
74
+ return value;
75
+ }
76
+
77
+ text( length: number ): string {
78
+ if ( this.position + length > this.end ) {
79
+ throw new RangeError( 'Box field past its end' );
80
+ }
81
+ this.position += length;
82
+ return this.bytes.toString( 'latin1', this.position - length, this.position );
83
+ }
84
+
85
+ /** A NUL-terminated string, or the rest of the box when the NUL is missing. */
86
+ string(): string {
87
+ const nul = this.bytes.indexOf( 0, this.position );
88
+ const stop = nul < 0 || nul >= this.end ? this.end : nul;
89
+ const value = this.bytes.toString( 'utf8', this.position, stop );
90
+ this.position = Math.min( this.end, stop + 1 );
91
+ return value;
92
+ }
93
+ }
94
+
95
+ /** The IDs of the EXIF and XMP items an `iinf` box lists; throws a RangeError when it does not read. */
96
+ function readMetadataItems( bytes: Buffer, iinf: Box ): { exif: Set<number>; xmp: Set<number> } {
97
+ const reader = new FieldReader( bytes, iinf );
98
+ const version = reader.uint( 1 );
99
+ reader.uint( 3 );
100
+ reader.uint( version === 0 ? 2 : 4 );
101
+ const exif = new Set<number>();
102
+ const xmp = new Set<number>();
103
+ const entries = readBoxes( bytes, reader.position, iinf.end );
104
+ if ( ! entries ) {
105
+ throw new RangeError( 'Item entries do not read' );
106
+ }
107
+ for ( const infe of entries ) {
108
+ if ( infe.type !== 'infe' ) {
109
+ continue;
110
+ }
111
+ const entry = new FieldReader( bytes, infe );
112
+ const entryVersion = entry.uint( 1 );
113
+ entry.uint( 3 );
114
+ const id = entry.uint( entryVersion === 3 ? 4 : 2 );
115
+ entry.uint( 2 );
116
+ // Versions 0 and 1 describe a MIME item without naming its type.
117
+ const type = entryVersion >= 2 ? entry.text( 4 ) : 'mime';
118
+ entry.string();
119
+ if ( type === 'Exif' ) {
120
+ exif.add( id );
121
+ } else if ( type === 'mime' && entry.string().toLowerCase() === XMP_CONTENT_TYPE ) {
122
+ xmp.add( id );
123
+ }
124
+ }
125
+ return { exif, xmp };
126
+ }
127
+
128
+ /**
129
+ * Where the data of each item lies, as file offsets read from an `iloc` box, `[ -1, -1 ]` for an
130
+ * extent that cannot be located; throws a RangeError when the box does not read.
131
+ */
132
+ function readItemLocations( bytes: Buffer, iloc: Box, idat: Box | undefined ): Map<number, Array<[ number, number ]>> {
133
+ const reader = new FieldReader( bytes, iloc );
134
+ const version = reader.uint( 1 );
135
+ reader.uint( 3 );
136
+ const sizes = reader.uint( 2 );
137
+ const offsetSize = sizes >> 12;
138
+ const lengthSize = ( sizes >> 8 ) & 0xf;
139
+ const baseOffsetSize = ( sizes >> 4 ) & 0xf;
140
+ const indexSize = version === 0 ? 0 : sizes & 0xf;
141
+ const itemCount = reader.uint( version < 2 ? 2 : 4 );
142
+ if ( itemCount > MAX_ITEMS ) {
143
+ throw new RangeError( 'Too many items' );
144
+ }
145
+ const locations = new Map<number, Array<[ number, number ]>>();
146
+ for ( let item = 0; item < itemCount; item++ ) {
147
+ const id = reader.uint( version < 2 ? 2 : 4 );
148
+ const method = version === 0 ? 0 : reader.uint( 2 ) & 0xf;
149
+ const dataReference = reader.uint( 2 );
150
+ const baseOffset = reader.uint( baseOffsetSize );
151
+ const extentCount = reader.uint( 2 );
152
+ const extents: Array<[ number, number ]> = [];
153
+ for ( let extent = 0; extent < extentCount; extent++ ) {
154
+ reader.uint( indexSize );
155
+ const offset = reader.uint( offsetSize );
156
+ const length = reader.uint( lengthSize );
157
+ // Method 0 points into the file, 1 into the `idat` box; 2 (other items) and other files are not read.
158
+ const origin = method === 0 && dataReference === 0 ? 0 : method === 1 ? idat?.start : undefined;
159
+ const start = origin === undefined ? -1 : origin + baseOffset + offset;
160
+ const limit = method === 1 ? idat?.end ?? -1 : bytes.length;
161
+ extents.push( start < 0 || length === 0 || start + length > limit ? [ -1, -1 ] : [ start, start + length ] );
162
+ }
163
+ locations.set( id, [ ...( locations.get( id ) ?? [] ), ...extents ] );
164
+ }
165
+ return locations;
166
+ }
167
+
168
+ /** Writes `data`, padded with `fill`, over the extents in order. */
169
+ function overwrite( bytes: Buffer, extents: Array<[ number, number ]>, data: Buffer, fill: number ): void {
170
+ let written = 0;
171
+ for ( const [ start, end ] of extents ) {
172
+ bytes.fill( fill, start, end );
173
+ written += data.copy( bytes, start, Math.min( written, data.length ), Math.min( data.length, written + end - start ) );
174
+ }
175
+ }
176
+
177
+ /**
178
+ * The HEIF image with its EXIF and XMP items overwritten, or null when its boxes do not read,
179
+ * an item's data cannot be located, or it is an image sequence.
180
+ */
181
+ export function stripHeif( content: Buffer ): Buffer | null {
182
+ const boxes = readBoxes( content, 0, content.length );
183
+ if ( ! boxes || boxes[ 0 ]?.type !== 'ftyp' || boxes.some( ( box ) => box.type === 'moov' ) ) {
184
+ return null;
185
+ }
186
+ const metas = boxes.filter( ( box ) => box.type === 'meta' );
187
+ // `meta` is a full box: version and flags come before its children.
188
+ const children = metas.length === 1 ? readBoxes( content, metas[ 0 ].start + 4, metas[ 0 ].end ) : null;
189
+ const iinf = children?.find( ( box ) => box.type === 'iinf' );
190
+ const iloc = children?.find( ( box ) => box.type === 'iloc' );
191
+ if ( ! iinf || ! iloc ) {
192
+ return null;
193
+ }
194
+ const stripped = Buffer.from( content );
195
+ try {
196
+ const { exif, xmp } = readMetadataItems( content, iinf );
197
+ const locations = readItemLocations( content, iloc, children!.find( ( box ) => box.type === 'idat' ) );
198
+ for ( const [ ids, data, fill ] of [ [ exif, EMPTY_EXIF, 0 ], [ xmp, Buffer.alloc( 0 ), SPACE ] ] as const ) {
199
+ for ( const id of ids ) {
200
+ const extents = locations.get( id ) ?? [];
201
+ if ( extents.some( ( [ start ] ) => start < 0 ) ) {
202
+ return null;
203
+ }
204
+ overwrite( stripped, extents, data, fill );
205
+ }
206
+ }
207
+ } catch ( error ) {
208
+ if ( error instanceof RangeError ) {
209
+ return null;
210
+ }
211
+ throw error;
212
+ }
213
+ // Top-level `uuid` boxes hold vendor data, such as XMP in some writers.
214
+ for ( const box of boxes.filter( ( box ) => box.type === 'uuid' ) ) {
215
+ stripped.fill( 0, box.start, box.end );
216
+ }
217
+ return stripped;
218
+ }
219
+
220
+ /** The major and compatible brands of a file's leading `ftyp` box, empty when there is none. */
221
+ export function readFtypBrands( content: Buffer ): string[] {
222
+ const size = content.length >= 16 ? content.readUInt32BE( 0 ) : 0;
223
+ if ( size < 16 || size > content.length || content.toString( 'latin1', 4, 8 ) !== 'ftyp' ) {
224
+ return [];
225
+ }
226
+ // The minor version sits between the major brand and the compatible ones.
227
+ const brands = [ content.toString( 'latin1', 8, 12 ) ];
228
+ for ( let offset = 16; offset + 4 <= size; offset += 4 ) {
229
+ brands.push( content.toString( 'latin1', offset, offset + 4 ) );
230
+ }
231
+ return brands;
232
+ }
@@ -1,12 +1,15 @@
1
1
  /**
2
2
  * Removes what a photo tells about where, when and with what it was taken (EXIF with GPS,
3
- * XMP, IPTC, comments) without decoding it: JPEG segments and PNG chunks are dropped whole,
4
- * so the image data stays byte for byte. Only the orientation is written back, since without
5
- * it a portrait photo from a phone opens on its side.
3
+ * XMP, IPTC, comments) without decoding it: JPEG segments and PNG and WebP chunks are dropped
4
+ * whole, so the image data stays byte for byte. Only the orientation is written back, since
5
+ * without it a portrait photo from a phone opens on its side. HEIF images are handled in
6
+ * `heif-metadata.ts`.
6
7
  */
7
8
 
8
9
  import { crc32 } from 'node:zlib';
9
10
 
11
+ import { stripHeif } from './heif-metadata.js';
12
+
10
13
  import type { AllowedExtension } from './upload-allowlist.js';
11
14
 
12
15
  const ORIENTATION_TAG = 0x0112;
@@ -39,6 +42,15 @@ const PNG_IMAGE_CHUNKS = new Set( [
39
42
  'bKGD', 'hIST', 'pHYs', 'sPLT', 'acTL', 'fcTL', 'fdAT',
40
43
  ] );
41
44
 
45
+ const WEBP_HEADER_SIZE = 12;
46
+ const RIFF_CHUNK_HEADER_SIZE = 8;
47
+ // The chunks that draw the image, as for PNG; EXIF, XMP and any other chunk may carry metadata.
48
+ const WEBP_IMAGE_CHUNKS = new Set( [ 'VP8X', 'VP8 ', 'VP8L', 'ALPH', 'ANIM', 'ANMF', 'ICCP' ] );
49
+ const WEBP_BITSTREAM_CHUNKS = new Set( [ 'VP8 ', 'VP8L', 'ANMF' ] );
50
+ /** VP8X flags of the metadata chunks, in the first byte of its payload. */
51
+ const VP8X_EXIF = 0x08;
52
+ const VP8X_XMP = 0x04;
53
+
42
54
  /** The orientation (1 to 8) in IFD0 of a TIFF block, or undefined when there is none or it does not read. */
43
55
  function readOrientation( tiff: Buffer ): number | undefined {
44
56
  const order = tiff.toString( 'latin1', 0, 2 );
@@ -223,8 +235,74 @@ function stripPng( bytes: Buffer ): Buffer | null {
223
235
  return null;
224
236
  }
225
237
 
238
+ function riffChunk( type: string, payload: Buffer ): Buffer {
239
+ const chunk = Buffer.alloc( RIFF_CHUNK_HEADER_SIZE + payload.length + ( payload.length & 1 ) );
240
+ chunk.write( type, 0, 'latin1' );
241
+ chunk.writeUInt32LE( payload.length, 4 );
242
+ payload.copy( chunk, RIFF_CHUNK_HEADER_SIZE );
243
+ return chunk;
244
+ }
245
+
246
+ /**
247
+ * The WebP without metadata chunks, or null when its chunks do not read or none draws the image.
248
+ * Bytes after the RIFF size are cut off. The orientation needs the extended format (VP8X) to be
249
+ * written back, as a simple WebP cannot hold EXIF at all.
250
+ */
251
+ function stripWebp( bytes: Buffer ): Buffer | null {
252
+ if ( bytes.length < WEBP_HEADER_SIZE || bytes.toString( 'latin1', 0, 4 ) !== 'RIFF' || bytes.toString( 'latin1', 8, 12 ) !== 'WEBP' ) {
253
+ return null;
254
+ }
255
+ const end = RIFF_CHUNK_HEADER_SIZE + bytes.readUInt32LE( 4 );
256
+ if ( end > bytes.length ) {
257
+ return null;
258
+ }
259
+ const chunks: Buffer[] = [];
260
+ let extended: { index: number; flags: Buffer } | undefined;
261
+ let orientation: number | undefined;
262
+ let drawn = false;
263
+ for ( let offset = WEBP_HEADER_SIZE; offset < end; ) {
264
+ const dataStart = offset + RIFF_CHUNK_HEADER_SIZE;
265
+ const dataEnd = dataStart + ( dataStart <= end ? bytes.readUInt32LE( offset + 4 ) : 0 );
266
+ if ( dataStart > end || dataEnd > end ) {
267
+ return null;
268
+ }
269
+ const type = bytes.toString( 'latin1', offset, offset + 4 );
270
+ const payload = bytes.subarray( dataStart, dataEnd );
271
+ if ( type === 'EXIF' ) {
272
+ // The format wants the TIFF block alone; some writers put the JPEG `Exif` header first.
273
+ orientation ??= readOrientation( payload.subarray( 0, EXIF_HEADER.length ).equals( EXIF_HEADER ) ? payload.subarray( EXIF_HEADER.length ) : payload );
274
+ }
275
+ if ( WEBP_IMAGE_CHUNKS.has( type ) ) {
276
+ if ( type === 'VP8X' ) {
277
+ extended ??= { index: chunks.length, flags: Buffer.from( payload ) };
278
+ }
279
+ chunks.push( riffChunk( type, payload ) );
280
+ drawn ||= WEBP_BITSTREAM_CHUNKS.has( type );
281
+ }
282
+ offset = dataEnd + ( ( dataEnd - dataStart ) & 1 );
283
+ }
284
+ if ( ! drawn ) {
285
+ return null;
286
+ }
287
+ if ( extended?.flags.length ) {
288
+ const { index, flags } = extended;
289
+ const writesOrientation = orientation !== undefined && orientation !== UPRIGHT;
290
+ flags[ 0 ] = ( flags[ 0 ] & ~( VP8X_EXIF | VP8X_XMP ) ) | ( writesOrientation ? VP8X_EXIF : 0 );
291
+ chunks[ index ] = riffChunk( 'VP8X', flags );
292
+ if ( writesOrientation ) {
293
+ // EXIF goes after the image data.
294
+ chunks.push( riffChunk( 'EXIF', orientationTiff( orientation! ) ) );
295
+ }
296
+ }
297
+ const header = Buffer.alloc( WEBP_HEADER_SIZE );
298
+ header.write( 'RIFF', 0, 'latin1' );
299
+ header.writeUInt32LE( 4 + chunks.reduce( ( sum, chunk ) => sum + chunk.length, 0 ), 4 );
300
+ header.write( 'WEBP', 8, 'latin1' );
301
+ return Buffer.concat( [ header, ...chunks ] );
302
+ }
303
+
226
304
  /**
227
- * The bytes to store for an upload: a JPEG or PNG without its metadata, any other file
305
+ * The bytes to store for an upload: a photo without its metadata, any other file
228
306
  * unchanged; null for a photo whose structure does not read.
229
307
  */
230
308
  export function stripPhotoMetadata( extension: AllowedExtension, bytes: Uint8Array ): Uint8Array | null {
@@ -235,6 +313,12 @@ export function stripPhotoMetadata( extension: AllowedExtension, bytes: Uint8Arr
235
313
  return stripJpeg( content );
236
314
  case 'png':
237
315
  return stripPng( content );
316
+ case 'webp':
317
+ return stripWebp( content );
318
+ case 'heic':
319
+ case 'heif':
320
+ case 'avif':
321
+ return stripHeif( content );
238
322
  default:
239
323
  return bytes;
240
324
  }
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Checks that a text upload is text, and that a CSV file holds no formula that runs something
3
+ * when Excel or another spreadsheet opens it (CSV injection).
4
+ */
5
+
6
+ const UTF16LE_BOM = [ 0xff, 0xfe ];
7
+ const UTF16BE_BOM = [ 0xfe, 0xff ];
8
+ const UTF8_BOM = '';
9
+ // Text has tabs, line breaks and form feeds, but no other control characters; NUL marks UTF-16 without a byte order mark or binary data.
10
+ const CONTROL_CHARACTER = /[\0-\x08\x0b\x0e-\x1f\x7f]/;
11
+ // Excel and others evaluate a cell that starts with one of these (after spaces, tabs or quotes).
12
+ const FORMULA_START = /^[\s"]*[=+\-@]/;
13
+ // A formula runs something through a function call (HYPERLINK, WEBSERVICE) or a DDE source (`cmd|'/c calc'!A1`).
14
+ // Excel allows no space between a function and its parenthesis, so numbers such as `-5`, `+49 (30) 1234` or
15
+ // `+66 2 550 6555; Counter (Gate A)` and plain arithmetic stay allowed.
16
+ const FUNCTION_CALL_OR_DDE = /[A-Za-z_][\w.]*\(|\|/;
17
+ // Splitting on every common delimiter at once only finds more cell starts than a spreadsheet would.
18
+ const CELL_DELIMITERS = /[,;\t\r\n]/g;
19
+
20
+ function startsWith( bytes: Uint8Array, signature: number[] ): boolean {
21
+ return signature.every( ( byte, index ) => bytes[ index ] === byte );
22
+ }
23
+
24
+ /** The text of an upload: UTF-16 by its byte order mark, else UTF-8, else Latin-1 (as Windows code pages read). */
25
+ function decodeText( bytes: Uint8Array ): string {
26
+ if ( startsWith( bytes, UTF16LE_BOM ) || startsWith( bytes, UTF16BE_BOM ) ) {
27
+ const encoding = startsWith( bytes, UTF16LE_BOM ) ? 'utf-16le' : 'utf-16be';
28
+ try {
29
+ return new TextDecoder( encoding, { fatal: true } ).decode( bytes );
30
+ } catch {
31
+ return '\0';
32
+ }
33
+ }
34
+ try {
35
+ return new TextDecoder( 'utf-8', { fatal: true, ignoreBOM: true } ).decode( bytes ).replace( UTF8_BOM, '' );
36
+ } catch {
37
+ return Buffer.from( bytes.buffer, bytes.byteOffset, bytes.byteLength ).toString( 'latin1' );
38
+ }
39
+ }
40
+
41
+ /** The cells of a CSV text, unquoted, split on any common delimiter; quoted cells may span lines. */
42
+ function* readCells( text: string ): Generator<string> {
43
+ let position = 0;
44
+ while ( position <= text.length ) {
45
+ let cell = '';
46
+ if ( text[ position ] === '"' ) {
47
+ position++;
48
+ for ( ;; ) {
49
+ const close = text.indexOf( '"', position );
50
+ if ( close < 0 ) {
51
+ cell += text.slice( position );
52
+ position = text.length;
53
+ break;
54
+ }
55
+ cell += text.slice( position, close );
56
+ position = close + 1;
57
+ if ( text[ position ] !== '"' ) {
58
+ break;
59
+ }
60
+ cell += '"';
61
+ position++;
62
+ }
63
+ }
64
+ CELL_DELIMITERS.lastIndex = position;
65
+ const end = CELL_DELIMITERS.exec( text )?.index ?? text.length;
66
+ yield cell + text.slice( position, end );
67
+ position = end + 1;
68
+ }
69
+ }
70
+
71
+ /** Whether a text upload is text, and for CSV free of formulas that call a function or DDE. */
72
+ export function inspectText( bytes: Uint8Array, csv: boolean ): 'valid' | 'macros' | 'mismatch' {
73
+ const text = decodeText( bytes );
74
+ if ( CONTROL_CHARACTER.test( text ) ) {
75
+ return 'mismatch';
76
+ }
77
+ if ( csv ) {
78
+ for ( const cell of readCells( text ) ) {
79
+ if ( FORMULA_START.test( cell ) && FUNCTION_CALL_OR_DDE.test( cell ) ) {
80
+ return 'macros';
81
+ }
82
+ }
83
+ }
84
+ return 'valid';
85
+ }