smartacme/ts/smartacme.classes.smartacme.ts

128 lines
3.9 KiB
TypeScript
Raw Normal View History

2016-11-11 13:17:50 +00:00
import 'typings-global'
import * as q from 'q'
import * as path from 'path'
let rsaKeygen = require('rsa-keygen')
2016-11-11 13:17:50 +00:00
import * as smartfile from 'smartfile'
import * as smartstring from 'smartstring'
let rawacme = require('rawacme')
2016-11-11 13:17:50 +00:00
import * as paths from './smartacme.paths'
2016-11-01 17:27:57 +00:00
import { SmartacmeHelper, IRsaKeypair } from './smartacme.classes.helper'
2016-11-11 13:17:50 +00:00
/**
* class SmartAcme exports methods for maintaining SSL Certificates
*/
2016-11-01 17:27:57 +00:00
export class SmartAcme {
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
2017-01-01 20:20:12 +00:00
location: string
link: string
rawacmeClient
JWK
2016-11-01 19:16:43 +00:00
2016-11-07 17:41:52 +00:00
/**
* the constructor for class SmartAcme
2016-11-07 17:41:52 +00:00
*/
constructor(productionArg: boolean = false) {
this.productionBool = productionArg
2017-01-01 20:20:12 +00:00
this.helper = new SmartacmeHelper(this)
this.keyPair = this.helper.createKeypair()
if (this.productionBool) {
this.acmeUrl = rawacme.LETSENCRYPT_URL
2017-01-01 20:20:12 +00:00
} else {
this.acmeUrl = rawacme.LETSENCRYPT_STAGING_URL
2016-11-11 13:17:50 +00:00
}
2016-11-01 19:16:43 +00:00
}
2016-11-07 17:41:52 +00:00
/**
2016-11-11 13:17:50 +00:00
* creates an account if not currently present in module
* @executes ASYNC
2016-11-07 17:41:52 +00:00
*/
2016-11-11 13:17:50 +00:00
createAccount() {
let done = q.defer()
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
2016-11-11 13:17:50 +00:00
}
2016-11-01 19:16:43 +00:00
2017-01-01 20:20:12 +00:00
// make client available in class
this.rawacmeClient = client
// create the registration
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
2017-01-01 20:20:12 +00:00
this.link = res.headers.link
console.log(this.link)
this.location = res.headers.location
done.resolve()
})
2016-11-01 19:16:43 +00:00
2016-11-11 13:17:50 +00:00
}
)
2016-11-11 13:17:50 +00:00
return done.promise
}
2017-01-01 20:20:12 +00:00
agreeTos() {
let done = q.defer()
let tosPart = this.link.split(',')[1]
let tosLinkPortion = tosPart.split(';')[0]
let url = tosLinkPortion.split(';')[0].trim().replace(/[<>]/g, '')
this.rawacmeClient.post(this.location,{Agreement: url, resource: 'reg'}, (err, res) => {
if (err) {
console.log(err)
done.reject(err)
return
}
done.resolve()
})
return done.promise
}
/**
* requests a certificate
*/
requestCertificate(domainNameArg) {
let done = q.defer()
this.rawacmeClient.newAuthz(
{
identifier: {
type: 'dns',
value: domainNameArg
}
},
this.keyPair,
(err, res) => {
if (err) {
console.error('smartacme: something went wrong:')
console.log(err)
done.reject(err)
}
console.log(JSON.stringify(res.body))
done.resolve()
}
)
return done.promise
}
2016-11-01 17:27:57 +00:00
}