diff --git a/index.js b/index.js index d74cbd6..8cffd37 100644 --- a/index.js +++ b/index.js @@ -26,7 +26,59 @@ module.exports.create = function (defaults) { cb(null); } + , loopback: function (defaults, domain, challenge, done) { + var hostname = domain + (defaults.loopbackPort ? ':' + defaults.loopbackPort : ''); + var urlstr = 'http://' + hostname + '/.well-known/acme-challenge/' + key; + + require('http').get(urlstr, function (res) { + if (200 !== res.statusCode) { + done(new Error("local loopback failed with statusCode " + res.statusCode)); + return; + } + var chunks = []; + res.on('data', function (chunk) { + chunks.push(chunk); + }); + res.on('end', function () { + var str = Buffer.concat(chunks).toString('utf8').trim(); + done(null, str); + }); + }).setTimeout(defaults.loopbackTimeout, function () { + done(new Error("loopback timeout, could not reach server")); + }).on('error', function (err) { + done(err); + }); + } + + , test: function (args, domain, challenge, keyAuthorization, done) { + var me = this; + var key = keyAuthorization || challenge; + + me.set(args, domain, challenge, key, function (err) { + if (err) { done(err); return; } + + myDefaults.loopbackPort = args.loopbackPort; + myDefaults.webrootPath = args.webrootPath; + me.loopback(args, domain, challenge, function (err, _key) { + if (err) { done(err); return; } + + if (key !== _key) { + err = new Error("keyAuthorization [original] '" + key + "'" + + " did not match [result] '" + _key + "'"); + return; + } + + me.remove(myDefaults, domain, challenge, function (_err) { + if (_err) { done(_err); return; } + + done(err); + }); + }); + }); + } + }; + return handlers; }; diff --git a/package.json b/package.json index 7075987..694bd19 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "le-challenge-standalone", - "version": "2.0.1", + "version": "2.1.1", "description": "An in-memory strategy for node-letsencrypt for setting, retrieving, and clearing ACME challenges issued by the ACME server.", "homepage": "https://greenlock.domains/", "main": "index.js",