now paying respect to same zone subdomains
This commit is contained in:
		
							
								
								
									
										44
									
								
								dist/cert.classes.cert.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								dist/cert.classes.cert.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,44 @@
 | 
				
			|||||||
 | 
					/// <reference types="q" />
 | 
				
			||||||
 | 
					import * as plugins from "./cert.plugins";
 | 
				
			||||||
 | 
					export interface ICertConstructorOptions {
 | 
				
			||||||
 | 
					    cfEmail: string;
 | 
				
			||||||
 | 
					    cfKey: string;
 | 
				
			||||||
 | 
					    sslDir?: string;
 | 
				
			||||||
 | 
					    gitOriginRepo?: string;
 | 
				
			||||||
 | 
					    testMode?: boolean;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					export declare class Cert {
 | 
				
			||||||
 | 
					    private _cfEmail;
 | 
				
			||||||
 | 
					    private _cfKey;
 | 
				
			||||||
 | 
					    private _sslDir;
 | 
				
			||||||
 | 
					    private _gitOriginRepo;
 | 
				
			||||||
 | 
					    private _testMode;
 | 
				
			||||||
 | 
					    domainCertRequestMap: plugins.lik.Stringmap;
 | 
				
			||||||
 | 
					    certificatesPresent: Certificate[];
 | 
				
			||||||
 | 
					    certificatesValid: Certificate[];
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Constructor for Cert object
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    constructor(optionsArg: ICertConstructorOptions);
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Pulls already requested certificates from git origin
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    sslGitOriginPull: () => void;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Pushes all new requested certificates to git origin
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    sslGitOriginAddCommitPush: () => void;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * gets a ssl cert for a given domain
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    getDomainCert(domainNameArg: string, optionsArg?: {
 | 
				
			||||||
 | 
					        force: boolean;
 | 
				
			||||||
 | 
					    }): plugins.q.Promise<{}>;
 | 
				
			||||||
 | 
					    cleanOldCertificates(): void;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					export declare class Certificate {
 | 
				
			||||||
 | 
					    domainName: string;
 | 
				
			||||||
 | 
					    creationDate: Date;
 | 
				
			||||||
 | 
					    expiryDate: Date;
 | 
				
			||||||
 | 
					    constructor();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										20
									
								
								dist/cert.classes.cert.helpers.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								dist/cert.classes.cert.helpers.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
				
			|||||||
 | 
					/// <reference types="q" />
 | 
				
			||||||
 | 
					import { Cert } from "./index.ts";
 | 
				
			||||||
 | 
					import * as plugins from "./cert.plugins";
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * schedule a retry of certificate request
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export declare let scheduleRetry: (domainArg: string, certClassArg: Cert) => plugins.q.Promise<{}>;
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * check if a given domainCert is still valid
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export declare let checkDomainsStillValid: (domainNameArg: string, sslDirArg: string) => boolean;
 | 
				
			||||||
 | 
					export interface certConfig {
 | 
				
			||||||
 | 
					    domainName: string;
 | 
				
			||||||
 | 
					    created: number;
 | 
				
			||||||
 | 
					    expires: number;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * update a ssl directory
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export declare let updateSslDirSync: (sslDirArg: string, domainNameArg: string) => void;
 | 
				
			||||||
							
								
								
									
										59
									
								
								dist/cert.classes.cert.helpers.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								dist/cert.classes.cert.helpers.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,59 @@
 | 
				
			|||||||
 | 
					"use strict";
 | 
				
			||||||
 | 
					const plugins = require("./cert.plugins");
 | 
				
			||||||
 | 
					const paths = require("./cert.paths");
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * schedule a retry of certificate request
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					exports.scheduleRetry = (domainArg, certClassArg) => {
 | 
				
			||||||
 | 
					    let done = plugins.q.defer();
 | 
				
			||||||
 | 
					    setTimeout(() => {
 | 
				
			||||||
 | 
					        certClassArg.getDomainCert(domainArg)
 | 
				
			||||||
 | 
					            .then(done.resolve);
 | 
				
			||||||
 | 
					    }, 20000);
 | 
				
			||||||
 | 
					    return done.promise;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * check if a given domainCert is still valid
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					exports.checkDomainsStillValid = (domainNameArg, sslDirArg) => {
 | 
				
			||||||
 | 
					    let domainConfigPath = plugins.path.join(sslDirArg, domainNameArg, "config.json");
 | 
				
			||||||
 | 
					    if (plugins.smartfile.fs.fileExistsSync(domainConfigPath)) {
 | 
				
			||||||
 | 
					        let domainConfig = plugins.smartfile.fs.toObjectSync(domainConfigPath, "json");
 | 
				
			||||||
 | 
					        if (Date.now() >= ((domainConfig.expires - 604800) * 1000)) {
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else {
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * update a ssl directory
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					exports.updateSslDirSync = (sslDirArg, domainNameArg) => {
 | 
				
			||||||
 | 
					    plugins.smartfile.fs.ensureDirSync(sslDirArg);
 | 
				
			||||||
 | 
					    let domainCertFolder = plugins.path.join(paths.certDir, domainNameArg);
 | 
				
			||||||
 | 
					    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
 | 
				
			||||||
 | 
					        let certRegex = /.*\-([0-9]*)\.pem/;
 | 
				
			||||||
 | 
					        let certFileNameWithTime = plugins.smartfile.fs.listFilesSync(domainCertFolder, certRegex)[0];
 | 
				
			||||||
 | 
					        let certTime = parseInt(certRegex.exec(certFileNameWithTime)[1]);
 | 
				
			||||||
 | 
					        let certConfig = {
 | 
				
			||||||
 | 
					            domainName: domainNameArg,
 | 
				
			||||||
 | 
					            created: certTime,
 | 
				
			||||||
 | 
					            expires: certTime + 7776000
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        plugins.smartfile.memory.toFsSync(JSON.stringify(certConfig), plugins.path.join(sslDirArg, domainNameArg, "config.json"));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    ;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					let updateGitOrigin = (syncDirectionArg) => {
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					updateGitOrigin(0 /* toOrigin */);
 | 
				
			||||||
 | 
					//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydC5jbGFzc2VzLmNlcnQuaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NlcnQuY2xhc3Nlcy5jZXJ0LmhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBLE1BQVksT0FBTyxXQUFNLGdCQUFnQixDQUFDLENBQUE7QUFDMUMsTUFBWSxLQUFLLFdBQU0sY0FBYyxDQUFDLENBQUE7QUFJdEM7O0dBRUc7QUFDUSxxQkFBYSxHQUFHLENBQUMsU0FBZ0IsRUFBQyxZQUFpQjtJQUMxRCxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzdCLFVBQVUsQ0FBQztRQUNQLFlBQVksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDO2FBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUIsQ0FBQyxFQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ1QsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7QUFDeEIsQ0FBQyxDQUFDO0FBRUY7O0dBRUc7QUFDUSw4QkFBc0IsR0FBRyxDQUFDLGFBQXFCLEVBQUUsU0FBaUI7SUFDekUsSUFBSSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ2xGLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RCxJQUFJLFlBQVksR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQ2hELGdCQUFnQixFQUNoQixNQUFNLENBQ1QsQ0FBQztRQUNGLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxJ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
 | 
				
			||||||
							
								
								
									
										137
									
								
								dist/cert.classes.cert.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										137
									
								
								dist/cert.classes.cert.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										5
									
								
								dist/cert.helpers.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								dist/cert.helpers.d.ts
									
									
									
									
										vendored
									
									
								
							@@ -1,5 +0,0 @@
 | 
				
			|||||||
/// <reference types="q" />
 | 
					 | 
				
			||||||
import { Cert } from "./index.ts";
 | 
					 | 
				
			||||||
import * as plugins from "./cert.plugins";
 | 
					 | 
				
			||||||
export declare let accountsKeyPresent: () => plugins.q.Promise<{}>;
 | 
					 | 
				
			||||||
export declare let scheduleRetry: (domainArg: string, certClassArg: Cert) => plugins.q.Promise<{}>;
 | 
					 | 
				
			||||||
							
								
								
									
										25
									
								
								dist/cert.helpers.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										25
									
								
								dist/cert.helpers.js
									
									
									
									
										vendored
									
									
								
							@@ -1,25 +0,0 @@
 | 
				
			|||||||
"use strict";
 | 
					 | 
				
			||||||
const plugins = require("./cert.plugins");
 | 
					 | 
				
			||||||
let firstCall = true;
 | 
					 | 
				
			||||||
let enoughTime = false;
 | 
					 | 
				
			||||||
exports.accountsKeyPresent = () => {
 | 
					 | 
				
			||||||
    let done = plugins.q.defer();
 | 
					 | 
				
			||||||
    if (firstCall) {
 | 
					 | 
				
			||||||
        done.resolve();
 | 
					 | 
				
			||||||
        firstCall = false;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else {
 | 
					 | 
				
			||||||
        setTimeout(done.resolve, 5000);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    ;
 | 
					 | 
				
			||||||
    return done.promise;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
exports.scheduleRetry = (domainArg, certClassArg) => {
 | 
					 | 
				
			||||||
    let done = plugins.q.defer();
 | 
					 | 
				
			||||||
    setTimeout(() => {
 | 
					 | 
				
			||||||
        certClassArg.getDomainCert(domainArg)
 | 
					 | 
				
			||||||
            .then(done.resolve);
 | 
					 | 
				
			||||||
    }, 20000);
 | 
					 | 
				
			||||||
    return done.promise;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydC5oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2VydC5oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxNQUFZLE9BQU8sV0FBTSxnQkFBZ0IsQ0FBQyxDQUFBO0FBRzFDLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQztBQUNyQixJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7QUFDWiwwQkFBa0IsR0FBRztJQUM1QixJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzdCLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDWixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDZixTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFBRSxJQUFJLENBQUMsQ0FBQztRQUNMLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFBQSxDQUFDO0lBQ0YsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7QUFDeEIsQ0FBQyxDQUFDO0FBRVMscUJBQWEsR0FBRyxDQUFDLFNBQWdCLEVBQUMsWUFBaUI7SUFDMUQsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM3QixVQUFVLENBQUM7UUFDUCxZQUFZLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQzthQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVCLENBQUMsRUFBQyxLQUFLLENBQUMsQ0FBQztJQUNULE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQ3hCLENBQUMsQ0FBQyJ9
 | 
					 | 
				
			||||||
							
								
								
									
										4
									
								
								dist/cert.hook.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								dist/cert.hook.js
									
									
									
									
										vendored
									
									
								
							@@ -29,7 +29,7 @@ let cleanChallenge = (domainNameArg) => {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
let cooldown = () => {
 | 
					let cooldown = () => {
 | 
				
			||||||
    let done = plugins.q.defer();
 | 
					    let done = plugins.q.defer();
 | 
				
			||||||
    let cooldowntime = 120000;
 | 
					    let cooldowntime = 40000;
 | 
				
			||||||
    let passedTime = 0;
 | 
					    let passedTime = 0;
 | 
				
			||||||
    plugins.beautylog.log("Cooling down! " + (cooldowntime / 1000).toString() + " seconds left");
 | 
					    plugins.beautylog.log("Cooling down! " + (cooldowntime / 1000).toString() + " seconds left");
 | 
				
			||||||
    let coolDownCounter = () => {
 | 
					    let coolDownCounter = () => {
 | 
				
			||||||
@@ -62,4 +62,4 @@ smartcli.addCommand({
 | 
				
			|||||||
    cleanChallenge(argv._[1]);
 | 
					    cleanChallenge(argv._[1]);
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
smartcli.startParse();
 | 
					smartcli.startParse();
 | 
				
			||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydC5ob29rLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2VydC5ob29rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0EsTUFBWSxPQUFPLFdBQU0sZ0JBQWdCLENBQUMsQ0FBQTtBQUMxQyxNQUFZLEtBQUssV0FBTSxjQUFjLENBQUMsQ0FBQTtBQUV0QyxJQUFJLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7QUFFL0MsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM3RCxJQUFJLE1BQU0sR0FBRyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7QUFDaEQsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNSLEtBQUssRUFBRSxNQUFNLENBQUMsT0FBTztJQUNyQixHQUFHLEVBQUUsTUFBTSxDQUFDLEtBQUs7Q0FDcEIsQ0FBQyxDQUFDO0FBRUgsSUFBSSxZQUFZLEdBQUcsQ0FBQyxhQUFxQixFQUFFLFlBQW9CO0lBQzNELElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDN0IsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsd0JBQXdCLEdBQUcsYUFBYSxDQUFDLENBQUM7SUFDaEUsTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNyRSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ2hELE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLDhEQUE4RCxDQUFDLENBQUM7UUFDdkYsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ1osSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25CLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUN4QixDQUFDLENBQUE7QUFFRCxJQUFJLGNBQWMsR0FBRyxDQUFDLGFBQWE7SUFDL0IsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM3QixPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsR0FBRyxhQUFhLENBQUMsQ0FBQztJQUNqRSxNQUFNLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN0RCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUN4QixDQUFDLENBQUE7QUFFRCxJQUFJLFFBQVEsR0FBRztJQUNYLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDN0IsSUFBSSxZQUFZLEdBQUcsTUFBTSxDQUFDO0lBQzFCLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztJQUNuQixPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLFlBQVksR0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQztJQUMzRixJQUFJLGVBQWUsR0FBRztRQUNsQixVQUFVLENBQUM7WUFDUCxFQUFFLENBQUEsQ0FBQyxZQUFZLElBQUksVUFBVSxDQUFDLENBQUEsQ0FBQztnQkFDM0IsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNuQixDQUFDO1lBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ0osVUFBVSxHQUFHLFVBQVUsR0FBRyxJQUFJLENBQUM7Z0JBQy9CLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDLEdBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUM7Z0JBQzFHLGVBQWUsRUFBRSxDQUFDO1lBQ3RCLENBQUM7UUFDTCxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDYixDQUFDLENBQUE7SUFDRCxlQUFlLEVBQUUsQ0FBQztJQUNsQixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUN4QixDQUFDLENBQUE7QUFFRCxJQUFJLFVBQVUsR0FBRyxDQUFDLGFBQXFCO0lBQ25DLE1BQU0sQ0FBQyxrQkFBa0IsR0FBRyxhQUFhLENBQUM7QUFDOUMsQ0FBQyxDQUFBO0FBRUQsUUFBUSxDQUFDLFVBQVUsQ0FBQztJQUNoQixXQUFXLEVBQUUsa0JBQWtCO0NBQ2xDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJO0lBQ1QsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLENBQUMsQ0FBQyxDQUFDO0FBRUgsUUFBUSxDQUFDLFVBQVUsQ0FBQztJQUNoQixXQUFXLEVBQUUsaUJBQWlCO0NBQ2pDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJO0lBQ1QsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5QixDQUFDLENBQUMsQ0FBQztBQUVILFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyJ9
 | 
					//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydC5ob29rLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2VydC5ob29rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0EsTUFBWSxPQUFPLFdBQU0sZ0JBQWdCLENBQUMsQ0FBQTtBQUMxQyxNQUFZLEtBQUssV0FBTSxjQUFjLENBQUMsQ0FBQTtBQUV0QyxJQUFJLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7QUFFL0MsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM3RCxJQUFJLE1BQU0sR0FBRyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7QUFDaEQsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNSLEtBQUssRUFBRSxNQUFNLENBQUMsT0FBTztJQUNyQixHQUFHLEVBQUUsTUFBTSxDQUFDLEtBQUs7Q0FDcEIsQ0FBQyxDQUFDO0FBRUgsSUFBSSxZQUFZLEdBQUcsQ0FBQyxhQUFxQixFQUFFLFlBQW9CO0lBQzNELElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDN0IsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsd0JBQXdCLEdBQUcsYUFBYSxDQUFDLENBQUM7SUFDaEUsTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNyRSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ2hELE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLDhEQUE4RCxDQUFDLENBQUM7UUFDdkYsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ1osSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25CLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUN4QixDQUFDLENBQUE7QUFFRCxJQUFJLGNBQWMsR0FBRyxDQUFDLGFBQWE7SUFDL0IsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM3QixPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsR0FBRyxhQUFhLENBQUMsQ0FBQztJQUNqRSxNQUFNLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN0RCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUN4QixDQUFDLENBQUE7QUFFRCxJQUFJLFFBQVEsR0FBRztJQUNYLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDN0IsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztJQUNuQixPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLFlBQVksR0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQztJQUMzRixJQUFJLGVBQWUsR0FBRztRQUNsQixVQUFVLENBQUM7WUFDUCxFQUFFLENBQUEsQ0FBQyxZQUFZLElBQUksVUFBVSxDQUFDLENBQUEsQ0FBQztnQkFDM0IsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNuQixDQUFDO1lBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ0osVUFBVSxHQUFHLFVBQVUsR0FBRyxJQUFJLENBQUM7Z0JBQy9CLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDLEdBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUM7Z0JBQzFHLGVBQWUsRUFBRSxDQUFDO1lBQ3RCLENBQUM7UUFDTCxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDYixDQUFDLENBQUE7SUFDRCxlQUFlLEVBQUUsQ0FBQztJQUNsQixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUN4QixDQUFDLENBQUE7QUFFRCxJQUFJLFVBQVUsR0FBRyxDQUFDLGFBQXFCO0lBQ25DLE1BQU0sQ0FBQyxrQkFBa0IsR0FBRyxhQUFhLENBQUM7QUFDOUMsQ0FBQyxDQUFBO0FBRUQsUUFBUSxDQUFDLFVBQVUsQ0FBQztJQUNoQixXQUFXLEVBQUUsa0JBQWtCO0NBQ2xDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJO0lBQ1QsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLENBQUMsQ0FBQyxDQUFDO0FBRUgsUUFBUSxDQUFDLFVBQVUsQ0FBQztJQUNoQixXQUFXLEVBQUUsaUJBQWlCO0NBQ2pDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJO0lBQ1QsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5QixDQUFDLENBQUMsQ0FBQztBQUVILFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyJ9
 | 
				
			||||||
							
								
								
									
										45
									
								
								dist/index.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										45
									
								
								dist/index.d.ts
									
									
									
									
										vendored
									
									
								
							@@ -1,44 +1 @@
 | 
				
			|||||||
/// <reference types="q" />
 | 
					export * from "./cert.classes.cert";
 | 
				
			||||||
import * as plugins from "./cert.plugins";
 | 
					 | 
				
			||||||
export interface ICertConstructorOptions {
 | 
					 | 
				
			||||||
    cfEmail: string;
 | 
					 | 
				
			||||||
    cfKey: string;
 | 
					 | 
				
			||||||
    sslDir?: string;
 | 
					 | 
				
			||||||
    gitOriginRepo?: string;
 | 
					 | 
				
			||||||
    testMode?: boolean;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
export declare class Cert {
 | 
					 | 
				
			||||||
    private _cfEmail;
 | 
					 | 
				
			||||||
    private _cfKey;
 | 
					 | 
				
			||||||
    private _sslDir;
 | 
					 | 
				
			||||||
    private _gitOriginRepo;
 | 
					 | 
				
			||||||
    private _testMode;
 | 
					 | 
				
			||||||
    domainsCurrentlyRequesting: plugins.lik.Stringmap;
 | 
					 | 
				
			||||||
    certificatesPresent: Certificate[];
 | 
					 | 
				
			||||||
    certificatesValid: Certificate[];
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Constructor for Cert object
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    constructor(optionsArg: ICertConstructorOptions);
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Pulls already requested certificates from git origin
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    sslGitOriginPull: () => void;
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Pushes all new requested certificates to git origin
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    sslGitOriginAddCommitPush: () => void;
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * gets a ssl cert for a given domain
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    getDomainCert(domainNameArg: string, optionsArg?: {
 | 
					 | 
				
			||||||
        force: boolean;
 | 
					 | 
				
			||||||
    }): plugins.q.Promise<{}>;
 | 
					 | 
				
			||||||
    cleanOldCertificates(): void;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
export declare class Certificate {
 | 
					 | 
				
			||||||
    domainName: string;
 | 
					 | 
				
			||||||
    creationDate: Date;
 | 
					 | 
				
			||||||
    expiryDate: Date;
 | 
					 | 
				
			||||||
    constructor();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										161
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										161
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@@ -30,12 +30,12 @@
 | 
				
			|||||||
    "@types/minimatch": "^2.0.28",
 | 
					    "@types/minimatch": "^2.0.28",
 | 
				
			||||||
    "@types/q": "^0.0.27",
 | 
					    "@types/q": "^0.0.27",
 | 
				
			||||||
    "@types/shelljs": "^0.3.27",
 | 
					    "@types/shelljs": "^0.3.27",
 | 
				
			||||||
    "beautylog": "^5.0.14",
 | 
					    "beautylog": "^5.0.18",
 | 
				
			||||||
    "cflare": "0.0.9",
 | 
					    "cflare": "0.0.9",
 | 
				
			||||||
    "fs-extra": "^0.30.0",
 | 
					    "fs-extra": "^0.30.0",
 | 
				
			||||||
    "lik": "^1.0.2",
 | 
					    "lik": "^1.0.5",
 | 
				
			||||||
    "q": "^1.4.1",
 | 
					    "q": "^1.4.1",
 | 
				
			||||||
    "shelljs": "^0.7.0",
 | 
					    "shelljs": "^0.7.1",
 | 
				
			||||||
    "smartcli": "^1.0.4",
 | 
					    "smartcli": "^1.0.4",
 | 
				
			||||||
    "smartfile": "^4.0.12",
 | 
					    "smartfile": "^4.0.12",
 | 
				
			||||||
    "smartgit": "0.1.9",
 | 
					    "smartgit": "0.1.9",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -36,12 +36,12 @@ describe("cert", function () {
 | 
				
			|||||||
                return Math.floor(Math.random() * (max - min) + min);
 | 
					                return Math.floor(Math.random() * (max - min) + min);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            promiseArray.push(testCert.getDomainCert(`testing${getRandomArbitrary(1, 100000)}.bleu.de`));
 | 
					            promiseArray.push(testCert.getDomainCert(`testing${getRandomArbitrary(1, 100000)}.bleu.de`));
 | 
				
			||||||
            //promiseArray.push(testCert.getDomainCert(`testing${getRandomArbitrary(1,100000)}.bleu.de`));
 | 
					            promiseArray.push(testCert.getDomainCert(`testing${getRandomArbitrary(1, 100000)}.bleu.de`));
 | 
				
			||||||
            //promiseArray.push(testCert.getDomainCert(`testing${getRandomArbitrary(1,100000)}.bleu.de`));
 | 
					            promiseArray.push(testCert.getDomainCert(`testing${getRandomArbitrary(1, 100000)}.bleu.de`));
 | 
				
			||||||
            q.all(promiseArray).then(() => {
 | 
					            q.all(promiseArray).then(() => {
 | 
				
			||||||
                done();
 | 
					                done();
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLFFBQU8sY0FBYyxDQUFDLENBQUE7QUFDdEIsUUFBTyxRQUFRLENBQUMsQ0FBQTtBQUNoQix1QkFBbUIsTUFBTSxDQUFDLENBQUE7QUFDMUIsTUFBTyxJQUFJLFdBQVcsTUFBTSxDQUFDLENBQUM7QUFDOUIsTUFBTyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFDeEIsMEJBQTJCLGlCQUFpQixDQUFDLENBQUE7QUFDN0MsTUFBWSxJQUFJLFdBQU0sZUFBZSxDQUFDLENBQUE7QUFHdEMsSUFBSSxRQUFRLEdBQUcsSUFBSSxXQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQztBQUVsRSxJQUFJLFFBQWtCLENBQUM7QUFFdkIsUUFBUSxDQUFDLE1BQU0sRUFBQztJQUNaLFFBQVEsQ0FBQyxTQUFTLEVBQUM7UUFDZixFQUFFLENBQUMsZ0NBQWdDLEVBQUMsVUFBUyxJQUFJO1lBQzdDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkIsc0JBQVksRUFBRSxDQUFDLElBQUksQ0FBQztnQkFDaEIsSUFBSSxFQUFFLENBQUM7WUFDWCxDQUFDLENBQUMsQ0FBQTtRQUNOLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQyxDQUFDLENBQUE7SUFDRixRQUFRLENBQUMsTUFBTSxFQUFDO1FBQ1osRUFBRSxDQUFDLDRDQUE0QyxFQUFDO1lBQzVDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEIsUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztnQkFDckIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUTtnQkFDN0IsS0FBSyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTTtnQkFDekIsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFDLGFBQWEsQ0FBQztnQkFDOUMsYUFBYSxFQUFDLGtEQUFrRDtnQkFDaEUsUUFBUSxFQUFDLElBQUk7YUFDaEIsQ0FBQyxDQUFDO1lBQ0gsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FBQTtRQUNGLEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBQyxVQUFTLElBQUk7WUFDN0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNyQixJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7WUFDdEIsNEJBQTRCLEdBQUcsRUFBRSxHQUFHO2dCQUNoQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDekQsQ0FBQztZQUNELFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxVQUFVLGtCQUFrQixDQUFDLENBQUMsRUFBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUM1Riw4RkFBOEY7WUFDOUYsOEZBQThGO1lBQzlGLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUNyQixJQUFJLEVBQUUsQ0FBQztZQUNYLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDLENBQUMsQ0FBQTtBQUNOLENBQUMsQ0FBQyxDQUFDIn0=
 | 
					//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLFFBQU8sY0FBYyxDQUFDLENBQUE7QUFDdEIsUUFBTyxRQUFRLENBQUMsQ0FBQTtBQUNoQix1QkFBbUIsTUFBTSxDQUFDLENBQUE7QUFDMUIsTUFBTyxJQUFJLFdBQVcsTUFBTSxDQUFDLENBQUM7QUFDOUIsTUFBTyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFDeEIsMEJBQTJCLGlCQUFpQixDQUFDLENBQUE7QUFDN0MsTUFBWSxJQUFJLFdBQU0sZUFBZSxDQUFDLENBQUE7QUFHdEMsSUFBSSxRQUFRLEdBQUcsSUFBSSxXQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQztBQUVsRSxJQUFJLFFBQWtCLENBQUM7QUFFdkIsUUFBUSxDQUFDLE1BQU0sRUFBQztJQUNaLFFBQVEsQ0FBQyxTQUFTLEVBQUM7UUFDZixFQUFFLENBQUMsZ0NBQWdDLEVBQUMsVUFBUyxJQUFJO1lBQzdDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkIsc0JBQVksRUFBRSxDQUFDLElBQUksQ0FBQztnQkFDaEIsSUFBSSxFQUFFLENBQUM7WUFDWCxDQUFDLENBQUMsQ0FBQTtRQUNOLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQyxDQUFDLENBQUE7SUFDRixRQUFRLENBQUMsTUFBTSxFQUFDO1FBQ1osRUFBRSxDQUFDLDRDQUE0QyxFQUFDO1lBQzVDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEIsUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztnQkFDckIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUTtnQkFDN0IsS0FBSyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTTtnQkFDekIsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFDLGFBQWEsQ0FBQztnQkFDOUMsYUFBYSxFQUFDLGtEQUFrRDtnQkFDaEUsUUFBUSxFQUFDLElBQUk7YUFDaEIsQ0FBQyxDQUFDO1lBQ0gsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FBQTtRQUNGLEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBQyxVQUFTLElBQUk7WUFDN0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNyQixJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7WUFDdEIsNEJBQTRCLEdBQUcsRUFBRSxHQUFHO2dCQUNoQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDekQsQ0FBQztZQUNELFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxVQUFVLGtCQUFrQixDQUFDLENBQUMsRUFBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUM1RixZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsVUFBVSxrQkFBa0IsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDNUYsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFVBQVUsa0JBQWtCLENBQUMsQ0FBQyxFQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQzVGLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUNyQixJQUFJLEVBQUUsQ0FBQztZQUNYLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDLENBQUMsQ0FBQTtBQUNOLENBQUMsQ0FBQyxDQUFDIn0=
 | 
				
			||||||
@@ -39,8 +39,8 @@ describe("cert",function(){
 | 
				
			|||||||
                return Math.floor(Math.random() * (max - min) + min);
 | 
					                return Math.floor(Math.random() * (max - min) + min);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            promiseArray.push(testCert.getDomainCert(`testing${getRandomArbitrary(1,100000)}.bleu.de`));
 | 
					            promiseArray.push(testCert.getDomainCert(`testing${getRandomArbitrary(1,100000)}.bleu.de`));
 | 
				
			||||||
            //promiseArray.push(testCert.getDomainCert(`testing${getRandomArbitrary(1,100000)}.bleu.de`));
 | 
					            promiseArray.push(testCert.getDomainCert(`testing${getRandomArbitrary(1,100000)}.bleu.de`));
 | 
				
			||||||
            //promiseArray.push(testCert.getDomainCert(`testing${getRandomArbitrary(1,100000)}.bleu.de`));
 | 
					            promiseArray.push(testCert.getDomainCert(`testing${getRandomArbitrary(1,100000)}.bleu.de`));
 | 
				
			||||||
            q.all(promiseArray).then(() => {
 | 
					            q.all(promiseArray).then(() => {
 | 
				
			||||||
                done();
 | 
					                done();
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										86
									
								
								ts/cert.classes.cert.helpers.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								ts/cert.classes.cert.helpers.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,86 @@
 | 
				
			|||||||
 | 
					import {Cert} from "./index.ts";
 | 
				
			||||||
 | 
					import * as plugins from "./cert.plugins";
 | 
				
			||||||
 | 
					import * as paths from "./cert.paths";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * schedule a retry of certificate request
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export let scheduleRetry = (domainArg:string,certClassArg:Cert) => {
 | 
				
			||||||
 | 
					    let done = plugins.q.defer();
 | 
				
			||||||
 | 
					    setTimeout(() => {
 | 
				
			||||||
 | 
					        certClassArg.getDomainCert(domainArg)
 | 
				
			||||||
 | 
					            .then(done.resolve);
 | 
				
			||||||
 | 
					    },20000);
 | 
				
			||||||
 | 
					    return done.promise;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * check if a given domainCert is still valid
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export let checkDomainsStillValid = (domainNameArg: string, sslDirArg: string): boolean => {
 | 
				
			||||||
 | 
					    let domainConfigPath = plugins.path.join(sslDirArg, domainNameArg, "config.json");
 | 
				
			||||||
 | 
					    if (plugins.smartfile.fs.fileExistsSync(domainConfigPath)) {
 | 
				
			||||||
 | 
					        let domainConfig = plugins.smartfile.fs.toObjectSync(
 | 
				
			||||||
 | 
					            domainConfigPath,
 | 
				
			||||||
 | 
					            "json"
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        if (Date.now() >= ((domainConfig.expires - 604800) * 1000)) {
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface certConfig {
 | 
				
			||||||
 | 
					    domainName: string;
 | 
				
			||||||
 | 
					    created: number;
 | 
				
			||||||
 | 
					    expires: number;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * update a ssl directory
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export let updateSslDirSync = (sslDirArg: string, domainNameArg: string) => {
 | 
				
			||||||
 | 
					    plugins.smartfile.fs.ensureDirSync(sslDirArg);
 | 
				
			||||||
 | 
					    let domainCertFolder = plugins.path.join(paths.certDir, domainNameArg)
 | 
				
			||||||
 | 
					    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
 | 
				
			||||||
 | 
					        let certRegex = /.*\-([0-9]*)\.pem/;
 | 
				
			||||||
 | 
					        let certFileNameWithTime: string = plugins.smartfile.fs.listFilesSync(domainCertFolder, certRegex)[0];
 | 
				
			||||||
 | 
					        let certTime = parseInt(certRegex.exec(certFileNameWithTime)[1]);
 | 
				
			||||||
 | 
					        let certConfig: certConfig = {
 | 
				
			||||||
 | 
					            domainName: domainNameArg,
 | 
				
			||||||
 | 
					            created: certTime,
 | 
				
			||||||
 | 
					            expires: certTime + 7776000
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        plugins.smartfile.memory.toFsSync(
 | 
				
			||||||
 | 
					            JSON.stringify(certConfig),
 | 
				
			||||||
 | 
					            plugins.path.join(sslDirArg, domainNameArg, "config.json")
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const enum gitSyncDirection {
 | 
				
			||||||
 | 
					    toOrigin,
 | 
				
			||||||
 | 
					    fromOrigin
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let updateGitOrigin = (syncDirectionArg: gitSyncDirection) => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					updateGitOrigin(gitSyncDirection.toOrigin);
 | 
				
			||||||
							
								
								
									
										160
									
								
								ts/cert.classes.cert.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										160
									
								
								ts/cert.classes.cert.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,160 @@
 | 
				
			|||||||
 | 
					import * as plugins from "./cert.plugins";
 | 
				
			||||||
 | 
					import * as paths from "./cert.paths";
 | 
				
			||||||
 | 
					import * as helpers from "./cert.classes.cert.helpers"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface ICertConstructorOptions {
 | 
				
			||||||
 | 
					    cfEmail: string,
 | 
				
			||||||
 | 
					    cfKey: string,
 | 
				
			||||||
 | 
					    sslDir?: string,
 | 
				
			||||||
 | 
					    gitOriginRepo?: string,
 | 
				
			||||||
 | 
					    testMode?: boolean
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export class Cert {
 | 
				
			||||||
 | 
					    private _cfEmail: string;
 | 
				
			||||||
 | 
					    private _cfKey: string;
 | 
				
			||||||
 | 
					    private _sslDir: string;
 | 
				
			||||||
 | 
					    private _gitOriginRepo: string;
 | 
				
			||||||
 | 
					    private _testMode: boolean;
 | 
				
			||||||
 | 
					    domainCertRequestMap: plugins.lik.Stringmap = new plugins.lik.Stringmap();
 | 
				
			||||||
 | 
					    certificatesPresent: Certificate[];
 | 
				
			||||||
 | 
					    certificatesValid: Certificate[];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Constructor for Cert object
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    constructor(optionsArg: ICertConstructorOptions) {
 | 
				
			||||||
 | 
					        this._cfEmail = optionsArg.cfEmail;
 | 
				
			||||||
 | 
					        this._cfKey = optionsArg.cfKey;
 | 
				
			||||||
 | 
					        this._sslDir = optionsArg.sslDir;
 | 
				
			||||||
 | 
					        this._gitOriginRepo = optionsArg.gitOriginRepo;
 | 
				
			||||||
 | 
					        this._testMode = optionsArg.testMode;
 | 
				
			||||||
 | 
					        // write hook config
 | 
				
			||||||
 | 
					        let config = {
 | 
				
			||||||
 | 
					            cfEmail: this._cfEmail,
 | 
				
			||||||
 | 
					            cfKey: this._cfKey
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        plugins.smartfile.memory.toFsSync(
 | 
				
			||||||
 | 
					            JSON.stringify(config),
 | 
				
			||||||
 | 
					            plugins.path.join(__dirname, "assets/config.json")
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        // setup sslDir
 | 
				
			||||||
 | 
					        if (!this._sslDir) this._sslDir = paths.defaultSslDir;
 | 
				
			||||||
 | 
					        // setup Git
 | 
				
			||||||
 | 
					        if (this._gitOriginRepo) {
 | 
				
			||||||
 | 
					            plugins.smartgit.init(this._sslDir);
 | 
				
			||||||
 | 
					            plugins.smartgit.remote.add(this._sslDir, "origin", this._gitOriginRepo);
 | 
				
			||||||
 | 
					            this.sslGitOriginPull();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        // setup leSh config;
 | 
				
			||||||
 | 
					        let leShConfigString;
 | 
				
			||||||
 | 
					        if (this._testMode) {
 | 
				
			||||||
 | 
					            leShConfigString = `CA="https://acme-staging.api.letsencrypt.org/directory"\n`;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            leShConfigString = " ";
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        plugins.smartfile.memory.toFsSync(
 | 
				
			||||||
 | 
					            leShConfigString,
 | 
				
			||||||
 | 
					            paths.leShConfig
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        plugins.shelljs.exec("chmod 700 " + paths.letsencryptSh);
 | 
				
			||||||
 | 
					        plugins.shelljs.exec("chmod 700 " + paths.certHook);
 | 
				
			||||||
 | 
					        plugins.shelljs.exec(
 | 
				
			||||||
 | 
					            `bash -c "${paths.letsencryptSh} -c --no-lock -f ${paths.leShConfig} -d notthere.notthere -t dns-01 -k ${paths.certHook} -o ${paths.certDir}"`,
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                silent: true
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Pulls already requested certificates from git origin
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    sslGitOriginPull = () => {
 | 
				
			||||||
 | 
					        if (this._gitOriginRepo) {
 | 
				
			||||||
 | 
					            plugins.smartgit.pull(this._sslDir, "origin", "master");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Pushes all new requested certificates to git origin
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    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");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * gets a ssl cert for a given domain
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    getDomainCert(domainNameArg: string, optionsArg: { force: boolean } = { force: false }) {
 | 
				
			||||||
 | 
					        let done = plugins.q.defer();
 | 
				
			||||||
 | 
					        let domainStringData = new plugins.smartstring.Domain(domainNameArg);
 | 
				
			||||||
 | 
					        let sameZoneRequesting: boolean = this.domainCertRequestMap.checkMinimatch("*" + domainStringData.zoneName)
 | 
				
			||||||
 | 
					        // make sure no one else requires the same domain at the same time
 | 
				
			||||||
 | 
					        if (!this.domainCertRequestMap.checkString(domainNameArg)) {
 | 
				
			||||||
 | 
					            this.domainCertRequestMap.addString(domainNameArg);
 | 
				
			||||||
 | 
					            if (!helpers.checkDomainsStillValid(domainNameArg, this._sslDir) || optionsArg.force) {
 | 
				
			||||||
 | 
					                if (!sameZoneRequesting) {
 | 
				
			||||||
 | 
					                    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
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        (codeArg, stdoutArg) => {
 | 
				
			||||||
 | 
					                            if (codeArg == 0) {
 | 
				
			||||||
 | 
					                                console.log(stdoutArg);
 | 
				
			||||||
 | 
					                                let fetchedCertsArray: string[] = plugins.smartfile.fs.listFoldersSync(paths.certDir);
 | 
				
			||||||
 | 
					                                if (fetchedCertsArray.indexOf(domainNameArg) != -1) {
 | 
				
			||||||
 | 
					                                    helpers.updateSslDirSync(this._sslDir, domainNameArg);
 | 
				
			||||||
 | 
					                                    plugins.smartfile.fs.removeSync(plugins.path.join(paths.certDir, domainNameArg));
 | 
				
			||||||
 | 
					                                };
 | 
				
			||||||
 | 
					                                done.resolve();
 | 
				
			||||||
 | 
					                            } else {
 | 
				
			||||||
 | 
					                                plugins.beautylog.warn(`${domainNameArg} scheduled for retry`);
 | 
				
			||||||
 | 
					                                helpers.scheduleRetry(domainNameArg, this).then(done.resolve);
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                            this.domainCertRequestMap.removeString(domainNameArg);
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    plugins.beautylog.info(`${domainNameArg} is waiting for domains names of same zone to finish`);
 | 
				
			||||||
 | 
					                    this.domainCertRequestMap.removeString(domainNameArg);
 | 
				
			||||||
 | 
					                    this.domainCertRequestMap.registerUntilTrue(
 | 
				
			||||||
 | 
					                        () => {
 | 
				
			||||||
 | 
					                            return !this.domainCertRequestMap.checkMinimatch("*" + domainStringData.zoneName);
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        () => {
 | 
				
			||||||
 | 
					                            this.getDomainCert(domainNameArg).then(done.resolve);
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                plugins.beautylog.info("certificate for " + domainNameArg + " is still valid! Not fetching new one!");
 | 
				
			||||||
 | 
					                this.domainCertRequestMap.removeString(domainNameArg);
 | 
				
			||||||
 | 
					                done.resolve();
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            plugins.beautylog.warn(`${domainNameArg} is already requesting`);
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return done.promise;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    cleanOldCertificates() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export class Certificate {
 | 
				
			||||||
 | 
					    domainName: string;
 | 
				
			||||||
 | 
					    creationDate: Date;
 | 
				
			||||||
 | 
					    expiryDate: Date;
 | 
				
			||||||
 | 
					    constructor() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1,25 +0,0 @@
 | 
				
			|||||||
import {Cert} from "./index.ts";
 | 
					 | 
				
			||||||
import * as plugins from "./cert.plugins";
 | 
					 | 
				
			||||||
import * as paths from "./cert.paths";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
let firstCall = true;
 | 
					 | 
				
			||||||
let enoughTime = false;
 | 
					 | 
				
			||||||
export let accountsKeyPresent = () => {
 | 
					 | 
				
			||||||
    let done = plugins.q.defer();
 | 
					 | 
				
			||||||
    if (firstCall) {
 | 
					 | 
				
			||||||
        done.resolve();
 | 
					 | 
				
			||||||
        firstCall = false;
 | 
					 | 
				
			||||||
    }  else {
 | 
					 | 
				
			||||||
        setTimeout(done.resolve,5000);
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
    return done.promise;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export let scheduleRetry = (domainArg:string,certClassArg:Cert) => {
 | 
					 | 
				
			||||||
    let done = plugins.q.defer();
 | 
					 | 
				
			||||||
    setTimeout(() => {
 | 
					 | 
				
			||||||
        certClassArg.getDomainCert(domainArg)
 | 
					 | 
				
			||||||
            .then(done.resolve);
 | 
					 | 
				
			||||||
    },20000);
 | 
					 | 
				
			||||||
    return done.promise;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
							
								
								
									
										203
									
								
								ts/index.ts
									
									
									
									
									
								
							
							
						
						
									
										203
									
								
								ts/index.ts
									
									
									
									
									
								
							@@ -1,205 +1,4 @@
 | 
				
			|||||||
import * as plugins from "./cert.plugins";
 | 
					import * as plugins from "./cert.plugins";
 | 
				
			||||||
import * as paths from "./cert.paths";
 | 
					import * as paths from "./cert.paths";
 | 
				
			||||||
import * as helpers from "./cert.helpers"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface ICertConstructorOptions {
 | 
					export * from "./cert.classes.cert";
 | 
				
			||||||
    cfEmail: string,
 | 
					 | 
				
			||||||
    cfKey: string,
 | 
					 | 
				
			||||||
    sslDir?: string,
 | 
					 | 
				
			||||||
    gitOriginRepo?: string,
 | 
					 | 
				
			||||||
    testMode?: boolean
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export class Cert {
 | 
					 | 
				
			||||||
    private _cfEmail: string;
 | 
					 | 
				
			||||||
    private _cfKey: string;
 | 
					 | 
				
			||||||
    private _sslDir: string;
 | 
					 | 
				
			||||||
    private _gitOriginRepo: string;
 | 
					 | 
				
			||||||
    private _testMode: boolean;
 | 
					 | 
				
			||||||
    domainsCurrentlyRequesting: plugins.lik.Stringmap = new plugins.lik.Stringmap();
 | 
					 | 
				
			||||||
    certificatesPresent: Certificate[];
 | 
					 | 
				
			||||||
    certificatesValid: Certificate[];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Constructor for Cert object
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    constructor(optionsArg: ICertConstructorOptions) {
 | 
					 | 
				
			||||||
        this._cfEmail = optionsArg.cfEmail;
 | 
					 | 
				
			||||||
        this._cfKey = optionsArg.cfKey;
 | 
					 | 
				
			||||||
        this._sslDir = optionsArg.sslDir;
 | 
					 | 
				
			||||||
        this._gitOriginRepo = optionsArg.gitOriginRepo;
 | 
					 | 
				
			||||||
        this._testMode = optionsArg.testMode;
 | 
					 | 
				
			||||||
        // write hook config
 | 
					 | 
				
			||||||
        let config = {
 | 
					 | 
				
			||||||
            cfEmail: this._cfEmail,
 | 
					 | 
				
			||||||
            cfKey: this._cfKey
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        plugins.smartfile.memory.toFsSync(
 | 
					 | 
				
			||||||
            JSON.stringify(config),
 | 
					 | 
				
			||||||
            plugins.path.join(__dirname, "assets/config.json")
 | 
					 | 
				
			||||||
        );
 | 
					 | 
				
			||||||
        // setup sslDir
 | 
					 | 
				
			||||||
        if (!this._sslDir) this._sslDir = paths.defaultSslDir;
 | 
					 | 
				
			||||||
        // setup Git
 | 
					 | 
				
			||||||
        if (this._gitOriginRepo) {
 | 
					 | 
				
			||||||
            plugins.smartgit.init(this._sslDir);
 | 
					 | 
				
			||||||
            plugins.smartgit.remote.add(this._sslDir, "origin", this._gitOriginRepo);
 | 
					 | 
				
			||||||
            this.sslGitOriginPull();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        // setup leSh config;
 | 
					 | 
				
			||||||
        let leShConfigString;
 | 
					 | 
				
			||||||
        if (this._testMode) {
 | 
					 | 
				
			||||||
            leShConfigString = `CA="https://acme-staging.api.letsencrypt.org/directory"\n`;
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            leShConfigString = " ";
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
        plugins.smartfile.memory.toFsSync(
 | 
					 | 
				
			||||||
            leShConfigString,
 | 
					 | 
				
			||||||
            paths.leShConfig
 | 
					 | 
				
			||||||
        );
 | 
					 | 
				
			||||||
        plugins.shelljs.exec("chmod 700 " + paths.letsencryptSh);
 | 
					 | 
				
			||||||
        plugins.shelljs.exec("chmod 700 " + paths.certHook);
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Pulls already requested certificates from git origin
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    sslGitOriginPull = () => {
 | 
					 | 
				
			||||||
        if (this._gitOriginRepo) {
 | 
					 | 
				
			||||||
            plugins.smartgit.pull(this._sslDir, "origin", "master");
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Pushes all new requested certificates to git origin
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    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");
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * gets a ssl cert for a given domain
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    getDomainCert(domainNameArg: string, optionsArg: { force: boolean } = { force: false }) {
 | 
					 | 
				
			||||||
        let done = plugins.q.defer();
 | 
					 | 
				
			||||||
        // 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
 | 
					 | 
				
			||||||
                        },
 | 
					 | 
				
			||||||
                        (codeArg, stdoutArg) => {
 | 
					 | 
				
			||||||
                            if (codeArg == 0) {
 | 
					 | 
				
			||||||
                                console.log(stdoutArg);
 | 
					 | 
				
			||||||
                                let fetchedCertsArray: string[] = 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();
 | 
					 | 
				
			||||||
                            } else {
 | 
					 | 
				
			||||||
                                this.domainsCurrentlyRequesting.removeString(domainNameArg);
 | 
					 | 
				
			||||||
                                plugins.beautylog.warn(`${domainNameArg} scheduled for retry`);
 | 
					 | 
				
			||||||
                                helpers.scheduleRetry(domainNameArg,this).then(done.resolve);
 | 
					 | 
				
			||||||
                            }
 | 
					 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
                    );
 | 
					 | 
				
			||||||
                } 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`);
 | 
					 | 
				
			||||||
            };
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return done.promise;
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
    cleanOldCertificates() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export class Certificate {
 | 
					 | 
				
			||||||
    domainName: string;
 | 
					 | 
				
			||||||
    creationDate: Date;
 | 
					 | 
				
			||||||
    expiryDate: Date;
 | 
					 | 
				
			||||||
    constructor() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
interface certConfig {
 | 
					 | 
				
			||||||
    domainName: string;
 | 
					 | 
				
			||||||
    created: number;
 | 
					 | 
				
			||||||
    expires: number;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
let checkDomainsStillValid = (domainNameArg: string, sslDirArg: string): boolean => {
 | 
					 | 
				
			||||||
    let domainConfigPath = plugins.path.join(sslDirArg, domainNameArg, "config.json");
 | 
					 | 
				
			||||||
    if (plugins.smartfile.fs.fileExistsSync(domainConfigPath)) {
 | 
					 | 
				
			||||||
        let domainConfig = plugins.smartfile.fs.toObjectSync(
 | 
					 | 
				
			||||||
            domainConfigPath,
 | 
					 | 
				
			||||||
            "json"
 | 
					 | 
				
			||||||
        );
 | 
					 | 
				
			||||||
        if (Date.now() >= ((domainConfig.expires - 604800) * 1000)) {
 | 
					 | 
				
			||||||
            return false;
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            return true;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
        return false;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
let updateSslDirSync = (sslDirArg: string, domainNameArg: string) => {
 | 
					 | 
				
			||||||
    plugins.smartfile.fs.ensureDirSync(sslDirArg);
 | 
					 | 
				
			||||||
    let domainCertFolder = plugins.path.join(paths.certDir, domainNameArg)
 | 
					 | 
				
			||||||
    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
 | 
					 | 
				
			||||||
        let certRegex = /.*\-([0-9]*)\.pem/;
 | 
					 | 
				
			||||||
        let certFileNameWithTime: string = plugins.smartfile.fs.listFilesSync(domainCertFolder, certRegex)[0];
 | 
					 | 
				
			||||||
        let certTime = parseInt(certRegex.exec(certFileNameWithTime)[1]);
 | 
					 | 
				
			||||||
        let certConfig: certConfig = {
 | 
					 | 
				
			||||||
            domainName: domainNameArg,
 | 
					 | 
				
			||||||
            created: certTime,
 | 
					 | 
				
			||||||
            expires: certTime + 7776000
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
        plugins.smartfile.memory.toFsSync(
 | 
					 | 
				
			||||||
            JSON.stringify(certConfig),
 | 
					 | 
				
			||||||
            plugins.path.join(sslDirArg, domainNameArg, "config.json")
 | 
					 | 
				
			||||||
        );
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const enum gitSyncDirection {
 | 
					 | 
				
			||||||
    toOrigin,
 | 
					 | 
				
			||||||
    fromOrigin
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
let updateGitOrigin = (syncDirectionArg: gitSyncDirection) => {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
updateGitOrigin(gitSyncDirection.toOrigin);
 | 
					 | 
				
			||||||
		Reference in New Issue
	
	Block a user