@muhgholy/next-drive 4.15.0 → 4.16.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.
@@ -4,7 +4,7 @@ var formidable = require('formidable');
4
4
  var path = require('path');
5
5
  var fs = require('fs');
6
6
  var os3 = require('os');
7
- var crypto3 = require('crypto');
7
+ var crypto2 = require('crypto');
8
8
  var mongoose = require('mongoose');
9
9
  var sharp2 = require('sharp');
10
10
  var zod = require('zod');
@@ -17,7 +17,7 @@ var formidable__default = /*#__PURE__*/_interopDefault(formidable);
17
17
  var path__default = /*#__PURE__*/_interopDefault(path);
18
18
  var fs__default = /*#__PURE__*/_interopDefault(fs);
19
19
  var os3__default = /*#__PURE__*/_interopDefault(os3);
20
- var crypto3__default = /*#__PURE__*/_interopDefault(crypto3);
20
+ var crypto2__default = /*#__PURE__*/_interopDefault(crypto2);
21
21
  var mongoose__default = /*#__PURE__*/_interopDefault(mongoose);
22
22
  var sharp2__default = /*#__PURE__*/_interopDefault(sharp2);
23
23
  var ffmpeg__default = /*#__PURE__*/_interopDefault(ffmpeg);
@@ -272,10 +272,12 @@ var driveConfiguration = async (config) => {
272
272
  ...config.storage,
273
273
  path: resolvedPath
274
274
  },
275
- security: config.security || {
276
- maxUploadSizeInBytes: 1024 * 1024 * 1024 * 10,
275
+ security: {
276
+ maxUploadSizeInBytes: config.security?.maxUploadSizeInBytes ?? 1024 * 1024 * 1024 * 10,
277
277
  // 10GB default for ROOT
278
- allowedMimeTypes: ["*/*"]
278
+ allowedMimeTypes: config.security?.allowedMimeTypes ?? ["*/*"],
279
+ signedUrls: config.security?.signedUrls,
280
+ trash: config.security?.trash
279
281
  }
280
282
  };
281
283
  } else {
@@ -364,7 +366,7 @@ var validateMimeType = (mime, allowedTypes) => {
364
366
  });
365
367
  };
