| 
									
										
										
										
											2015-12-15 15:21:27 +00:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-19 11:59:50 -08:00
										 |  |  | var path = require('path'); | 
					
						
							| 
									
										
										
										
											2017-04-11 08:53:04 +00:00
										 |  |  | var homeRe = new RegExp("^~(\\/|\\\\|\\" + path.sep + ")"); | 
					
						
							| 
									
										
										
										
											2018-04-27 11:38:15 -06:00
										 |  |  | // very basic check. Allows *.example.com.
 | 
					
						
							| 
									
										
										
										
											2018-04-27 11:44:49 -06:00
										 |  |  | var re = /^(\*\.)?[a-zA-Z0-9\.\-]+$/; | 
					
						
							| 
									
										
										
										
											2015-12-19 02:18:32 -08:00
										 |  |  | var punycode = require('punycode'); | 
					
						
							| 
									
										
										
										
											2018-04-24 11:43:27 -06:00
										 |  |  | var promisify = (require('util').promisify || require('bluebird').promisify); | 
					
						
							|  |  |  | var dnsResolveMxAsync = promisify(require('dns').resolveMx); | 
					
						
							| 
									
										
										
										
											2015-12-19 02:18:32 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-06 01:32:59 -04:00
										 |  |  | module.exports.attachCertInfo = function (results) { | 
					
						
							| 
									
										
										
										
											2019-04-01 00:36:59 -06:00
										 |  |  |   var certInfo = require('cert-info').info(results.cert); | 
					
						
							| 
									
										
										
										
											2016-08-06 01:32:59 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-09 15:19:29 -04:00
										 |  |  |   // subject, altnames, issuedAt, expiresAt
 | 
					
						
							|  |  |  |   Object.keys(certInfo).forEach(function (key) { | 
					
						
							|  |  |  |     results[key] = certInfo[key]; | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2016-08-06 01:32:59 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   return results; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-01 00:36:59 -06:00
										 |  |  | module.exports.certHasDomain = function (certInfo, _domain) { | 
					
						
							|  |  |  |   var names = (certInfo.altnames || []).slice(0); | 
					
						
							|  |  |  |   names.push(certInfo.subject); | 
					
						
							|  |  |  |   return names.some(function (name) { | 
					
						
							|  |  |  |     var domain = _domain.toLowerCase(); | 
					
						
							|  |  |  |     name = name.toLowerCase(); | 
					
						
							|  |  |  |     if ('*.' === name.substr(0, 2)) { | 
					
						
							|  |  |  |       name = name.substr(2); | 
					
						
							|  |  |  |       domain = domain.split('.').slice(1).join('.'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return name === domain; | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-19 11:59:50 -08:00
										 |  |  | module.exports.isValidDomain = function (domain) { | 
					
						
							| 
									
										
										
										
											2015-12-19 02:18:32 -08:00
										 |  |  |   if (re.test(domain)) { | 
					
						
							|  |  |  |     return domain; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   domain = punycode.toASCII(domain); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (re.test(domain)) { | 
					
						
							|  |  |  |     return domain; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return ''; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-04 18:49:35 -04:00
										 |  |  | module.exports.merge = function (/*defaults, args*/) { | 
					
						
							|  |  |  |   var allDefaults = Array.prototype.slice.apply(arguments); | 
					
						
							| 
									
										
										
										
											2016-08-08 15:17:09 -04:00
										 |  |  |   var args = allDefaults.shift(); | 
					
						
							| 
									
										
										
										
											2015-12-17 08:46:40 +00:00
										 |  |  |   var copy = {}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-04 18:49:35 -04:00
										 |  |  |   allDefaults.forEach(function (defaults) { | 
					
						
							|  |  |  |     Object.keys(defaults).forEach(function (key) { | 
					
						
							|  |  |  |       copy[key] = defaults[key]; | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2015-12-17 08:46:40 +00:00
										 |  |  |   }); | 
					
						
							| 
									
										
										
										
											2016-08-04 18:49:35 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-17 08:46:40 +00:00
										 |  |  |   Object.keys(args).forEach(function (key) { | 
					
						
							|  |  |  |     copy[key] = args[key]; | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return copy; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-04 18:49:35 -04:00
										 |  |  | module.exports.tplCopy = function (copy) { | 
					
						
							| 
									
										
										
										
											2018-05-15 17:35:22 -06:00
										 |  |  |   var homedir = require('os').homedir(); | 
					
						
							| 
									
										
										
										
											2016-08-08 18:11:25 -04:00
										 |  |  |   var tplKeys; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   copy.hostnameGet = function (copy) { | 
					
						
							| 
									
										
										
										
											2019-04-01 00:36:59 -06:00
										 |  |  |     return copy.subject || (copy.domains || [])[0] || copy.domain; | 
					
						
							| 
									
										
										
										
											2015-12-20 00:27:48 +00:00
										 |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-17 08:46:40 +00:00
										 |  |  |   Object.keys(copy).forEach(function (key) { | 
					
						
							| 
									
										
										
										
											2016-08-08 18:11:25 -04:00
										 |  |  |     var newName; | 
					
						
							|  |  |  |     if (!/Get$/.test(key)) { | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     newName = key.replace(/Get$/, ''); | 
					
						
							|  |  |  |     copy[newName] = copy[newName] || copy[key](copy); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   tplKeys = Object.keys(copy); | 
					
						
							|  |  |  |   tplKeys.sort(function (a, b) { | 
					
						
							|  |  |  |     return b.length - a.length; | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   tplKeys.forEach(function (key) { | 
					
						
							| 
									
										
										
										
											2016-08-05 04:14:40 -04:00
										 |  |  |     if ('string' !== typeof copy[key]) { | 
					
						
							|  |  |  |       return; | 
					
						
							| 
									
										
										
										
											2015-12-17 08:46:40 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-05 04:14:40 -04:00
										 |  |  |     copy[key] = copy[key].replace(homeRe, homedir + path.sep); | 
					
						
							| 
									
										
										
										
											2016-08-08 18:11:25 -04:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   tplKeys.forEach(function (key) { | 
					
						
							|  |  |  |     if ('string' !== typeof copy[key]) { | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-08-05 04:14:40 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-08 18:11:25 -04:00
										 |  |  |     tplKeys.forEach(function (tplname) { | 
					
						
							|  |  |  |       if (!copy[tplname]) { | 
					
						
							| 
									
										
										
										
											2016-08-05 04:14:40 -04:00
										 |  |  |         // what can't be templated now may be templatable later
 | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2016-08-08 18:11:25 -04:00
										 |  |  |       copy[key] = copy[key].replace(':' + tplname, copy[tplname]); | 
					
						
							| 
									
										
										
										
											2016-08-05 04:14:40 -04:00
										 |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2016-08-07 02:02:02 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   return copy; | 
					
						
							| 
									
										
										
										
											2015-12-17 08:46:40 +00:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2016-08-08 15:17:09 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | module.exports.testEmail = function (email) { | 
					
						
							|  |  |  |   var parts = (email||'').split('@'); | 
					
						
							|  |  |  |   var err; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (2 !== parts.length || !parts[0] || !parts[1]) { | 
					
						
							|  |  |  |     err = new Error("malformed email address '" + email + "'"); | 
					
						
							|  |  |  |     err.code = 'E_EMAIL'; | 
					
						
							| 
									
										
										
										
											2018-04-19 23:19:02 -06:00
										 |  |  |     return Promise.reject(err); | 
					
						
							| 
									
										
										
										
											2016-08-08 15:17:09 -04:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-19 23:19:02 -06:00
										 |  |  |   return dnsResolveMxAsync(parts[1]).then(function (records) { | 
					
						
							| 
									
										
										
										
											2016-08-08 15:17:09 -04:00
										 |  |  |     // records only returns when there is data
 | 
					
						
							|  |  |  |     if (!records.length) { | 
					
						
							|  |  |  |       throw new Error("sanity check fail: success, but no MX records returned"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return email; | 
					
						
							|  |  |  |   }, function (err) { | 
					
						
							|  |  |  |     if ('ENODATA' === err.code) { | 
					
						
							|  |  |  |       err = new Error("no MX records found for '" + parts[1] + "'"); | 
					
						
							|  |  |  |       err.code = 'E_EMAIL'; | 
					
						
							| 
									
										
										
										
											2018-04-19 23:19:02 -06:00
										 |  |  |       return Promise.reject(err); | 
					
						
							| 
									
										
										
										
											2016-08-08 15:17:09 -04:00
										 |  |  |     } | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | }; |