From 54416f7a0b0beb2817ad9aa72dca6efce700442b Mon Sep 17 00:00:00 2001 From: AJ ONeal Date: Tue, 9 Aug 2016 15:51:42 -0400 Subject: [PATCH] PASSES ALL TESTSgit status! --- lib/core.js | 9 ++-- tests/renew-certificate.js | 102 +++++++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+), 3 deletions(-) create mode 100644 tests/renew-certificate.js diff --git a/lib/core.js b/lib/core.js index df93899..6ee4501 100644 --- a/lib/core.js +++ b/lib/core.js @@ -270,6 +270,7 @@ module.exports.create = function (le) { // Certificates , renewAsync: function (args, certs) { var renewableAt = core.certificates._getRenewableAt(args, certs); + var err; //var halfLife = (certs.expiresAt - certs.issuedAt) / 2; //var renewable = (Date.now() - certs.issuedAt) > halfLife; @@ -277,12 +278,14 @@ module.exports.create = function (le) { log(args.debug, "(Renew) Renewable At", new Date(renewableAt).toISOString()); if (!args.duplicate && Date.now() < renewableAt) { - return PromiseA.reject(new Error( + err = new Error( "[ERROR] Certificate issued at '" + new Date(certs.issuedAt).toISOString() + "' and expires at '" + new Date(certs.expiresAt).toISOString() + "'. Ignoring renewal attempt until '" + new Date(renewableAt).toISOString() + "'. Set { duplicate: true } to force." - )); + ); + err.code = 'E_NOT_RENEWABLE'; + return PromiseA.reject(err); } // Either the cert has entered its renewal period @@ -318,7 +321,7 @@ module.exports.create = function (le) { return false; } , _getRenewableAt: function (args, certs) { - return certs.expiresAt - le.renewWithin; + return certs.expiresAt - (args.renewWithin || le.renewWithin); } , checkAsync: function (args) { var copy = utils.merge(args, le); diff --git a/tests/renew-certificate.js b/tests/renew-certificate.js new file mode 100644 index 0000000..58a4ae8 --- /dev/null +++ b/tests/renew-certificate.js @@ -0,0 +1,102 @@ +'use strict'; + +var LE = require('../').LE; +var le = LE.create({ + server: 'staging' +, acme: require('le-acme-core').ACME.create() +, store: require('le-store-certbot').create({ + configDir: '~/letsencrypt.test/etc' + , webrootPath: '~/letsencrypt.test/var/:hostname' + }) +, challenge: require('le-challenge-fs').create({ + webrootPath: '~/letsencrypt.test/var/:hostname' + }) +, debug: true +}); + +// TODO test generateRsaKey code path separately +// and then provide opts.accountKeypair to create account + +//var testId = Math.round(Date.now() / 1000).toString(); +var testId = 'test1000'; +var testEmail = 'coolaj86+le.' + testId + '@gmail.com'; +// TODO integrate with Daplie Domains for junk domains to test with +var testDomains = [ 'pokemap.hellabit.com', 'www.pokemap.hellabit.com' ]; +var testCerts; + +var tests = [ + function () { + // TODO test that an altname also fetches the proper certificate + return le.core.certificates.checkAsync({ + domains: testDomains + }).then(function (certs) { + if (!certs) { + throw new Error("Either certificates.registerAsync (in previous test)" + + " or certificates.checkAsync (in this test) failed."); + } + + testCerts = certs; + console.log('Issued At', new Date(certs.issuedAt).toISOString()); + console.log('Expires At', new Date(certs.expiresAt).toISOString()); + + if (certs.expiresAt <= Date.now()) { + throw new Error("Certificates are already expired. They cannot be tested for duplicate or forced renewal."); + } + }); + } + +, function () { + return le.core.certificates.renewAsync({ + email: testEmail + , domains: testDomains + }, testCerts).then(function () { + throw new Error("Should not have renewed non-expired certificates."); + }, function (err) { + if ('E_NOT_RENEWABLE' !== err.code) { + throw err; + } + }); + } + +, function () { + return le.core.certificates.renewAsync({ + email: testEmail + , domains: testDomains + , renewWithin: 720 * 24 * 60 * 60 * 1000 + }, testCerts).then(function (certs) { + console.log('Issued At', new Date(certs.issuedAt).toISOString()); + console.log('Expires At', new Date(certs.expiresAt).toISOString()); + + if (certs.issuedAt === testCerts.issuedAt) { + throw new Error("Should not have returned existing certificates."); + } + }); + } +]; + +function run() { + //var express = require(express); + var server = require('http').createServer(le.middleware()); + server.listen(80, function () { + console.log('Server running, proceeding to test.'); + + function next() { + var test = tests.shift(); + if (!test) { + server.close(); + console.info('All tests passed'); + return; + } + + test().then(next, function (err) { + console.error('ERROR'); + console.error(err.stack); + server.close(); + }); + } + + next(); + }); +} + +run();