366
368
  var computeFileHash = (filePath) => new Promise((resolve, reject) => {
367
- const hash = crypto3__default.default.createHash("sha256");
369
+ const hash = crypto2__default.default.createHash("sha256");
368
370
  const stream = fs__default.default.createReadStream(filePath);
369
371
  stream.on("data", (data) => hash.update(data));
370
372
  stream.on("end", () => resolve(hash.digest("hex")));
@@ -1286,7 +1288,7 @@ var driveGetUrl = (fileId, options) => {
1286
1288
  } else {
1287
1289
  expiryTimestamp = Math.floor(Date.now() / 1e3) + expiresIn;
1288
1290
  }
1289
- const signature = crypto3__default.default.createHmac("sha256", secret).update(`${fileId}:${expiryTimestamp}`).digest("hex");
1291
+ const signature = crypto2__default.default.createHmac("sha256", secret).update(`${fileId}:${expiryTimestamp}`).digest("hex");
1290
1292
  const token = Buffer.from(`${expiryTimestamp}:${signature}`).toString("base64url");
1291
1293
  return `/api/drive?action=serve&id=${fileId}&token=${token}`;
1292
1294
  };
@@ -1552,7 +1554,7 @@ var driveUpload = async (source, key, options) => {
1552
1554
  if (!fs__default.default.existsSync(tempDir)) {
1553
1555
  fs__default.default.mkdirSync(tempDir, { recursive: true });
1554
1556
  }
1555
- tempFilePath = path__default.default.join(tempDir, `upload-${crypto3__default.default.randomUUID()}.tmp`);
1557
+ tempFilePath = path__default.default.join(tempDir, `upload-${crypto2__default.default.randomUUID()}.tmp`);
1556
1558
  fs__default.default.writeFileSync(tempFilePath, source);
1557
1559
  sourceFilePath = tempFilePath;
1558
1560
  fileSize = source.length;
@@ -1561,7 +1563,7 @@ var driveUpload = async (source, key, options) => {
1561
1563
  if (!fs__default.default.existsSync(tempDir)) {
1562
1564
  fs__default.default.mkdirSync(tempDir, { recursive: true });
1563
1565
  }
1564
- tempFilePath = path__default.default.join(tempDir, `upload-${crypto3__default.default.randomUUID()}.tmp`);
1566
+ tempFilePath = path__default.default.join(tempDir, `upload-${crypto2__default.default.randomUUID()}.tmp`);
1565
1567
  const writeStream = fs__default.default.createWriteStream(tempFilePath);
1566
1568
  await new Promise((resolve, reject) => {
1567
1569
  source.pipe(writeStream);
@@ -1669,6 +1671,21 @@ var getProvider = async (req, owner) => {
1669
1671
  if (account.metadata.provider === "GOOGLE") return { provider: GoogleDriveProvider, accountId: account._id.toString() };
1670
1672
  return { provider: LocalStorageProvider };
1671
1673
  };
1674
+ var addSignedUrlToken = (item, config) => {
1675
+ if (!config.security?.signedUrls?.enabled || !config.security.signedUrls.secret) {
1676
+ return item;
1677
+ }
1678
+ const { secret, expiresIn } = config.security.signedUrls;
1679
+ const expiryTimestamp = Math.floor(Date.now() / 1e3) + expiresIn;
1680
+ const signature = crypto2__default.default.createHmac("sha256", secret).update(`${item.id}:${expiryTimestamp}`).digest("hex");
1681
+ return { ...item, token: Buffer.from(`${expiryTimestamp}:${signature}`).toString("base64url") };
1682
+ };
1683
+ var addSignedUrlTokens = (items, config) => {
1684
+ if (!config.security?.signedUrls?.enabled || !config.security.signedUrls.secret) {
1685
+ return items;
1686
+ }
1687
+ return items.map((item) => addSignedUrlToken(item, config));
1688
+ };
1672
1689
  var applyCorsHeaders = (req, res, config) => {
1673
1690
  const cors = config.cors;
1674
1691
  if (!cors?.enabled) return false;
@@ -1750,7 +1767,7 @@ var driveAPIHandler = async (req, res) => {
1750
1767
  return res.status(401).json({ status: 401, message: "Token expired" });
1751
1768
  }
1752
1769
  const { secret } = config.security.signedUrls;
1753
- const expectedSignature = crypto3__default.default.createHmac("sha256", secret).update(`${id}:${expiry}`).digest("hex");
1770
+ const expectedSignature = crypto2__default.default.createHmac("sha256", secret).update(`${id}:${expiry}`).digest("hex");
1754
1771
  if (signature !== expectedSignature) {
1755
1772
  return res.status(401).json({ status: 401, message: "Invalid token" });
1756
1773
  }
@@ -2024,15 +2041,7 @@ var driveAPIHandler = async (req, res) => {
2024
2041
  }
2025
2042
  if (afterId) query._id = { $lt: afterId };
2026
2043
  const items = await drive_default.find(query, {}, { sort: { order: 1, _id: -1 }, limit });
2027
- let plainItems = await Promise.all(items.map((item) => item.toClient()));
2028
- if (config.security?.signedUrls?.enabled) {
2029
- const { secret, expiresIn } = config.security.signedUrls;
2030
- plainItems = plainItems.map((item) => {
2031
- const expiryTimestamp = Math.floor(Date.now() / 1e3) + expiresIn;
2032
- const signature = crypto3__default.default.createHmac("sha256", secret).update(`${item.id}:${expiryTimestamp}`).digest("hex");
2033
- return { ...item, token: Buffer.from(`${expiryTimestamp}:${signature}`).toString("base64url") };
2034
- });
2035
- }
2044
+ const plainItems = addSignedUrlTokens(await Promise.all(items.map((item) => item.toClient())), config);
2036
2045
  res.status(200).json({ status: 200, message: "Items retrieved", data: { items: plainItems, hasMore: items.length === limit } });
2037
2046
  return;
2038
2047
  }
@@ -2059,15 +2068,7 @@ var driveAPIHandler = async (req, res) => {
2059
2068
  }
2060
2069
  if (folderId && folderId !== "root") query.parentId = folderId;
2061
2070
  const items = await drive_default.find(query, {}, { limit, sort: { createdAt: -1 } });
2062
- let plainItems = await Promise.all(items.map((i) => i.toClient()));
2063
- if (config.security?.signedUrls?.enabled) {
2064
- const { secret, expiresIn } = config.security.signedUrls;
2065
- plainItems = plainItems.map((item) => {
2066
- const expiryTimestamp = Math.floor(Date.now() / 1e3) + expiresIn;
2067
- const signature = crypto3__default.default.createHmac("sha256", secret).update(`${item.id}:${expiryTimestamp}`).digest("hex");
2068
- return { ...item, token: Buffer.from(`${expiryTimestamp}:${signature}`).toString("base64url") };
2069
- });
2070
- }
2071
+ const plainItems = addSignedUrlTokens(await Promise.all(items.map((i) => i.toClient())), config);
2071
2072
  return res.status(200).json({ status: 200, message: "Results", data: { items: plainItems } });
2072
2073
  }
2073
2074
  // ** 3. UPLOAD **
@@ -2125,7 +2126,7 @@ var driveAPIHandler = async (req, res) => {
2125
2126
  return res.status(413).json({ status: 413, message: "Storage quota exceeded" });
2126
2127
  }
2127
2128
  }
2128
- currentUploadId = crypto3__default.default.randomUUID();
2129
+ currentUploadId = crypto2__default.default.randomUUID();
2129
2130
  const uploadDir = path__default.default.join(tempBaseDir, currentUploadId);
2130
2131
  fs__default.default.mkdirSync(uploadDir, { recursive: true });
2131
2132
  const metadata = {
@@ -2230,7 +2231,7 @@ var driveAPIHandler = async (req, res) => {
2230
2231
  const item = await provider.uploadFile(drive, finalTempPath, meta.accountId);
2231
2232
  fs__default.default.rmSync(uploadDir, { recursive: true, force: true });
2232
2233
  const newQuota = await provider.getQuota(meta.owner, meta.accountId, information.storage.quotaInBytes);
2233
- res.status(200).json({ status: 200, message: "Upload complete", data: { type: "UPLOAD_COMPLETE", driveId: String(drive._id), item }, statistic: { storage: newQuota } });
2234
+ res.status(200).json({ status: 200, message: "Upload complete", data: { type: "UPLOAD_COMPLETE", driveId: String(drive._id), item: addSignedUrlToken(item, config) }, statistic: { storage: newQuota } });
2234
2235
  } catch (err) {
2235
2236
  await drive_default.deleteOne({ _id: drive._id });
2236
2237
  throw err;
@@ -2272,7 +2273,7 @@ var driveAPIHandler = async (req, res) => {
2272
2273
  const folderData = createFolderBodySchema.safeParse(req.body);
2273
2274
  if (!folderData.success) return res.status(400).json({ status: 400, message: folderData.error.errors[0].message });
2274
2275
  const { name, parentId } = folderData.data;
2275
- const item = await provider.createFolder(name, parentId ?? null, owner, accountId);
2276
+ const item = addSignedUrlToken(await provider.createFolder(name, parentId ?? null, owner, accountId), config);
2276
2277
  return res.status(201).json({ status: 201, message: "Folder created", data: { item } });
2277
2278
  }
2278
2279
  // ** 5. DELETE **
@@ -2327,15 +2328,7 @@ var driveAPIHandler = async (req, res) => {
2327
2328
  trashedAt: { $ne: null }
2328
2329
  };
2329
2330
  const items = await drive_default.find(query, {}, { sort: { trashedAt: -1 } });
2330
- let plainItems = await Promise.all(items.map((item) => item.toClient()));
2331
- if (config.security?.signedUrls?.enabled) {
2332
- const { secret, expiresIn } = config.security.signedUrls;
2333
- plainItems = plainItems.map((item) => {
2334
- const expiryTimestamp = Math.floor(Date.now() / 1e3) + expiresIn;
2335
- const signature = crypto3__default.default.createHmac("sha256", secret).update(`${item.id}:${expiryTimestamp}`).digest("hex");
2336
- return { ...item, token: Buffer.from(`${expiryTimestamp}:${signature}`).toString("base64url") };
2337
- });
2338
- }
2331
+ const plainItems = addSignedUrlTokens(await Promise.all(items.map((item) => item.toClient())), config);
2339
2332
  return res.status(200).json({
2340
2333
  status: 200,
2341
2334
  message: "Trash items",
@@ -2390,14 +2383,14 @@ var driveAPIHandler = async (req, res) => {
2390
2383
  console.error(`Failed to move item ${id}`, e);
2391
2384
  }
2392
2385
  }
2393
- return res.status(200).json({ status: 200, message: "Moved", data: { items } });
2386
+ return res.status(200).json({ status: 200, message: "Moved", data: { items: addSignedUrlTokens(items, config) } });
2394
2387
  }
2395
2388
  // ** 8. RENAME **
2396
2389
  case "rename": {
2397
2390
  const renameData = renameBodySchema.safeParse({ id: req.query.id, ...req.body });
2398
2391
  if (!renameData.success) return res.status(400).json({ status: 400, message: "Invalid data" });
2399
2392
  const { id, newName } = renameData.data;
2400
- const item = await provider.rename(id, newName, owner, accountId);
2393
+ const item = addSignedUrlToken(await provider.rename(id, newName, owner, accountId), config);
2401
2394
  return res.status(200).json({ status: 200, message: "Renamed", data: { item } });
2402
2395
  }
2403
2396
  // ** 9. THUMBNAIL **
@@ -2422,5 +2415,5 @@ exports.driveReadFile = driveReadFile;
2422
2415
  exports.driveUpload = driveUpload;
2423
2416
  exports.getDriveConfig = getDriveConfig;
2424
2417
  exports.getDriveInformation = getDriveInformation;
2425
- //# sourceMappingURL=chunk-2DGLSDQ7.cjs.map
2426
- //# sourceMappingURL=chunk-2DGLSDQ7.cjs.map
2418
+ //# sourceMappingURL=chunk-HNLXZW5G.cjs.map
2419
+ //# sourceMappingURL=chunk-HNLXZW5G.cjs.map