2015-12-15 15:21:27 +00:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
var fs = require('fs');
|
2015-12-19 19:59:50 +00:00
|
|
|
var path = require('path');
|
2015-12-15 15:21:27 +00:00
|
|
|
var PromiseA = require('bluebird');
|
|
|
|
|
2015-12-19 19:59:50 +00:00
|
|
|
var homeRe = new RegExp("^~(\\/|\\\|\\" + path.sep + ")");
|
2015-12-19 10:18:32 +00:00
|
|
|
var re = /^[a-zA-Z0-9\.\-]+$/;
|
|
|
|
var punycode = require('punycode');
|
|
|
|
|
2015-12-19 19:59:50 +00:00
|
|
|
module.exports.isValidDomain = function (domain) {
|
2015-12-19 10:18:32 +00:00
|
|
|
if (re.test(domain)) {
|
|
|
|
return domain;
|
|
|
|
}
|
|
|
|
|
|
|
|
domain = punycode.toASCII(domain);
|
|
|
|
|
|
|
|
if (re.test(domain)) {
|
|
|
|
return domain;
|
|
|
|
}
|
|
|
|
|
|
|
|
return '';
|
|
|
|
};
|
|
|
|
|
2015-12-17 08:46:40 +00:00
|
|
|
module.exports.tplConfigDir = function merge(configDir, defaults) {
|
2015-12-19 19:59:50 +00:00
|
|
|
var homedir = require('homedir')();
|
2015-12-17 08:46:40 +00:00
|
|
|
Object.keys(defaults).forEach(function (key) {
|
|
|
|
if ('string' === typeof defaults[key]) {
|
|
|
|
defaults[key] = defaults[key].replace(':config', configDir).replace(':conf', configDir);
|
2015-12-19 19:59:50 +00:00
|
|
|
defaults[key] = defaults[key].replace(homeRe, homedir + path.sep);
|
2015-12-17 08:46:40 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
};
|
2015-12-17 05:44:41 +00:00
|
|
|
|
2015-12-17 08:46:40 +00:00
|
|
|
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;
|
|
|
|
};
|
|
|
|
|
2015-12-20 00:27:48 +00:00
|
|
|
module.exports.tplCopy = function merge(copy) {
|
2015-12-19 19:59:50 +00:00
|
|
|
var homedir = require('homedir')();
|
2015-12-20 00:27:48 +00:00
|
|
|
var tpls = {
|
|
|
|
hostname: (copy.domains || [])[0]
|
|
|
|
, server: (copy.server || '').replace('https://', '').replace(/(\/)$/, '')
|
|
|
|
, conf: copy.configDir
|
|
|
|
, config: copy.configDir
|
|
|
|
};
|
|
|
|
|
2015-12-17 08:46:40 +00:00
|
|
|
Object.keys(copy).forEach(function (key) {
|
|
|
|
if ('string' === typeof copy[key]) {
|
2015-12-20 00:27:48 +00:00
|
|
|
Object.keys(tpls).sort(function (a, b) {
|
|
|
|
return b.length - a.length;
|
|
|
|
}).forEach(function (tplname) {
|
2015-12-20 10:41:17 +00:00
|
|
|
if (!tpls[tplname]) {
|
|
|
|
// what can't be templated now may be templatable later
|
|
|
|
return;
|
|
|
|
}
|
2015-12-20 00:27:48 +00:00
|
|
|
copy[key] = copy[key].replace(':' + tplname, tpls[tplname]);
|
|
|
|
copy[key] = copy[key].replace(homeRe, homedir + path.sep);
|
|
|
|
});
|
2015-12-17 08:46:40 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
//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");
|
|
|
|
}
|
2015-12-15 15:21:27 +00:00
|
|
|
|
2015-12-17 05:44:41 +00:00
|
|
|
//, fs.readFileAsync(fullchainPath, 'ascii')
|
2015-12-17 08:46:40 +00:00
|
|
|
// 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
|
|
|
|
|
2015-12-15 15:21:27 +00:00
|
|
|
// stat the file, not the link
|
2015-12-17 08:46:40 +00:00
|
|
|
, fs.statAsync(args.certPath) // 3
|
2015-12-15 15:21:27 +00:00
|
|
|
]).then(function (arr) {
|
2016-08-04 16:23:40 +00:00
|
|
|
var cert = arr[1];
|
|
|
|
var getCertInfo = require('./cert-info').getCertInfo;
|
|
|
|
|
|
|
|
// XXX Note: Parsing the certificate info comes at a great cost (~500kb)
|
|
|
|
var certInfo = getCertInfo(cert);
|
2015-12-17 08:46:40 +00:00
|
|
|
|
2015-12-15 15:21:27 +00:00
|
|
|
return {
|
2015-12-17 05:44:41 +00:00
|
|
|
key: arr[0] // privkey.pem
|
2015-12-17 08:46:40 +00:00
|
|
|
, privkey: arr[0] // privkey.pem
|
|
|
|
|
|
|
|
, fullchain: arr[1] + '\n' + arr[2] // fullchain.pem
|
2016-08-04 16:23:40 +00:00
|
|
|
, cert: cert // cert.pem
|
2015-12-17 08:46:40 +00:00
|
|
|
|
2015-12-17 05:44:41 +00:00
|
|
|
, chain: arr[2] // chain.pem
|
2015-12-17 08:46:40 +00:00
|
|
|
, ca: arr[2] // chain.pem
|
2015-12-17 05:44:41 +00:00
|
|
|
|
2015-12-17 09:05:18 +00:00
|
|
|
, privkeyPath: args.privkeyPath
|
|
|
|
, fullchainPath: args.fullchainPath
|
|
|
|
, certPath: args.certPath
|
|
|
|
, chainPath: args.chainPath
|
|
|
|
|
2016-08-04 16:23:40 +00:00
|
|
|
//, issuedAt: arr[3].mtime.valueOf()
|
|
|
|
, issuedAt: Date(certInfo.notBefore.value).valueOf() // Date.now()
|
|
|
|
, expiresAt: Date(certInfo.notAfter.value).valueOf()
|
2015-12-17 09:05:18 +00:00
|
|
|
, lifetime: args.lifetime
|
2015-12-15 15:21:27 +00:00
|
|
|
};
|
2015-12-17 08:46:40 +00:00
|
|
|
}, function (err) {
|
2015-12-17 09:17:27 +00:00
|
|
|
if (args.debug) {
|
2016-02-10 20:41:15 +00:00
|
|
|
console.error("[letsencrypt/lib/common.js] fetchFromDisk");
|
2015-12-17 08:46:40 +00:00
|
|
|
console.error(err.stack);
|
|
|
|
}
|
2015-12-15 15:21:27 +00:00
|
|
|
return null;
|
|
|
|
});
|
|
|
|
};
|