"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ensureConfigDirs = exports.getLegacyConfigDir = exports.rootCACertPath = exports.rootCAKeyPath = exports.rootCADir = exports.withDomainCertificateConfig = exports.withDomainSigningRequestConfig = exports.caSelfSignConfig = exports.opensslDatabaseFilePath = exports.opensslSerialFilePath = exports.caVersionFile = exports.pathForDomain = exports.domainsDir = exports.getStableDomainPath = exports.configPath = exports.configDir = exports.isWindows = exports.isLinux = exports.isMac = void 0; const tslib_1 = require("tslib"); const path_1 = tslib_1.__importDefault(require("path")); const fs_1 = require("fs"); const mkdirp_1 = require("mkdirp"); const lodash_1 = require("lodash"); const applicationConfigPath = require("application-config-path"); const eol_1 = tslib_1.__importDefault(require("eol")); const utils_1 = require("./utils"); // Platform shortcuts exports.isMac = process.platform === 'darwin'; exports.isLinux = process.platform === 'linux'; exports.isWindows = process.platform === 'win32'; // Common paths exports.configDir = applicationConfigPath('devcert'); exports.configPath = path_1.default.join.bind(path_1.default, exports.configDir); const getFilteredDomains = (domains) => Array.from(domains .sort((a, b) => b.length - a.length) .reduce((filteredList, domain) => Array.from(filteredList) .reduce((matches, item) => { if (item.indexOf(domain) > -1) { matches.add(domain); } else if (domain.indexOf(item) === -1 && item.indexOf(domain) === -1) { matches.add(item); matches.add(domain); } else { matches.add(item); } return matches; }, new Set()), new Set([domains[0]]))).sort(); const getStableDomainPath = (domains) => domains.length === 1 ? domains[0] : 'san-' + utils_1.numericHash(getFilteredDomains(domains).join('')); exports.getStableDomainPath = getStableDomainPath; exports.domainsDir = exports.configPath('domains'); exports.pathForDomain = path_1.default.join.bind(path_1.default, exports.domainsDir); exports.caVersionFile = exports.configPath('devcert-ca-version'); exports.opensslSerialFilePath = exports.configPath('certificate-authority', 'serial'); exports.opensslDatabaseFilePath = exports.configPath('certificate-authority', 'index.txt'); exports.caSelfSignConfig = path_1.default.join(__dirname, '../openssl-configurations/certificate-authority-self-signing.conf'); function generateSubjectAltNames(domains) { return domains .reduce((dnsEntries, domain) => dnsEntries.concat([ `DNS.${dnsEntries.length + 1} = ${domain}`, `DNS.${dnsEntries.length + 2} = *.${domain}`, ]), []) .join("\r\n"); } function withDomainSigningRequestConfig(domains, cb) { const domain = domains[0]; const subjectAltNames = generateSubjectAltNames(domains); let tmpFile = utils_1.mktmp(); let source = fs_1.readFileSync(path_1.default.join(__dirname, '../openssl-configurations/domain-certificate-signing-requests.conf'), 'utf-8'); let template = lodash_1.template(source); let result = template({ domain, subjectAltNames }); fs_1.writeFileSync(tmpFile, eol_1.default.auto(result)); cb(tmpFile); fs_1.unlinkSync(tmpFile); } exports.withDomainSigningRequestConfig = withDomainSigningRequestConfig; function withDomainCertificateConfig(domains, cb) { const domainPath = exports.getStableDomainPath(domains); const subjectAltNames = generateSubjectAltNames(domains); let tmpFile = utils_1.mktmp(); let source = fs_1.readFileSync(path_1.default.join(__dirname, '../openssl-configurations/domain-certificates.conf'), 'utf-8'); let template = lodash_1.template(source); let result = template({ subjectAltNames, serialFile: exports.opensslSerialFilePath, databaseFile: exports.opensslDatabaseFilePath, domainDir: exports.pathForDomain(domainPath) }); fs_1.writeFileSync(tmpFile, eol_1.default.auto(result)); cb(tmpFile); fs_1.unlinkSync(tmpFile); } exports.withDomainCertificateConfig = withDomainCertificateConfig; // confTemplate = confTemplate.replace(/DATABASE_PATH/, configPath('index.txt').replace(/\\/g, '\\\\')); // confTemplate = confTemplate.replace(/SERIAL_PATH/, configPath('serial').replace(/\\/g, '\\\\')); // confTemplate = eol.auto(confTemplate); exports.rootCADir = exports.configPath('certificate-authority'); exports.rootCAKeyPath = exports.configPath('certificate-authority', 'private-key.key'); exports.rootCACertPath = exports.configPath('certificate-authority', 'certificate.cert'); // Exposed for uninstallation purposes. function getLegacyConfigDir() { if (exports.isWindows && process.env.LOCALAPPDATA) { return path_1.default.join(process.env.LOCALAPPDATA, 'devcert', 'config'); } else { let uid = process.getuid && process.getuid(); let userHome = (exports.isLinux && uid === 0) ? path_1.default.resolve('/usr/local/share') : require('os').homedir(); return path_1.default.join(userHome, '.config', 'devcert'); } } exports.getLegacyConfigDir = getLegacyConfigDir; function ensureConfigDirs() { mkdirp_1.sync(exports.configDir); mkdirp_1.sync(exports.domainsDir); mkdirp_1.sync(exports.rootCADir); } exports.ensureConfigDirs = ensureConfigDirs; ensureConfigDirs(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6Ii4vIiwic291cmNlcyI6WyJjb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLHdEQUF3QjtBQUN4QiwyQkFBNEY7QUFDNUYsbUNBQXdDO0FBQ3hDLG1DQUFrRDtBQUNsRCxpRUFBa0U7QUFDbEUsc0RBQXNCO0FBQ3RCLG1DQUEyQztBQUUzQyxxQkFBcUI7QUFDUixRQUFBLEtBQUssR0FBRyxPQUFPLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQztBQUN0QyxRQUFBLE9BQU8sR0FBRyxPQUFPLENBQUMsUUFBUSxLQUFLLE9BQU8sQ0FBQztBQUN2QyxRQUFBLFNBQVMsR0FBRyxPQUFPLENBQUMsUUFBUSxLQUFLLE9BQU8sQ0FBQztBQUV0RCxlQUFlO0FBQ0YsUUFBQSxTQUFTLEdBQUcscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDN0MsUUFBQSxVQUFVLEdBQTBDLGNBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQUksRUFBRSxpQkFBUyxDQUFDLENBQUM7QUFFakcsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLE9BQWlCLEVBQUUsRUFBRSxDQUMvQyxLQUFLLENBQUMsSUFBSSxDQUNSLE9BQU87S0FDSixJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7S0FDbkMsTUFBTSxDQUFDLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQy9CLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO0tBQ3JCLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRTtJQUN4QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7UUFDN0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUNyQjtT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LGNBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0tBQ2pFO1NBQU07UUFDTCxJQUFJLEdBQUcsR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM3QyxJQUFJLFFBQVEsR0FBRyxDQUFDLGVBQU8sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25HLE9BQU8sY0FBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0tBQ2xEO0FBQ0gsQ0FBQztBQVJELGdEQVFDO0FBRUQsU0FBZ0IsZ0JBQWdCO0lBQzlCLGFBQU0sQ0FBQyxpQkFBUyxDQUFDLENBQUM7SUFDbEIsYUFBTSxDQUFDLGtCQUFVLENBQUMsQ0FBQztJQUNuQixhQUFNLENBQUMsaUJBQVMsQ0FBQyxDQUFDO0FBQ3BCLENBQUM7QUFKRCw0Q0FJQztBQUVELGdCQUFnQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHVubGlua1N5bmMgYXMgcm0sIHdyaXRlRmlsZVN5bmMgYXMgd3JpdGVGaWxlLCByZWFkRmlsZVN5bmMgYXMgcmVhZEZpbGUgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBzeW5jIGFzIG1rZGlycCB9IGZyb20gJ21rZGlycCc7XG5pbXBvcnQgeyB0ZW1wbGF0ZSBhcyBtYWtlVGVtcGxhdGUgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGFwcGxpY2F0aW9uQ29uZmlnUGF0aCA9IHJlcXVpcmUoJ2FwcGxpY2F0aW9uLWNvbmZpZy1wYXRoJyk7XG5pbXBvcnQgZW9sIGZyb20gJ2VvbCc7XG5pbXBvcnQge21rdG1wLCBudW1lcmljSGFzaH0gZnJvbSAnLi91dGlscyc7XG5cbi8vIFBsYXRmb3JtIHNob3J0Y3V0c1xuZXhwb3J0IGNvbnN0IGlzTWFjID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2Rhcndpbic7XG5leHBvcnQgY29uc3QgaXNMaW51eCA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICdsaW51eCc7XG5leHBvcnQgY29uc3QgaXNXaW5kb3dzID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcblxuLy8gQ29tbW9uIHBhdGhzXG5leHBvcnQgY29uc3QgY29uZmlnRGlyID0gYXBwbGljYXRpb25Db25maWdQYXRoKCdkZXZjZXJ0Jyk7XG5leHBvcnQgY29uc3QgY29uZmlnUGF0aDogKC4uLnBhdGhTZWdtZW50czogc3RyaW5nW10pID0+IHN0cmluZyA9IHBhdGguam9pbi5iaW5kKHBhdGgsIGNvbmZpZ0Rpcik7XG5cbmNvbnN0IGdldEZpbHRlcmVkRG9tYWlucyA9IChkb21haW5zOiBzdHJpbmdbXSkgPT5cbiAgQXJyYXkuZnJvbShcbiAgICBkb21haW5zXG4gICAgICAuc29ydCgoYSwgYikgPT4gYi5sZW5ndGggLSBhLmxlbmd0aClcbiAgICAgIC5yZWR1Y2UoKGZpbHRlcmVkTGlzdCwgZG9tYWluKSA9PlxuICAgICAgICBBcnJheS5mcm9tKGZpbHRlcmVkTGlzdClcbiAgICAgICAgICAucmVkdWNlKChtYXRjaGVzLCBpdGVtKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbS5pbmRleE9mKGRvbWFpbikgPiAtMSkge1xuICAgICAgICAgICAgICBtYXRjaGVzLmFkZChkb21haW4pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkb21haW4uaW5kZXhPZihpdGVtKSA9PT0gLTEgJiYgaXRlbS5pbmRleE9mKGRvbWFpbikgPT09IC0xKSB7XG4gICAgICAgICAgICAgIG1hdGNoZXMuYWRkKGl0ZW0pO1xuICAgICAgICAgICAgICBtYXRjaGVzLmFkZChkb21haW4pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbWF0Y2hlcy5hZGQoaXRlbSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVzO1xuICAgICAgICAgIH0sIG5ldyBTZXQoKVxuICAgICAgICAgICksIG5ldyBTZXQoW2RvbWFpbnNbMF1dKVxuICAgICAgKVxuICApLnNvcnQoKTtcblxuZXhwb3J0IGNvbnN0IGdldFN0YWJsZURvbWFpblBhdGggPSAoZG9tYWluczogc3RyaW5nW10pID0+XG4gIGRvbWFpbnMubGVuZ3RoID09PSAxID9cbiAgICBkb21haW5zWzBdIDpcbiAgICAnc2FuLScgKyBudW1lcmljSGFzaChnZXRGaWx0ZXJlZERvbWFpbnMoZG9tYWlucykuam9pbignJykpO1xuZXhwb3J0IGNvbnN0IGRvbWFpbnNEaXIgPSBjb25maWdQYXRoKCdkb21haW5zJyk7XG5leHBvcnQgY29uc3QgcGF0aEZvckRvbWFpbjogKGRvbWFpbjogc3RyaW5nLCAuLi5wYXRoU2VnbWVudHM6IHN0cmluZ1tdKSA9PiBzdHJpbmcgPSBwYXRoLmpvaW4uYmluZChwYXRoLCBkb21haW5zRGlyKVxuXG5leHBvcnQgY29uc3QgY2FWZXJzaW9uRmlsZSA9IGNvbmZpZ1BhdGgoJ2RldmNlcnQtY2EtdmVyc2lvbicpO1xuZXhwb3J0IGNvbnN0IG9wZW5zc2xTZXJpYWxGaWxlUGF0aCA9IGNvbmZpZ1BhdGgoJ2NlcnRpZmljYXRlLWF1dGhvcml0eScsICdzZXJpYWwnKTtcbmV4cG9ydCBjb25zdCBvcGVuc3NsRGF0YWJhc2VGaWxlUGF0aCA9IGNvbmZpZ1BhdGgoJ2NlcnRpZmljYXRlLWF1dGhvcml0eScsICdpbmRleC50eHQnKTtcbmV4cG9ydCBjb25zdCBjYVNlbGZTaWduQ29uZmlnID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL29wZW5zc2wtY29uZmlndXJhdGlvbnMvY2VydGlmaWNhdGUtYXV0aG9yaXR5LXNlbGYtc2lnbmluZy5jb25mJyk7XG5cbmZ1bmN0aW9uIGdlbmVyYXRlU3ViamVjdEFsdE5hbWVzKGRvbWFpbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGRvbWFpbnNcbiAgICAucmVkdWNlKChkbnNFbnRyaWVzLCBkb21haW4pID0+XG4gICAgICBkbnNFbnRyaWVzLmNvbmNhdChbXG4gICAgICAgIGBETlMuJHtkbnNFbnRyaWVzLmxlbmd0aCArIDF9ID0gJHtkb21haW59YCxcbiAgICAgICAgYEROUy4ke2Ruc0VudHJpZXMubGVuZ3RoICsgMn0gPSAqLiR7ZG9tYWlufWAsXG4gICAgICBdKSwgW10gYXMgc3RyaW5nW10pXG4gICAgLmpvaW4oXCJcXHJcXG5cIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoRG9tYWluU2lnbmluZ1JlcXVlc3RDb25maWcoZG9tYWluczogc3RyaW5nW10sIGNiOiAoZmlsZXBhdGg6IHN0cmluZykgPT4gdm9pZCkge1xuICBjb25zdCBkb21haW4gPSBkb21haW5zWzBdO1xuICBjb25zdCBzdWJqZWN0QWx0TmFtZXMgPSBnZW5lcmF0ZVN1YmplY3RBbHROYW1lcyhkb21haW5zKTtcbiAgbGV0IHRtcEZpbGUgPSBta3RtcCgpO1xuICBsZXQgc291cmNlID0gcmVhZEZpbGUocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL29wZW5zc2wtY29uZmlndXJhdGlvbnMvZG9tYWluLWNlcnRpZmljYXRlLXNpZ25pbmctcmVxdWVzdHMuY29uZicpLCAndXRmLTgnKTtcbiAgbGV0IHRlbXBsYXRlID0gbWFrZVRlbXBsYXRlKHNvdXJjZSk7XG4gIGxldCByZXN1bHQgPSB0ZW1wbGF0ZSh7ZG9tYWluLCBzdWJqZWN0QWx0TmFtZXN9KTtcbiAgd3JpdGVGaWxlKHRtcEZpbGUsIGVvbC5hdXRvKHJlc3VsdCkpO1xuICBjYih0bXBGaWxlKTtcbiAgcm0odG1wRmlsZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoRG9tYWluQ2VydGlmaWNhdGVDb25maWcoZG9tYWluczogc3RyaW5nW10sIGNiOiAoZmlsZXBhdGg6IHN0cmluZykgPT4gdm9pZCkge1xuICBjb25zdCBkb21haW5QYXRoID0gZ2V0U3RhYmxlRG9tYWluUGF0aChkb21haW5zKTtcbiAgY29uc3Qgc3ViamVjdEFsdE5hbWVzID0gZ2VuZXJhdGVTdWJqZWN0QWx0TmFtZXMoZG9tYWlucyk7XG4gIGxldCB0bXBGaWxlID0gbWt0bXAoKTtcbiAgbGV0IHNvdXJjZSA9IHJlYWRGaWxlKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi9vcGVuc3NsLWNvbmZpZ3VyYXRpb25zL2RvbWFpbi1jZXJ0aWZpY2F0ZXMuY29uZicpLCAndXRmLTgnKTtcbiAgbGV0IHRlbXBsYXRlID0gbWFrZVRlbXBsYXRlKHNvdXJjZSk7XG4gIGxldCByZXN1bHQgPSB0ZW1wbGF0ZSh7XG4gICAgc3ViamVjdEFsdE5hbWVzLFxuICAgIHNlcmlhbEZpbGU6IG9wZW5zc2xTZXJpYWxGaWxlUGF0aCxcbiAgICBkYXRhYmFzZUZpbGU6IG9wZW5zc2xEYXRhYmFzZUZpbGVQYXRoLFxuICAgIGRvbWFpbkRpcjogcGF0aEZvckRvbWFpbihkb21haW5QYXRoKVxuICB9KTtcbiAgd3JpdGVGaWxlKHRtcEZpbGUsIGVvbC5hdXRvKHJlc3VsdCkpO1xuICBjYih0bXBGaWxlKTtcbiAgcm0odG1wRmlsZSk7XG59XG5cbiAgLy8gY29uZlRlbXBsYXRlID0gY29uZlRlbXBsYXRlLnJlcGxhY2UoL0RBVEFCQVNFX1BBVEgvLCBjb25maWdQYXRoKCdpbmRleC50eHQnKS5yZXBsYWNlKC9cXFxcL2csICdcXFxcXFxcXCcpKTtcbiAgLy8gY29uZlRlbXBsYXRlID0gY29uZlRlbXBsYXRlLnJlcGxhY2UoL1NFUklBTF9QQVRILywgY29uZmlnUGF0aCgnc2VyaWFsJykucmVwbGFjZSgvXFxcXC9nLCAnXFxcXFxcXFwnKSk7XG4gIC8vIGNvbmZUZW1wbGF0ZSA9IGVvbC5hdXRvKGNvbmZUZW1wbGF0ZSk7XG5cbmV4cG9ydCBjb25zdCByb290Q0FEaXIgPSBjb25maWdQYXRoKCdjZXJ0aWZpY2F0ZS1hdXRob3JpdHknKTtcbmV4cG9ydCBjb25zdCByb290Q0FLZXlQYXRoID0gY29uZmlnUGF0aCgnY2VydGlmaWNhdGUtYXV0aG9yaXR5JywgJ3ByaXZhdGUta2V5LmtleScpO1xuZXhwb3J0IGNvbnN0IHJvb3RDQUNlcnRQYXRoID0gY29uZmlnUGF0aCgnY2VydGlmaWNhdGUtYXV0aG9yaXR5JywgJ2NlcnRpZmljYXRlLmNlcnQnKTtcblxuXG5cbi8vIEV4cG9zZWQgZm9yIHVuaW5zdGFsbGF0aW9uIHB1cnBvc2VzLlxuZXhwb3J0IGZ1bmN0aW9uIGdldExlZ2FjeUNvbmZpZ0RpcigpOiBzdHJpbmcge1xuICBpZiAoaXNXaW5kb3dzICYmIHByb2Nlc3MuZW52LkxPQ0FMQVBQREFUQSkge1xuICAgIHJldHVybiBwYXRoLmpvaW4ocHJvY2Vzcy5lbnYuTE9DQUxBUFBEQVRBLCAnZGV2Y2VydCcsICdjb25maWcnKTtcbiAgfSBlbHNlIHtcbiAgICBsZXQgdWlkID0gcHJvY2Vzcy5nZXR1aWQgJiYgcHJvY2Vzcy5nZXR1aWQoKTtcbiAgICBsZXQgdXNlckhvbWUgPSAoaXNMaW51eCAmJiB1aWQgPT09IDApID8gcGF0aC5yZXNvbHZlKCcvdXNyL2xvY2FsL3NoYXJlJykgOiByZXF1aXJlKCdvcycpLmhvbWVkaXIoKTtcbiAgICByZXR1cm4gcGF0aC5qb2luKHVzZXJIb21lLCAnLmNvbmZpZycsICdkZXZjZXJ0Jyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUNvbmZpZ0RpcnMoKSB7XG4gIG1rZGlycChjb25maWdEaXIpO1xuICBta2RpcnAoZG9tYWluc0Rpcik7XG4gIG1rZGlycChyb290Q0FEaXIpO1xufVxuXG5lbnN1cmVDb25maWdEaXJzKCk7XG4iXX0=