| 
									
										
										
										
											2016-08-05 18:11:19 -04:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-09 14:05:47 -04:00
										 |  |  | var utils = require('./utils'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function log(debug) { | 
					
						
							|  |  |  |   if (debug) { | 
					
						
							|  |  |  |     var args = Array.prototype.slice.call(arguments); | 
					
						
							|  |  |  |     args.shift(); | 
					
						
							|  |  |  |     args.unshift("[le/lib/middleware.js]"); | 
					
						
							|  |  |  |     console.log.apply(console, args); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports.create = function (le) { | 
					
						
							|  |  |  |   if (!le.challenge || !le.challenge.get) { | 
					
						
							|  |  |  |     throw new Error("middleware requires challenge plugin with get method"); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   log(le.debug, "created middleware"); | 
					
						
							| 
									
										
										
										
											2016-08-05 18:11:19 -04:00
										 |  |  |   return function () { | 
					
						
							|  |  |  |     var prefix = le.acmeChallengePrefix; // /.well-known/acme-challenge/:token
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return function (req, res, next) { | 
					
						
							|  |  |  |       if (0 !== req.url.indexOf(prefix)) { | 
					
						
							| 
									
										
										
										
											2016-08-09 14:05:47 -04:00
										 |  |  |         log(le.debug, "no match, skipping middleware"); | 
					
						
							| 
									
										
										
										
											2016-08-05 18:11:19 -04:00
										 |  |  |         next(); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-09 14:05:47 -04:00
										 |  |  |       log(le.debug, "this must be tinder, 'cuz it's a match!"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       var token = req.url.slice(prefix.length); | 
					
						
							| 
									
										
										
										
											2016-08-09 14:17:26 -04:00
										 |  |  |       var hostname = req.hostname || (req.headers.host || '').toLowerCase().replace(/:.*/, ''); | 
					
						
							| 
									
										
										
										
											2016-08-05 18:11:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-09 14:05:47 -04:00
										 |  |  |       log(le.debug, "hostname", hostname, "token", token); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-09 14:17:26 -04:00
										 |  |  |       var copy = utils.merge({ domains: [ hostname ] }, le); | 
					
						
							| 
									
										
										
										
											2016-08-09 14:05:47 -04:00
										 |  |  |       copy = utils.tplCopy(copy); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-05 18:11:19 -04:00
										 |  |  |       // TODO tpl copy?
 | 
					
						
							| 
									
										
										
										
											2016-08-09 14:05:47 -04:00
										 |  |  |       le.challenge.get(copy, hostname, token, function (err, secret) { | 
					
						
							|  |  |  |         if (err || !token) { | 
					
						
							|  |  |  |           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." } }'); | 
					
						
							| 
									
										
										
										
											2016-08-05 18:11:19 -04:00
										 |  |  |           return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-09 14:05:47 -04:00
										 |  |  |         res.setHeader('Content-Type', 'text/plain; charset=utf-8'); | 
					
						
							|  |  |  |         res.end(secret); | 
					
						
							| 
									
										
										
										
											2016-08-05 18:11:19 -04:00
										 |  |  |       }); | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | }; |