Spaces:
Paused
Paused
File size: 1,578 Bytes
b152fd5 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | import { randomBytes } from "node:crypto";
import fs from "node:fs";
import path from "node:path";
import type { PaperclipConfig } from "./schema.js";
import { resolveRuntimeLikePath } from "../utils/path-resolver.js";
export type EnsureSecretsKeyResult =
| { status: "created"; path: string }
| { status: "existing"; path: string }
| { status: "skipped_env"; path: null }
| { status: "skipped_provider"; path: null };
export function ensureLocalSecretsKeyFile(
config: Pick<PaperclipConfig, "secrets">,
configPath?: string,
): EnsureSecretsKeyResult {
if (config.secrets.provider !== "local_encrypted") {
return { status: "skipped_provider", path: null };
}
const envMasterKey = process.env.PAPERCLIP_SECRETS_MASTER_KEY;
if (envMasterKey && envMasterKey.trim().length > 0) {
return { status: "skipped_env", path: null };
}
const keyFileOverride = process.env.PAPERCLIP_SECRETS_MASTER_KEY_FILE;
const configuredPath =
keyFileOverride && keyFileOverride.trim().length > 0
? keyFileOverride.trim()
: config.secrets.localEncrypted.keyFilePath;
const keyFilePath = resolveRuntimeLikePath(configuredPath, configPath);
if (fs.existsSync(keyFilePath)) {
return { status: "existing", path: keyFilePath };
}
fs.mkdirSync(path.dirname(keyFilePath), { recursive: true });
fs.writeFileSync(keyFilePath, randomBytes(32).toString("base64"), {
encoding: "utf8",
mode: 0o600,
});
try {
fs.chmodSync(keyFilePath, 0o600);
} catch {
// best effort
}
return { status: "created", path: keyFilePath };
}
|