diff --git a/dist/smartacme.classes.helper.d.ts b/dist/smartacme.classes.helper.d.ts new file mode 100644 index 0000000..e0f8546 --- /dev/null +++ b/dist/smartacme.classes.helper.d.ts @@ -0,0 +1,8 @@ +import 'typings-global'; +export interface IRsaKeypair { + publicKey: string; + privateKey: string; +} +export declare class SmartacmeHelper { + createKeypair(bit?: number): IRsaKeypair; +} diff --git a/dist/smartacme.classes.helper.js b/dist/smartacme.classes.helper.js new file mode 100644 index 0000000..8940fc6 --- /dev/null +++ b/dist/smartacme.classes.helper.js @@ -0,0 +1,14 @@ +"use strict"; +require("typings-global"); +let rsaKeygen = require('rsa-keygen'); +class SmartacmeHelper { + createKeypair(bit = 2048) { + let result = rsaKeygen.generate(bit); + return { + publicKey: result.public_key, + privateKey: result.private_key + }; + } +} +exports.SmartacmeHelper = SmartacmeHelper; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhY21lLmNsYXNzZXMuaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRhY21lLmNsYXNzZXMuaGVscGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwwQkFBdUI7QUFDdkIsSUFBSSxTQUFTLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFBO0FBT3JDO0lBQ0ksYUFBYSxDQUFDLEdBQUcsR0FBRyxJQUFJO1FBQ3BCLElBQUksTUFBTSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDbkMsTUFBTSxDQUFDO1lBQ0osU0FBUyxFQUFHLE1BQU0sQ0FBQyxVQUFVO1lBQzdCLFVBQVUsRUFBRSxNQUFNLENBQUMsV0FBVztTQUNoQyxDQUFBO0lBQ04sQ0FBQztDQUNKO0FBUkQsMENBUUMifQ== \ No newline at end of file diff --git a/dist/smartacme.classes.smartacme.d.ts b/dist/smartacme.classes.smartacme.d.ts index b287317..33d83fd 100644 --- a/dist/smartacme.classes.smartacme.d.ts +++ b/dist/smartacme.classes.smartacme.d.ts @@ -1,29 +1,23 @@ /// import 'typings-global'; import * as q from 'q'; +import { SmartacmeHelper, IRsaKeypair } from './smartacme.classes.helper'; /** * class SmartAcme exports methods for maintaining SSL Certificates */ export declare class SmartAcme { - preparedBool: boolean; - acmeUrls: any; + helper: SmartacmeHelper; + acmeUrl: string; productionBool: boolean; - keyPair: any; + keyPair: IRsaKeypair; + JWK: any; + /** + * the constructor for class SmartAcme + */ constructor(productionArg?: boolean); - /** - * prepares the SmartAcme class - */ - prepareAcme(): q.Promise<{}>; /** * creates an account if not currently present in module + * @executes ASYNC */ createAccount(): q.Promise<{}>; - /** - * creates a keyPair - */ - createKeyPair(): q.Promise<{}>; - /** - * gets the Acme Urls - */ - getAcmeUrls(): q.Promise<{}>; } diff --git a/dist/smartacme.classes.smartacme.js b/dist/smartacme.classes.smartacme.js index ff1b65f..85af3f3 100644 --- a/dist/smartacme.classes.smartacme.js +++ b/dist/smartacme.classes.smartacme.js @@ -1,101 +1,60 @@ "use strict"; require("typings-global"); const q = require("q"); -let ACME = require('le-acme-core').ACME.create(); -let RSA = require('rsa-compat').RSA; -let bitlen = 1024; -let exp = 65537; -let options = { - public: true, - pem: true, - internal: true -}; +let rsaKeygen = require('rsa-keygen'); +let rawacme = require('rawacme'); +const smartacme_classes_helper_1 = require("./smartacme.classes.helper"); /** * class SmartAcme exports methods for maintaining SSL Certificates */ class SmartAcme { - constructor(productionArg = false) { - this.preparedBool = false; - this.productionBool = productionArg; - } /** - * prepares the SmartAcme class + * the constructor for class SmartAcme */ - prepareAcme() { - let done = q.defer(); - if (this.preparedBool === false) { - this.getAcmeUrls() - .then(() => { - return this.createKeyPair(); - }) - .then((x) => { - console.log('prepared smartacme instance'); - done.resolve(); - }); + constructor(productionArg = false) { + this.productionBool = productionArg; + this.helper = new smartacme_classes_helper_1.SmartacmeHelper(); + this.keyPair = this.helper.createKeypair(); + if (this.productionBool) { + this.acmeUrl = rawacme.LETSENCRYPT_STAGING_URL; } else { - done.resolve(); + this.acmeUrl = rawacme.LETSENCRYPT_URL; } - return done.promise; } /** * creates an account if not currently present in module + * @executes ASYNC */ createAccount() { let done = q.defer(); - this.prepareAcme() - .then(() => { - let options = { - newRegUrl: this.acmeUrls.newReg, - email: 'domains@lossless.org', - accountKeypair: { - privateKeyPem: this.keyPair - }, - agreeToTerms: function (tosUrl, done) { - done(null, tosUrl); - } - }; - ACME.registerNewAccount(options, (err, regr) => { - if (err) { - console.log(err); - done.reject(err); - } - done.resolve(regr); - }); - }).catch(err => { console.log(err); }); - return done.promise; - } - /** - * creates a keyPair - */ - createKeyPair() { - let done = q.defer(); - RSA.generateKeypair(bitlen, exp, options, (err, keypair) => { + rawacme.createClient({ + url: this.acmeUrl, + publicKey: this.keyPair.publicKey, + privateKey: this.keyPair.privateKey + }, (err, client) => { if (err) { + console.error('smartacme: something went wrong:'); console.log(err); done.reject(err); + return; } - console.log(keypair); - this.keyPair = keypair; - done.resolve(); - }); - return done.promise; - } - /** - * gets the Acme Urls - */ - getAcmeUrls() { - let done = q.defer(); - ACME.getAcmeUrls(ACME.stagingServerUrl, (err, urls) => { - if (err) { - throw err; - } - this.acmeUrls = urls; - console.log(this.acmeUrls); - done.resolve(); + client.newReg({ + contact: ['mailto:domains@lossless.org'] + }, (err, res) => { + if (err) { + console.error('smartacme: something went wrong:'); + console.log(err); + done.reject(err); + return; + } + this.JWK = res.body.key; + console.log(this.JWK); + done.resolve(); + }); }); return done.promise; } } exports.SmartAcme = SmartAcme; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhY21lLmNsYXNzZXMuc21hcnRhY21lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRhY21lLmNsYXNzZXMuc21hcnRhY21lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwwQkFBdUI7QUFDdkIsdUJBQXNCO0FBTXRCLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUE7QUFDaEQsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQTtBQUVuQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUE7QUFDakIsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFBO0FBQ2YsSUFBSSxPQUFPLEdBQUc7SUFDVixNQUFNLEVBQUUsSUFBSTtJQUNaLEdBQUcsRUFBRSxJQUFJO0lBQ1QsUUFBUSxFQUFFLElBQUk7Q0FDakIsQ0FBQTtBQUNEOztHQUVHO0FBQ0g7SUFLSSxZQUFZLGdCQUF5QixLQUFLO1FBSjFDLGlCQUFZLEdBQVksS0FBSyxDQUFBO1FBS3pCLElBQUksQ0FBQyxjQUFjLEdBQUcsYUFBYSxDQUFBO0lBQ3ZDLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVc7UUFDUCxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDcEIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxXQUFXLEVBQUU7aUJBQ2IsSUFBSSxDQUFDO2dCQUNGLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUE7WUFDL0IsQ0FBQyxDQUFDO2lCQUNELElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ0osT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFBO2dCQUMxQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUE7WUFDbEIsQ0FBQyxD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 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhY21lLmNsYXNzZXMuc21hcnRhY21lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRhY21lLmNsYXNzZXMuc21hcnRhY21lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwwQkFBdUI7QUFDdkIsdUJBQXNCO0FBRXRCLElBQUksU0FBUyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQTtBQUdyQyxJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUE7QUFHaEMseUVBQXlFO0FBRXpFOztHQUVHO0FBQ0g7SUFPSTs7T0FFRztJQUNILFlBQVksZ0JBQXlCLEtBQUs7UUFDdEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUE7UUFDbkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLDBDQUFlLEVBQUUsQ0FBQTtRQUNuQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDMUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsdUJBQXVCLENBQUE7UUFDbEQsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ0osSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFBO1FBQzFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsYUFBYTtRQUNULElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUNwQixPQUFPLENBQUMsWUFBWSxDQUNoQjtZQUNJLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTztZQUNqQixTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTO1lBQ2pDLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVU7U0FDdEMsRUFDRCxDQUFDLEdBQUcsRUFBRSxNQUFNO1lBQ1IsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDTixPQUFPLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUE7Z0JBQ2pELE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ2hCLE1BQU0sQ0FBQTtZQUNWLENBQUM7WUFFRCxNQUFNLENBQUMsTUFBTSxDQUNUO2dCQUNJLE9BQU8sRUFBRSxDQUFDLDZCQUE2QixDQUFDO2FBQzNDLEVBQ0QsQ0FBQyxHQUFHLEVBQUUsR0FBRztnQkFDTCxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQTtvQkFDakQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtvQkFDaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtvQkFDaEIsTUFBTSxDQUFBO2dCQUNWLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQTtnQkFDdkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ3JCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtZQUNsQixDQUFDLENBQUMsQ0FBQTtRQUVWLENBQUMsQ0FDSixDQUFBO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUE7SUFDdkIsQ0FBQztDQUNKO0FBN0RELDhCQTZEQyJ9 \ No newline at end of file diff --git a/package.json b/package.json index d7082ac..7ee36c8 100644 --- a/package.json +++ b/package.json @@ -24,9 +24,9 @@ "homepage": "https://gitlab.com/pushrocks/smartacme#README", "dependencies": { "@types/q": "0.x.x", - "le-acme-core": "^2.0.7", "q": "^1.4.1", - "rsa-compat": "^1.2.7", + "rawacme": "^0.2.1", + "rsa-keygen": "^1.0.6", "smartfile": "^4.1.0", "smartstring": "^2.0.20", "typings-global": "^1.0.14" diff --git a/test/test.js b/test/test.js index 56c73cc..6cd783c 100644 --- a/test/test.js +++ b/test/test.js @@ -10,17 +10,12 @@ describe('smartacme', function () { testAcme = new smartacme.SmartAcme(); should(testAcme).be.instanceOf(smartacme.SmartAcme); }); - it('should get the ACME urls', function (done) { - testAcme.getAcmeUrls().then(() => { done(); }); - }); - it('should prepare the Instance', function (done) { - testAcme.prepareAcme().then(done); - }); it('should have created keyPair', function () { + should(testAcme.acmeUrl).be.of.type('string'); }); it('should register a new account', function (done) { + this.timeout(40000); testAcme.createAccount().then(x => { - console.log(x); done(); }).catch(err => { console.log(err); @@ -28,4 +23,4 @@ describe('smartacme', function () { }); }); }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHdCQUFxQjtBQUNyQixpQ0FBZ0M7QUFFaEMsNEJBQTRCO0FBQzVCLDJDQUEwQztBQUUxQyxRQUFRLENBQUMsV0FBVyxFQUFFO0lBQ2xCLElBQUksUUFBNkIsQ0FBQTtJQUNqQyxFQUFFLENBQUMsZ0NBQWdDLEVBQUU7UUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNuQixRQUFRLEdBQUcsSUFBSSxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUE7UUFDcEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ3ZELENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLDBCQUEwQixFQUFFLFVBQVUsSUFBSTtRQUN6QyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNqRCxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyw2QkFBNkIsRUFBRSxVQUFVLElBQUk7UUFDNUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNyQyxDQUFDLENBQUMsQ0FBQTtJQUNGLEVBQUUsQ0FBQyw2QkFBNkIsRUFBRTtJQUVsQyxDQUFDLENBQUMsQ0FBQTtJQUNGLEVBQUUsQ0FBQywrQkFBK0IsRUFBRSxVQUFVLElBQUk7UUFDOUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDZCxJQUFJLEVBQUUsQ0FBQTtRQUNWLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHO1lBQ1IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNoQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDYixDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUMsQ0FBQyxDQUFBO0FBQ04sQ0FBQyxDQUFDLENBQUEifQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHdCQUFxQjtBQUNyQixpQ0FBZ0M7QUFFaEMsNEJBQTRCO0FBQzVCLDJDQUEwQztBQUUxQyxRQUFRLENBQUMsV0FBVyxFQUFFO0lBQ2xCLElBQUksUUFBNkIsQ0FBQTtJQUNqQyxFQUFFLENBQUMsZ0NBQWdDLEVBQUU7UUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNuQixRQUFRLEdBQUcsSUFBSSxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUE7UUFDcEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ3ZELENBQUMsQ0FBQyxDQUFBO0lBQ0YsRUFBRSxDQUFDLDZCQUE2QixFQUFFO1FBQzlCLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDakQsQ0FBQyxDQUFDLENBQUE7SUFDRixFQUFFLENBQUMsK0JBQStCLEVBQUUsVUFBVSxJQUFJO1FBQzlDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDbkIsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNCLElBQUksRUFBRSxDQUFBO1FBQ1YsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUc7WUFDUixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNiLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQyxDQUFDLENBQUE7QUFDTixDQUFDLENBQUMsQ0FBQSJ9 \ No newline at end of file diff --git a/test/test.ts b/test/test.ts index 68d93cc..c022ab7 100644 --- a/test/test.ts +++ b/test/test.ts @@ -11,20 +11,12 @@ describe('smartacme', function () { testAcme = new smartacme.SmartAcme() should(testAcme).be.instanceOf(smartacme.SmartAcme) }) - - it('should get the ACME urls', function (done) { - testAcme.getAcmeUrls().then(() => { done() }) - }) - - it('should prepare the Instance', function (done) { - testAcme.prepareAcme().then(done) - }) it('should have created keyPair', function () { - + should(testAcme.acmeUrl).be.of.type('string') }) it('should register a new account', function (done) { + this.timeout(40000) testAcme.createAccount().then(x => { - console.log(x) done() }).catch(err => { console.log(err) diff --git a/ts/smartacme.classes.helper.ts b/ts/smartacme.classes.helper.ts new file mode 100644 index 0000000..6e60610 --- /dev/null +++ b/ts/smartacme.classes.helper.ts @@ -0,0 +1,17 @@ +import 'typings-global' +let rsaKeygen = require('rsa-keygen') + +export interface IRsaKeypair { + publicKey: string + privateKey: string +} + +export class SmartacmeHelper { + createKeypair(bit = 2048): IRsaKeypair { + let result = rsaKeygen.generate(bit) + return { + publicKey: result.public_key, + privateKey: result.private_key + } + } +} \ No newline at end of file diff --git a/ts/smartacme.classes.smartacme.ts b/ts/smartacme.classes.smartacme.ts index 4a361f8..46b096c 100644 --- a/ts/smartacme.classes.smartacme.ts +++ b/ts/smartacme.classes.smartacme.ts @@ -1,111 +1,76 @@ import 'typings-global' import * as q from 'q' import * as path from 'path' +let rsaKeygen = require('rsa-keygen') import * as smartfile from 'smartfile' import * as smartstring from 'smartstring' +let rawacme = require('rawacme') import * as paths from './smartacme.paths' -let ACME = require('le-acme-core').ACME.create() -let RSA = require('rsa-compat').RSA +import { SmartacmeHelper, IRsaKeypair } from './smartacme.classes.helper' -let bitlen = 1024 -let exp = 65537 -let options = { - public: true, - pem: true, - internal: true -} /** * class SmartAcme exports methods for maintaining SSL Certificates */ export class SmartAcme { - preparedBool: boolean = false - acmeUrls: any - productionBool: boolean - keyPair: any - constructor(productionArg: boolean = false) { - this.productionBool = productionArg - } + helper: SmartacmeHelper // bundles helper methods that would clutter the main SmartAcme class + acmeUrl: string // the acme url to use + productionBool: boolean // a boolean to quickly know wether we are in production or not + keyPair: IRsaKeypair // the keyPair needed for account creation + JWK /** - * prepares the SmartAcme class + * the constructor for class SmartAcme */ - prepareAcme() { - let done = q.defer() - if (this.preparedBool === false) { - this.getAcmeUrls() - .then(() => { - return this.createKeyPair() - }) - .then((x) => { - console.log('prepared smartacme instance') - done.resolve() - }) + constructor(productionArg: boolean = false) { + this.productionBool = productionArg + this.helper = new SmartacmeHelper() + this.keyPair = this.helper.createKeypair() + if (this.productionBool) { + this.acmeUrl = rawacme.LETSENCRYPT_STAGING_URL } else { - done.resolve() + this.acmeUrl = rawacme.LETSENCRYPT_URL } - return done.promise } /** * creates an account if not currently present in module + * @executes ASYNC */ createAccount() { let done = q.defer() - this.prepareAcme() - .then(() => { - let options = { - newRegUrl: this.acmeUrls.newReg, - email: 'domains@lossless.org', // valid email (server checks MX records) - accountKeypair: { // privateKeyPem or privateKeyJwt - privateKeyPem: this.keyPair - }, - agreeToTerms: function (tosUrl, done) { - done(null, tosUrl) - } + rawacme.createClient( + { + url: this.acmeUrl, + publicKey: this.keyPair.publicKey, + privateKey: this.keyPair.privateKey + }, + (err, client) => { + if (err) { + console.error('smartacme: something went wrong:') + console.log(err) + done.reject(err) + return } - ACME.registerNewAccount(options, (err, regr) => { - if(err) { - console.log(err) - done.reject(err) - } - done.resolve(regr) - }) - }).catch(err => { console.log(err) }) - return done.promise - } + client.newReg( + { + contact: ['mailto:domains@lossless.org'] + }, + (err, res) => { + if (err) { + console.error('smartacme: something went wrong:') + console.log(err) + done.reject(err) + return + } + this.JWK = res.body.key + console.log(this.JWK) + done.resolve() + }) - /** - * creates a keyPair - */ - createKeyPair() { - let done = q.defer() - RSA.generateKeypair(bitlen, exp, options, (err, keypair) => { - if (err) { - console.log(err) - done.reject(err) } - console.log(keypair) - this.keyPair = keypair - done.resolve() - }) - return done.promise - } - - /** - * gets the Acme Urls - */ - getAcmeUrls() { - let done = q.defer() - ACME.getAcmeUrls(ACME.stagingServerUrl, (err, urls) => { - if (err) { - throw err - } - this.acmeUrls = urls - console.log(this.acmeUrls) - done.resolve() - }) + ) return done.promise } } diff --git a/ts/test.coffee b/ts/test.coffee new file mode 100644 index 0000000..e69de29