fix bug tunnel bug with --sites

This commit is contained in:
AJ ONeal 2017-02-01 20:00:00 -07:00
parent afdf0920ca
commit 929f555d73
4 changed files with 49 additions and 48 deletions

View File

@ -95,7 +95,6 @@ function createServer(port, pubdir, content, opts) {
var app = require('../lib/app.js');
var directive = { public: pubdir, content: content, livereload: opts.livereload
, servername: opts.servername
, sites: opts.sites
, expressApp: opts.expressApp };
var insecureServer;
@ -141,21 +140,21 @@ function createServer(port, pubdir, content, opts) {
var secureContexts = {
'localhost.daplie.me': null
};
opts.httpsOptions.SNICallback = function (servername, cb ) {
console.log('[https] servername', servername);
opts.httpsOptions.SNICallback = function (sni, cb ) {
console.log('[https] sni', sni);
// Static Certs
if ('localhost.daplie.me' === servername) {
if ('localhost.daplie.me' === sni) {
// TODO implement
if (!secureContexts[servername]) {
secureContexts[servername] = tls.createSecureContext(require('localhost.daplie.me-certificates').merge({}));
if (!secureContexts[sni]) {
secureContexts[sni] = tls.createSecureContext(require('localhost.daplie.me-certificates').merge({}));
}
cb(null, secureContexts[servername]);
cb(null, secureContexts[sni]);
return;
}
// Dynamic Certs
lex.httpsOptions.SNICallback(servername, cb);
lex.httpsOptions.SNICallback(sni, cb);
};
var server = https.createServer(opts.httpsOptions);
@ -277,7 +276,7 @@ function run() {
var p;
opts.PromiseA = PromiseA;
opts.httpsOptions.SNICallback = function (servername, cb) {
opts.httpsOptions.SNICallback = function (sni, cb) {
if (!secureContext) {
secureContext = tls.createSecureContext(opts.httpsOptions);
}
@ -286,11 +285,11 @@ function run() {
};
if (letsencryptHost) {
// TODO remove in v3.x (aka goldilocks)
argv.key = argv.key || '/etc/letsencrypt/live/' + letsencryptHost + '/privkey.pem';
argv.cert = argv.cert || '/etc/letsencrypt/live/' + letsencryptHost + '/fullchain.pem';
argv.root = argv.root || argv.chain || '';
argv.servername = argv.servername || letsencryptHost;
argv.sites = argv.sites || [ { name: argv.servername || letsencryptHost , path: '.' } ];
argv.sites = argv.sites || (argv.servername || letsencryptHost);
argv['serve-root'] = argv['serve-root'] || argv['serve-chain'];
// argv[express-app]
}
@ -341,18 +340,17 @@ function run() {
}
opts.servername = defaultServername;
opts.sites = [ { name: defaultServername , path: '.' } ];
if (argv.servername) {
opts.servername = argv.servername;
if (!argv.sites) {
// TODO remove in v3.x (aka goldilocks)
if (argv.sites) {
throw new Error('specify only --sites, not --servername');
}
opts.sites = [ { name: argv.servername, path: '.' } ];
}
}
if (argv.sites) {
opts.sites = argv.sites.split(',').map(function (servername) {
var serverparts = servername.split('|');
opts.sites = argv.sites.split(',').map(function (name) {
var serverparts = name.split('|');
// TODO allow reverse proxy
return {
name: serverparts.shift()
@ -360,6 +358,8 @@ function run() {
};
});
}
// TODO use arrays in all things
opts._old_server_name = opts.sites[0].name;
if (argv.p || argv.port || argv._[0]) {
opts.manualPort = true;
@ -380,7 +380,7 @@ function run() {
opts.expressApp = require(path.resolve(process.cwd(), argv['express-app']));
}
if (opts.email || opts.servername) {
if (opts.email || argv.sites || argv.servername) {
if (!opts.agreeTos) {
console.warn("You may need to specify --agree-tos to agree to both the Let's Encrypt and Daplie DNS terms of service.");
}
@ -423,7 +423,7 @@ function run() {
console.info('');
// Port
httpsUrl = 'https://' + opts.servername;
httpsUrl = 'https://' + opts._old_server_name;
p = opts.port;
if (httpsPort !== p) {
httpsUrl += ':' + p;
@ -431,7 +431,7 @@ function run() {
console.info('\t' + httpsUrl);
// Insecure Port
httpUrl = 'http://' + opts.servername;
httpUrl = 'http://' + opts._old_server_name;
p = opts.insecurePort;
if (httpPort !== p) {
httpUrl += ':' + p;
@ -439,16 +439,16 @@ function run() {
console.info('\t' + httpUrl + ' (redirecting to https)');
console.info('');
if (!(argv.servername && defaultServername !== argv.servername && !(argv.key && argv.cert))) {
if (!((argv.sites || argv.servername) && defaultServername !== (argv.sites || argv.servername) && !(argv.key && argv.cert))) {
// ifaces
opts.ifaces = require('../lib/local-ip.js').find();
promise = PromiseA.resolve();
} else {
console.info("Attempting to resolve external connection for '" + argv.servername + "'");
console.info("Attempting to resolve external connection for '" + opts._old_server_name + "'");
try {
promise = require('../lib/match-ips.js').match(argv.servername, opts);
promise = require('../lib/match-ips.js').match(opts._old_server_name, opts);
} catch(e) {
console.warn("Upgrade to version 2.x to use automatic certificate issuance for '" + argv.servername + "'");
console.warn("Upgrade to version 2.x to use automatic certificate issuance for '" + opts._old_server_name + "'");
promise = PromiseA.resolve();
}
}
@ -456,7 +456,7 @@ function run() {
return promise.then(function (matchingIps) {
if (matchingIps) {
if (!matchingIps.length) {
console.info("Neither the attached nor external interfaces match '" + argv.servername + "'");
console.info("Neither the attached nor external interfaces match '" + opts._old_server_name + "'");
}
}
opts.matchingIps = matchingIps || [];

View File

@ -11,7 +11,6 @@ module.exports = function (opts) {
var server;
function addServer(hostname) {
console.log('add server:', hostname);
if (hostsMap[hostname]) {
return hostsMap[hostname];
@ -24,8 +23,6 @@ module.exports = function (opts) {
return;
}
console.log('add server for reals', tmp);
site.path = site.path || site.paths[0] || '.';
if (!pathsMap[site.path]) {
@ -67,8 +64,6 @@ module.exports = function (opts) {
}
opts.servername = opts.servername || opts.sites[0].name;
addServer(opts.sites[0].name);
return function (req, res) {
@ -79,7 +74,7 @@ module.exports = function (opts) {
}
var done = finalhandler(req, res);
var host = req.headers.host;
var hostname = (host||'').split(':')[0] || opts.servername;
var hostname = (host||'').split(':')[0] || opts.sites[0].name;
function serveStatic(server) {
if (server.expressApp) {
@ -95,7 +90,7 @@ module.exports = function (opts) {
if (opts.livereload) {
res.__my_livereload = '<script src="//'
+ (host || opts.servername).split(':')[0]
+ (host || opts.sites[0].name).split(':')[0]
+ ':35729/livereload.js?snipver=1"></script>';
res.__my_addLen = res.__my_livereload.length;

View File

@ -5,10 +5,10 @@ module.exports.create = function (opts/*, servers*/) {
var dns = PromiseA.promisifyAll(require('dns'));
return PromiseA.all([
dns.resolve4Async(opts.servername).then(function (results) {
dns.resolve4Async(opts._old_server_name).then(function (results) {
return results;
}, function () {})
, dns.resolve6Async(opts.servername).then(function (results) {
, dns.resolve6Async(opts._old_server_name).then(function (results) {
return results;
}, function () {})
]).then(function (results) {
@ -73,14 +73,14 @@ module.exports.create = function (opts/*, servers*/) {
if (require.main === module) {
var opts = {
servername: 'aj.daplie.me'
_old_server_name: 'aj.daplie.me'
, PromiseA: require('bluebird')
};
// ifaces
opts.ifaces = require('./local-ip.js').find();
console.log('opts.ifaces');
console.log(opts.ifaces);
require('./match-ips.js').match(opts.servername, opts).then(function (ips) {
require('./match-ips.js').match(opts._old_server_name, opts).then(function (ips) {
opts.matchingIps = ips.matchingIps || [];
opts.externalIps = ips.externalIps;
module.exports.create(opts);

View File

@ -63,25 +63,31 @@ module.exports.create = function (opts, servers) {
return Tunnel.token({
refreshToken: opts.refreshToken
, email: opts.email
, domains: [ opts.servername ]
, domains: opts.sites.map(function (site) {
return site.name;
})
, device: { hostname: opts.devicename || opts.device }
}).then(function (result) {
// { jwt, tunnelUrl }
var locals = [];
opts.sites.map(function (site) {
locals.push({
protocol: 'https'
, hostname: site.name
, port: opts.port
});
locals.push({
protocol: 'http'
, hostname: site.name
, port: opts.insecurePort || opts.port
});
});
return stunnel.connect({
token: result.jwt
, stunneld: result.tunnelUrl
// XXX TODO BUG // this is just for testing
, insecure: /*opts.insecure*/ true
, locals: [
{ protocol: 'https'
, hostname: opts.servername
, port: opts.port
}
, { protocol: 'http'
, hostname: opts.servername
, port: opts.insecurePort || opts.port
}
]
, locals: locals
// a simple passthru is proving to not be so simple
, net: require('net') /*
{