diff --git a/dist/smartacme.classes.acmeclient.d.ts b/dist/smartacme.classes.acmeclient.d.ts index 973cc01..7f344af 100644 --- a/dist/smartacme.classes.acmeclient.d.ts +++ b/dist/smartacme.classes.acmeclient.d.ts @@ -186,9 +186,9 @@ export declare class AcmeClient { * @param {number} days_valid * @return {{resource: string, csr: string, notBefore: string, notAfter: string}} */ - makeCertRequest(csr: any, DAYS_VALID: number): { + makeCertRequest(csr: string, DAYS_VALID: number): { 'resource': string; - 'csr': string; + 'csr': any; 'notBefore': string; 'notAfter': string; }; diff --git a/dist/smartacme.classes.acmeclient.js b/dist/smartacme.classes.acmeclient.js index f2e2ddf..53a1c0e 100644 --- a/dist/smartacme.classes.acmeclient.js +++ b/dist/smartacme.classes.acmeclient.js @@ -1,5 +1,5 @@ "use strict"; -const base64url = require("base64url"); +const plugins = require("./smartacme.plugins"); const child_process = require("child_process"); const crypto = require("crypto"); const fs = require("fs"); @@ -13,7 +13,7 @@ const smartacme_classes_jwebclient_1 = require("./smartacme.classes.jwebclient") * @return {Buffer} * @throws Exception if object cannot be stringified or contains cycle */ -let json_to_utf8buffer = function (obj) { +let json_to_utf8buffer = (obj) => { return new Buffer(JSON.stringify(obj), 'utf8'); }; /** @@ -135,7 +135,6 @@ class AcmeClient { */ getRegistration(uri, payload, callback) { /*jshint -W069 */ - let ctx = this; if (!(payload instanceof Object)) { payload = {}; // ensure payload is object } @@ -143,37 +142,32 @@ class AcmeClient { if (typeof callback !== 'function') { callback = this.emptyCallback; // ensure callback is function } - this.jWebClient.post(uri, payload, function (ans, res) { + this.jWebClient.post(uri, payload, (ans, res) => { if (ans instanceof Object) { - ctx.clientProfilePubKey = ans.key; // cache or reset returned public key + this.clientProfilePubKey = ans.key; // cache or reset returned public key if ((res instanceof Object) && (res['headers'] instanceof Object)) { let linkStr = res.headers['link']; if (typeof linkStr === 'string') { - let tosLink = ctx.getTosLink(linkStr); + let tosLink = this.getTosLink(linkStr); if (typeof tosLink === 'string') { - ctx.tosLink = tosLink; // cache TOS link + this.tosLink = tosLink; // cache TOS link } else { - ctx.tosLink = null; // reset TOS link + this.tosLink = null; // reset TOS link } } else { - ctx.tosLink = null; // reset TOS link + this.tosLink = null; // reset TOS link } } else { - ctx.tosLink = null; // reset TOS link + this.tosLink = null; // reset TOS link } callback(ans, res); } else { callback(false); } - // dereference - ans = null; - callback = null; - ctx = null; - res = null; }); // dereference payload = null; @@ -186,37 +180,25 @@ class AcmeClient { */ authorizeDomain(domain, callback) { /*jshint -W069 */ - let ctx = this; if (typeof callback !== 'function') { callback = this.emptyCallback; // ensure callback is function } - this.getProfile(function (profile) { + this.getProfile((profile) => { if (!(profile instanceof Object)) { callback(false); // no profile returned - // dereference - callback = null; - ctx = null; } else { - ctx.jWebClient.post(ctx.directory['new-authz'], ctx.makeDomainAuthorizationRequest(domain), function (ans, res) { + this.jWebClient.post(this.directory['new-authz'], this.makeDomainAuthorizationRequest(domain), (ans, res) => { if ((res instanceof Object) && (res['statusCode'] === 403)) { - ctx.agreeTos(ctx.tosLink, function (ans_, res_) { + this.agreeTos(this.tosLink, (ans_, res_) => { if ((res_ instanceof Object) && (res_['statusCode'] >= 200) && (res_['statusCode'] <= 400)) { - ctx.authorizeDomain(domain, callback); // try authorization again + this.authorizeDomain(domain, callback); // try authorization again } else { callback(false); // agreement failed } - // dereference - ans = null; - ans_ = null; - callback = null; - ctx = null; - profile = null; - res = null; - res_ = null; }); } else { @@ -225,50 +207,31 @@ class AcmeClient { && (typeof res.headers['location'] === 'string') && (ans instanceof Object)) { let poll_uri = res.headers['location']; // status URI for polling - let challenge = ctx.selectChallenge(ans, 'http-01'); // select simple http challenge + let challenge = this.selectChallenge(ans, 'http-01'); // select simple http challenge if (challenge instanceof Object) { - ctx.prepareChallenge(domain, challenge, function () { + this.prepareChallenge(domain, challenge, () => { // reset ans = null; res = null; // accept challenge - ctx.acceptChallenge(challenge, function (ans, res) { + this.acceptChallenge(challenge, (ans, res) => { if ((res instanceof Object) && (res['statusCode'] < 400) // server confirms challenge acceptance ) { - ctx.pollUntilValid(poll_uri, callback); // poll status until server states success + this.pollUntilValid(poll_uri, callback); // poll status until server states success } else { callback(false); // server did not confirm challenge acceptance } - // dereference - ans = null; - callback = null; - challenge = null; - ctx = null; - profile = null; - res = null; }); }); } else { callback(false); // desired challenge is not in list - // dereference - ans = null; - callback = null; - ctx = null; - profile = null; - res = null; } } else { callback(false); // server did not respond with status URI - // dereference - ans = null; - callback = null; - ctx = null; - profile = null; - res = null; } } }); @@ -300,7 +263,6 @@ class AcmeClient { */ pollUntilValid(uri, callback, retry = 1) { /*jshint -W069 */ - let ctx = this; if (typeof callback !== 'function') { callback = this.emptyCallback; // ensure callback is function } @@ -308,32 +270,18 @@ class AcmeClient { callback(false); // stop if retry value exceeds maximum } else { - this.jWebClient.get(uri, function (ans, res) { + this.jWebClient.get(uri, (ans, res) => { if (!(ans instanceof Object)) { callback(false); // invalid answer - // dereference - callback = null; - ctx = null; - res = null; } else { if (ans['status'] === 'pending') { - setTimeout(function () { - ctx.pollUntilValid(uri, callback, retry * 2); // retry - // dereference - ans = null; - callback = null; - ctx = null; - res = null; + setTimeout(() => { + this.pollUntilValid(uri, callback, retry * 2); // retry }, retry * 500); } else { callback(ans, res); // challenge complete - // dereference - ans = null; - callback = null; - ctx = null; - res = null; } } }); @@ -348,7 +296,6 @@ class AcmeClient { */ pollUntilIssued(uri, callback, retry = 1) { /*jshint -W069 */ - let ctx = this; if (typeof callback !== 'function') { callback = this.emptyCallback; // ensure callback is function } @@ -356,33 +303,18 @@ class AcmeClient { callback(false); // stop if retry value exceeds maximum } else { - this.jWebClient.get(uri, function (ans, res) { + this.jWebClient.get(uri, (ans, res) => { if ((ans instanceof Buffer) && (ans.length > 0)) { callback(ans); // certificate was returned with answer - // dereference - ans = null; - callback = null; - ctx = null; - res = null; } else { if ((res instanceof Object) && (res['statusCode'] < 400)) { - setTimeout(function () { - ctx.pollUntilIssued(uri, callback, retry * 2); // retry - // dereference - ans = null; - callback = null; - ctx = null; - res = null; + setTimeout(() => { + this.pollUntilIssued(uri, callback, retry * 2); // retry }, retry * 500); } else { callback(false); // CSR complete - // dereference - ans = null; - callback = null; - ctx = null; - res = null; } } }); @@ -396,33 +328,21 @@ class AcmeClient { */ requestSigning(domain, callback) { /*jshint -W069 */ - let ctx = this; if (typeof callback !== 'function') { callback = this.emptyCallback; // ensure callback is function } - fs.readFile(domain + '.csr', function (err, csr) { + fs.readFile(domain + '.csr', (err, csrBuffer) => { if (err instanceof Object) { - if (ctx.jWebClient.verbose) { + if (this.jWebClient.verbose) { console.error('Error : File system error', err['code'], 'while reading key from file'); } callback(false); - // dereference - callback = null; - csr = null; - ctx = null; - err = null; } else { - ctx.jWebClient.post(ctx.directory['new-cert'], ctx.makeCertRequest(csr, ctx.days_valid), function (ans, res) { + let csr = csrBuffer.toString(); + this.jWebClient.post(this.directory['new-cert'], this.makeCertRequest(csr, this.days_valid), (ans, res) => { if ((ans instanceof Buffer) && (ans.length > 0)) { callback(ans); // certificate was returned with answer - // dereference - ans = null; - callback = null; - csr = null; - ctx = null; - err = null; - res = null; } else { if (res instanceof Object) { @@ -431,7 +351,7 @@ class AcmeClient { if (!(headers instanceof Object)) { headers = {}; // ensure headers is object } - ctx.pollUntilIssued(headers['location'], callback); // poll provided status URI + this.pollUntilIssued(headers['location'], callback); // poll provided status URI // dereference headers = null; } @@ -442,13 +362,6 @@ class AcmeClient { else { callback(false); // invalid response } - // dereference - ans = null; - callback = null; - csr = null; - ctx = null; - err = null; - res = null; } }); } @@ -461,35 +374,25 @@ class AcmeClient { */ getProfile(callback) { /*jshint -W069 */ - let ctx = this; if (typeof callback !== 'function') { callback = this.emptyCallback; // ensure callback is function } - this.getDirectory(function (dir) { + this.getDirectory((dir) => { if (!(dir instanceof Object)) { callback(false); // server did not respond with directory - // dereference - callback = null; - ctx = null; } else { - ctx.directory = dir; // cache directory - ctx.newRegistration(null, function (ans, res) { + this.directory = dir; // cache directory + this.newRegistration(null, (ans, res) => { if ((res instanceof Object) && (res['headers'] instanceof Object) && (typeof res.headers['location'] === 'string')) { - ctx.regLink = res.headers['location']; - ctx.getRegistration(ctx.regLink, null, callback); // get registration info from link + this.regLink = res.headers['location']; + this.getRegistration(this.regLink, null, callback); // get registration info from link } else { callback(false); // registration failed } - // dereference - ans = null; - callback = null; - ctx = null; - dir = null; - res = null; }); } }); @@ -502,38 +405,29 @@ class AcmeClient { */ createAccount(email, callback) { /*jshint -W069 */ - let ctx = this; if (typeof email === 'string') { if (typeof callback !== 'function') { callback = this.emptyCallback; // ensure callback is function } - ctx.newRegistration({ + this.newRegistration({ contact: [ 'mailto:' + email ] - }, function (ans, res) { + }, (ans, res) => { if ((res instanceof Object) && (res['statusCode'] === 201) && (res['headers'] instanceof Object) && (typeof res.headers['location'] === 'string')) { - ctx.regLink = res.headers['location']; - callback(ctx.regLink); // registration URI + this.regLink = res.headers['location']; + callback(this.regLink); // registration URI } else { callback(false); // registration failed } - // dereference - ans = null; - callback = null; - ctx = null; - res = null; }); } else { callback(false); // no email address provided - // dereference - callback = null; - ctx = null; } } /** @@ -558,36 +452,35 @@ class AcmeClient { */ requestCertificate(domain, organization, country, callback) { /*jshint -W069 */ - let ctx = this; if (typeof domain !== 'string') { domain = ''; // ensure domain is string } if (typeof callback !== 'function') { callback = this.emptyCallback; // ensure callback is function } - this.getProfile(function (profile) { - let email = ctx.extractEmail(profile); // try to determine email address from profile - if (typeof ctx.emailOverride === 'string') { - email = ctx.emailOverride; // override email address if set + this.getProfile((profile) => { + let email = this.extractEmail(profile); // try to determine email address from profile + if (typeof this.emailOverride === 'string') { + email = this.emailOverride; // override email address if set } else if (typeof email !== 'string') { - email = ctx.emailDefaultPrefix + '@' + domain; // or set default + email = this.emailDefaultPrefix + '@' + domain; // or set default } - let bit = ctx.defaultRsaKeySize; + let bit = this.defaultRsaKeySize; // sanitize bit = Number(bit); - country = ctx.makeSafeFileName(country); - domain = ctx.makeSafeFileName(domain); - email = ctx.makeSafeFileName(email); - organization = ctx.makeSafeFileName(organization); + country = this.makeSafeFileName(country); + domain = this.makeSafeFileName(domain); + email = this.makeSafeFileName(email); + organization = this.makeSafeFileName(organization); // create key pair - ctx.createKeyPair(bit, country, organization, domain, email, function (e) { + this.createKeyPair(bit, country, organization, domain, email, (e) => { if (!e) { - ctx.requestSigning(domain, function (cert) { + this.requestSigning(domain, (cert) => { if ((cert instanceof Buffer) || (typeof cert === 'string')) { - fs.writeFile(domain + '.der', cert, function (err) { + fs.writeFile(domain + '.der', cert, (err) => { if (err instanceof Object) { - if (ctx.jWebClient.verbose) { + if (this.jWebClient.verbose) { console.error('Error : File system error', err['code'], 'while writing certificate to file'); } callback(false); @@ -595,33 +488,15 @@ class AcmeClient { else { callback(true); // CSR complete and certificate written to file system } - // dereference - callback = null; - cert = null; - ctx = null; - e = null; - err = null; - profile = null; }); } else { callback(false); // invalid certificate data - // dereference - callback = null; - cert = null; - ctx = null; - e = null; - profile = null; } }); } else { callback(false); // could not create key pair - // dereference - callback = null; - ctx = null; - e = null; - profile = null; } }); }); @@ -644,7 +519,7 @@ class AcmeClient { if (this.jWebClient.verbose) { console.error('Running:', openssl); } - child_process.exec(openssl, function (e) { + child_process.exec(openssl, (e) => { if (!e) { console.error('Result : done'); } @@ -676,7 +551,7 @@ class AcmeClient { // respects file name restrictions for ntfs and ext2 let regex_file = '[<>:\"/\\\\\\|\\?\\*\\u0000-\\u001f\\u007f\\u0080-\\u009f]'; let regex_path = '[<>:\"\\\\\\|\\?\\*\\u0000-\\u001f\\u007f\\u0080-\\u009f]'; - return name.replace(new RegExp(withPath ? regex_path : regex_file, 'g'), function (charToReplace) { + return name.replace(new RegExp(withPath ? regex_path : regex_file, 'g'), (charToReplace) => { if (typeof charToReplace === 'string') { return '%' + charToReplace.charCodeAt(0).toString(16).toLocaleUpperCase(); } @@ -691,47 +566,31 @@ class AcmeClient { */ prepareChallenge(domain, challenge, callback) { /*jshint -W069, unused:false*/ - let ctx = this; if (typeof callback !== 'function') { callback = this.emptyCallback; // ensure callback is function } if (challenge instanceof Object) { if (challenge['type'] === 'http-01') { let path = this.webroot + this.well_known_path + challenge['token']; // webroot and well_known_path are expected to be already sanitized - fs.writeFile(path, this.makeKeyAuthorization(challenge), function (err) { + fs.writeFile(path, this.makeKeyAuthorization(challenge), (err) => { if (err instanceof Object) { - if (ctx.jWebClient.verbose) { + if (this.jWebClient.verbose) { console.error('Error : File system error', err['code'], 'while writing challenge data to file'); } callback(); - // dereference - callback = null; - challenge = null; - ctx = null; - err = null; } else { // let uri = "http://" + domain + this.well_known_path + challenge["token"] let rl = readline.createInterface(process.stdin, process.stdout); - if (ctx.withInteraction) { - rl.question('Press enter to proceed', function (answer) { + if (this.withInteraction) { + rl.question('Press enter to proceed', (answer) => { rl.close(); callback(); - // dereference - callback = null; - challenge = null; - ctx = null; - rl = null; }); } else { rl.close(); callback(); // skip interaction prompt if desired - // dereference - callback = null; - challenge = null; - ctx = null; - rl = null; } } }); @@ -739,19 +598,11 @@ class AcmeClient { else { console.error('Error : Challenge not supported'); callback(); - // dereference - callback = null; - challenge = null; - ctx = null; } } else { console.error('Error : Invalid challenge response'); callback(); - // dereference - callback = null; - challenge = null; - ctx = null; } } /** @@ -767,9 +618,6 @@ class AcmeClient { match = null; return result; } - // dereference - match = null; - return void 0; } /** * Helper: Select challenge by type @@ -780,7 +628,7 @@ class AcmeClient { selectChallenge(ans, challengeType) { /*jshint -W069 */ if ((ans instanceof Object) && (ans['challenges'] instanceof Array)) { - return ans.challenges.filter(function (entry) { + return ans.challenges.filter((entry) => { let type = entry['type']; // dereference entry = null; @@ -807,7 +655,7 @@ class AcmeClient { return void 0; // invalid profile } let prefix = 'mailto:'; - let email = profile.contact.filter(function (entry) { + let email = profile.contact.filter((entry) => { if (typeof entry !== 'string') { return false; } @@ -851,11 +699,9 @@ class AcmeClient { n: this.clientProfilePubKey['n'] }); let hash = crypto.createHash('sha256').update(jwk.toString('utf8'), 'utf8').digest(); - let ACCOUNT_KEY = base64url.default.encode(hash); // create base64 encoded hash of account key + // create base64 encoded hash of account key + let ACCOUNT_KEY = plugins.smartstring.base64.encodeUri(hash.toString()); let token = challenge['token']; - // dereference - challenge = null; - jwk = null; return token + '.' + ACCOUNT_KEY; } } @@ -887,7 +733,7 @@ class AcmeClient { if ((typeof DAYS_VALID !== 'number') || (isNaN(DAYS_VALID)) || (DAYS_VALID === 0)) { DAYS_VALID = 1; // default validity duration (1 day) } - let DOMAIN_CSR_DER = base64url.default.encode(csr); // create base64 encoded CSR + let DOMAIN_CSR_DER = plugins.smartstring.base64.encodeUri(csr); // create base64 encoded CSR let CURRENT_DATE = (new Date()).toISOString(); // set start date to current date // set end date to current date + days_valid let NOTAFTER_DATE = (new Date((+new Date()) + 1000 * 60 * 60 * 24 * Math.abs(DAYS_VALID))).toISOString(); @@ -900,4 +746,4 @@ class AcmeClient { } } exports.AcmeClient = AcmeClient; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhY21lLmNsYXNzZXMuYWNtZWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0YWNtZS5jbGFzc2VzLmFjbWVjbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBLHVDQUFzQztBQUN0QywrQ0FBOEM7QUFDOUMsaUNBQWdDO0FBQ2hDLHlCQUF3QjtBQUN4QixxQ0FBb0M7QUFDcEMsaUZBQTJEO0FBRTNEOzs7Ozs7O0dBT0c7QUFDSCxJQUFJLGtCQUFrQixHQUFHLFVBQVUsR0FBRztJQUNsQyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQTtBQUNsRCxDQUFDLENBQUE7QUFFRDs7Ozs7O0dBTUc7QUFDSDtJQWNJLFlBQVksZUFBZTtRQUN2Qjs7O1dBR0c7UUFDSCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFBO1FBQzdCOzs7O1dBSUc7UUFDSCxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQTtRQUNuQjs7OztXQUlHO1FBQ0gsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQTtRQUM3Qjs7O1dBR0c7UUFDSCxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQTtRQUNuQjs7O1dBR0c7UUFDSCxJQUFJLENBQUMsWUFBWSxHQUFHLGVBQWUsQ0FBQTtRQUNuQzs7OztXQUlHO1FBQ0gsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFlBQVksQ0FBQSxDQUFDLFdBQVc7UUFDbEQ7OztXQUdHO1FBQ0gsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUEsQ0FBQyxXQUFXO1FBQ3JDOzs7V0FHRztRQUNILElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSx5Q0FBVSxFQUFFLENBQUEsQ0FBQyxlQUFlO1FBQ2xEOzs7V0FHRztRQUNILElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFBLENBQUMsV0FBVztRQUMv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 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhY21lLmNsYXNzZXMuYWNtZWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0YWNtZS5jbGFzc2VzLmFjbWVjbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUE4QztBQUM5QywrQ0FBOEM7QUFDOUMsaUNBQWdDO0FBQ2hDLHlCQUF3QjtBQUN4QixxQ0FBb0M7QUFDcEMsaUZBQTJEO0FBRTNEOzs7Ozs7O0dBT0c7QUFDSCxJQUFJLGtCQUFrQixHQUFHLENBQUMsR0FBRztJQUN6QixNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQTtBQUNsRCxDQUFDLENBQUE7QUFFRDs7Ozs7O0dBTUc7QUFDSDtJQWNJLFlBQVksZUFBZTtRQUN2Qjs7O1dBR0c7UUFDSCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFBO1FBQzdCOzs7O1dBSUc7UUFDSCxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQTtRQUNuQjs7OztXQUlHO1FBQ0gsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQTtRQUM3Qjs7O1dBR0c7UUFDSCxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQTtRQUNuQjs7O1dBR0c7UUFDSCxJQUFJLENBQUMsWUFBWSxHQUFHLGVBQWUsQ0FBQTtRQUNuQzs7OztXQUlHO1FBQ0gsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFlBQVksQ0FBQSxDQUFDLFdBQVc7UUFDbEQ7OztXQUdHO1FBQ0gsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUEsQ0FBQyxXQUFXO1FBQ3JDOzs7V0FHRztRQUNILElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSx5Q0FBVSxFQUFFLENBQUEsQ0FBQyxlQUFlO1FBQ2xEOzs7V0FHRztRQUNILElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFBLENBQUMsV0FBVztRQUMv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 \ No newline at end of file diff --git a/dist/smartacme.classes.jwebclient.js b/dist/smartacme.classes.jwebclient.js index fb5d757..75e7db2 100644 --- a/dist/smartacme.classes.jwebclient.js +++ b/dist/smartacme.classes.jwebclient.js @@ -1,5 +1,5 @@ "use strict"; -const base64url = require("base64url"); +const plugins = require("./smartacme.plugins"); const https = require("https"); let jwa = require('jwa'); const url = require("url"); @@ -12,7 +12,7 @@ const url = require("url"); * @throws Exception if object cannot be stringified or contains cycle */ let json_to_utf8base64url = function (obj) { - return base64url.default.encode(new Buffer(JSON.stringify(obj), 'utf8')); + return plugins.smartstring.base64.encodeUri(JSON.stringify(obj)); }; /** * @class JWebClient @@ -25,17 +25,17 @@ class JWebClient { * @member {Object} module:JWebClient~JWebClient#key_pair * @desc User account key pair */ - this.key_pair = null; // {Object} + this.key_pair = {}; /** * @member {string} module:JWebClient~JWebClient#last_nonce * @desc Cached nonce returned with last request */ - this.last_nonce = null; // {string} + this.last_nonce = null; /** * @member {boolean} module:JWebClient~JWebClient#verbose * @desc Determines verbose mode */ - this.verbose = false; // {boolean} + this.verbose = false; } /** * createJWT @@ -51,7 +51,7 @@ class JWebClient { /*jshint -W069 */ // prepare key if (key instanceof Object) { - key = base64url.default.toBuffer(key['k']); + key = new Buffer(plugins.smartstring.base64.decode(key['k'])); } // prepare header let header = { @@ -76,13 +76,6 @@ class JWebClient { input, sig ].join('.'); - // dereference - header = null; - hmac = null; - input = null; - jwk = null; - key = null; - payload = null; // output return output; } @@ -209,11 +202,7 @@ class JWebClient { if (typeof callback !== 'function') { callback = this.emptyCallback; // ensure callback is function } - let key_pair = this.key_pair; - if (!(key_pair instanceof Object)) { - key_pair = {}; // ensure key pair is object - } - let jwt = this.createJWT(this.last_nonce, payload, 'RS256', key_pair['private_pem'], key_pair['public_jwk']); + let jwt = this.createJWT(this.last_nonce, payload, 'RS256', this.key_pair['private_pem'], this.key_pair['public_jwk']); this.request(uri, jwt, (ans, res) => { ctx.evaluateStatus(uri, payload, ans, res); // save replay nonce for later requests @@ -221,16 +210,7 @@ class JWebClient { ctx.last_nonce = res.headers['replay-nonce']; } callback(ans, res); - // dereference - ans = null; - callback = null; - ctx = null; - key_pair = null; - payload = null; - res = null; }, errorCallback); - // dereference - errorCallback = null; } /** * evaluateStatus @@ -266,11 +246,6 @@ class JWebClient { console.error('Receive:', res['headers']); // received headers console.error('Receive:', ans); // received data } - // dereference - ans = null; - payload = null; - res = null; - uri_parsed = null; } /** * Helper: Empty callback @@ -280,4 +255,4 @@ class JWebClient { } } exports.JWebClient = JWebClient; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhY21lLmNsYXNzZXMuandlYmNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0YWNtZS5jbGFzc2VzLmp3ZWJjbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBLHVDQUFzQztBQUN0QywrQkFBOEI7QUFDOUIsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQ3hCLDJCQUEwQjtBQUUxQjs7Ozs7OztHQU9HO0FBQ0gsSUFBSSxxQkFBcUIsR0FBRyxVQUFVLEdBQUc7SUFDckMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQTtBQUM1RSxDQUFDLENBQUE7QUFFRDs7OztHQUlHO0FBQ0g7SUFJSTtRQUNJOzs7V0FHRztRQUNILElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFBLENBQUMsV0FBVztRQUNoQzs7O1dBR0c7UUFDSCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQSxDQUFDLFdBQVc7UUFDbEM7OztXQUdHO1FBQ0gsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUEsQ0FBQyxZQUFZO0lBQ3JDLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxTQUFTLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7UUFDbkMsaUJBQWlCO1FBQ2pCLGNBQWM7UUFDZCxFQUFFLENBQUMsQ0FBQyxHQUFHLFlBQVksTUFBTSxDQUFDLENBQUMsQ0FBQztZQUN4QixHQUFHLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7UUFDOUMsQ0FBQztRQUNELGlCQUFpQjtRQUNqQixJQUFJLE1BQU0sR0FBRztZQUNULEdBQUcsRUFBRSxLQUFLO1lBQ1YsR0FBRyxFQUFFLEdBQUc7WUFDUixHQUFHLEVBQUUsR0FBRztZQUNSLEtBQUssRUFBRSxJQUFJO1NBQ2QsQ0FBQTtRQUVELEVBQUUsQ0FBQyxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkIsTUFBTSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUE7UUFDeEIsQ0FBQztRQUNELGlDQUFpQztRQUNqQyxJQUFJLEtBQUssR0FBRztZQUNSLHFCQUFxQixDQUFDLE1BQU0sQ0FBQztZQUM3QixxQkFBcUIsQ0FBQyxPQUFPLENBQUM7U0FDakMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDWCxhQUFhO1FBQ2IsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ25CLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFBO1FBQy9CLGtDQUFrQztRQUNsQyxJQUFJLE1BQU0sR0FBRztZQUNULEtBQUs7WUFDTCxHQUFHO1NBQ04sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDWCxjQUFjO1FBQ2QsTUFBTSxHQUFHLElBQUksQ0FBQTtRQUNiLElBQUksR0FBRyxJQUFJLENBQUE7UUFDWCxLQUFLLEdBQUcsSUFBSSxDQUFBO1FBQ1osR0FBRyxHQUFHLElBQUksQ0FBQTtRQUNWLEdBQUcsR0FBRyxJQUFJLENBQUE7UUFDVixPQUFPLEdBQUcsSUFBSSxDQUFBO1FBQ2QsU0FBUztRQUNULE1BQU0sQ0FBQyxNQUFNLENBQUE7SUFDakIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYTtRQUMzQyxpQkFBaUI7UUFDakIsRUFBRSxDQUFDLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztZQUM1QixLQUFLLEdBQUcsRUFBRSxDQUFBLENBQUMseUJBQXlCO1FBQ3hDLENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxPQUFPLFFBQVEsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFBLENBQUMsOEJBQThCO1FBQ2hFLENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxPQUFPLGFBQWEsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFBLENBQUMsOEJBQThCO1FBQ3JFLENBQUM7UUFDRCxrQkFBa0I7UUFDbEIsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUMxQixJQUFJLE9BQU8sR0FBRztZQUNWLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUTtZQUN0QixJQUFJLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQzVCLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtZQUNkLE1BQU0sRUFBRSxJQUFJO1lBQ1osT0FBTyxFQUFFLEVBQUU7U0FDZCxDQUFBO1FBQ0QsRUFBRSxDQUFDLENBQUMsT0FBTyxPQUFPLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztZQUM5QixPQUFPLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtZQUN2QixPQUFPLENBQUMsT0FBTyxHQUFHO2dCQUNkLGNBQWMsRUFBRSxrQkFBa0I7Z0JBQ2xDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxNQUFNO2FBQ25DLENBQUE7UUFDTCxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDSixPQUFPLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQTtRQUMxQixDQUFDO1FBQ0Qsa0JBQWtCO1FBQ2xCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFVBQVUsR0FBRztZQUMxQyxlQUFlO1lBQ2YsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFBO1lBQ2IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsVUFBVSxLQUFLO2dCQUMxQixFQUFFLENBQUMsQ0FBQyxLQUFLLFlBQVksTUFBTSxDQUFDLENBQUMsQ0FBQztvQkFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtnQkFDcEIsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFBO1lBQ0YsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUU7Z0JBQ1YsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFDN0IsSUFBSSxNQUFNLEdBQUcsQ0FDVCxDQUFDLEdBQUcsWUFBWSxNQUFNLENBQUM7dUJBQ3BCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxZQUFZLE1BQU0sQ0FBQzt1QkFDbEMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEtBQUssUUFBUSxDQUFDO3VCQUNqRCxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQ3hELENBQUE7Z0JBQ0QsRUFBRSxDQUFDLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDM0IsSUFBSSxDQUFDO3dCQUNELGtCQUFrQjt3QkFDbEIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7d0JBQzNDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUE7b0JBQ3ZCLENBQUU7b0JBQUEsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDVCxtQ0FBbUM7d0JBQ25DLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtvQkFDNUIsQ0FBQztnQkFDTCxDQUFDO2dCQUFDLElBQUksQ0FBQyxDQUFDO29CQUNKLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUE7Z0JBQ3RCLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQTtRQUNOLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDO1lBQ3RCLE9BQU8sQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFBO1lBQ2pDLFFBQVE7WUFDUixhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDNUIsQ0FBQyxDQUFDLENBQUE7UUFDRiwyQ0FBMkM7UUFDM0MsRUFBRSxDQUFDLENBQUMsT0FBTyxPQUFPLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztZQUM5QixHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3RCLENBQUM7UUFDRCxlQUFlO1FBQ2YsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFBO0lBQ2IsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEdBQUcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLGFBQWE7UUFDNUIsaUJBQWlCO1FBQ2pCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQTtRQUNkLEVBQUUsQ0FBQyxDQUFDLE9BQU8sUUFBUSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDakMsUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUEsQ0FBQyw4QkFBOEI7UUFDaEUsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLFVBQVUsR0FBRyxFQUFFLEdBQUc7WUFDeEMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQTtZQUN2Qyx1Q0FBdUM7WUFDdkMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLFlBQVksTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFlBQVksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoRSxHQUFHLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUE7WUFDaEQsQ0FBQztZQUNELFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUE7WUFDbEIsY0FBYztZQUNkLEdBQUcsR0FBRyxJQUFJLENBQUE7WUFDVixRQUFRLEdBQUcsSUFBSSxDQUFBO1lBQ2YsR0FBRyxHQUFHLElBQUksQ0FBQTtZQUNWLEdBQUcsR0FBRyxJQUFJLENBQUE7UUFDZCxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUE7UUFDakIsY0FBYztRQUNkLGFBQWEsR0FBRyxJQUFJLENBQUE7SUFDeEIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxJQUFJLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYTtRQUN0QyxpQkFBaUI7UUFDakIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFBO1FBQ2QsRUFBRSxDQUFDLENBQUMsT0FBTyxRQUFRLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQztZQUNqQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQSxDQUFDLDhCQUE4QjtRQUNoRSxDQUFDO1FBQ0QsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQTtRQUM1QixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxZQUFZLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxRQUFRLEdBQUcsRUFBRSxDQUFBLENBQUMsNEJBQTRCO1FBQzlDLENBQUM7UUFDRCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUE7UUFDNUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUc7WUFDNUIsR0FBRyxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQTtZQUMxQyx1Q0FBdUM7WUFDdkMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLFlBQVksTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFlBQVksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoRSxHQUFHLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUE7WUFDaEQsQ0FBQztZQUNELFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUE7WUFDbEIsY0FBYztZQUNkLEdBQUcsR0FBRyxJQUFJLENBQUE7WUFDVixRQUFRLEdBQUcsSUFBSSxDQUFBO1lBQ2YsR0FBRyxHQUFHLElBQUksQ0FBQTtZQUNWLFFBQVEsR0FBRyxJQUFJLENBQUE7WUFDZixPQUFPLEdBQUcsSUFBSSxDQUFBO1lBQ2QsR0FBRyxHQUFHLElBQUksQ0FBQTtRQUNkLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQTtRQUNqQixjQUFjO1FBQ2QsYUFBYSxHQUFHLElBQUksQ0FBQTtJQUN4QixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILGNBQWMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHO1FBQ2pDLGlCQUFpQjtRQUNqQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNmLEVBQUUsQ0FBQyxDQUNDLENBQUMsT0FBTyxZQUFZLE1BQU0sQ0FBQzttQkFDeEIsQ0FBQyxPQUFPLE9BQU8sS0FBSyxRQUFRLENBQUM7bUJBQzdCLENBQUMsT0FBTyxPQUFPLEtBQUssUUFBUSxDQUFDO21CQUM3QixDQUFDLE9BQU8sT0FBTyxLQUFLLFNBQVMsQ0FDcEMsQ0FBQyxDQUFDLENBQUM7Z0JBQ0MsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUEsQ0FBQyxxQkFBcUI7WUFDNUQsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLFVBQVUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQy9CLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdEQsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQSxDQUFDLDhCQUE4QjtRQUNoRyxDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN0RCxPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFBLENBQUMseUJBQXlCO1lBQ3ZGLEVBQUUsQ0FBQyxDQUFDLEdBQUcsWUFBWSxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUN4QixFQUFFLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDO29CQUNwQyxPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFBLENBQUMsdUJBQXVCO2dCQUNyRixDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFBLENBQUMsbUJBQW1CO1lBQzdELE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFBLENBQUMsZ0JBQWdCO1FBQ25ELENBQUM7UUFDRCxjQUFjO1FBQ2QsR0FBRyxHQUFHLElBQUksQ0FBQTtRQUNWLE9BQU8sR0FBRyxJQUFJLENBQUE7UUFDZCxHQUFHLEdBQUcsSUFBSSxDQUFBO1FBQ1YsVUFBVSxHQUFHLElBQUksQ0FBQTtJQUNyQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxhQUFhO1FBQ1QsTUFBTTtJQUNWLENBQUM7Q0FDSjtBQTlRRCxnQ0E4UUMifQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhY21lLmNsYXNzZXMuandlYmNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0YWNtZS5jbGFzc2VzLmp3ZWJjbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUE4QztBQUM5QywrQkFBOEI7QUFDOUIsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQ3hCLDJCQUEwQjtBQUUxQjs7Ozs7OztHQU9HO0FBQ0gsSUFBSSxxQkFBcUIsR0FBRyxVQUFVLEdBQUc7SUFDckMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7QUFDcEUsQ0FBQyxDQUFBO0FBRUQ7Ozs7R0FJRztBQUNIO0lBSUk7UUFDSTs7O1dBR0c7UUFDSCxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQTtRQUNsQjs7O1dBR0c7UUFDSCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQTtRQUN0Qjs7O1dBR0c7UUFDSCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQTtJQUN4QixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO1FBQ25DLGlCQUFpQjtRQUNqQixjQUFjO1FBQ2QsRUFBRSxDQUFDLENBQUMsR0FBRyxZQUFZLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDeEIsR0FBRyxHQUFHLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2pFLENBQUM7UUFDRCxpQkFBaUI7UUFDakIsSUFBSSxNQUFNLEdBQUc7WUFDVCxHQUFHLEVBQUUsS0FBSztZQUNWLEdBQUcs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 \ No newline at end of file diff --git a/dist/smartacme.classes.smartacme.d.ts b/dist/smartacme.classes.smartacme.d.ts index 57d2931..06f69b4 100644 --- a/dist/smartacme.classes.smartacme.d.ts +++ b/dist/smartacme.classes.smartacme.d.ts @@ -1,5 +1,9 @@ import * as acmeclient from './smartacme.classes.acmeclient'; export declare class SmartAcme { + acmeAccount: AcmeAccount; acmeClient: acmeclient.AcmeClient; constructor(directoryUrlArg?: string); + createAccount(): void; +} +export declare class AcmeAccount { } diff --git a/dist/smartacme.classes.smartacme.js b/dist/smartacme.classes.smartacme.js index e6f9cbd..530f4cd 100644 --- a/dist/smartacme.classes.smartacme.js +++ b/dist/smartacme.classes.smartacme.js @@ -4,6 +4,14 @@ class SmartAcme { constructor(directoryUrlArg = 'https://acme-staging.api.letsencrypt.org/directory') { this.acmeClient = new acmeclient.AcmeClient(directoryUrlArg); } + createAccount() { + this.acmeClient.createAccount('test@bleu.de', (answer) => { + console.log(answer); + }); + } } exports.SmartAcme = SmartAcme; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhY21lLmNsYXNzZXMuc21hcnRhY21lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRhY21lLmNsYXNzZXMuc21hcnRhY21lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSw2REFBNEQ7QUFFNUQ7SUFFSSxZQUFZLGtCQUEwQixvREFBb0Q7UUFDdEYsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUE7SUFDaEUsQ0FBQztDQUNKO0FBTEQsOEJBS0MifQ== \ No newline at end of file +class AcmeAccount { +} +exports.AcmeAccount = AcmeAccount; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhY21lLmNsYXNzZXMuc21hcnRhY21lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRhY21lLmNsYXNzZXMuc21hcnRhY21lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSw2REFBNEQ7QUFFNUQ7SUFHSSxZQUFZLGtCQUEwQixvREFBb0Q7UUFDdEYsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUE7SUFDaEUsQ0FBQztJQUVELGFBQWE7UUFDVCxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxjQUFjLEVBQUMsQ0FBQyxNQUFNO1lBQ2hELE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDdkIsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDO0NBQ0o7QUFaRCw4QkFZQztBQUVEO0NBRUM7QUFGRCxrQ0FFQyJ9 \ No newline at end of file diff --git a/dist/smartacme.plugins.d.ts b/dist/smartacme.plugins.d.ts index 8a7180f..092605d 100644 --- a/dist/smartacme.plugins.d.ts +++ b/dist/smartacme.plugins.d.ts @@ -1,3 +1,4 @@ import 'typings-global'; import * as path from 'path'; -export { path }; +import * as smartstring from 'smartstring'; +export { path, smartstring }; diff --git a/dist/smartacme.plugins.js b/dist/smartacme.plugins.js index 1e65bb2..5a09677 100644 --- a/dist/smartacme.plugins.js +++ b/dist/smartacme.plugins.js @@ -2,4 +2,6 @@ require("typings-global"); const path = require("path"); exports.path = path; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhY21lLnBsdWdpbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydGFjbWUucGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMEJBQXVCO0FBQ3ZCLDZCQUE0QjtBQUd4QixvQkFBSSJ9 \ No newline at end of file +const smartstring = require("smartstring"); +exports.smartstring = smartstring; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhY21lLnBsdWdpbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydGFjbWUucGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMEJBQXVCO0FBQ3ZCLDZCQUE0QjtBQUl4QixvQkFBSTtBQUhSLDJDQUEwQztBQUl0QyxrQ0FBVyJ9 \ No newline at end of file diff --git a/package.json b/package.json index 1427f7a..b47fdad 100644 --- a/package.json +++ b/package.json @@ -24,10 +24,9 @@ "homepage": "https://gitlab.com/pushrocks/smartacme#README", "dependencies": { "@types/base64url": "^2.0.3", - "base64url": "^2.0.0", "jwa": "^1.1.3", "rsa-pem-to-jwk": "^1.1.3", - "smartstring": "^2.0.19", + "smartstring": "^2.0.20", "typings-global": "^1.0.14" }, "devDependencies": { diff --git a/test/test.js b/test/test.js index 9fb4b88..78d7084 100644 --- a/test/test.js +++ b/test/test.js @@ -1,7 +1,16 @@ "use strict"; require("typings-test"); +const should = require("should"); +// import the module to test +const smartacme = require("../dist/index"); describe('smartacme', function () { let testAcme; - it('should create a valid instance'); + it('should create a valid instance', function () { + testAcme = new smartacme.SmartAcme(); + should(testAcme).be.instanceOf(smartacme.SmartAcme); + }); + it('should register a new account', function () { + testAcme.createAccount(); + }); }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHdCQUFxQjtBQU1yQixRQUFRLENBQUMsV0FBVyxFQUFFO0lBQ2xCLElBQUksUUFBNkIsQ0FBQTtJQUNqQyxFQUFFLENBQUMsZ0NBQWdDLENBQUMsQ0FBQTtBQUN4QyxDQUFDLENBQUMsQ0FBQSJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHdCQUFxQjtBQUNyQixpQ0FBZ0M7QUFFaEMsNEJBQTRCO0FBQzVCLDJDQUEwQztBQUUxQyxRQUFRLENBQUMsV0FBVyxFQUFFO0lBQ2xCLElBQUksUUFBNkIsQ0FBQTtJQUNqQyxFQUFFLENBQUMsZ0NBQWdDLEVBQUU7UUFDakMsUUFBUSxHQUFHLElBQUksU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFBO1FBQ3BDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUN2RCxDQUFDLENBQUMsQ0FBQTtJQUNGLEVBQUUsQ0FBQywrQkFBK0IsRUFBRTtRQUNoQyxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUE7SUFDNUIsQ0FBQyxDQUFDLENBQUE7QUFDTixDQUFDLENBQUMsQ0FBQSJ9 \ No newline at end of file diff --git a/test/test.ts b/test/test.ts index f7fa067..89f76d1 100644 --- a/test/test.ts +++ b/test/test.ts @@ -5,6 +5,12 @@ import * as should from 'should' import * as smartacme from '../dist/index' describe('smartacme', function(){ - let testAcme: smartacme.smartacme - it('should create a valid instance') + let testAcme: smartacme.SmartAcme + it('should create a valid instance', function(){ + testAcme = new smartacme.SmartAcme() + should(testAcme).be.instanceOf(smartacme.SmartAcme) + }) + it('should register a new account', function() { + testAcme.createAccount() + }) }) diff --git a/ts/smartacme.classes.acmeclient.ts b/ts/smartacme.classes.acmeclient.ts index ce2df76..1452b4c 100644 --- a/ts/smartacme.classes.acmeclient.ts +++ b/ts/smartacme.classes.acmeclient.ts @@ -1,5 +1,4 @@ import * as plugins from './smartacme.plugins' -import * as base64url from 'base64url' import * as child_process from 'child_process' import * as crypto from 'crypto' import * as fs from 'fs' @@ -14,7 +13,7 @@ import { JWebClient } from './smartacme.classes.jwebclient' * @return {Buffer} * @throws Exception if object cannot be stringified or contains cycle */ -let json_to_utf8buffer = function (obj) { +let json_to_utf8buffer = (obj) => { return new Buffer(JSON.stringify(obj), 'utf8') } @@ -27,7 +26,7 @@ let json_to_utf8buffer = function (obj) { */ export class AcmeClient { clientProfilePubKey: any - days_valid: number + daysValid: number defaultRsaKeySize: number directory: any directoryUrl: string @@ -37,7 +36,7 @@ export class AcmeClient { regLink: string tosLink: string webroot: string - well_known_path: string + wellKnownPath: string withInteraction: boolean constructor(directoryUrlArg) { /** @@ -50,7 +49,7 @@ export class AcmeClient { * @desc Validity period in days * @default 1 */ - this.days_valid = 1 + this.daysValid = 1 /** * @member {number} module:AcmeClient~AcmeClient#defaultRsaKeySize * @desc Key strength in bits @@ -104,7 +103,7 @@ export class AcmeClient { * @desc Directory structure for challenge data * @default "/.well-known/acme-challenge/" */ - this.well_known_path = '/.well-known/acme-challenge/' // {string} + this.wellKnownPath = '/.well-known/acme-challenge/' // {string} /** * @member {boolean} module:AcmeClient~AcmeClient#withInteraction * @desc Determines if interaction of user is required @@ -154,7 +153,6 @@ export class AcmeClient { */ getRegistration(uri, payload, callback) { /*jshint -W069 */ - let ctx = this if (!(payload instanceof Object)) { payload = {} // ensure payload is object } @@ -162,33 +160,28 @@ export class AcmeClient { if (typeof callback !== 'function') { callback = this.emptyCallback // ensure callback is function } - this.jWebClient.post(uri, payload, function (ans, res) { + this.jWebClient.post(uri, payload,(ans, res) => { if (ans instanceof Object) { - ctx.clientProfilePubKey = ans.key // cache or reset returned public key + this.clientProfilePubKey = ans.key // cache or reset returned public key if ((res instanceof Object) && (res['headers'] instanceof Object)) { let linkStr = res.headers['link'] if (typeof linkStr === 'string') { - let tosLink = ctx.getTosLink(linkStr) + let tosLink = this.getTosLink(linkStr) if (typeof tosLink === 'string') { - ctx.tosLink = tosLink // cache TOS link + this.tosLink = tosLink // cache TOS link } else { - ctx.tosLink = null // reset TOS link + this.tosLink = null // reset TOS link } } else { - ctx.tosLink = null // reset TOS link + this.tosLink = null // reset TOS link } } else { - ctx.tosLink = null // reset TOS link + this.tosLink = null // reset TOS link } callback(ans, res) } else { callback(false) } - // dereference - ans = null - callback = null - ctx = null - res = null }) // dereference payload = null @@ -202,37 +195,25 @@ export class AcmeClient { */ authorizeDomain(domain, callback) { /*jshint -W069 */ - let ctx = this if (typeof callback !== 'function') { callback = this.emptyCallback // ensure callback is function } - this.getProfile(function (profile) { + this.getProfile((profile) => { if (!(profile instanceof Object)) { callback(false) // no profile returned - // dereference - callback = null - ctx = null } else { - ctx.jWebClient.post(ctx.directory['new-authz'], ctx.makeDomainAuthorizationRequest(domain), function (ans, res) { + this.jWebClient.post(this.directory['new-authz'], this.makeDomainAuthorizationRequest(domain), (ans, res) => { if ((res instanceof Object) && (res['statusCode'] === 403)) { // if unauthorized - ctx.agreeTos(ctx.tosLink, function (ans_, res_) { // agree to TOS + this.agreeTos(this.tosLink, (ans_, res_) => { // agree to TOS if ( // if TOS were agreed successfully (res_ instanceof Object) && (res_['statusCode'] >= 200) && (res_['statusCode'] <= 400) ) { - ctx.authorizeDomain(domain, callback) // try authorization again + this.authorizeDomain(domain, callback) // try authorization again } else { callback(false) // agreement failed } - // dereference - ans = null - ans_ = null - callback = null - ctx = null - profile = null - res = null - res_ = null }) } else { if ( @@ -242,48 +223,29 @@ export class AcmeClient { && (ans instanceof Object) ) { let poll_uri = res.headers['location'] // status URI for polling - let challenge = ctx.selectChallenge(ans, 'http-01') // select simple http challenge + let challenge = this.selectChallenge(ans, 'http-01') // select simple http challenge if (challenge instanceof Object) { // desired challenge is in list - ctx.prepareChallenge(domain, challenge, function () { // prepare all objects and files for challenge + this.prepareChallenge(domain, challenge, () => { // prepare all objects and files for challenge // reset ans = null res = null // accept challenge - ctx.acceptChallenge(challenge, function (ans, res) { + this.acceptChallenge(challenge, (ans, res) => { if ( (res instanceof Object) && (res['statusCode'] < 400) // server confirms challenge acceptance ) { - ctx.pollUntilValid(poll_uri, callback) // poll status until server states success + this.pollUntilValid(poll_uri, callback) // poll status until server states success } else { callback(false) // server did not confirm challenge acceptance } - // dereference - ans = null - callback = null - challenge = null - ctx = null - profile = null - res = null }) }) } else { callback(false) // desired challenge is not in list - // dereference - ans = null - callback = null - ctx = null - profile = null - res = null } } else { callback(false) // server did not respond with status URI - // dereference - ans = null - callback = null - ctx = null - profile = null - res = null } } }) @@ -317,37 +279,22 @@ export class AcmeClient { */ pollUntilValid(uri, callback, retry = 1) { /*jshint -W069 */ - let ctx = this if (typeof callback !== 'function') { callback = this.emptyCallback // ensure callback is function } if (retry > 128) { callback(false) // stop if retry value exceeds maximum } else { - this.jWebClient.get(uri, function (ans, res) { + this.jWebClient.get(uri, (ans, res) => { if (!(ans instanceof Object)) { callback(false) // invalid answer - // dereference - callback = null - ctx = null - res = null } else { if (ans['status'] === 'pending') { // still pending - setTimeout(function () { - ctx.pollUntilValid(uri, callback, retry * 2) // retry - // dereference - ans = null - callback = null - ctx = null - res = null + setTimeout(() => { + this.pollUntilValid(uri, callback, retry * 2) // retry }, retry * 500) } else { callback(ans, res) // challenge complete - // dereference - ans = null - callback = null - ctx = null - res = null } } }) @@ -363,38 +310,22 @@ export class AcmeClient { */ pollUntilIssued(uri, callback, retry = 1) { /*jshint -W069 */ - let ctx = this if (typeof callback !== 'function') { callback = this.emptyCallback // ensure callback is function } if (retry > 128) { callback(false) // stop if retry value exceeds maximum } else { - this.jWebClient.get(uri, function (ans, res) { + this.jWebClient.get(uri,(ans, res) => { if ((ans instanceof Buffer) && (ans.length > 0)) { callback(ans) // certificate was returned with answer - // dereference - ans = null - callback = null - ctx = null - res = null } else { if ((res instanceof Object) && (res['statusCode'] < 400)) { // still pending - setTimeout(function () { - ctx.pollUntilIssued(uri, callback, retry * 2) // retry - // dereference - ans = null - callback = null - ctx = null - res = null + setTimeout(() => { + this.pollUntilIssued(uri, callback, retry * 2) // retry }, retry * 500) } else { callback(false) // CSR complete - // dereference - ans = null - callback = null - ctx = null - res = null } } }) @@ -409,32 +340,20 @@ export class AcmeClient { */ requestSigning(domain, callback) { /*jshint -W069 */ - let ctx = this if (typeof callback !== 'function') { callback = this.emptyCallback // ensure callback is function } - fs.readFile(domain + '.csr', function (err, csr) { + fs.readFile(domain + '.csr', (err, csrBuffer: Buffer) => { if (err instanceof Object) { // file system error - if (ctx.jWebClient.verbose) { + if (this.jWebClient.verbose) { console.error('Error : File system error', err['code'], 'while reading key from file') } callback(false) - // dereference - callback = null - csr = null - ctx = null - err = null } else { - ctx.jWebClient.post(ctx.directory['new-cert'], ctx.makeCertRequest(csr, ctx.days_valid), function (ans, res) { + let csr = csrBuffer.toString() + this.jWebClient.post(this.directory['new-cert'], this.makeCertRequest(csr, this.daysValid), (ans, res) => { if ((ans instanceof Buffer) && (ans.length > 0)) { // answer is buffer callback(ans) // certificate was returned with answer - // dereference - ans = null - callback = null - csr = null - ctx = null - err = null - res = null } else { if (res instanceof Object) { if ((res['statusCode'] < 400) && !ans) { // success response, but no answer was provided @@ -442,7 +361,7 @@ export class AcmeClient { if (!(headers instanceof Object)) { headers = {} // ensure headers is object } - ctx.pollUntilIssued(headers['location'], callback) // poll provided status URI + this.pollUntilIssued(headers['location'], callback) // poll provided status URI // dereference headers = null } else { @@ -451,13 +370,6 @@ export class AcmeClient { } else { callback(false) // invalid response } - // dereference - ans = null - callback = null - csr = null - ctx = null - err = null - res = null } }) } @@ -471,35 +383,25 @@ export class AcmeClient { */ getProfile(callback) { /*jshint -W069 */ - let ctx = this if (typeof callback !== 'function') { callback = this.emptyCallback // ensure callback is function } - this.getDirectory(function (dir) { + this.getDirectory((dir) => { if (!(dir instanceof Object)) { callback(false) // server did not respond with directory - // dereference - callback = null - ctx = null } else { - ctx.directory = dir // cache directory - ctx.newRegistration(null, function (ans, res) { // try new registration to get registration link + this.directory = dir // cache directory + this.newRegistration(null, (ans, res) => { // try new registration to get registration link if ( (res instanceof Object) && (res['headers'] instanceof Object) && (typeof res.headers['location'] === 'string') ) { - ctx.regLink = res.headers['location'] - ctx.getRegistration(ctx.regLink, null, callback) // get registration info from link + this.regLink = res.headers['location'] + this.getRegistration(this.regLink, null, callback) // get registration info from link } else { callback(false) // registration failed } - // dereference - ans = null - callback = null - ctx = null - dir = null - res = null }) } }) @@ -513,40 +415,31 @@ export class AcmeClient { */ createAccount(email, callback) { /*jshint -W069 */ - let ctx = this if (typeof email === 'string') { if (typeof callback !== 'function') { callback = this.emptyCallback // ensure callback is function } - ctx.newRegistration( + this.newRegistration( { contact: [ 'mailto:' + email ] }, - function (ans, res) { + (ans, res) => { if ( (res instanceof Object) && (res['statusCode'] === 201) && (res['headers'] instanceof Object) && (typeof res.headers['location'] === 'string') ) { - ctx.regLink = res.headers['location'] - callback(ctx.regLink) // registration URI + this.regLink = res.headers['location'] + callback(this.regLink) // registration URI } else { callback(false) // registration failed } - // dereference - ans = null - callback = null - ctx = null - res = null }) } else { callback(false) // no email address provided - // dereference - callback = null - ctx = null } } @@ -573,66 +466,47 @@ export class AcmeClient { */ requestCertificate(domain, organization, country, callback) { /*jshint -W069 */ - let ctx = this if (typeof domain !== 'string') { domain = '' // ensure domain is string } if (typeof callback !== 'function') { callback = this.emptyCallback // ensure callback is function } - this.getProfile(function (profile) { - let email = ctx.extractEmail(profile) // try to determine email address from profile - if (typeof ctx.emailOverride === 'string') { - email = ctx.emailOverride // override email address if set + this.getProfile((profile) => { + let email = this.extractEmail(profile) // try to determine email address from profile + if (typeof this.emailOverride === 'string') { + email = this.emailOverride // override email address if set } else if (typeof email !== 'string') { - email = ctx.emailDefaultPrefix + '@' + domain // or set default + email = this.emailDefaultPrefix + '@' + domain // or set default } - let bit = ctx.defaultRsaKeySize + let bit = this.defaultRsaKeySize // sanitize bit = Number(bit) - country = ctx.makeSafeFileName(country) - domain = ctx.makeSafeFileName(domain) - email = ctx.makeSafeFileName(email) - organization = ctx.makeSafeFileName(organization) + country = this.makeSafeFileName(country) + domain = this.makeSafeFileName(domain) + email = this.makeSafeFileName(email) + organization = this.makeSafeFileName(organization) // create key pair - ctx.createKeyPair(bit, country, organization, domain, email, function (e) { // create key pair + this.createKeyPair(bit, country, organization, domain, email, (e) => { // create key pair if (!e) { - ctx.requestSigning(domain, function (cert) { // send CSR + this.requestSigning(domain, (cert) => { // send CSR if ((cert instanceof Buffer) || (typeof cert === 'string')) { // valid certificate data - fs.writeFile(domain + '.der', cert, function (err) { // sanitize domain name for file path + fs.writeFile(domain + '.der', cert, (err) => { // sanitize domain name for file path if (err instanceof Object) { // file system error - if (ctx.jWebClient.verbose) { + if (this.jWebClient.verbose) { console.error('Error : File system error', err['code'], 'while writing certificate to file') } callback(false) } else { callback(true) // CSR complete and certificate written to file system } - // dereference - callback = null - cert = null - ctx = null - e = null - err = null - profile = null }) } else { callback(false) // invalid certificate data - // dereference - callback = null - cert = null - ctx = null - e = null - profile = null } }) } else { callback(false) // could not create key pair - // dereference - callback = null - ctx = null - e = null - profile = null } }) }) @@ -656,7 +530,7 @@ export class AcmeClient { if (this.jWebClient.verbose) { console.error('Running:', openssl) } - child_process.exec(openssl, function (e) { + child_process.exec(openssl, (e) => { if (!e) { console.error('Result : done') } else { @@ -690,7 +564,7 @@ export class AcmeClient { // respects file name restrictions for ntfs and ext2 let regex_file = '[<>:\"/\\\\\\|\\?\\*\\u0000-\\u001f\\u007f\\u0080-\\u009f]' let regex_path = '[<>:\"\\\\\\|\\?\\*\\u0000-\\u001f\\u007f\\u0080-\\u009f]' - return name.replace(new RegExp(withPath ? regex_path : regex_file, 'g'), function (charToReplace) { + return name.replace(new RegExp(withPath ? regex_path : regex_file, 'g'), (charToReplace) => { if (typeof charToReplace === 'string') { return '%' + charToReplace.charCodeAt(0).toString(16).toLocaleUpperCase() } @@ -706,66 +580,42 @@ export class AcmeClient { */ prepareChallenge(domain, challenge, callback) { /*jshint -W069, unused:false*/ - let ctx = this if (typeof callback !== 'function') { callback = this.emptyCallback // ensure callback is function } if (challenge instanceof Object) { if (challenge['type'] === 'http-01') { // simple http challenge - let path = this.webroot + this.well_known_path + challenge['token'] // webroot and well_known_path are expected to be already sanitized - fs.writeFile(path, this.makeKeyAuthorization(challenge), function (err) { // create challenge file + let path = this.webroot + this.wellKnownPath + challenge['token'] // webroot and well_known_path are expected to be already sanitized + fs.writeFile(path, this.makeKeyAuthorization(challenge), (err) => { // create challenge file if (err instanceof Object) { // file system error - if (ctx.jWebClient.verbose) { + if (this.jWebClient.verbose) { console.error( 'Error : File system error', err['code'], 'while writing challenge data to file' ) } callback() - // dereference - callback = null - challenge = null - ctx = null - err = null } else { // let uri = "http://" + domain + this.well_known_path + challenge["token"] let rl = readline.createInterface(process.stdin, process.stdout) - if (ctx.withInteraction) { - rl.question('Press enter to proceed', function (answer) { // wait for user to proceed + if (this.withInteraction) { + rl.question('Press enter to proceed', (answer) => { // wait for user to proceed rl.close() callback() - // dereference - callback = null - challenge = null - ctx = null - rl = null }) } else { rl.close() callback() // skip interaction prompt if desired - // dereference - callback = null - challenge = null - ctx = null - rl = null } } }) } else { // no supported challenge console.error('Error : Challenge not supported') callback() - // dereference - callback = null - challenge = null - ctx = null } } else { // invalid challenge response console.error('Error : Invalid challenge response') callback() - // dereference - callback = null - challenge = null - ctx = null } } @@ -782,9 +632,6 @@ export class AcmeClient { match = null return result } - // dereference - match = null - return void 0 } /** @@ -796,7 +643,7 @@ export class AcmeClient { selectChallenge(ans, challengeType: string) { /*jshint -W069 */ if ((ans instanceof Object) && (ans['challenges'] instanceof Array)) { - return ans.challenges.filter(function (entry) { + return ans.challenges.filter((entry) => { let type = entry['type'] // dereference entry = null @@ -824,7 +671,7 @@ export class AcmeClient { return void 0 // invalid profile } let prefix = 'mailto:' - let email = profile.contact.filter(function (entry) { + let email = profile.contact.filter((entry) => { if (typeof entry !== 'string') { return false } else { @@ -871,11 +718,9 @@ export class AcmeClient { } ) let hash = crypto.createHash('sha256').update(jwk.toString('utf8'), 'utf8').digest() - let ACCOUNT_KEY = base64url.default.encode(hash) // create base64 encoded hash of account key + // create base64 encoded hash of account key + let ACCOUNT_KEY = plugins.smartstring.base64.encodeUri(hash.toString()) let token = challenge['token'] - // dereference - challenge = null - jwk = null return token + '.' + ACCOUNT_KEY } } else { @@ -901,14 +746,14 @@ export class AcmeClient { * @param {number} days_valid * @return {{resource: string, csr: string, notBefore: string, notAfter: string}} */ - makeCertRequest(csr, DAYS_VALID: number) { + makeCertRequest(csr: string, DAYS_VALID: number) { if (typeof csr !== 'string' && !(csr instanceof Buffer)) { csr = '' // default string for CSR } if ((typeof DAYS_VALID !== 'number') || (isNaN(DAYS_VALID)) || (DAYS_VALID === 0)) { DAYS_VALID = 1 // default validity duration (1 day) } - let DOMAIN_CSR_DER = base64url.default.encode(csr) // create base64 encoded CSR + let DOMAIN_CSR_DER = plugins.smartstring.base64.encodeUri(csr) // create base64 encoded CSR let CURRENT_DATE = (new Date()).toISOString() // set start date to current date // set end date to current date + days_valid diff --git a/ts/smartacme.classes.jwebclient.ts b/ts/smartacme.classes.jwebclient.ts index 2465c76..c340787 100644 --- a/ts/smartacme.classes.jwebclient.ts +++ b/ts/smartacme.classes.jwebclient.ts @@ -1,5 +1,4 @@ import * as plugins from './smartacme.plugins' -import * as base64url from 'base64url' import * as https from 'https' let jwa = require('jwa') import * as url from 'url' @@ -13,7 +12,7 @@ import * as url from 'url' * @throws Exception if object cannot be stringified or contains cycle */ let json_to_utf8base64url = function (obj) { - return base64url.default.encode(new Buffer(JSON.stringify(obj), 'utf8')) + return plugins.smartstring.base64.encodeUri(JSON.stringify(obj)) } /** @@ -30,17 +29,17 @@ export class JWebClient { * @member {Object} module:JWebClient~JWebClient#key_pair * @desc User account key pair */ - this.key_pair = null // {Object} + this.key_pair = {} /** * @member {string} module:JWebClient~JWebClient#last_nonce * @desc Cached nonce returned with last request */ - this.last_nonce = null // {string} + this.last_nonce = null /** * @member {boolean} module:JWebClient~JWebClient#verbose * @desc Determines verbose mode */ - this.verbose = false // {boolean} + this.verbose = false } /** @@ -57,7 +56,7 @@ export class JWebClient { /*jshint -W069 */ // prepare key if (key instanceof Object) { - key = base64url.default.toBuffer(key['k']) + key = new Buffer(plugins.smartstring.base64.decode(key['k'])) } // prepare header let header = { @@ -83,13 +82,6 @@ export class JWebClient { input, sig ].join('.') - // dereference - header = null - hmac = null - input = null - jwk = null - key = null - payload = null // output return output } @@ -218,11 +210,12 @@ export class JWebClient { if (typeof callback !== 'function') { callback = this.emptyCallback // ensure callback is function } - let key_pair = this.key_pair - if (!(key_pair instanceof Object)) { - key_pair = {} // ensure key pair is object - } - let jwt = this.createJWT(this.last_nonce, payload, 'RS256', key_pair['private_pem'], key_pair['public_jwk']) + let jwt = this.createJWT( + this.last_nonce, + payload, + 'RS256', + this.key_pair['private_pem'], + this.key_pair['public_jwk']) this.request(uri, jwt, (ans, res) => { ctx.evaluateStatus(uri, payload, ans, res) // save replay nonce for later requests @@ -230,16 +223,7 @@ export class JWebClient { ctx.last_nonce = res.headers['replay-nonce'] } callback(ans, res) - // dereference - ans = null - callback = null - ctx = null - key_pair = null - payload = null - res = null - }, errorCallback) - // dereference - errorCallback = null + }, errorCallback ) } /** @@ -278,11 +262,6 @@ export class JWebClient { console.error('Receive:', res['headers']) // received headers console.error('Receive:', ans) // received data } - // dereference - ans = null - payload = null - res = null - uri_parsed = null } /** diff --git a/ts/smartacme.classes.smartacme.ts b/ts/smartacme.classes.smartacme.ts index 569f42a..299b922 100644 --- a/ts/smartacme.classes.smartacme.ts +++ b/ts/smartacme.classes.smartacme.ts @@ -2,8 +2,19 @@ import * as plugins from './smartacme.plugins' import * as acmeclient from './smartacme.classes.acmeclient' export class SmartAcme { + acmeAccount: AcmeAccount acmeClient: acmeclient.AcmeClient constructor(directoryUrlArg: string = 'https://acme-staging.api.letsencrypt.org/directory') { this.acmeClient = new acmeclient.AcmeClient(directoryUrlArg) } + + createAccount() { + this.acmeClient.createAccount('test@bleu.de',(answer) => { + console.log(answer) + }) + } +} + +export class AcmeAccount { + } diff --git a/ts/smartacme.plugins.ts b/ts/smartacme.plugins.ts index 3eccc7e..ab0b54b 100644 --- a/ts/smartacme.plugins.ts +++ b/ts/smartacme.plugins.ts @@ -1,6 +1,8 @@ import 'typings-global' import * as path from 'path' +import * as smartstring from 'smartstring' export { - path + path, + smartstring }