Compare commits
	
		
			No commits in common. "e179188bc0d84942e43598cde0c180fea4de2c06" and "595de158eede559661f5b6a49263ca134da7f1e9" have entirely different histories.
		
	
	
		
			e179188bc0
			...
			595de158ee
		
	
		
| @ -1,8 +1,4 @@ | |||||||
| { | { | ||||||
|   "bracketSpacing": true, |  | ||||||
|   "printWidth": 80, |  | ||||||
|   "singleQuote": true, |  | ||||||
|   "tabWidth": 2, |  | ||||||
|   "trailingComma": "none", |   "trailingComma": "none", | ||||||
|   "useTabs": true |   "useTabs": true | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										87
									
								
								index.js
									
									
									
									
									
								
							
							
						
						
									
										87
									
								
								index.js
									
									
									
									
									
								
							| @ -1,16 +1,16 @@ | |||||||
| 'use strict'; | "use strict"; | ||||||
| /*global Promise*/ | /*global Promise*/ | ||||||
| var crypto = require('crypto'); | var crypto = require("crypto"); | ||||||
| 
 | 
 | ||||||
| module.exports.create = function() { | module.exports.create = function() { | ||||||
| 	throw new Error( | 	throw new Error( | ||||||
| 		'acme-challenge-test is a test fixture for acme-challenge-* plugins, not a plugin itself' | 		"acme-challenge-test is a test fixture for acme-challenge-* plugins, not a plugin itself" | ||||||
| 	); | 	); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| // ignore all of this, it's just to normalize Promise vs node-style callback thunk vs synchronous
 | // ignore all of this, it's just to normalize Promise vs node-style callback thunk vs synchronous
 | ||||||
| function promiseCheckAndCatch(obj, name) { | function promiseCheckAndCatch(obj, name) { | ||||||
| 	var promisify = require('util').promisify; | 	var promisify = require("util").promisify; | ||||||
| 	// don't loose this-ness, just in case that's important
 | 	// don't loose this-ness, just in case that's important
 | ||||||
| 	var fn = obj[name].bind(obj); | 	var fn = obj[name].bind(obj); | ||||||
| 	var promiser; | 	var promiser; | ||||||
| @ -32,13 +32,13 @@ function promiseCheckAndCatch(obj, name) { | |||||||
| 				"'challenge." + | 				"'challenge." + | ||||||
| 					name + | 					name + | ||||||
| 					"' should accept either one argument, the options," + | 					"' should accept either one argument, the options," + | ||||||
| 					' and return a Promise or accept two arguments, the options and a node-style callback thunk' | 					" and return a Promise or accept two arguments, the options and a node-style callback thunk" | ||||||
| 			) | 			) | ||||||
| 		); | 		); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	function shouldntBeNull(result) { | 	function shouldntBeNull(result) { | ||||||
| 		if ('undefined' === typeof result) { | 		if ("undefined" === typeof result) { | ||||||
| 			throw new Error( | 			throw new Error( | ||||||
| 				"'challenge.'" + | 				"'challenge.'" + | ||||||
| 					name + | 					name + | ||||||
| @ -57,21 +57,21 @@ function promiseCheckAndCatch(obj, name) { | |||||||
| // Here's the meat, where the tests are happening:
 | // Here's the meat, where the tests are happening:
 | ||||||
| function run(challenger, opts) { | function run(challenger, opts) { | ||||||
| 	var ch = opts.challenge; | 	var ch = opts.challenge; | ||||||
| 	if ('http-01' === ch.type && ch.wildname) { | 	if ("http-01" === ch.type && ch.wildname) { | ||||||
| 		throw new Error('http-01 cannot be used for wildcard domains'); | 		throw new Error("http-01 cannot be used for wildcard domains"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	var set = promiseCheckAndCatch(challenger, 'set'); | 	var set = promiseCheckAndCatch(challenger, "set"); | ||||||
| 	if ('function' !== typeof challenger.get) { | 	if ("function" !== typeof challenger.get) { | ||||||
| 		throw new Error( | 		throw new Error( | ||||||
| 			"'challenge.get' should be implemented for the sake of testing." + | 			"'challenge.get' should be implemented for the sake of testing." + | ||||||
| 				' It should be implemented as the internal method for fetching the challenge' + | 				" It should be implemented as the internal method for fetching the challenge" + | ||||||
| 				' (i.e. reading from a database, file system or API, not return internal),' + | 				" (i.e. reading from a database, file system or API, not return internal)," + | ||||||
| 				' not the external check (the http call, dns query, etc), which will already be done as part of this test.' | 				" not the external check (the http call, dns query, etc), which will already be done as part of this test." | ||||||
| 		); | 		); | ||||||
| 	} | 	} | ||||||
| 	var get = promiseCheckAndCatch(challenger, 'get'); | 	var get = promiseCheckAndCatch(challenger, "get"); | ||||||
| 	var remove = promiseCheckAndCatch(challenger, 'remove'); | 	var remove = promiseCheckAndCatch(challenger, "remove"); | ||||||
| 
 | 
 | ||||||
| 	// The first time we just check it against itself
 | 	// The first time we just check it against itself
 | ||||||
| 	// this will cause the prompt to appear
 | 	// this will cause the prompt to appear
 | ||||||
| @ -80,41 +80,40 @@ function run(challenger, opts) { | |||||||
| 			// this will cause the final completion message to appear
 | 			// this will cause the final completion message to appear
 | ||||||
| 			// _test is used by the manual cli reference implementations
 | 			// _test is used by the manual cli reference implementations
 | ||||||
| 			var query = { type: ch.type, /*debug*/ status: ch.status, _test: true }; | 			var query = { type: ch.type, /*debug*/ status: ch.status, _test: true }; | ||||||
| 			if ('http-01' === ch.type) { | 			if ("http-01" === ch.type) { | ||||||
| 				query.identifier = ch.identifier; | 				query.identifier = ch.identifier; | ||||||
| 				query.token = ch.token; | 				query.token = ch.token; | ||||||
| 				// For testing only
 | 				// For testing only
 | ||||||
| 				query.url = ch.challengeUrl; | 				query.url = ch.challengeUrl; | ||||||
| 			} else if ('dns-01' === ch.type) { | 			} else if ("dns-01" === ch.type) { | ||||||
| 				query.identifier = { type: 'dns', value: ch.dnsHost }; | 				query.identifier = { type: "dns", value: ch.dnsHost }; | ||||||
| 				// For testing only
 | 				// For testing only
 | ||||||
| 				query.altname = ch.altname; | 				query.altname = ch.altname; | ||||||
| 				// there should only be two possible TXT records per challenge domain:
 | 				// there should only be two possible TXT records per challenge domain:
 | ||||||
| 				// one for the bare domain, and the other if and only if there's a wildcard
 | 				// one for the bare domain, and the other if and only if there's a wildcard
 | ||||||
| 				query.wildcard = ch.wildcard; | 				query.wildcard = ch.wildcard; | ||||||
| 				query.dnsAuthorization = ch.dnsAuthorization; |  | ||||||
| 			} else { | 			} else { | ||||||
| 				query = JSON.parse(JSON.stringify(ch)); | 				query = JSON.parse(JSON.stringify(ch)); | ||||||
| 				query.comment = 'unknown challenge type, supplying everything'; | 				query.comment = "unknown challenge type, supplying everything"; | ||||||
| 			} | 			} | ||||||
| 			return get({ challenge: query }) | 			return get({ challenge: query }) | ||||||
| 				.then(function(secret) { | 				.then(function(secret) { | ||||||
| 					if ('string' === typeof secret) { | 					if ("string" === typeof secret) { | ||||||
| 						console.info( | 						console.info( | ||||||
| 							'secret was passed as a string, which works historically, but should be an object instead:' | 							"secret was passed as a string, which works historically, but should be an object instead:" | ||||||
| 						); | 						); | ||||||
| 						console.info('{ "keyAuthorization": "' + secret + '" }'); | 						console.info('{ "keyAuthorization": "' + secret + '" }'); | ||||||
| 						console.info('or'); | 						console.info("or"); | ||||||
| 						// TODO this should be "keyAuthorizationDigest"
 | 						// TODO this should be "keyAuthorizationDigest"
 | ||||||
| 						console.info('{ "dnsAuthorization": "' + secret + '" }'); | 						console.info('{ "dnsAuthorization": "' + secret + '" }'); | ||||||
| 						console.info( | 						console.info( | ||||||
| 							'This is to help keep acme / greenlock (and associated plugins) future-proof for new challenge types' | 							"This is to help keep acme / greenlock (and associated plugins) future-proof for new challenge types" | ||||||
| 						); | 						); | ||||||
| 					} | 					} | ||||||
| 					// historically 'secret' has been a string, but I'd like it to transition to be an object.
 | 					// historically 'secret' has been a string, but I'd like it to transition to be an object.
 | ||||||
| 					// to make it backwards compatible in v2.7 to change it,
 | 					// to make it backwards compatible in v2.7 to change it,
 | ||||||
| 					// so I'm not sure that we really need to.
 | 					// so I'm not sure that we really need to.
 | ||||||
| 					if ('http-01' === ch.type) { | 					if ("http-01" === ch.type) { | ||||||
| 						secret = secret.keyAuthorization || secret; | 						secret = secret.keyAuthorization || secret; | ||||||
| 						if (ch.keyAuthorization !== secret) { | 						if (ch.keyAuthorization !== secret) { | ||||||
| 							throw new Error( | 							throw new Error( | ||||||
| @ -126,7 +125,7 @@ function run(challenger, opts) { | |||||||
| 									"'" | 									"'" | ||||||
| 							); | 							); | ||||||
| 						} | 						} | ||||||
| 					} else if ('dns-01' === ch.type) { | 					} else if ("dns-01" === ch.type) { | ||||||
| 						secret = secret.dnsAuthorization || secret; | 						secret = secret.dnsAuthorization || secret; | ||||||
| 						if (ch.dnsAuthorization !== secret) { | 						if (ch.dnsAuthorization !== secret) { | ||||||
| 							throw new Error( | 							throw new Error( | ||||||
| @ -139,7 +138,7 @@ function run(challenger, opts) { | |||||||
| 							); | 							); | ||||||
| 						} | 						} | ||||||
| 					} else { | 					} else { | ||||||
| 						if ('tls-alpn-01' === ch.type) { | 						if ("tls-alpn-01" === ch.type) { | ||||||
| 							console.warn( | 							console.warn( | ||||||
| 								"'tls-alpn-01' support is in development" + | 								"'tls-alpn-01' support is in development" + | ||||||
| 									" (or developed and we haven't update this yet). Please contact us." | 									" (or developed and we haven't update this yet). Please contact us." | ||||||
| @ -166,12 +165,12 @@ function run(challenger, opts) { | |||||||
| 						return get(opts).then(function(result) { | 						return get(opts).then(function(result) { | ||||||
| 							if (result) { | 							if (result) { | ||||||
| 								throw new Error( | 								throw new Error( | ||||||
| 									'challenge.remove() should have made it not possible for challenge.get() to return a value' | 									"challenge.remove() should have made it not possible for challenge.get() to return a value" | ||||||
| 								); | 								); | ||||||
| 							} | 							} | ||||||
| 							if (null !== result) { | 							if (null !== result) { | ||||||
| 								throw new Error( | 								throw new Error( | ||||||
| 									'challenge.get() should return null when the value is not set' | 									"challenge.get() should return null when the value is not set" | ||||||
| 								); | 								); | ||||||
| 							} | 							} | ||||||
| 						}); | 						}); | ||||||
| @ -179,9 +178,9 @@ function run(challenger, opts) { | |||||||
| 				}); | 				}); | ||||||
| 		}) | 		}) | ||||||
| 		.then(function() { | 		.then(function() { | ||||||
| 			console.info('All soft tests: PASS'); | 			console.info("All soft tests: PASS"); | ||||||
| 			console.warn( | 			console.warn( | ||||||
| 				'Hard tests (actually checking http URLs and dns records) is implemented in acme-v2.' | 				"Hard tests (actually checking http URLs and dns records) is implemented in acme-v2." | ||||||
| 			); | 			); | ||||||
| 			console.warn( | 			console.warn( | ||||||
| 				"We'll copy them over here as well, but that's a TODO for next week." | 				"We'll copy them over here as well, but that's a TODO for next week." | ||||||
| @ -191,39 +190,39 @@ function run(challenger, opts) { | |||||||
| 
 | 
 | ||||||
| module.exports.test = function(type, altname, challenger) { | module.exports.test = function(type, altname, challenger) { | ||||||
| 	var expires = new Date(Date.now() + 10 * 60 * 1000).toISOString(); | 	var expires = new Date(Date.now() + 10 * 60 * 1000).toISOString(); | ||||||
| 	var token = crypto.randomBytes(8).toString('hex'); | 	var token = crypto.randomBytes(8).toString("hex"); | ||||||
| 	var thumb = crypto.randomBytes(16).toString('hex'); | 	var thumb = crypto.randomBytes(16).toString("hex"); | ||||||
| 	var keyAuth = token + '.' + crypto.randomBytes(16).toString('hex'); | 	var keyAuth = token + "." + crypto.randomBytes(16).toString("hex"); | ||||||
| 	var dnsAuth = crypto | 	var dnsAuth = crypto | ||||||
| 		.createHash('sha256') | 		.createHash("sha256") | ||||||
| 		.update(keyAuth) | 		.update(keyAuth) | ||||||
| 		.digest('base64') | 		.digest("base64") | ||||||
| 		.replace(/\+/g, '-') | 		.replace(/\+/g, "-") | ||||||
| 		.replace(/\//g, '_') | 		.replace(/\//g, "_") | ||||||
| 		.replace(/=/g, ''); | 		.replace(/=/g, ""); | ||||||
| 
 | 
 | ||||||
| 	var challenge = { | 	var challenge = { | ||||||
| 		type: type, | 		type: type, | ||||||
| 		identifier: { type: 'dns', value: null }, // completed below
 | 		identifier: { type: "dns", value: null }, // completed below
 | ||||||
| 		wildcard: false, // completed below
 | 		wildcard: false, // completed below
 | ||||||
| 		status: 'pending', | 		status: "pending", | ||||||
| 		expires: expires, | 		expires: expires, | ||||||
| 		token: token, | 		token: token, | ||||||
| 		thumbprint: thumb, | 		thumbprint: thumb, | ||||||
| 		keyAuthorization: keyAuth, | 		keyAuthorization: keyAuth, | ||||||
| 		url: null, // completed below
 | 		url: null, // completed below
 | ||||||
| 		dnsHost: '_acme-challenge.', // completed below
 | 		dnsHost: "_acme-challenge.", // completed below
 | ||||||
| 		dnsAuthorization: dnsAuth, | 		dnsAuthorization: dnsAuth, | ||||||
| 		altname: altname, | 		altname: altname, | ||||||
| 		_test: true // used by CLI referenced implementations
 | 		_test: true // used by CLI referenced implementations
 | ||||||
| 	}; | 	}; | ||||||
| 	if ('*.' === altname.slice(0, 2)) { | 	if ("*." === altname.slice(0, 2)) { | ||||||
| 		challenge.wildcard = true; | 		challenge.wildcard = true; | ||||||
| 		altname = altname.slice(2); | 		altname = altname.slice(2); | ||||||
| 	} | 	} | ||||||
| 	challenge.identifier.value = altname; | 	challenge.identifier.value = altname; | ||||||
| 	challenge.url = | 	challenge.url = | ||||||
| 		'http://' + altname + '/.well-known/acme-challenge/' + challenge.token; | 		"http://" + altname + "/.well-known/acme-challenge/" + challenge.token; | ||||||
| 	challenge.dnsHost += altname; | 	challenge.dnsHost += altname; | ||||||
| 
 | 
 | ||||||
| 	return run(challenger, { challenge: challenge }); | 	return run(challenger, { challenge: challenge }); | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
| 	"name": "acme-challenge-test", | 	"name": "acme-challenge-test", | ||||||
| 	"version": "3.0.4", | 	"version": "3.0.3", | ||||||
| 	"description": "The base set of tests for all ACME challenge strategies. Any `acme-http-01-`, `acme-dns-01-`, `acme-challenge-`, or greenlock plugin should be able to pass these tests.", | 	"description": "The base set of tests for all ACME challenge strategies. Any `acme-http-01-`, `acme-dns-01-`, `acme-challenge-`, or greenlock plugin should be able to pass these tests.", | ||||||
| 	"main": "index.js", | 	"main": "index.js", | ||||||
| 	"homepage": "https://git.rootprojects.org/root/acme-challenge-test.js", | 	"homepage": "https://git.rootprojects.org/root/acme-challenge-test.js", | ||||||
| @ -21,8 +21,7 @@ | |||||||
| 		"challenge", | 		"challenge", | ||||||
| 		"plugin", | 		"plugin", | ||||||
| 		"module", | 		"module", | ||||||
| 		"strategy", | 		"strategy" | ||||||
| 		"greenlock" |  | ||||||
| 	], | 	], | ||||||
| 	"author": "AJ ONeal <solderjs@gmail.com> (https://solderjs.com/)", | 	"author": "AJ ONeal <solderjs@gmail.com> (https://solderjs.com/)", | ||||||
| 	"license": "MPL-2.0" | 	"license": "MPL-2.0" | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user