@paroicms/server
Version:
The ParoiCMS server
33 lines • 1.49 kB
JavaScript
import { ApiError } from "@paroicms/public-server-lib";
import { type } from "arktype";
import { checkBackupFileName } from "../../connector/site-backup/backup.helper.js";
import { getBackup } from "../../connector/site-backup/backup.js";
import { getRouteParameter } from "../../express/http-helpers.js";
import { verifyPresignedLink } from "./backup.helper.js";
const BackupUrlQueryAT = type({
"t?": "string|undefined",
"+": "reject",
});
export async function downloadBackupController(siteContext, httpContext, routeParams) {
const { req, res } = httpContext;
const backupName = getRouteParameter(routeParams, "backupName");
const validated = BackupUrlQueryAT.assert(req.query);
const token = validated.t;
if (!token)
throw new Error("missing user token");
const { backupFile, contentType } = verifyPresignedLink(token);
if (!checkBackupFileName({ fqdn: req.hostname }, backupName)) {
throw new ApiError("Invalid payload", 404);
}
if (backupFile !== backupName) {
throw new ApiError("invalid token provided", 400);
}
const { fileStream, fileWeight } = await getBackup(siteContext, backupName);
res.status(200);
res.append("Cache-Control", "no-store");
res.append("Content-Type", contentType);
res.append("Content-Length", fileWeight.toString());
res.append("Content-Disposition", `attachment; filename=${backupName}`);
res.send(fileStream);
}
//# sourceMappingURL=backup.controller.js.map