mirror of
https://github.com/Portabase/portabase.git
synced 2026-07-14 11:16:13 +02:00
57 lines
1.8 KiB
TypeScript
57 lines
1.8 KiB
TypeScript
import fs from "node:fs";
|
|
import forge from "node-forge";
|
|
import {EventPayload} from "@/features/notifications/types";
|
|
import {dispatchNotification} from "@/features/notifications/dispatch";
|
|
import {Database, DatabaseWith} from "@/db/schema/07_database";
|
|
|
|
|
|
export async function decryptedDump(file: File, aesKeyHex: string, ivHex: string, fileExtension: string): Promise<File> {
|
|
const privateKeyPem = fs.readFileSync("private/keys/server_private.pem", "utf8");
|
|
const privateKey = forge.pki.privateKeyFromPem(privateKeyPem);
|
|
|
|
// Decrypt AES key with RSA-OAEP
|
|
const encryptedAesKey = forge.util.hexToBytes(aesKeyHex);
|
|
const aesKey = privateKey.decrypt(encryptedAesKey, "RSA-OAEP", {
|
|
md: forge.md.sha256.create(),
|
|
mgf1: {md: forge.md.sha256.create()},
|
|
});
|
|
|
|
// Read encrypted file content
|
|
const encryptedBuffer = Buffer.from(await file.arrayBuffer());
|
|
const iv = forge.util.hexToBytes(ivHex);
|
|
|
|
// AES decryption
|
|
const decipher = forge.cipher.createDecipher("AES-CBC", aesKey);
|
|
decipher.start({iv});
|
|
decipher.update(forge.util.createBuffer(encryptedBuffer.toString("binary")));
|
|
const success = decipher.finish();
|
|
|
|
if (!success) {
|
|
throw new Error("Decryption failed");
|
|
}
|
|
|
|
const decryptedBytes = decipher.output.getBytes();
|
|
const decryptedBuffer = Buffer.from(decryptedBytes, "binary");
|
|
|
|
// Return a File so you can use file.arrayBuffer() later
|
|
return new File(
|
|
[decryptedBuffer],
|
|
file.name.replace(/\.enc$/, fileExtension),
|
|
{type: "application/octet-stream"}
|
|
);
|
|
}
|
|
|
|
|
|
export function getFileExtension(dbType: string) {
|
|
switch (dbType) {
|
|
case "postgresql":
|
|
return ".dump";
|
|
case "mysql":
|
|
return ".sql";
|
|
default:
|
|
return ".dump";
|
|
}
|
|
}
|
|
|
|
|