mirror of
				https://github.com/therootcompany/greenlock.js.git
				synced 2024-11-16 17:29:00 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			114 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| var fs = require('fs');
 | |
| var path = require('path');
 | |
| var PromiseA = require('bluebird');
 | |
| 
 | |
| var homeRe = new RegExp("^~(\\/|\\\|\\" + path.sep + ")");
 | |
| var re = /^[a-zA-Z0-9\.\-]+$/;
 | |
| var punycode = require('punycode');
 | |
| 
 | |
| module.exports.isValidDomain = function (domain) {
 | |
|   if (re.test(domain)) {
 | |
|     return domain;
 | |
|   }
 | |
| 
 | |
|   domain = punycode.toASCII(domain);
 | |
| 
 | |
|   if (re.test(domain)) {
 | |
|     return domain;
 | |
|   }
 | |
| 
 | |
|   return '';
 | |
| };
 | |
| 
 | |
| module.exports.tplConfigDir = function merge(configDir, defaults) {
 | |
|   var homedir = require('homedir')();
 | |
|   Object.keys(defaults).forEach(function (key) {
 | |
|     if ('string' === typeof defaults[key]) {
 | |
|       defaults[key] = defaults[key].replace(':config', configDir).replace(':conf', configDir);
 | |
|       defaults[key] = defaults[key].replace(homeRe, homedir + path.sep);
 | |
|     }
 | |
|   });
 | |
| };
 | |
| 
 | |
| module.exports.merge = function merge(defaults, args) {
 | |
|   var copy = {};
 | |
| 
 | |
|   Object.keys(defaults).forEach(function (key) {
 | |
|     copy[key] = defaults[key];
 | |
|   });
 | |
|   Object.keys(args).forEach(function (key) {
 | |
|     copy[key] = args[key];
 | |
|   });
 | |
| 
 | |
|   return copy;
 | |
| };
 | |
| 
 | |
| module.exports.tplCopy = function merge(copy) {
 | |
|   var homedir = require('homedir')();
 | |
|   var tpls = {
 | |
|     hostname: (copy.domains || [])[0]
 | |
|   , server: (copy.server || '').replace('https://', '').replace(/(\/)$/, '')
 | |
|   , conf: copy.configDir
 | |
|   , config: copy.configDir
 | |
|   };
 | |
| 
 | |
|   Object.keys(copy).forEach(function (key) {
 | |
|     if ('string' === typeof copy[key]) {
 | |
|       Object.keys(tpls).sort(function (a, b) {
 | |
|         return b.length - a.length;
 | |
|       }).forEach(function (tplname) {
 | |
|         copy[key] = copy[key].replace(':' + tplname, tpls[tplname]);
 | |
|         copy[key] = copy[key].replace(homeRe, homedir + path.sep);
 | |
|       });
 | |
|     }
 | |
|   });
 | |
| 
 | |
|   //return copy;
 | |
| };
 | |
| 
 | |
| module.exports.fetchFromDisk = function (args) {
 | |
|   // TODO NO HARD-CODED DEFAULTS
 | |
|   if (!args.fullchainPath || !args.privkeyPath || !args.certPath || !args.chainPath) {
 | |
|     console.warn("missing one or more of args.privkeyPath, args.fullchainPath, args.certPath, args.chainPath");
 | |
|     console.warn("hard-coded conventional pathnames were for debugging and are not a stable part of the API");
 | |
|   }
 | |
| 
 | |
|   //, fs.readFileAsync(fullchainPath, 'ascii')
 | |
|   // note: if this ^^ gets added back in, the arrays below must change
 | |
|   return PromiseA.all([
 | |
|     fs.readFileAsync(args.privkeyPath, 'ascii')   // 0
 | |
|   , fs.readFileAsync(args.certPath, 'ascii')      // 1
 | |
|   , fs.readFileAsync(args.chainPath, 'ascii')     // 2
 | |
| 
 | |
|     // stat the file, not the link
 | |
|   , fs.statAsync(args.certPath)                   // 3
 | |
|   ]).then(function (arr) {
 | |
| 
 | |
|     return {
 | |
|       key: arr[0]                           // privkey.pem
 | |
|     , privkey: arr[0]                       // privkey.pem
 | |
| 
 | |
|     , fullchain: arr[1] + '\n' + arr[2]     // fullchain.pem
 | |
|     , cert: arr[1]                          // cert.pem
 | |
| 
 | |
|     , chain: arr[2]                         // chain.pem
 | |
|     , ca: arr[2]                            // chain.pem
 | |
| 
 | |
|     , privkeyPath: args.privkeyPath
 | |
|     , fullchainPath: args.fullchainPath
 | |
|     , certPath: args.certPath
 | |
|     , chainPath: args.chainPath
 | |
| 
 | |
|     , issuedAt: arr[3].mtime.valueOf()      // ??? TODO parse to determine expiresAt and lifetime
 | |
|     , lifetime: args.lifetime
 | |
|     };
 | |
|   }, function (err) {
 | |
|     if (args.debug) {
 | |
|       console.error(err.stack);
 | |
|     }
 | |
|     return null;
 | |
|   });
 | |
| };
 |