express-storage 2.0.2 → 3.0.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 (177) hide show
  1. package/README.md +366 -34
  2. package/dist/cjs/config/index.d.ts +10 -0
  3. package/dist/cjs/config/index.d.ts.map +1 -0
  4. package/dist/cjs/config/index.js +19 -0
  5. package/dist/cjs/config/index.js.map +1 -0
  6. package/dist/cjs/drivers/azure.driver.d.ts +73 -0
  7. package/dist/cjs/drivers/azure.driver.d.ts.map +1 -0
  8. package/dist/cjs/drivers/azure.driver.js +390 -0
  9. package/dist/cjs/drivers/azure.driver.js.map +1 -0
  10. package/dist/cjs/drivers/base.driver.d.ts +136 -0
  11. package/dist/cjs/drivers/base.driver.d.ts.map +1 -0
  12. package/dist/cjs/drivers/base.driver.js +357 -0
  13. package/dist/cjs/drivers/base.driver.js.map +1 -0
  14. package/dist/{drivers → cjs/drivers}/gcs.driver.d.ts +20 -38
  15. package/dist/cjs/drivers/gcs.driver.d.ts.map +1 -0
  16. package/dist/cjs/drivers/gcs.driver.js +343 -0
  17. package/dist/cjs/drivers/gcs.driver.js.map +1 -0
  18. package/dist/cjs/drivers/index.d.ts +15 -0
  19. package/dist/cjs/drivers/index.d.ts.map +1 -0
  20. package/dist/cjs/drivers/index.js +26 -0
  21. package/dist/cjs/drivers/index.js.map +1 -0
  22. package/dist/cjs/drivers/local.driver.d.ts +86 -0
  23. package/dist/cjs/drivers/local.driver.d.ts.map +1 -0
  24. package/dist/cjs/drivers/local.driver.js +556 -0
  25. package/dist/cjs/drivers/local.driver.js.map +1 -0
  26. package/dist/{drivers → cjs/drivers}/s3.driver.d.ts +19 -39
  27. package/dist/cjs/drivers/s3.driver.d.ts.map +1 -0
  28. package/dist/cjs/drivers/s3.driver.js +400 -0
  29. package/dist/cjs/drivers/s3.driver.js.map +1 -0
  30. package/dist/cjs/factory/driver.factory.d.ts +43 -0
  31. package/dist/cjs/factory/driver.factory.d.ts.map +1 -0
  32. package/dist/cjs/factory/driver.factory.js +101 -0
  33. package/dist/cjs/factory/driver.factory.js.map +1 -0
  34. package/dist/cjs/index.d.ts +26 -0
  35. package/dist/cjs/index.d.ts.map +1 -0
  36. package/dist/cjs/index.js +31 -0
  37. package/dist/cjs/index.js.map +1 -0
  38. package/dist/cjs/package.json +1 -0
  39. package/dist/cjs/storage-manager.d.ts +210 -0
  40. package/dist/cjs/storage-manager.d.ts.map +1 -0
  41. package/dist/cjs/storage-manager.js +649 -0
  42. package/dist/cjs/storage-manager.js.map +1 -0
  43. package/dist/cjs/types/storage.types.d.ts +438 -0
  44. package/dist/cjs/types/storage.types.d.ts.map +1 -0
  45. package/dist/cjs/types/storage.types.js +3 -0
  46. package/dist/cjs/types/storage.types.js.map +1 -0
  47. package/dist/cjs/utils/config.utils.d.ts.map +1 -0
  48. package/dist/cjs/utils/config.utils.js +213 -0
  49. package/dist/cjs/utils/config.utils.js.map +1 -0
  50. package/dist/{utils → cjs/utils}/file.utils.d.ts +62 -8
  51. package/dist/cjs/utils/file.utils.d.ts.map +1 -0
  52. package/dist/cjs/utils/file.utils.js +464 -0
  53. package/dist/cjs/utils/file.utils.js.map +1 -0
  54. package/dist/cjs/utils/index.d.ts +12 -0
  55. package/dist/cjs/utils/index.d.ts.map +1 -0
  56. package/dist/cjs/utils/index.js +36 -0
  57. package/dist/cjs/utils/index.js.map +1 -0
  58. package/dist/cjs/utils/rate-limiter.d.ts +40 -0
  59. package/dist/cjs/utils/rate-limiter.d.ts.map +1 -0
  60. package/dist/cjs/utils/rate-limiter.js +87 -0
  61. package/dist/cjs/utils/rate-limiter.js.map +1 -0
  62. package/dist/esm/config/index.d.ts +10 -0
  63. package/dist/esm/config/index.d.ts.map +1 -0
  64. package/dist/esm/config/index.js +10 -0
  65. package/dist/esm/config/index.js.map +1 -0
  66. package/dist/esm/drivers/azure.driver.d.ts +73 -0
  67. package/dist/esm/drivers/azure.driver.d.ts.map +1 -0
  68. package/dist/esm/drivers/azure.driver.js +353 -0
  69. package/dist/esm/drivers/azure.driver.js.map +1 -0
  70. package/dist/esm/drivers/base.driver.d.ts +136 -0
  71. package/dist/esm/drivers/base.driver.d.ts.map +1 -0
  72. package/dist/esm/drivers/base.driver.js +350 -0
  73. package/dist/esm/drivers/base.driver.js.map +1 -0
  74. package/dist/esm/drivers/gcs.driver.d.ts +68 -0
  75. package/dist/esm/drivers/gcs.driver.d.ts.map +1 -0
  76. package/dist/esm/drivers/gcs.driver.js +306 -0
  77. package/dist/esm/drivers/gcs.driver.js.map +1 -0
  78. package/dist/esm/drivers/index.d.ts +15 -0
  79. package/dist/esm/drivers/index.d.ts.map +1 -0
  80. package/dist/esm/drivers/index.js +15 -0
  81. package/dist/esm/drivers/index.js.map +1 -0
  82. package/dist/esm/drivers/local.driver.d.ts +86 -0
  83. package/dist/esm/drivers/local.driver.d.ts.map +1 -0
  84. package/dist/esm/drivers/local.driver.js +549 -0
  85. package/dist/esm/drivers/local.driver.js.map +1 -0
  86. package/dist/esm/drivers/s3.driver.d.ts +69 -0
  87. package/dist/esm/drivers/s3.driver.d.ts.map +1 -0
  88. package/dist/esm/drivers/s3.driver.js +363 -0
  89. package/dist/esm/drivers/s3.driver.js.map +1 -0
  90. package/dist/esm/factory/driver.factory.d.ts +43 -0
  91. package/dist/esm/factory/driver.factory.d.ts.map +1 -0
  92. package/dist/esm/factory/driver.factory.js +92 -0
  93. package/dist/esm/factory/driver.factory.js.map +1 -0
  94. package/dist/esm/index.d.ts +26 -0
  95. package/dist/esm/index.d.ts.map +1 -0
  96. package/dist/esm/index.js +26 -0
  97. package/dist/esm/index.js.map +1 -0
  98. package/dist/esm/package.json +1 -0
  99. package/dist/esm/storage-manager.d.ts +210 -0
  100. package/dist/esm/storage-manager.d.ts.map +1 -0
  101. package/dist/esm/storage-manager.js +645 -0
  102. package/dist/esm/storage-manager.js.map +1 -0
  103. package/dist/esm/types/storage.types.d.ts +438 -0
  104. package/dist/esm/types/storage.types.d.ts.map +1 -0
  105. package/dist/esm/types/storage.types.js.map +1 -0
  106. package/dist/esm/utils/config.utils.d.ts +45 -0
  107. package/dist/esm/utils/config.utils.d.ts.map +1 -0
  108. package/dist/esm/utils/config.utils.js.map +1 -0
  109. package/dist/esm/utils/file.utils.d.ts +196 -0
  110. package/dist/esm/utils/file.utils.d.ts.map +1 -0
  111. package/dist/esm/utils/file.utils.js +439 -0
  112. package/dist/esm/utils/file.utils.js.map +1 -0
  113. package/dist/esm/utils/index.d.ts +12 -0
  114. package/dist/esm/utils/index.d.ts.map +1 -0
  115. package/dist/esm/utils/index.js +11 -0
  116. package/dist/esm/utils/index.js.map +1 -0
  117. package/dist/esm/utils/rate-limiter.d.ts +40 -0
  118. package/dist/esm/utils/rate-limiter.d.ts.map +1 -0
  119. package/dist/esm/utils/rate-limiter.js +82 -0
  120. package/dist/esm/utils/rate-limiter.js.map +1 -0
  121. package/package.json +90 -52
  122. package/src/config/index.ts +17 -0
  123. package/src/drivers/azure.driver.ts +434 -0
  124. package/src/drivers/base.driver.ts +436 -0
  125. package/src/drivers/gcs.driver.ts +366 -0
  126. package/src/drivers/index.ts +15 -0
  127. package/src/drivers/local.driver.ts +626 -0
  128. package/src/drivers/s3.driver.ts +459 -0
  129. package/src/factory/driver.factory.ts +101 -0
  130. package/src/index.ts +72 -0
  131. package/src/storage-manager.ts +801 -0
  132. package/src/types/storage.types.ts +561 -0
  133. package/src/utils/config.utils.ts +229 -0
  134. package/src/utils/file.utils.ts +536 -0
  135. package/src/utils/index.ts +35 -0
  136. package/src/utils/rate-limiter.ts +94 -0
  137. package/dist/drivers/azure.driver.d.ts +0 -88
  138. package/dist/drivers/azure.driver.d.ts.map +0 -1
  139. package/dist/drivers/azure.driver.js +0 -391
  140. package/dist/drivers/azure.driver.js.map +0 -1
  141. package/dist/drivers/base.driver.d.ts +0 -170
  142. package/dist/drivers/base.driver.d.ts.map +0 -1
  143. package/dist/drivers/base.driver.js +0 -347
  144. package/dist/drivers/base.driver.js.map +0 -1
  145. package/dist/drivers/gcs.driver.d.ts.map +0 -1
  146. package/dist/drivers/gcs.driver.js +0 -354
  147. package/dist/drivers/gcs.driver.js.map +0 -1
  148. package/dist/drivers/local.driver.d.ts +0 -107
  149. package/dist/drivers/local.driver.d.ts.map +0 -1
  150. package/dist/drivers/local.driver.js +0 -621
  151. package/dist/drivers/local.driver.js.map +0 -1
  152. package/dist/drivers/s3.driver.d.ts.map +0 -1
  153. package/dist/drivers/s3.driver.js +0 -387
  154. package/dist/drivers/s3.driver.js.map +0 -1
  155. package/dist/factory/driver.factory.d.ts +0 -62
  156. package/dist/factory/driver.factory.d.ts.map +0 -1
  157. package/dist/factory/driver.factory.js +0 -177
  158. package/dist/factory/driver.factory.js.map +0 -1
  159. package/dist/index.d.ts +0 -30
  160. package/dist/index.d.ts.map +0 -1
  161. package/dist/index.js +0 -33
  162. package/dist/index.js.map +0 -1
  163. package/dist/storage-manager.d.ts +0 -228
  164. package/dist/storage-manager.d.ts.map +0 -1
  165. package/dist/storage-manager.js +0 -715
  166. package/dist/storage-manager.js.map +0 -1
  167. package/dist/types/storage.types.d.ts +0 -295
  168. package/dist/types/storage.types.d.ts.map +0 -1
  169. package/dist/types/storage.types.js.map +0 -1
  170. package/dist/utils/config.utils.d.ts.map +0 -1
  171. package/dist/utils/config.utils.js.map +0 -1
  172. package/dist/utils/file.utils.d.ts.map +0 -1
  173. package/dist/utils/file.utils.js +0 -278
  174. package/dist/utils/file.utils.js.map +0 -1
  175. /package/dist/{utils → cjs/utils}/config.utils.d.ts +0 -0
  176. /package/dist/{types → esm/types}/storage.types.js +0 -0
  177. /package/dist/{utils → esm/utils}/config.utils.js +0 -0
