mirror of
				https://github.com/therootcompany/greenlock.js.git
				synced 2024-11-16 17:29:00 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			109 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| var utils = require('./utils');
 | |
| 
 | |
| function _log(debug) {
 | |
| 	if (debug) {
 | |
| 		var args = Array.prototype.slice.call(arguments);
 | |
| 		args.shift();
 | |
| 		args.unshift('[greenlock/lib/middleware.js]');
 | |
| 		console.log.apply(console, args);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| module.exports.create = function(gl) {
 | |
| 	if (!gl.challenges['http-01'] || !gl.challenges['http-01'].get) {
 | |
| 		throw new Error('middleware requires challenge plugin with get method');
 | |
| 	}
 | |
| 	var log = gl.log || _log;
 | |
| 
 | |
| 	log(gl.debug, 'created middleware');
 | |
| 	return function(_app) {
 | |
| 		if (_app && 'function' !== typeof _app) {
 | |
| 			throw new Error(
 | |
| 				'use greenlock.middleware() or greenlock.middleware(function (req, res) {})'
 | |
| 			);
 | |
| 		}
 | |
| 		var prefix = gl.acmeChallengePrefix || '/.well-known/acme-challenge/';
 | |
| 
 | |
| 		return function(req, res, next) {
 | |
| 			if (0 !== req.url.indexOf(prefix)) {
 | |
| 				log(gl.debug, 'no match, skipping middleware');
 | |
| 				if ('function' === typeof _app) {
 | |
| 					_app(req, res, next);
 | |
| 				} else if ('function' === typeof next) {
 | |
| 					next();
 | |
| 				} else {
 | |
| 					res.statusCode = 500;
 | |
| 					res.end(
 | |
| 						"[500] Developer Error: app.use('/', greenlock.middleware()) or greenlock.middleware(app)"
 | |
| 					);
 | |
| 				}
 | |
| 				return;
 | |
| 			}
 | |
| 
 | |
| 			log(gl.debug, "this must be tinder, 'cuz it's a match!");
 | |
| 
 | |
| 			var token = req.url.slice(prefix.length);
 | |
| 			var hostname =
 | |
| 				req.hostname ||
 | |
| 				(req.headers.host || '').toLowerCase().replace(/:.*/, '');
 | |
| 
 | |
| 			log(gl.debug, 'hostname', hostname, 'token', token);
 | |
| 
 | |
| 			var copy = utils.merge({ domains: [hostname] }, gl);
 | |
| 			copy = utils.tplCopy(copy);
 | |
| 			copy.challenge = {};
 | |
| 			copy.challenge.type = 'http-01'; // obviously...
 | |
| 			copy.challenge.identifier = { type: 'dns', value: hostname };
 | |
| 			copy.challenge.wildcard = false;
 | |
| 			copy.challenge.token = token;
 | |
| 			copy.challenge.altname = hostname;
 | |
| 
 | |
| 			function cb(opts) {
 | |
| 				var secret = opts.keyAuthorization || opts;
 | |
| 				if (secret && 'string' === typeof secret) {
 | |
| 					res.setHeader('Content-Type', 'text/plain; charset=utf-8');
 | |
| 					res.end(secret);
 | |
| 					return;
 | |
| 				}
 | |
| 				eb(new Error("couldn't retrieve keyAuthorization"));
 | |
| 				return;
 | |
| 			}
 | |
| 			function eb(/*err*/) {
 | |
| 				res.statusCode = 404;
 | |
| 				res.setHeader(
 | |
| 					'Content-Type',
 | |
| 					'application/json; charset=utf-8'
 | |
| 				);
 | |
| 				res.end(
 | |
| 					'{ "error": { "message": "Error: These aren\'t the tokens you\'re looking for. Move along." } }'
 | |
| 				);
 | |
| 				return;
 | |
| 			}
 | |
| 			function mb(err, result) {
 | |
| 				if (err) {
 | |
| 					eb(err);
 | |
| 					return;
 | |
| 				}
 | |
| 				cb(result);
 | |
| 			}
 | |
| 
 | |
| 			var challenger = gl.challenges['http-01'].get;
 | |
| 			if (1 === challenger.length) {
 | |
| 				/*global Promise*/
 | |
| 				return Promise.resolve()
 | |
| 					.then(function() {
 | |
| 						return gl.challenges['http-01'].get(copy);
 | |
| 					})
 | |
| 					.then(cb)
 | |
| 					.catch(eb);
 | |
| 			} else if (2 === challenger.length) {
 | |
| 				gl.challenges['http-01'].get(copy, mb);
 | |
| 			} else {
 | |
| 				gl.challenges['http-01'].get(copy, hostname, token, mb);
 | |
| 			}
 | |
| 		};
 | |
| 	};
 | |
| };
 |