@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.
- package/dist/{chunk-2DGLSDQ7.cjs → chunk-HNLXZW5G.cjs} +37 -44
- package/dist/chunk-HNLXZW5G.cjs.map +1 -0
- package/dist/{chunk-PRQD67LD.js → chunk-PFIAZK57.js} +36 -43
- package/dist/chunk-PFIAZK57.js.map +1 -0
- package/dist/server/config.d.ts.map +1 -1
- package/dist/server/express.cjs +11 -11
- package/dist/server/express.js +2 -2
- package/dist/server/index.cjs +13 -13
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-2DGLSDQ7.cjs.map +0 -1
- package/dist/chunk-PRQD67LD.js.map +0 -1
|
@@ -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
|
|
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
|
|
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:
|
|
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 =
|
|
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 =
|
|
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-${
|
|
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-${
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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-
|
|
2426
|
-
//# sourceMappingURL=chunk-
|
|
2418
|
+
//# sourceMappingURL=chunk-HNLXZW5G.cjs.map
|
|
2419
|
+
//# sourceMappingURL=chunk-HNLXZW5G.cjs.map
|