111 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| var NOBJ = {};
 | |
| 
 | |
| module.exports.create = function (challenge) {
 | |
|   var servers = {
 | |
|     _servers: []
 | |
| 
 | |
|   , httpResponder: function (req, res) {
 | |
|       console.info(req.method + ' ' + req.headers.host + req.url);
 | |
|       var acmeChallengePrefix = '/.well-known/acme-challenge/';
 | |
| 
 | |
|       if (0 !== req.url.indexOf(acmeChallengePrefix)) {
 | |
|         res.end("Greenlock™ Commandline: https://git.coolaj86.com/coolaj86/greenlock-cli.js");
 | |
|         return;
 | |
|       }
 | |
| 
 | |
|       var token = req.url.slice(acmeChallengePrefix.length);
 | |
| 
 | |
|       challenge.get(NOBJ, req.headers.host.replace(/:.*/, ''), token, function (err, val) {
 | |
|         if (val) {
 | |
|           console.info("Responding with authorization token '" + val + "'");
 | |
|         } else {
 | |
|           console.info("No authorization token found");
 | |
|         }
 | |
|         res.end(val || '_ ERROR challenge not found _');
 | |
|       });
 | |
|     }
 | |
| 
 | |
|   , startServers: function (plainPorts, tlsPorts, opts) {
 | |
|       opts = opts || {};
 | |
| 
 | |
|       var tlsOptions = opts.tlsOptions || {};
 | |
|       var https = require('https');
 | |
|       var http = require('http');
 | |
| 
 | |
|       if (servers._servers.length) {
 | |
|         return;
 | |
|       }
 | |
| 
 | |
|       // http-01-port
 | |
|       plainPorts.forEach(function (port) {
 | |
|         var server = http.createServer(servers.httpResponder);
 | |
| 
 | |
|         servers._servers.push(server);
 | |
|         server.listen(port, function () {
 | |
|           if (opts.debug) {
 | |
|             console.info('Listening http on', this.address());
 | |
|           }
 | |
|         });
 | |
|         server.on('error', function (err) {
 | |
|           if ('EADDRINUSE' === err.code) {
 | |
|             console.error("");
 | |
|             console.error("You already have a different server running on port '" + port + "'.");
 | |
|             console.error("You should probably use the --webroot-path option instead of --standalone.");
 | |
|             return;
 | |
|           }
 | |
|           throw err;
 | |
|         });
 | |
|       });
 | |
| 
 | |
|       // tls-sni-01-port
 | |
|       tlsPorts.forEach(function (port) {
 | |
|         var server = https.createServer(tlsOptions, servers.httpResponder);
 | |
| 
 | |
|         servers._servers.push(server);
 | |
|         server.listen(port, function () {
 | |
|           if (opts.debug) {
 | |
|             console.info('Listening https on', this.address());
 | |
|           }
 | |
|         });
 | |
|         server.on('error', function (err) {
 | |
|           if ('EADDRINUSE' === err.code) {
 | |
|             console.error("");
 | |
|             console.error("You already have a different server running on port '" + port + "'.");
 | |
|             console.error("You should probably use the --webroot-path option instead of --standalone.");
 | |
|             return;
 | |
|           }
 | |
|           throw err;
 | |
|         });
 | |
|       });
 | |
| 
 | |
|     }
 | |
| 
 | |
|   , closeServers: function (opts) {
 | |
|       opts = opts || {};
 | |
|       return new Promise(function (done) {
 | |
|         var closedServers = 0;
 | |
|         var serversToClose = servers._servers.length;
 | |
|         if (0 === serversToClose) {
 | |
|           done();
 | |
|         }
 | |
| 
 | |
|         servers._servers.forEach(function (server) {
 | |
|           server.close(function () {
 | |
|             if (serversToClose === ++closedServers) {
 | |
|               if (opts.debug) {
 | |
|                 console.info('Closed all servers');
 | |
|               }
 | |
|               servers._servers = [];
 | |
|               done();
 | |
|             }
 | |
|           });
 | |
|         });
 | |
|       });
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   return servers;
 | |
| };
 |