@@ -1,621 +0,0 @@
1
- import fs from 'fs';
2
- import path from 'path';
3
- import { BaseStorageDriver } from './base.driver.js';
4
- import { createMonthBasedPath, ensureDirectoryExists } from '../utils/file.utils.js';
5
- /**
6
- * Magic byte signatures for common file types.
7
- * Used to detect actual file content type regardless of extension.
8
- * This provides security against extension spoofing attacks.
9
- */
10
- const MAGIC_BYTES = [
11
- // Images
12
- { bytes: [0xFF, 0xD8, 0xFF], mimeType: 'image/jpeg' },
13
- { bytes: [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A], mimeType: 'image/png' },
14
- { bytes: [0x47, 0x49, 0x46, 0x38, 0x37, 0x61], mimeType: 'image/gif' }, // GIF87a
15
- { bytes: [0x47, 0x49, 0x46, 0x38, 0x39, 0x61], mimeType: 'image/gif' }, // GIF89a
16
- { bytes: [0x52, 0x49, 0x46, 0x46], mimeType: 'image/webp' }, // RIFF (WebP container)
17
- { bytes: [0x42, 0x4D], mimeType: 'image/bmp' },
18
- // Documents
19
- { bytes: [0x25, 0x50, 0x44, 0x46], mimeType: 'application/pdf' }, // %PDF
20
- { bytes: [0x50, 0x4B, 0x03, 0x04], mimeType: 'application/zip' }, // ZIP (also docx, xlsx, etc.)
21
- { bytes: [0x50, 0x4B, 0x05, 0x06], mimeType: 'application/zip' }, // Empty ZIP
22
- { bytes: [0x50, 0x4B, 0x07, 0x08], mimeType: 'application/zip' }, // Spanned ZIP
23
- // Archives
24
- { bytes: [0x1F, 0x8B], mimeType: 'application/gzip' },
25
- { bytes: [0x52, 0x61, 0x72, 0x21, 0x1A, 0x07], mimeType: 'application/vnd.rar' }, // RAR
26
- { bytes: [0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C], mimeType: 'application/x-7z-compressed' }, // 7z
27
- // Audio/Video
28
- { bytes: [0x49, 0x44, 0x33], mimeType: 'audio/mpeg' }, // ID3 (MP3)
29
- { bytes: [0xFF, 0xFB], mimeType: 'audio/mpeg' }, // MP3 without ID3
30
- { bytes: [0xFF, 0xFA], mimeType: 'audio/mpeg' }, // MP3 without ID3
31
- { bytes: [0x4F, 0x67, 0x67, 0x53], mimeType: 'audio/ogg' }, // OGG
32
- { bytes: [0x66, 0x74, 0x79, 0x70], mimeType: 'video/mp4', offset: 4 }, // ftyp (MP4/M4A)
33
- // Executables (for security detection)
34
- { bytes: [0x4D, 0x5A], mimeType: 'application/x-msdownload' }, // EXE/DLL
35
- { bytes: [0x7F, 0x45, 0x4C, 0x46], mimeType: 'application/x-executable' }, // ELF
36
- ];
37
- /**
38
- * Detects MIME type from file content using magic bytes.
39
- * Returns undefined if no match is found (falls back to extension-based detection).
40
- *
41
- * @param filePath - Path to the file to analyze
42
- * @returns Detected MIME type or undefined
43
- */
44
- function detectMimeTypeFromMagicBytes(filePath) {
45
- try {
46
- // Read first 16 bytes (enough for most magic numbers)
47
- const fd = fs.openSync(filePath, 'r');
48
- const buffer = Buffer.alloc(16);
49
- const bytesRead = fs.readSync(fd, buffer, 0, 16, 0);
50
- fs.closeSync(fd);
51
- if (bytesRead === 0) {
52
- return undefined;
53
- }
54
- for (const signature of MAGIC_BYTES) {
55
- const offset = signature.offset || 0;
56
- if (offset + signature.bytes.length > bytesRead) {
57
- continue;
58
- }
59
- let matches = true;
60
- for (let i = 0; i < signature.bytes.length; i++) {
61
- if (buffer[offset + i] !== signature.bytes[i]) {
62
- matches = false;
63
- break;
64
- }
65
- }
66
- if (matches) {
67
- return signature.mimeType;
68
- }
69
- }
70
- return undefined;
71
- }
72
- catch {
73
- return undefined;
74
- }
75
- }
76
- /**
77
- * Maps file extensions to MIME types.
78
- * Used as fallback when magic byte detection doesn't match.
79
- */
80
- const EXTENSION_MIME_MAP = {
81
- // Images
82
- '.jpg': 'image/jpeg',
83
- '.jpeg': 'image/jpeg',
84
- '.png': 'image/png',
85
- '.gif': 'image/gif',
86
- '.webp': 'image/webp',
87
- '.svg': 'image/svg+xml',
88
- '.ico': 'image/x-icon',
89
- '.bmp': 'image/bmp',
90
- '.tiff': 'image/tiff',
91
- '.tif': 'image/tiff',
92
- // Documents
93
- '.pdf': 'application/pdf',
94
- '.doc': 'application/msword',
95
- '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
96
- '.xls': 'application/vnd.ms-excel',
97
- '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
98
- '.ppt': 'application/vnd.ms-powerpoint',
99
- '.pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
100
- '.txt': 'text/plain',
101
- '.csv': 'text/csv',
102
- '.json': 'application/json',
103
- '.xml': 'application/xml',
104
- // Audio
105
- '.mp3': 'audio/mpeg',
106
- '.wav': 'audio/wav',
107
- '.ogg': 'audio/ogg',
108
- '.m4a': 'audio/mp4',
109
- // Video
110
- '.mp4': 'video/mp4',
111
- '.webm': 'video/webm',
112
- '.avi': 'video/x-msvideo',
113
- '.mov': 'video/quicktime',
114
- '.mkv': 'video/x-matroska',
115
- // Archives
116
- '.zip': 'application/zip',
117
- '.tar': 'application/x-tar',
118
- '.gz': 'application/gzip',
119
- '.rar': 'application/vnd.rar',
120
- '.7z': 'application/x-7z-compressed',
121
- // Web
122
- '.html': 'text/html',
123
- '.htm': 'text/html',
124
- '.css': 'text/css',
125
- '.js': 'application/javascript',
126
- '.ts': 'application/typescript',
127
- // Fonts
128
- '.woff': 'font/woff',
129
- '.woff2': 'font/woff2',
130
- '.ttf': 'font/ttf',
131
- '.otf': 'font/otf',
132
- };
133
- /**
134
- * LocalStorageDriver - Saves files to your local filesystem.
135
- *
136
- * Great for development and small-scale applications.
137
- * Files are organized by year/month folders automatically.
138
- *
139
- * **Security features:**
140
- * - Path traversal prevention (blocks ../ and null bytes)
141
- * - Symlinks are NOT followed or deleted (prevents directory escape attacks)
142
- * - Magic byte detection for content-type validation (prevents extension spoofing)
143
- * - Files stay within the configured base directory
144
- *
145
- * **Symlink behavior:** This driver explicitly rejects symlinks for security.
146
- * If a file is a symlink, it will not be read, deleted, or listed. This prevents
147
- * attackers from using symlinks to access files outside the storage directory.
148
- *
149
- * Note: Local storage doesn't support presigned URLs since
150
- * there's no external service to sign requests against.
151
- */
152
- export class LocalStorageDriver extends BaseStorageDriver {
153
- constructor(config) {
154
- super(config);
155
- this.basePath = config.localPath || 'public/express-storage';
156
- }
157
- /**
158
- * Saves a file to the local filesystem.
159
- *
160
- * Files are automatically organized into YYYY/MM folders.
161
- * For example, a file uploaded in January 2026 goes into:
162
- * {basePath}/2026/01/{unique_filename}.jpg
163
- *
164
- * For large files (>100MB), uses streaming to reduce memory usage
165
- * and prevent application crashes.
166
- */
167
- async upload(file, _options) {
168
- try {
169
- const validationErrors = this.validateFile(file);
170
- if (validationErrors.length > 0) {
171
- return this.createErrorResult(validationErrors.join(', '));
172
- }
173
- const fileName = this.generateFileName(file.originalname);
174
- const monthPath = createMonthBasedPath(this.basePath);
175
- const fullDirPath = path.resolve(monthPath);
176
- ensureDirectoryExists(fullDirPath);
177
- const filePath = path.join(fullDirPath, fileName);
178
- // Use streaming for large files to reduce memory usage
179
- if (this.shouldUseStreaming(file)) {
180
- await this.uploadWithStream(file, filePath);
181
- }
182
- else {
183
- const fileContent = this.getFileContent(file);
184
- fs.writeFileSync(filePath, fileContent);
185
- }
186
- const fileUrl = this.generateFileUrl(filePath);
187
- // Return relative path from basePath (e.g., '2026/01/filename.jpg')
188
- const absoluteFilePath = path.resolve(filePath);
189
- const absoluteBasePath = path.resolve(this.basePath);
190
- const relativePath = this.normalizePathSeparators(path.relative(absoluteBasePath, absoluteFilePath));
191
- return this.createSuccessResult(relativePath, fileUrl);
192
- }
193
- catch (error) {
194
- return this.createErrorResult(error instanceof Error ? error.message : 'Failed to upload file');
195
- }
196
- }
197
- /**
198
- * Uploads a large file using streaming.
199
- *
200
- * This method pipes the file stream directly to disk, which is more
201
- * memory-efficient for large files (>100MB).
202
- */
203
- async uploadWithStream(file, filePath) {
204
- return new Promise((resolve, reject) => {
205
- const readStream = this.getFileStream(file);
206
- const writeStream = fs.createWriteStream(filePath);
207
- readStream
208
- .pipe(writeStream)
209
- .on('finish', resolve)
210
- .on('error', (err) => {
211
- // Clean up partial file on error
212
- try {
213
- if (fs.existsSync(filePath)) {
214
- fs.unlinkSync(filePath);
215
- }
216
- }
217
- catch {
218
- // Ignore cleanup errors
219
- }
220
- reject(err);
221
- });
222
- // Handle read stream errors
223
- readStream.on('error', (err) => {
224
- writeStream.destroy();
225
- try {
226
- if (fs.existsSync(filePath)) {
227
- fs.unlinkSync(filePath);
228
- }
229
- }
230
- catch {
231
- // Ignore cleanup errors
232
- }
233
- reject(err);
234
- });
235
- });
236
- }
237
- /**
238
- * Builds a URL for accessing the file.
239
- *
240
- * If your basePath starts with 'public/', we strip that prefix
241
- * since Express.static('public') serves files from /
242
- *
243
- * Example: public/uploads/2026/01/photo.jpg -> /uploads/2026/01/photo.jpg
244
- */
245
- generateFileUrl(filePath) {
246
- const absoluteFilePath = path.resolve(filePath);
247
- const absoluteBasePath = path.resolve(this.basePath);
248
- const relativeFromBase = this.normalizePathSeparators(path.relative(absoluteBasePath, absoluteFilePath));
249
- const normalizedBasePath = this.normalizePathSeparators(this.basePath);
250
- if (normalizedBasePath.startsWith('public/')) {
251
- const webBasePath = normalizedBasePath.replace(/^public\//, '');
252
- return this.normalizeUrl(`/${webBasePath}/${relativeFromBase}`);
253
- }
254
- return this.normalizeUrl(`/${normalizedBasePath}/${relativeFromBase}`);
255
- }
256
- /**
257
- * Converts Windows backslashes to forward slashes.
258
- */
259
- normalizePathSeparators(pathStr) {
260
- return pathStr.replace(/\\/g, '/');
261
- }
262
- /**
263
- * Removes duplicate slashes from URLs.
264
- */
265
- normalizeUrl(url) {
266
- return url.replace(/\/+/g, '/');
267
- }
268
- /**
269
- * Local storage doesn't support presigned upload URLs.
270
- */
271
- async generateUploadUrl(_fileName, _contentType, _maxSize) {
272
- return this.createPresignedErrorResult('Presigned URLs are not supported for local storage');
273
- }
274
- /**
275
- * Local storage doesn't support presigned view URLs.
276
- */
277
- async generateViewUrl(_fileName) {
278
- return this.createPresignedErrorResult('Presigned URLs are not supported for local storage');
279
- }
280
- /**
281
- * Validates a local file exists and matches expected values.
282
- *
283
- * Content type detection uses a two-tier approach:
284
- * 1. Magic byte detection (examines actual file content for security)
285
- * 2. Extension-based fallback (when magic bytes don't match)
286
- *
287
- * This helps detect extension spoofing attacks where a malicious file
288
- * is renamed with an innocent extension (e.g., malware.exe -> photo.jpg).
289
- */
290
- async validateAndConfirmUpload(reference, options) {
291
- const deleteOnFailure = options?.deleteOnFailure !== false;
292
- try {
293
- const filePath = this.resolveFilePath(reference);
294
- if (!filePath || !fs.existsSync(filePath)) {
295
- return {
296
- success: false,
297
- error: 'File not found',
298
- };
299
- }
300
- const stats = fs.statSync(filePath);
301
- const fileUrl = this.generateFileUrl(filePath);
302
- // Try magic byte detection first (more secure), fall back to extension
303
- const magicMimeType = detectMimeTypeFromMagicBytes(filePath);
304
- const ext = path.extname(reference).toLowerCase();
305
- const extensionMimeType = ext && EXTENSION_MIME_MAP[ext] ? EXTENSION_MIME_MAP[ext] : undefined;
306
- // Use magic bytes if detected, otherwise fall back to extension
307
- const actualContentType = magicMimeType || extensionMimeType;
308
- const actualFileSize = stats.size;
309
- // Security check: warn if magic bytes differ from extension (potential spoofing)
310
- const contentTypeMismatchWarning = magicMimeType && extensionMimeType &&
311
- magicMimeType !== extensionMimeType;
312
- // Validate content type if expected
313
- if (options?.expectedContentType && actualContentType !== options.expectedContentType) {
314
- if (deleteOnFailure) {
315
- await this.delete(reference);
316
- }
317
- const mismatchDetail = contentTypeMismatchWarning
318
- ? ` (Warning: file extension suggests '${extensionMimeType}' but actual content is '${magicMimeType}')`
319
- : '';
320
- const errorResult = {
321
- success: false,
322
- error: `Content type mismatch: expected '${options.expectedContentType}', got '${actualContentType || 'unknown'}'${mismatchDetail}${deleteOnFailure ? ' (file deleted)' : ' (file kept for inspection)'}`,
323
- };
324
- if (actualContentType)
325
- errorResult.actualContentType = actualContentType;
326
- errorResult.actualFileSize = actualFileSize;
327
- return errorResult;
328
- }
329
- // Validate file size if expected
330
- if (options?.expectedFileSize !== undefined && actualFileSize !== options.expectedFileSize) {
331
- if (deleteOnFailure) {
332
- await this.delete(reference);
333
- }
334
- const errorResult = {
335
- success: false,
336
- error: `File size mismatch: expected ${options.expectedFileSize} bytes, got ${actualFileSize} bytes${deleteOnFailure ? ' (file deleted)' : ' (file kept for inspection)'}`,
337
- };
338
- if (actualContentType)
339
- errorResult.actualContentType = actualContentType;
340
- errorResult.actualFileSize = actualFileSize;
341
- return errorResult;
342
- }
343
- const result = {
344
- success: true,
345
- reference,
346
- viewUrl: fileUrl,
347
- actualFileSize,
348
- };
349
- if (actualContentType) {
350
- result.actualContentType = actualContentType;
351
- }
352
- return result;
353
- }
354
- catch (error) {
355
- return {
356
- success: false,
357
- error: error instanceof Error ? error.message : 'Failed to validate upload',
358
- };
359
- }
360
- }
361
- /**
362
- * Deletes a file from local storage.
363
- *
364
- * Security checks:
365
- * - Rejects path traversal attempts (../ sequences)
366
- * - Rejects null bytes in paths
367
- * - Verifies target stays within base directory
368
- * - Won't follow or delete symlinks (security: prevents directory escape attacks)
369
- * - Only deletes regular files (not directories)
370
- *
371
- * @param reference - The file path relative to the storage base directory
372
- * @returns true if file was deleted, false if not found or security check failed
373
- */
374
- async delete(reference) {
375
- try {
376
- // Decode URL-encoded characters first to catch encoded traversal attempts like %2e%2e%2f
377
- let decodedReference;
378
- try {
379
- decodedReference = decodeURIComponent(reference);
380
- }
381
- catch {
382
- return false;
383
- }
384
- if (decodedReference.includes('..') || decodedReference.includes('\0')) {
385
- return false;
386
- }
387
- const baseDir = path.resolve(this.basePath);
388
- const targetPath = path.join(baseDir, decodedReference);
389
- const resolvedPath = path.resolve(targetPath);
390
- // Make sure we're not escaping the base directory
391
- if (!resolvedPath.startsWith(baseDir + path.sep) && resolvedPath !== baseDir) {
392
- return false;
393
- }
394
- let stat;
395
- try {
396
- stat = fs.lstatSync(resolvedPath);
397
- }
398
- catch {
399
- return false;
400
- }
401
- // Don't follow symlinks — security protection against:
402
- // 1. Directory escape attacks (symlink pointing outside storage)
403
- // 2. Unauthorized file deletion via symlink redirection
404
- // 3. Race conditions where symlink is swapped after check
405
- if (stat.isSymbolicLink()) {
406
- return false;
407
- }
408
- if (!stat.isFile()) {
409
- return false;
410
- }
411
- fs.unlinkSync(resolvedPath);
412
- return true;
413
- }
414
- catch {
415
- return false;
416
- }
417
- }
418
- /**
419
- * Safely resolves a reference to a file path within our base directory.
420
- * Returns null for any suspicious input.
421
- */
422
- resolveFilePath(reference) {
423
- const baseDir = path.resolve(this.basePath);
424
- // Decode URL-encoded characters first to catch encoded traversal attempts like %2e%2e%2f
425
- let decodedReference;
426
- try {
427
- decodedReference = decodeURIComponent(reference);
428
- }
429
- catch {
430
- return null;
431
- }
432
- if (decodedReference.includes('..') || decodedReference.includes('\0')) {
433
- return null;
434
- }
435
- const directPath = path.join(baseDir, decodedReference);
436
- const resolvedPath = path.resolve(directPath);
437
- if (!resolvedPath.startsWith(baseDir + path.sep) && resolvedPath !== baseDir) {
438
- return null;
439
- }
440
- try {
441
- const stat = fs.lstatSync(directPath);
442
- if (stat.isSymbolicLink()) {
443
- return null;
444
- }
445
- if (stat.isFile()) {
446
- return directPath;
447
- }
448
- }
449
- catch {
450
- return null;
451
- }
452
- return null;
453
- }
454
- /**
455
- * Lists files in local storage with optional prefix filtering and pagination.
456
- *
457
- * Uses early termination to avoid loading all files into memory when possible.
458
- * Files are collected in sorted order and iteration stops once we have enough
459
- * results for the requested page.
460
- */
461
- async listFiles(prefix, maxResults = 1000, continuationToken) {
462
- try {
463
- // Decode URL-encoded characters first to catch encoded traversal attempts like %2e%2e%2f
464
- let decodedPrefix;
465
- if (prefix) {
466
- try {
467
- decodedPrefix = decodeURIComponent(prefix);
468
- }
469
- catch {
470
- return {
471
- success: false,
472
- error: 'Invalid prefix: malformed URL encoding',
473
- };
474
- }
475
- }
476
- if (decodedPrefix && (decodedPrefix.includes('..') || decodedPrefix.includes('\0'))) {
477
- return {
478
- success: false,
479
- error: 'Invalid prefix: path traversal sequences are not allowed',
480
- };
481
- }
482
- const validatedMaxResults = Math.floor(Math.max(1, Math.min(Number.isNaN(maxResults) ? 1000 : maxResults, 1000)));
483
- const baseDir = path.resolve(this.basePath);
484
- if (!fs.existsSync(baseDir)) {
485
- return { success: true, files: [] };
486
- }
487
- const matchingFiles = [];
488
- let hasMore = false;
489
- // Maximum recursion depth to prevent stack overflow on deeply nested directories
490
- const MAX_RECURSION_DEPTH = 100;
491
- // Maximum files to collect before stopping (for memory protection)
492
- // We collect a bit more than needed for accurate hasMore detection
493
- const MAX_COLLECT = validatedMaxResults + 1;
494
- // Use decoded prefix for file matching
495
- const effectivePrefix = decodedPrefix;
496
- // Skip directories that can't possibly contain matching files
497
- const couldContainPrefix = (dirRelativePath, targetPrefix) => {
498
- if (!targetPrefix)
499
- return true;
500
- return targetPrefix.startsWith(dirRelativePath) ||
501
- dirRelativePath.startsWith(targetPrefix) ||
502
- dirRelativePath === '';
503
- };
504
- // Check if we should skip this file based on continuation token
505
- const isAfterToken = (filePath, token) => {
506
- if (!token)
507
- return true;
508
- return filePath.localeCompare(token) > 0;
509
- };
510
- const collectFiles = (dir, dirRelativePath, depth = 0) => {
511
- // Return true to continue, false to stop early
512
- // Prevent stack overflow from extremely deep directory structures
513
- if (depth > MAX_RECURSION_DEPTH) {
514
- return true;
515
- }
516
- // Early termination: we have enough files
517
- if (matchingFiles.length >= MAX_COLLECT) {
518
- hasMore = true;
519
- return false;
520
- }
521
- if (effectivePrefix && !couldContainPrefix(dirRelativePath, effectivePrefix)) {
522
- return true;
523
- }
524
- let items;
525
- try {
526
- items = fs.readdirSync(dir);
527
- }
528
- catch {
529
- return true;
530
- }
531
- // Sort items for consistent ordering
532
- items.sort();
533
- for (const item of items) {
534
- // Check if we have enough files
535
- if (matchingFiles.length >= MAX_COLLECT) {
536
- hasMore = true;
537
- return false;
538
- }
539
- const itemPath = path.join(dir, item);
540
- const relativePath = dirRelativePath ? `${dirRelativePath}/${item}` : item;
541
- let stat;
542
- try {
543
- stat = fs.lstatSync(itemPath);
544
- }
545
- catch {
546
- continue;
547
- }
548
- // Skip symlinks for security reasons:
549
- // 1. Symlinks could point outside the storage directory (directory escape)
550
- // 2. Symlinks could create infinite loops in directory traversal
551
- // 3. Symlinks could expose sensitive files from other locations
552
- // If you need symlink support, use a different storage strategy
553
- if (stat.isSymbolicLink()) {
554
- continue;
555
- }
556
- if (stat.isDirectory()) {
557
- // Skip directories that are lexicographically before our continuation token
558
- // (they can't contain files we need)
559
- if (continuationToken && !couldContainPrefix(relativePath, continuationToken.split('/')[0] || '')) {
560
- // Only skip if this directory is completely before the token
561
- if (relativePath.localeCompare(continuationToken) < 0 && !continuationToken.startsWith(relativePath + '/')) {
562
- continue;
563
- }
564
- }
565
- const shouldContinue = collectFiles(itemPath, relativePath, depth + 1);
566
- if (!shouldContinue) {
567
- return false;
568
- }
569
- }
570
- else if (stat.isFile()) {
571
- if (effectivePrefix && !relativePath.startsWith(effectivePrefix)) {
572
- continue;
573
- }
574
- // Skip files at or before the continuation token
575
- if (!isAfterToken(relativePath, continuationToken)) {
576
- continue;
577
- }
578
- const fileInfo = {
579
- name: relativePath,
580
- size: stat.size,
581
- lastModified: stat.mtime,
582
- };
583
- const ext = path.extname(relativePath).toLowerCase();
584
- if (ext && EXTENSION_MIME_MAP[ext]) {
585
- fileInfo.contentType = EXTENSION_MIME_MAP[ext];
586
- }
587
- else {
588
- fileInfo.contentType = 'application/octet-stream';
589
- }
590
- matchingFiles.push(fileInfo);
591
- }
592
- }
593
- return true;
594
- };
595
- collectFiles(baseDir, '');
596
- // Sort results (should already be mostly sorted due to directory traversal order)
597
- matchingFiles.sort((a, b) => a.name.localeCompare(b.name));
598
- // Take only the requested number of results
599
- const pageFiles = matchingFiles.slice(0, validatedMaxResults);
600
- const result = {
601
- success: true,
602
- files: pageFiles,
603
- };
604
- // Set next token if there are more results
605
- if (matchingFiles.length > validatedMaxResults || hasMore) {
606
- const lastFile = pageFiles[pageFiles.length - 1];
607
- if (lastFile) {
608
- result.nextToken = lastFile.name;
609
- }
610
- }
611
- return result;
612
- }
613
- catch (error) {
614
- return {
615
- success: false,
616
- error: error instanceof Error ? error.message : 'Failed to list files',
617
- };
618
- }
619
- }
620
- }
621
- //# sourceMappingURL=local.driver.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"local.driver.js","sourceRoot":"","sources":["../../src/drivers/local.driver.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"s3.driver.d.ts","sourceRoot":"","sources":["../../src/drivers/s3.driver.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,aAAa,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,eAAe,EAAE,aAAa,EAAY,MAAM,2BAA2B,CAAC;AAGvL;;;;;;;;;GASG;AACH,qBAAa,eAAgB,SAAQ,iBAAiB;IACpD,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,aAAa;IAqBjC;;;;;;OAMG;IACG,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA6D3F;;;;;;OAMG;YACW,gBAAgB;IAyD9B;;;;;;;;OAQG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA+C/G;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAgCpE;;;OAGG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAwChD;;;;;OAKG;IACY,wBAAwB,CACrC,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,oBAAoB,CAAC;IAqEhC;;;;;OAKG;IACG,SAAS,CACb,MAAM,CAAC,EAAE,MAAM,EACf,UAAU,GAAE,MAAa,EACzB,iBAAiB,CAAC,EAAE,MAAM,GACzB,OAAO,CAAC,eAAe,CAAC;CAwC5B;AAED;;;;;GAKG;AACH,qBAAa,wBAAyB,SAAQ,eAAe;gBAC/C,MAAM,EAAE,aAAa;IAIjC;;;;;;;;;;OAUG;IACY,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC;CA2BtG"}