@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
JavaScript
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;
;