| 
									
										
										
										
											2016-08-05 18:11:19 -04:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-09 14:05:47 -04:00
										 |  |  | var utils = require('./utils'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-25 22:04:36 +02:00
										 |  |  | function _log(debug) { | 
					
						
							| 
									
										
										
										
											2019-10-08 04:51:15 -06:00
										 |  |  | 	if (debug) { | 
					
						
							|  |  |  | 		var args = Array.prototype.slice.call(arguments); | 
					
						
							|  |  |  | 		args.shift(); | 
					
						
							|  |  |  | 		args.unshift('[greenlock/lib/middleware.js]'); | 
					
						
							|  |  |  | 		console.log.apply(console, args); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-08-09 14:05:47 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-08 04:51:15 -06:00
										 |  |  | 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; | 
					
						
							| 
									
										
										
										
											2016-08-09 14:05:47 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-08 04:51:15 -06:00
										 |  |  | 	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/'; | 
					
						
							| 
									
										
										
										
											2016-08-05 18:11:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-08 04:51:15 -06:00
										 |  |  | 		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; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2016-08-05 18:11:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-08 04:51:15 -06:00
										 |  |  | 			log(gl.debug, "this must be tinder, 'cuz it's a match!"); | 
					
						
							| 
									
										
										
										
											2016-08-09 14:05:47 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-08 04:51:15 -06:00
										 |  |  | 			var token = req.url.slice(prefix.length); | 
					
						
							|  |  |  | 			var hostname = | 
					
						
							|  |  |  | 				req.hostname || | 
					
						
							|  |  |  | 				(req.headers.host || '').toLowerCase().replace(/:.*/, ''); | 
					
						
							| 
									
										
										
										
											2016-08-05 18:11:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-08 04:51:15 -06:00
										 |  |  | 			log(gl.debug, 'hostname', hostname, 'token', token); | 
					
						
							| 
									
										
										
										
											2016-08-09 14:05:47 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-08 04:51:15 -06:00
										 |  |  | 			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; | 
					
						
							| 
									
										
										
										
											2016-08-09 14:05:47 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-08 04:51:15 -06:00
										 |  |  | 			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); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2019-04-05 19:45:24 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-08 04:51:15 -06:00
										 |  |  | 			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); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2016-08-05 18:11:19 -04:00
										 |  |  | }; |