UNPKG

@trap_stevo/vault-link

Version:

Unlock the ultimate gateway to secure file and directory access. VaultLink transforms your files into guarded, time-sensitive links—sealed, tamper-proof, and effortlessly shareable. Elevate your storage game with unparalleled precision and flexibility, tu

99 lines (98 loc) • 3.37 kB
"use strict"; const archiver = require("archiver"); const express = require("express"); const path = require("path"); const fs = require("fs"); const { listDirectoryContents } = require("./HUDControllers/fileHandler"); const ReferenceManager = require("./HUDManagers/ReferenceManager"); const { generateHash } = require("./HUDControllers/hashHelper"); function createLinkGateway(config) { const app = express(); function verifySignature(url, signature, secretKey) { const expectedSignature = generateHash(url, secretKey); return expectedSignature === signature; } function parseNameAndReference(combined) { const separatorIndex = combined.lastIndexOf("-"); const name = combined.substring(0, separatorIndex); const reference = combined.substring(separatorIndex + 1); return { name, reference }; } app.get(`${config.linkedFileEndpoint || "/file"}/*`, (req, ress) => { const { name: fileName, reference } = parseNameAndReference(req.params[0]); const absoluteFilePath = ReferenceManager.getReference("file-paths", reference); if (!absoluteFilePath) { return ress.status(404).send("Unauthorized reference."); } const { expires, signature } = req.query; if (Number(expires) < Math.floor(Date.now() / 1000)) { return ress.status(403).send("URL expired."); } const fullUrl = `${req.protocol}://${req.get("host")}${req.originalUrl.split("&signature=")[0]}`; if (!verifySignature(fullUrl, signature, config.secretKey)) { return ress.status(403).send("Unauthorized URL."); } if (fs.existsSync(absoluteFilePath)) { ress.setHeader("Content-Disposition", `attachment; filename="${fileName}"`); ress.setHeader("Content-Type", "application/octet-stream"); ress.sendFile(absoluteFilePath); return; } ress.status(404).send("File not found."); return; }); app.get(`${config.linkedDirectoryEndpoint || "/directory"}/*`, (req, ress) => { const { name: directoryName, reference } = parseNameAndReference(req.params[0]); const absoluteDirectoryPath = ReferenceManager.getReference("file-paths", reference); if (!absoluteDirectoryPath) { return ress.status(404).send("Unauthorized reference."); } const { expires, signature } = req.query; if (Number(expires) < Math.floor(Date.now() / 1000)) { return ress.status(403).send("URL expired."); } const fullUrl = `${req.protocol}://${req.get("host")}${req.originalUrl.split("&signature=")[0]}`; if (!verifySignature(fullUrl, signature, config.secretKey)) { return ress.status(403).send("Unauthorized URL."); } if (fs.existsSync(absoluteDirectoryPath)) { ress.setHeader("Content-Disposition", `attachment; filename="${directoryName}.zip"`); ress.setHeader("Content-Type", "application/zip"); const archive = archiver("zip", { zlib: { level: 9 } }); archive.on("error", err => res.status(500).send({ error: "Did not retrieve vaulted directory." })); archive.pipe(res); archive.directory(absoluteDirectoryPath, false); archive.finalize(); return; } ress.status(404).send("Directory not found."); return; }); return app; } module.exports = createLinkGateway;