smartcert/dist/index.js

153 lines
14 KiB
JavaScript
Raw Permalink Normal View History

2016-06-18 14:03:46 +00:00
"use strict";
2016-07-21 12:58:05 +00:00
const plugins = require("./cert.plugins");
const paths = require("./cert.paths");
2016-07-22 00:11:04 +00:00
const helpers = require("./cert.helpers");
2016-07-12 16:00:08 +00:00
;
2016-07-21 12:58:05 +00:00
class Cert {
/**
* Constructor for Cert object
*/
constructor(optionsArg) {
2016-07-22 00:11:04 +00:00
this.domainsCurrentlyRequesting = new plugins.lik.Stringmap();
2016-07-21 12:58:05 +00:00
/**
* Pulls already requested certificates from git origin
*/
this.sslGitOriginPull = () => {
if (this._gitOriginRepo) {
plugins.smartgit.pull(this._sslDir, "origin", "master");
2016-07-04 02:56:49 +00:00
}
};
2016-07-21 12:58:05 +00:00
/**
* Pushes all new requested certificates to git origin
*/
this.sslGitOriginAddCommitPush = () => {
if (this._gitOriginRepo) {
plugins.smartgit.add.addAll(this._sslDir);
plugins.smartgit.commit(this._sslDir, "added new SSL certificates and deleted obsolete ones.");
plugins.smartgit.push(this._sslDir, "origin", "master");
2016-07-04 02:56:49 +00:00
}
};
2016-06-28 07:32:01 +00:00
this._cfEmail = optionsArg.cfEmail;
this._cfKey = optionsArg.cfKey;
this._sslDir = optionsArg.sslDir;
2016-07-04 02:56:49 +00:00
this._gitOriginRepo = optionsArg.gitOriginRepo;
2016-07-04 06:41:58 +00:00
this._testMode = optionsArg.testMode;
// write hook config
2016-07-21 12:58:05 +00:00
let config = {
2016-06-28 07:32:01 +00:00
cfEmail: this._cfEmail,
cfKey: this._cfKey
2016-06-22 11:22:09 +00:00
};
2016-06-28 03:53:49 +00:00
plugins.smartfile.memory.toFsSync(JSON.stringify(config), plugins.path.join(__dirname, "assets/config.json"));
2016-07-13 10:09:34 +00:00
// setup sslDir
if (!this._sslDir)
this._sslDir = paths.defaultSslDir;
2016-07-04 06:41:58 +00:00
// setup Git
2016-07-04 02:56:49 +00:00
if (this._gitOriginRepo) {
plugins.smartgit.init(this._sslDir);
plugins.smartgit.remote.add(this._sslDir, "origin", this._gitOriginRepo);
this.sslGitOriginPull();
}
2016-07-04 06:41:58 +00:00
// setup leSh config;
2016-07-21 12:58:05 +00:00
let leShConfigString;
2016-07-04 06:41:58 +00:00
if (this._testMode) {
2016-07-21 12:58:05 +00:00
leShConfigString = `CA="https://acme-staging.api.letsencrypt.org/directory"\n`;
2016-07-04 06:41:58 +00:00
}
else {
leShConfigString = " ";
}
;
plugins.smartfile.memory.toFsSync(leShConfigString, paths.leShConfig);
2016-07-21 12:58:05 +00:00
plugins.shelljs.exec("chmod 700 " + paths.letsencryptSh);
plugins.shelljs.exec("chmod 700 " + paths.certHook);
2016-06-18 14:03:46 +00:00
}
;
2016-07-21 12:58:05 +00:00
/**
* gets a ssl cert for a given domain
*/
getDomainCert(domainNameArg, optionsArg = { force: false }) {
let done = plugins.q.defer();
2016-07-22 00:11:04 +00:00
// make sure no one else requires the same domain at the same time
helpers.accountsKeyPresent().then(() => {
if (!this.domainsCurrentlyRequesting.checkString(domainNameArg)) {
this.domainsCurrentlyRequesting.addString(domainNameArg);
if (!checkDomainsStillValid(domainNameArg, this._sslDir) || optionsArg.force) {
plugins.smartfile.fs.ensureDir(paths.certDir);
plugins.beautylog.info(`getting cert for ${domainNameArg}`);
plugins.shelljs.exec(`bash -c "${paths.letsencryptSh} -c --no-lock -f ${paths.leShConfig} -d ${domainNameArg} -t dns-01 -k ${paths.certHook} -o ${paths.certDir}"`, {
silent: true,
async: true
}, (codeArg, stdoutArg) => {
console.log(stdoutArg);
let fetchedCertsArray = plugins.smartfile.fs.listFoldersSync(paths.certDir);
if (fetchedCertsArray.indexOf(domainNameArg) != -1) {
updateSslDirSync(this._sslDir, domainNameArg);
plugins.smartfile.fs.removeSync(plugins.path.join(paths.certDir, domainNameArg));
}
this.domainsCurrentlyRequesting.removeString(domainNameArg);
done.resolve();
});
2016-07-21 12:58:05 +00:00
}
2016-07-22 00:11:04 +00:00
else {
plugins.beautylog.info("certificate for " + domainNameArg + " is still valid! Not fetching new one!");
this.domainsCurrentlyRequesting.removeString(domainNameArg);
done.resolve();
}
;
}
else {
plugins.beautylog.warn(`${domainNameArg} is already requesting`);
}
;
});
2016-06-22 11:22:09 +00:00
return done.promise;
2016-07-21 12:58:05 +00:00
}
2016-06-18 14:03:46 +00:00
;
2016-07-21 12:58:05 +00:00
cleanOldCertificates() {
}
2016-07-04 06:41:58 +00:00
;
2016-07-21 12:58:05 +00:00
}
2016-06-18 14:03:46 +00:00
exports.Cert = Cert;
2016-07-21 12:58:05 +00:00
class Certificate {
constructor() {
2016-06-18 14:03:46 +00:00
}
;
2016-07-21 12:58:05 +00:00
}
2016-06-18 14:03:46 +00:00
exports.Certificate = Certificate;
2016-07-21 12:58:05 +00:00
let checkDomainsStillValid = (domainNameArg, sslDirArg) => {
let domainConfigPath = plugins.path.join(sslDirArg, domainNameArg, "config.json");
2016-07-04 06:41:58 +00:00
if (plugins.smartfile.fs.fileExistsSync(domainConfigPath)) {
2016-07-21 12:58:05 +00:00
let domainConfig = plugins.smartfile.fs.toObjectSync(domainConfigPath, "json");
2016-07-04 06:41:58 +00:00
if (Date.now() >= ((domainConfig.expires - 604800) * 1000)) {
return false;
}
else {
return true;
}
}
else {
return false;
}
2016-06-28 03:53:49 +00:00
};
2016-07-21 12:58:05 +00:00
let updateSslDirSync = (sslDirArg, domainNameArg) => {
2016-06-28 07:32:01 +00:00
plugins.smartfile.fs.ensureDirSync(sslDirArg);
2016-07-21 12:58:05 +00:00
let domainCertFolder = plugins.path.join(paths.certDir, domainNameArg);
2016-06-28 07:32:01 +00:00
if (plugins.smartfile.fs.listFoldersSync(paths.certDir).indexOf(domainNameArg) != -1) {
plugins.smartfile.fs.copySync(plugins.path.join(domainCertFolder, "fullchain.pem"), plugins.path.join(sslDirArg, domainNameArg, "fullchain.pem"));
plugins.smartfile.fs.copySync(plugins.path.join(domainCertFolder, "privkey.pem"), plugins.path.join(sslDirArg, domainNameArg, "privkey.pem"));
// create cert config
2016-07-21 12:58:05 +00:00
let certRegex = /.*\-([0-9]*)\.pem/;
let certFileNameWithTime = plugins.smartfile.fs.listFilesSync(domainCertFolder, certRegex)[0];
let certTime = parseInt(certRegex.exec(certFileNameWithTime)[1]);
let certConfig = {
2016-06-28 07:32:01 +00:00
domainName: domainNameArg,
created: certTime,
expires: certTime + 7776000
};
2016-07-04 06:41:58 +00:00
plugins.smartfile.memory.toFsSync(JSON.stringify(certConfig), plugins.path.join(sslDirArg, domainNameArg, "config.json"));
2016-06-28 07:32:01 +00:00
}
;
2016-06-28 03:53:49 +00:00
};
2016-07-21 12:58:05 +00:00
let updateGitOrigin = (syncDirectionArg) => {
2016-06-28 03:53:49 +00:00
};
2016-07-04 02:56:49 +00:00
updateGitOrigin(0 /* toOrigin */);
2016-07-22 00:11:04 +00:00
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsTUFBWSxPQUFPLFdBQU0sZ0JBQWdCLENBQUMsQ0FBQTtBQUMxQyxNQUFZLEtBQUssV0FBTSxjQUFjLENBQUMsQ0FBQTtBQUN0QyxNQUFZLE9BQU8sV0FBTSxnQkFFekIsQ0FBQyxDQUZ3QztBQVF4QyxDQUFDO0FBRUY7SUFVSTs7T0FFRztJQUNILFlBQVksVUFBbUM7UUFQL0MsK0JBQTBCLEdBQTBCLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQTZDaEY7O1dBRUc7UUFDSCxxQkFBZ0IsR0FBRztZQUNmLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO2dCQUN0QixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUM1RCxDQUFDO1FBQ0wsQ0FBQyxDQUFDO1FBRUY7O1dBRUc7UUFDSCw4QkFBeUIsR0FBRztZQUN4QixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztnQkFDdEIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDMUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSx1REFBdUQsQ0FBQyxDQUFDO2dCQUMvRixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUM1RCxDQUFDO1FBQ0wsQ0FBQyxDQUFDO1FBdkRFLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQztRQUNuQyxJQUFJLENBQUMsTUFB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