89 lines
8.1 KiB
JavaScript
89 lines
8.1 KiB
JavaScript
|
"use strict";
|
||
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||
|
};
|
||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
exports.save = exports.load = exports.FILE_TYPE = exports.CRYPTO_DIR = exports.STORAGE_DIR = void 0;
|
||
|
const crypto_1 = __importDefault(require("crypto"));
|
||
|
const path_1 = __importDefault(require("path"));
|
||
|
const fs_1 = __importDefault(require("fs"));
|
||
|
const os_1 = __importDefault(require("os"));
|
||
|
const util_1 = require("util");
|
||
|
const errors_1 = require("./errors");
|
||
|
const has_error_code_1 = __importDefault(require("./utils/has-error-code"));
|
||
|
const readFile = (0, util_1.promisify)(fs_1.default.readFile);
|
||
|
const writeFile = (0, util_1.promisify)(fs_1.default.writeFile);
|
||
|
const mkdir = (0, util_1.promisify)(fs_1.default.mkdir);
|
||
|
const readdir = (0, util_1.promisify)(fs_1.default.readdir);
|
||
|
const rm = (0, util_1.promisify)(fs_1.default.rm);
|
||
|
exports.STORAGE_DIR = '.tcss';
|
||
|
exports.CRYPTO_DIR = '.tcpk';
|
||
|
var FILE_TYPE;
|
||
|
(function (FILE_TYPE) {
|
||
|
FILE_TYPE[FILE_TYPE["STORAGE"] = 0] = "STORAGE";
|
||
|
FILE_TYPE[FILE_TYPE["NONCE"] = 1] = "NONCE";
|
||
|
FILE_TYPE[FILE_TYPE["AUTH_TAG"] = 2] = "AUTH_TAG";
|
||
|
FILE_TYPE[FILE_TYPE["PRIVATE_KEY"] = 3] = "PRIVATE_KEY";
|
||
|
FILE_TYPE[FILE_TYPE["PASSPHRASE"] = 4] = "PASSPHRASE";
|
||
|
})(FILE_TYPE = exports.FILE_TYPE || (exports.FILE_TYPE = {}));
|
||
|
// TODO: Use OS APIs to secretely store PASSPHRASE, AUTH_TAG, NONCE
|
||
|
const FILENAME_TEMPLATES = {
|
||
|
[FILE_TYPE.STORAGE]: (seed) => path_1.default.join(os_1.default.homedir(), exports.STORAGE_DIR, `storage-${seed}`),
|
||
|
[FILE_TYPE.NONCE]: (seed) => path_1.default.join(os_1.default.homedir(), exports.CRYPTO_DIR, `n-${seed}`),
|
||
|
[FILE_TYPE.AUTH_TAG]: (seed) => path_1.default.join(os_1.default.homedir(), exports.CRYPTO_DIR, `at-${seed}`),
|
||
|
[FILE_TYPE.PRIVATE_KEY]: (seed) => path_1.default.join(os_1.default.homedir(), exports.CRYPTO_DIR, `pk-${seed}`),
|
||
|
[FILE_TYPE.PASSPHRASE]: (seed) => path_1.default.join(os_1.default.homedir(), `.tcpp-${seed}`),
|
||
|
};
|
||
|
async function ensureDir(filename) {
|
||
|
await mkdir(path_1.default.dirname(filename), { recursive: true });
|
||
|
}
|
||
|
async function readNamesDir(path) {
|
||
|
try {
|
||
|
return await readdir(path);
|
||
|
}
|
||
|
catch (error) {
|
||
|
if ((0, has_error_code_1.default)(error) && error.code === 'ENOENT')
|
||
|
throw new errors_1.SavedDataNotDetected();
|
||
|
throw error;
|
||
|
}
|
||
|
}
|
||
|
async function detectNames(type) {
|
||
|
const template = FILENAME_TEMPLATES[type]('');
|
||
|
const dirname = path_1.default.dirname(template);
|
||
|
const basenames = await readNamesDir(dirname);
|
||
|
const filenames = basenames.filter(name => name.includes(path_1.default.basename(template)));
|
||
|
return filenames.map(name => path_1.default.join(dirname, name));
|
||
|
}
|
||
|
async function detectName(type) {
|
||
|
const names = await detectNames(type);
|
||
|
if (!names.length)
|
||
|
throw new errors_1.SavedDataNotDetected();
|
||
|
if (names.length > 1)
|
||
|
throw new errors_1.MultipleSavedDataDetected();
|
||
|
return names[0];
|
||
|
}
|
||
|
async function generateName(type) {
|
||
|
return FILENAME_TEMPLATES[type](crypto_1.default.randomUUID());
|
||
|
}
|
||
|
async function load(type) {
|
||
|
const name = await detectName(type);
|
||
|
const data = await readFile(name);
|
||
|
await remove(name);
|
||
|
return data;
|
||
|
}
|
||
|
exports.load = load;
|
||
|
async function save(type, data) {
|
||
|
const name = await generateName(type);
|
||
|
await ensureDir(name);
|
||
|
await removeAll(type);
|
||
|
await writeFile(name, data);
|
||
|
}
|
||
|
exports.save = save;
|
||
|
async function remove(name) {
|
||
|
await rm(name, { force: true });
|
||
|
}
|
||
|
async function removeAll(type) {
|
||
|
const names = await detectNames(type);
|
||
|
await Promise.all(names.map(name => remove(name)));
|
||
|
}
|
||
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9maWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixnREFBd0I7QUFDeEIsNENBQW9CO0FBQ3BCLDRDQUFvQjtBQUNwQiwrQkFBaUM7QUFDakMscUNBQTJFO0FBQzNFLDRFQUFrRDtBQUdsRCxNQUFNLFFBQVEsR0FBSSxJQUFBLGdCQUFTLEVBQUMsWUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3pDLE1BQU0sU0FBUyxHQUFHLElBQUEsZ0JBQVMsRUFBQyxZQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDMUMsTUFBTSxLQUFLLEdBQU8sSUFBQSxnQkFBUyxFQUFDLFlBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN0QyxNQUFNLE9BQU8sR0FBSyxJQUFBLGdCQUFTLEVBQUMsWUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3hDLE1BQU0sRUFBRSxHQUFVLElBQUEsZ0JBQVMsRUFBQyxZQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFdEIsUUFBQSxXQUFXLEdBQUcsT0FBTyxDQUFDO0FBQ3RCLFFBQUEsVUFBVSxHQUFJLE9BQU8sQ0FBQztBQUVuQyxJQUFZLFNBTVg7QUFORCxXQUFZLFNBQVM7SUFDakIsK0NBQU8sQ0FBQTtJQUNQLDJDQUFLLENBQUE7SUFDTCxpREFBUSxDQUFBO0lBQ1IsdURBQVcsQ0FBQTtJQUNYLHFEQUFVLENBQUE7QUFDZCxDQUFDLEVBTlcsU0FBUyxHQUFULGlCQUFTLEtBQVQsaUJBQVMsUUFNcEI7QUFFRCxtRUFBbUU7QUFDbkUsTUFBTSxrQkFBa0IsR0FBRztJQUN2QixDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBTSxDQUFDLElBQVksRUFBRSxFQUFFLENBQUMsY0FBSSxDQUFDLElBQUksQ0FBQyxZQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsbUJBQVcsRUFBRSxXQUFXLElBQUksRUFBRSxDQUFDO0lB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
|