added loopback test
This commit is contained in:
		
							parent
							
								
									6cb3909677
								
							
						
					
					
						commit
						ccd525a09a
					
				
							
								
								
									
										56
									
								
								index.js
									
									
									
									
									
								
							
							
						
						
									
										56
									
								
								index.js
									
									
									
									
									
								
							| @ -3,7 +3,7 @@ | |||||||
| var fs = require('fs'); | var fs = require('fs'); | ||||||
| var path = require('path'); | var path = require('path'); | ||||||
| 
 | 
 | ||||||
| var defaults = { | var myDefaults = { | ||||||
|   //webrootPath: [ '~', 'letsencrypt', 'var', 'lib' ].join(path.sep)
 |   //webrootPath: [ '~', 'letsencrypt', 'var', 'lib' ].join(path.sep)
 | ||||||
|   webrootPath: path.join(require('os').tmpdir(), 'acme-challenge') |   webrootPath: path.join(require('os').tmpdir(), 'acme-challenge') | ||||||
| , debug: false | , debug: false | ||||||
| @ -19,9 +19,9 @@ Challenge.create = function (options) { | |||||||
|   }); |   }); | ||||||
|   results.create = undefined; |   results.create = undefined; | ||||||
| 
 | 
 | ||||||
|   Object.keys(defaults).forEach(function (key) { |   Object.keys(myDefaults).forEach(function (key) { | ||||||
|     if ('undefined' === typeof options[key]) { |     if ('undefined' === typeof options[key]) { | ||||||
|       options[key] = defaults[key]; |       options[key] = myDefaults[key]; | ||||||
|     } |     } | ||||||
|   }); |   }); | ||||||
|   results._options = options; |   results._options = options; | ||||||
| @ -67,3 +67,53 @@ Challenge.get = function (defaults, domain, key, done) { | |||||||
| Challenge.remove = function (defaults, domain, key, done) { | Challenge.remove = function (defaults, domain, key, done) { | ||||||
|   fs.unlink(path.join(defaults.webrootPath, key), done); |   fs.unlink(path.join(defaults.webrootPath, key), done); | ||||||
| }; | }; | ||||||
|  | 
 | ||||||
|  | Challenge.loopback = function (defaults, domain, key, done) { | ||||||
|  |   var hostname = domain + (defaults.test ? ':' + defaults.test : ''); | ||||||
|  |   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); | ||||||
|  |     }); | ||||||
|  |   }).on('error', function (err) { | ||||||
|  |     done(err); | ||||||
|  |   }); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | Challenge.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; } | ||||||
|  | 
 | ||||||
|  |     // test is actually the port to be used
 | ||||||
