update error handling
This commit is contained in:
parent
c92a9f1864
commit
aa6119378a
|
@ -7,7 +7,6 @@
|
|||
'use strict';
|
||||
|
||||
module.exports.create = function (deps) {
|
||||
var NOOP=function () {}, log=NOOP;
|
||||
var request=deps.request;
|
||||
var toStandardB64 = deps.leUtils.toStandardB64;
|
||||
var importPemPrivateKey = deps.leCrypto.importPemPrivateKey;
|
||||
|
@ -16,6 +15,8 @@ module.exports.create = function (deps) {
|
|||
var Acme = deps.Acme;
|
||||
|
||||
function getCert(options, cb) {
|
||||
var NOOP = function () {};
|
||||
var log = options.debug ? console.log : NOOP;
|
||||
var state={
|
||||
validatedDomains:[]
|
||||
, validAuthorizationUrls:[]
|
||||
|
@ -56,6 +57,47 @@ module.exports.create = function (deps) {
|
|||
return handleErr(err, 'Failed to parse privateKey');
|
||||
}
|
||||
|
||||
function bodyToError(res, body) {
|
||||
var err;
|
||||
|
||||
if (!body) {
|
||||
err = new Error("[Error] letiny-core: no request body");
|
||||
err.code = "E_NO_RESPONSE_BODY";
|
||||
throw err;
|
||||
}
|
||||
|
||||
if ('{' === body[0] || '{' === String.fromCharCode(body[0])) {
|
||||
try {
|
||||
body = JSON.parse(body);
|
||||
} catch(e) {
|
||||
err = new Error("[Error] letiny-core: body could not be parsed");
|
||||
err.code = "E_BODY_PARSE";
|
||||
err.description = body;
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
|
||||
if (Math.floor(res.statusCode / 100) !== 2) {
|
||||
err = new Error("[Error] letiny-core: not 200 ok");
|
||||
err.code = "E_STATUS_CODE";
|
||||
err.type = body.type
|
||||
err.description = body;
|
||||
err.detail = body.detail;
|
||||
throw err;
|
||||
}
|
||||
|
||||
if (body.type && body.detail) {
|
||||
err = new Error("[Error] letiny-core: " + body.detail);
|
||||
err.code = body.type;
|
||||
err.type = body.type;
|
||||
err.description = body.detail;
|
||||
err.detail = body.detail;
|
||||
throw err;
|
||||
}
|
||||
|
||||
return body;
|
||||
}
|
||||
|
||||
nextDomain();
|
||||
|
||||
function nextDomain() {
|
||||
|
@ -98,7 +140,7 @@ module.exports.create = function (deps) {
|
|||
state.authorizationUrl=res.headers.location;
|
||||
state.newCertUrl=links.next;
|
||||
|
||||
authz=JSON.parse(body);
|
||||
authz=body;
|
||||
|
||||
httpChallenges=authz.challenges.filter(function(x) {
|
||||
return x.type==='http-01';
|
||||
|
@ -136,11 +178,22 @@ module.exports.create = function (deps) {
|
|||
return handleErr(err, 'Authorization status request failed ('+res.statusCode+')');
|
||||
}
|
||||
|
||||
authz=JSON.parse(body);
|
||||
authz=body;
|
||||
|
||||
if (authz.status==='pending') {
|
||||
setTimeout(function() {
|
||||
request.get(state.authorizationUrl, {}, function(err, res, body) {
|
||||
request({
|
||||
method: 'GET'
|
||||
, url: state.authorizationUrl
|
||||
}, function(err, res, body) {
|
||||
if (!err && res.body) {
|
||||
try {
|
||||
body = bodyToError(res, body);
|
||||
} catch(e) {
|
||||
err = e;
|
||||
}
|
||||
}
|
||||
|
||||
ensureValidation(err, res, body, unlink);
|
||||
});
|
||||
}, 1000);
|
||||
|
@ -172,12 +225,17 @@ module.exports.create = function (deps) {
|
|||
function downloadCertificate(err, res, body) {
|
||||
var links, certUrl;
|
||||
|
||||
if (err || Math.floor(res.statusCode/100)!==2) {
|
||||
log('Certificate request failed with error ', err);
|
||||
if (body) {
|
||||
log(body.toString());
|
||||
if (err) {
|
||||
handleErr(err, 'Certificate request failed');
|
||||
return;
|
||||
}
|
||||
return handleErr(err, 'Certificate request failed');
|
||||
|
||||
if (Math.floor(res.statusCode/100)!==2) {
|
||||
err = new Error("invalid status code: " + res.statusCode);
|
||||
err.code = "E_STATUS_CODE";
|
||||
err.description = body;
|
||||
handleErr(err);
|
||||
return;
|
||||
}
|
||||
|
||||
links=Acme.parseLink(res.headers.link);
|
||||
|
@ -189,33 +247,54 @@ module.exports.create = function (deps) {
|
|||
|
||||
state.certificate=body;
|
||||
certUrl=res.headers.location;
|
||||
request.get({
|
||||
url:certUrl,
|
||||
encoding:null
|
||||
request({
|
||||
method: 'GET'
|
||||
, url: certUrl
|
||||
, encoding: null
|
||||
}, function(err, res, body) {
|
||||
if (!err) {
|
||||
try {
|
||||
body = bodyToError(res, body);
|
||||
} catch(e) {
|
||||
err = e;
|
||||
}
|
||||
}
|
||||
|
||||
if (err) {
|
||||
return handleErr(err, 'Failed to fetch cert from '+certUrl);
|
||||
}
|
||||
|
||||
if (res.statusCode!==200) {
|
||||
return handleErr(err, 'Failed to fetch cert from '+certUrl, res.body.toString());
|
||||
}
|
||||
|
||||
if (body.toString()!==state.certificate.toString()) {
|
||||
handleErr(null, 'Cert at '+certUrl+' did not match returned cert');
|
||||
} else {
|
||||
return handleErr(null, 'Cert at '+certUrl+' did not match returned cert');
|
||||
}
|
||||
|
||||
log('Successfully verified cert at '+certUrl);
|
||||
log('Requesting issuer certificate...');
|
||||
request.get({
|
||||
url:links.up,
|
||||
encoding:null
|
||||
request({
|
||||
method: 'GET'
|
||||
, url: links.up
|
||||
, encoding: null
|
||||
}, function(err, res, body) {
|
||||
if (!err) {
|
||||
try {
|
||||
body = bodyToError(res, body);
|
||||
} catch(e) {
|
||||
err = e;
|
||||
}
|
||||
}
|
||||
|
||||
if (err || res.statusCode!==200) {
|
||||
return handleErr(err, 'Failed to fetch issuer certificate');
|
||||
}
|
||||
|
||||
state.caCert=certBufferToPem(body);
|
||||
log('Requesting issuer certificate: done');
|
||||
done();
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue