102 lines
16 KiB
JavaScript
102 lines
16 KiB
JavaScript
![]() |
"use strict";
|
||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
exports.removeDomain = exports.configuredDomains = exports.hasCertificateFor = exports.certificateFor = exports.uninstall = void 0;
|
||
|
const tslib_1 = require("tslib");
|
||
|
const fs_1 = require("fs");
|
||
|
const debug_1 = tslib_1.__importDefault(require("debug"));
|
||
|
const command_exists_1 = require("command-exists");
|
||
|
const rimraf_1 = tslib_1.__importDefault(require("rimraf"));
|
||
|
const constants_1 = require("./constants");
|
||
|
const platforms_1 = tslib_1.__importDefault(require("./platforms"));
|
||
|
const certificate_authority_1 = tslib_1.__importStar(require("./certificate-authority"));
|
||
|
Object.defineProperty(exports, "uninstall", { enumerable: true, get: function () { return certificate_authority_1.uninstall; } });
|
||
|
const certificates_1 = tslib_1.__importDefault(require("./certificates"));
|
||
|
const user_interface_1 = tslib_1.__importDefault(require("./user-interface"));
|
||
|
const is_valid_domain_1 = tslib_1.__importDefault(require("is-valid-domain"));
|
||
|
const debug = debug_1.default('devcert');
|
||
|
/**
|
||
|
* Request an SSL certificate for the given app name signed by the devcert root
|
||
|
* certificate authority. If devcert has previously generated a certificate for
|
||
|
* that app name on this machine, it will reuse that certificate.
|
||
|
*
|
||
|
* If this is the first time devcert is being run on this machine, it will
|
||
|
* generate and attempt to install a root certificate authority.
|
||
|
*
|
||
|
* Returns a promise that resolves with { key, cert }, where `key` and `cert`
|
||
|
* are Buffers with the contents of the certificate private key and certificate
|
||
|
* file, respectively
|
||
|
*
|
||
|
* If `options.getCaBuffer` is true, return value will include the ca certificate data
|
||
|
* as { ca: Buffer }
|
||
|
*
|
||
|
* If `options.getCaPath` is true, return value will include the ca certificate path
|
||
|
* as { caPath: string }
|
||
|
*/
|
||
|
function certificateFor(requestedDomains, options = {}) {
|
||
|
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
||
|
const domains = Array.isArray(requestedDomains) ? requestedDomains : [requestedDomains];
|
||
|
domains.forEach((domain) => {
|
||
|
if (domain !== "localhost" && !is_valid_domain_1.default(domain, { subdomain: true, wildcard: false, allowUnicode: true, topLevel: false })) {
|
||
|
throw new Error(`"${domain}" is not a valid domain name.`);
|
||
|
}
|
||
|
});
|
||
|
const domainPath = constants_1.getStableDomainPath(domains);
|
||
|
debug(`Certificate requested for ${domains}. Skipping certutil install: ${Boolean(options.skipCertutilInstall)}. Skipping hosts file: ${Boolean(options.skipHostsFile)}`);
|
||
|
if (options.ui) {
|
||
|
Object.assign(user_interface_1.default, options.ui);
|
||
|
}
|
||
|
if (!constants_1.isMac && !constants_1.isLinux && !constants_1.isWindows) {
|
||
|
throw new Error(`Platform not supported: "${process.platform}"`);
|
||
|
}
|
||
|
if (!command_exists_1.sync('openssl')) {
|
||
|
throw new Error('OpenSSL not found: OpenSSL is required to generate SSL certificates - make sure it is installed and available in your PATH');
|
||
|
}
|
||
|
let domainKeyPath = constants_1.pathForDomain(domainPath, `private-key.key`);
|
||
|
let domainCertPath = constants_1.pathForDomain(domainPath, `certificate.crt`);
|
||
|
if (!fs_1.existsSync(constants_1.rootCAKeyPath)) {
|
||
|
debug('Root CA is not installed yet, so it must be our first run. Installing root CA ...');
|
||
|
yield certificate_authority_1.default(options);
|
||
|
}
|
||
|
else if (options.getCaBuffer || options.getCaPath) {
|
||
|
debug('Root CA is not readable, but it probably is because an earlier version of devcert locked it. Trying to fix...');
|
||
|
yield certificate_authority_1.ensureCACertReadable(options);
|
||
|
}
|
||
|
if (!fs_1.existsSync(constants_1.pathForDomain(domainPath, `certificate.crt`))) {
|
||
|
debug(`Can't find certificate file for ${domains}, so it must be the first request for ${domains}. Generating and caching ...`);
|
||
|
yield certificates_1.default(domains);
|
||
|
}
|
||
|
if (!options.skipHostsFile) {
|
||
|
domains.forEach((domain) => tslib_1.__awaiter(this, void 0, void 0, function* () {
|
||
|
yield platforms_1.default.addDomainToHostFileIfMissing(domain);
|
||
|
}));
|
||
|
}
|
||
|
debug(`Returning domain certificate`);
|
||
|
const ret = {
|
||
|
key: fs_1.readFileSync(domainKeyPath),
|
||
|
cert: fs_1.readFileSync(domainCertPath)
|
||
|
};
|
||
|
if (options.getCaBuffer)
|
||
|
ret.ca = fs_1.readFileSync(constants_1.rootCACertPath);
|
||
|
if (options.getCaPath)
|
||
|
ret.caPath = constants_1.rootCACertPath;
|
||
|
return ret;
|
||
|
});
|
||
|
}
|
||
|
exports.certificateFor = certificateFor;
|
||
|
function hasCertificateFor(requestedDomains) {
|
||
|
const domains = Array.isArray(requestedDomains) ? requestedDomains : [requestedDomains];
|
||
|
const domainPath = constants_1.getStableDomainPath(domains);
|
||
|
return fs_1.existsSync(constants_1.pathForDomain(domainPath, `certificate.crt`));
|
||
|
}
|
||
|
exports.hasCertificateFor = hasCertificateFor;
|
||
|
function configuredDomains() {
|
||
|
return fs_1.readdirSync(constants_1.domainsDir);
|
||
|
}
|
||
|
exports.configuredDomains = configuredDomains;
|
||
|
function removeDomain(requestedDomains) {
|
||
|
const domains = Array.isArray(requestedDomains) ? requestedDomains : [requestedDomains];
|
||
|
const domainPath = constants_1.getStableDomainPath(domains);
|
||
|
return rimraf_1.default.sync(constants_1.pathForDomain(domainPath));
|
||
|
}
|
||
|
exports.removeDomain = removeDomain;
|
||
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiLi8iLCJzb3VyY2VzIjpbImluZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSwyQkFBNEY7QUFDNUYsMERBQWdDO0FBQ2hDLG1EQUF1RDtBQUN2RCw0REFBNEI7QUFDNUIsMkNBU3FCO0FBQ3JCLG9FQUEwQztBQUMxQyx5RkFBdUc7QUFJOUYsMEZBSm1ELGlDQUFTLE9BSW5EO0FBSGxCLDBFQUF1RDtBQUN2RCw4RUFBcUQ7QUFDckQsOEVBQTRDO0FBRzVDLE1BQU0sS0FBSyxHQUFHLGVBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQTZCckM7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsU0FBc0IsY0FBYyxDQUFvQixnQkFBbUMsRUFBRSxVQUFhLEVBQU87O1FBQy9HLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN4RixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDekIsSUFBSSxNQUFNLEtBQUssV0FBVyxJQUFJLENBQUMseUJBQWEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtnQkFDL0gsTUFBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLE1BQU0sK0JBQStCLENBQUMsQ0FBQzthQUM1RDtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxVQUFVLEdBQUcsK0JBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDaEQsS0FBSyxDQUFDLDZCQUE2QixPQUFPLGdDQUFnQyxPQUFPLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLDBCQUEwQixPQUFPLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUUxSyxJQUFJLE9BQU8sQ0FBQyxFQUFFLEVBQUU7WUFDZCxNQUFNLENBQUMsTUFBTSxDQUFDLHdCQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQy9CO1FBRUQsSUFBSSxDQUFDLGlCQUFLLElBQUksQ0FBQyxtQkFBTyxJQUFJLENBQUMscUJBQVMsRUFBRTtZQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixPQUFPLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztTQUNsRTtRQUVELElBQUksQ0FBQyxxQkFBYSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsNEhBQTRILENBQUMsQ0FBQztTQUMvSTtRQUVELElBQUksYUFBYSxHQUFHLHlCQUFhLENBQUMsVUFBVSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDakUsSUFBSSxjQUFjLEdBQUcseUJBQWEsQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUVsRSxJQUFJLENBQUMsZUFBTSxDQUFDLHlCQUFhLENBQUMsRUFBRTtZQUMxQixLQUFLLENBQUMsbUZBQW1GLENBQUMsQ0FBQztZQUMzRixNQUFNLCtCQUEyQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzVDO2FBQU0sSUFBSSxPQUFPLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUU7WUFDbkQsS0FBSyxDQUFDLCtHQUErRyxDQUFDLENBQUM7WUFDdkgsTUFBTSw0Q0FBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNyQztRQUVELElBQUksQ0FBQyxlQUFNLENBQUMseUJBQWEsQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxFQUFFO1lBQ3pELEtBQUssQ0FBQyxtQ0FBbUMsT0FBTyx5Q0FBeUMsT0FBTyw4QkFBOEIsQ0FBQyxDQUFDO1lBQ2hJLE1BQU0sc0JBQXlCLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDMUM7UUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRTtZQUMxQixPQUFPLENBQUMsT0FBTyxDQUFDLENBQU8sTUFBTSxFQUFFLEVBQUU7Z0JBQy9CLE1BQU0sbUJBQWUsQ0FBQyw0QkFBNEIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3RCxDQUFDLENBQUEsQ0FBQyxDQUFBO1NBQ0g7UUFFRCxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUV0QyxNQUFNLEdBQUcsR0FBRztZQUNWLEdBQUcsRUFBRSxpQkFBUSxDQUFDLGFBQWEsQ0FBQztZQUM1QixJQUFJLEVBQUUsaUJBQVEsQ0FBQyxjQUFjLENBQUM7U0FDYixDQUFDO1FBQ3BCLElBQUksT0FBTyxDQUFDLFdBQVc7WUFBRyxHQUE0QixDQUFDLEVBQUUsR0FBRyxpQkFBUSxDQUFDLDBCQUFjLENBQUMsQ0FBQztRQUNyRixJQUFJLE9BQU8sQ0FBQyxTQUFTO1lBQUcsR0FBMEIsQ0FBQyxNQUFNLEdBQUcsMEJBQWMsQ0FBQztRQUUzRSxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7Q0FBQTtBQXZERCx3Q0F1REM7QUFFRCxTQUFnQixpQkFBaUIsQ0FBQyxnQkFBbUM7SUFDbkUsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3hGLE1BQU0sVUFBVSxHQUFHLCtCQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hELE9BQU8sZUFBTSxDQUFDLHlCQUFhLENBQUMsVUFBVSxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQztBQUM5RCxDQUFDO0FBSkQsOENBSUM7QUFFRCxTQUFnQixpQkFBaUI7SUFDL0IsT0FBTyxnQkFBTyxDQUFDLHNCQUFVLENBQUMsQ0FBQztBQUM3QixDQUFDO0FBRkQsOENBRUM7QUFFRCxTQUFnQixZQUFZLENBQUMsZ0JBQW1DO0lBQzlELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN4RixNQUFNLFVBQVUsR0FBRywrQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoRCxPQUFPLGdCQUFNLENBQUMsSUFBSSxDQUFDLHlCQUFhLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBSkQsb0NBSUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWFkRmlsZVN5bmMgYXMgcmVhZEZpbGUsIHJlYWRkaXJTeW5jIGFzIHJlYWRkaXIsIGV4aXN0c1N5bmMgYXMgZXhpc3RzIH0gZnJvbSAnZnMnO1xuaW1wb3J0IGNyZWF0ZURlYnVnIGZyb20gJ2RlY
|