|  |     myDefaults.test = args.test; | ||||||
|  |     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); | ||||||
|  |       }); | ||||||
|  |     }); | ||||||
|  |   }); | ||||||
|  | }; | ||||||
|  | |||||||
| @ -29,5 +29,9 @@ | |||||||
|   "homepage": "https://github.com/Daplie/le-challenge-fs#readme", |   "homepage": "https://github.com/Daplie/le-challenge-fs#readme", | ||||||
|   "dependencies": { |   "dependencies": { | ||||||
|     "mkdirp": "^0.5.1" |     "mkdirp": "^0.5.1" | ||||||
|  |   }, | ||||||
|  |   "devDependencies": { | ||||||
|  |     "finalhandler": "^0.5.0", | ||||||
|  |     "serve-static": "^1.11.1" | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										42
									
								
								test.js
									
									
									
									
									
								
							
							
						
						
									
										42
									
								
								test.js
									
									
									
									
									
								
							| @ -1,6 +1,8 @@ | |||||||
| 'use strict'; | 'use strict'; | ||||||
| 
 | 
 | ||||||
| var challenge = require('./').create({ debug: true, webrootPath: '/tmp/acme-challenge' }); | //var httpsOptions = require('localhost.daplie.com-certificates').merge({});
 | ||||||
|  | var webrootPath = '/tmp/acme-challenge'; | ||||||
|  | var challenge = require('./').create({ debug: true, webrootPath: webrootPath }); | ||||||
| 
 | 
 | ||||||
| var opts = challenge.getOptions(); | var opts = challenge.getOptions(); | ||||||
| var domain = 'example.com'; | var domain = 'example.com'; | ||||||
| @ -12,17 +14,13 @@ challenge.remove(opts, domain, token, function () { | |||||||
| 
 | 
 | ||||||
|   challenge.set(opts, domain, token, key, function (err) { |   challenge.set(opts, domain, token, key, function (err) { | ||||||
|     // if there's an error, there's a problem
 |     // if there's an error, there's a problem
 | ||||||
|     if (err) { |     if (err) { throw err; } | ||||||
|       throw err; |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     // throw new Error("manually check /tmp/acme-challenge");
 |     // throw new Error("manually check /tmp/acme-challenge");
 | ||||||
| 
 | 
 | ||||||
|     challenge.get(opts, domain, token, function (err, _key) { |     challenge.get(opts, domain, token, function (err, _key) { | ||||||
|       // if there's an error, there's a problem
 |       // if there's an error, there's a problem
 | ||||||
|       if (err) { |       if (err) { throw err; } | ||||||
|         throw err; |  | ||||||
|       } |  | ||||||
| 
 | 
 | ||||||
|       // should retrieve the key
 |       // should retrieve the key
 | ||||||
|       if (key !== _key) { |       if (key !== _key) { | ||||||
| @ -31,9 +29,7 @@ challenge.remove(opts, domain, token, function () { | |||||||
| 
 | 
 | ||||||
|       challenge.remove(opts, domain, token, function () { |       challenge.remove(opts, domain, token, function () { | ||||||
|         // if there's an error, there's a problem
 |         // if there's an error, there's a problem
 | ||||||
|         if (err) { |         if (err) { throw err; } | ||||||
|           throw err; |  | ||||||
|         } |  | ||||||
| 
 | 
 | ||||||
|         challenge.get(opts, domain, token, function (err, _key) { |         challenge.get(opts, domain, token, function (err, _key) { | ||||||
|           // error here is okay
 |           // error here is okay
 | ||||||
| @ -43,9 +39,33 @@ challenge.remove(opts, domain, token, function () { | |||||||
|             throw new Error("FAIL: should not get key"); |             throw new Error("FAIL: should not get key"); | ||||||
|           } |           } | ||||||
| 
 | 
 | ||||||
|           console.info('PASS'); |           console.info('[PASS] unit test'); | ||||||
|         }); |         }); | ||||||
|       }); |       }); | ||||||
|     }); |     }); | ||||||
|   }); |   }); | ||||||
| }); | }); | ||||||
|  | 
 | ||||||
|  | function loopbackTest() { | ||||||
|  |   var http = require('http'); | ||||||
|  |   var serveStatic = require('serve-static')(webrootPath, { dotfiles: 'allow' }); | ||||||
|  |   var finalhandler = require('finalhandler'); | ||||||
|  |   var server = http.createServer(function (req, res) { | ||||||
|  |     req.url = req.url.replace(/^\/\.well-known\/acme-challenge\//, '/'); | ||||||
|  |     serveStatic(req, res, finalhandler(req, res)); | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   server.listen(0, function () { | ||||||
|  |     var port = server.address().port; | ||||||
|  | 
 | ||||||
|  |     opts.webrootPath = webrootPath; | ||||||
|  |     opts.test = port; | ||||||
|  |     challenge.test(opts, 'localhost', 'foo', 'bar', function (err) { | ||||||
|  |       server.close(); | ||||||
|  |       if (err) { console.error(err.stack); return; } | ||||||
|  | 
 | ||||||
|  |       console.info('[PASS] localhost loopback'); | ||||||
|  |     }); | ||||||
|  |   }); | ||||||
|  | } | ||||||
|  | loopbackTest(); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user