diff --git a/.gitmodules b/.gitmodules index 75adf64..e69de29 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +0,0 @@ -[submodule "packages/assets/org.oauth3"] - path = packages/assets/org.oauth3 - url = git@git.daplie.com:OAuth3/oauth3.js.git diff --git a/bin/goldilocks.js b/bin/goldilocks.js index 70526cd..0896544 100755 --- a/bin/goldilocks.js +++ b/bin/goldilocks.js @@ -137,6 +137,8 @@ function readConfigAndRun(args) { config.addresses = addresses; config.device = { hostname: 'daplien-pod' }; + config.tunnel = args.tunnel || config.tunnel; + var PromiseA = require('bluebird'); var tcpProm, dnsProm; diff --git a/etc/goldilocks/goldilocks.example.yml b/etc/goldilocks/goldilocks.example.yml index c593118..fa0ff12 100644 --- a/etc/goldilocks/goldilocks.example.yml +++ b/etc/goldilocks/goldilocks.example.yml @@ -69,7 +69,7 @@ http: - name: proxy domains: - localhost.daplie.me - host: locahost + host: localhost port: 4000 - name: static domains: diff --git a/lib/app.js b/lib/app.js index caf4289..6eb72f2 100644 --- a/lib/app.js +++ b/lib/app.js @@ -15,7 +15,6 @@ module.exports = function (myDeps, conf, overrideHttp) { //var server; var serveInit; var app; - var tun; var request; /* @@ -43,7 +42,6 @@ module.exports = function (myDeps, conf, overrideHttp) { function createServeInit() { var PromiseA = require('bluebird'); - var stunnel = require('stunnel'); var OAUTH3 = require('../packages/assets/org.oauth3'); require('../packages/assets/org.oauth3/oauth3.domains.js'); require('../packages/assets/org.oauth3/oauth3.dns.js'); @@ -96,7 +94,13 @@ module.exports = function (myDeps, conf, overrideHttp) { obj.id = id; owners[id] = obj; - return fs.writeFileAsync(ownersPath, JSON.stringify(owners), 'utf8'); + return fs.mkdirAsync(path.dirname(ownersPath)).catch(function (err) { + if (err.code !== 'EEXIST') { + console.error('failed to mkdir', path.dirname(ownersPath), err.toString()); + } + }).then(function () { + return fs.writeFileAsync(ownersPath, JSON.stringify(owners), 'utf8'); + }); } }; @@ -143,8 +147,7 @@ module.exports = function (myDeps, conf, overrideHttp) { providerUri: providerUri , session: session }); - //var crypto = require('crypto'); - //var id = crypto.createHash('sha256').update(session.token.sub).digest('hex'); + return oauth3.setProvider(providerUri).then(function () { /* return oauth3.api('domains.list').then(function (domains) { @@ -173,55 +176,13 @@ module.exports = function (myDeps, conf, overrideHttp) { } }).then(function (result) { console.log('got a token from the tunnel server?'); - console.log(result); - if (!result.tunnelUrl) { - result.tunnelUrl = ('wss://' + (new Buffer(result.jwt.split('.')[1], 'base64').toString('ascii')).aud + '/'); - } - var services = { https: { '*': 443 }, http: { '*': 80 }, smtp: { '*': 25}, smtps: { '*': 587 /*also 465/starttls*/ } /*, ssh: { '*': 22 }*/ }; - /* - console.log('blah'); - console.log(result.jwt); - console.log(result.tunnelUrl); - console.log(services); - console.log('deps.tunnel'); - console.log(deps.tunnel); - console.log('deps.tunnel.net'); - console.log(deps.tunnel.net.toString()); - console.log('deps.net'); - console.log(deps.net); - */ - var opts3 = { - token: result.jwt - , stunneld: result.tunnelUrl - // we'll provide faux networking and pipe as we please - , services: services - , net: myDeps.tunnel.net - }; - - console.log('blah 2'); - if (tun) { - console.log('balh 3'); - if (tun.append) { - tun.append(result.jwt); - } - else if (tun.end) { - tun.end(); - tun = null; - } - } - - console.log('might have tunnel?'); - if (!tun) { - console.log('connecting to the tunnel'); - tun = stunnel.connect(opts3); - conf.tun = true; - } + result.owner = session.id; + return deps.tunneler.add(result); }); /* }); */ }); - //, { token: token, refresh: refresh }); } }; diff --git a/lib/goldilocks.js b/lib/goldilocks.js index ae6c552..9164d44 100644 --- a/lib/goldilocks.js +++ b/lib/goldilocks.js @@ -68,7 +68,13 @@ module.exports.create = function (deps, config) { return; } + function onError(err) { + console.error('[error] socket errored peeking -', err); + conn.destroy(); + } + conn.once('error', onError); conn.once('data', function (chunk) { + conn.removeListener('error', onError); peek(conn, chunk, opts); }); } @@ -184,6 +190,7 @@ module.exports.create = function (deps, config) { return writer; } }; + deps.tunneler = require('./tunnel-manager').create(deps, config); var listenPromises = []; var tcpPortMap = {}; diff --git a/lib/mdns.js b/lib/mdns.js index cc08ccd..7da687a 100644 --- a/lib/mdns.js +++ b/lib/mdns.js @@ -2,7 +2,8 @@ var PromiseA = require('bluebird'); var fs = PromiseA.promisifyAll(require('fs')); -var idFilename = require('path').join(__dirname, '..', 'var', 'mdns-id'); +var path = require('path'); +var idFilename = path.join(__dirname, '..', 'var', 'mdns-id'); var queryName = '_cloud._tcp.local'; var randomId = { @@ -18,10 +19,15 @@ var randomId = { } , set: function (value) { - return fs.writeFileAsync(idFilename, value) - .then(function () { + return fs.mkdirAsync(path.dirname(idFilename)).catch(function (err) { + if (err.code !== 'EEXIST') { + console.error('failed to mkdir', path.dirname(idFilename), err.toString()); + } + }).then(function () { + return fs.writeFileAsync(idFilename, value).then(function () { return value; }); + }); } }; @@ -104,6 +110,7 @@ function createResponse(name, packet, ttl) { module.exports.start = function (deps, config) { var socket = require('dgram').createSocket({ type: 'udp4', reuseAddr: true }); var dns = require('dns-suite'); + var nextBroadcast = -1; socket.on('message', function (message, rinfo) { // console.log('Received %d bytes from %s:%d', message.length, rinfo.address, rinfo.port); @@ -130,7 +137,13 @@ module.exports.start = function (deps, config) { randomId.get().then(function (name) { var resp = createResponse(name, packet, config.mdns.ttl); - socket.send(resp, config.mdns.port, config.mdns.broadcast); + var now = Date.now(); + if (now > nextBroadcast) { + socket.send(resp, config.mdns.port, config.mdns.broadcast); + nextBroadcast = now + config.mdns.ttl * 1000; + } else { + socket.send(resp, rinfo.port, rinfo.address); + } }); }); diff --git a/lib/modules/admin.js b/lib/modules/admin.js index 691fc4f..d22b168 100644 --- a/lib/modules/admin.js +++ b/lib/modules/admin.js @@ -1,3 +1,12 @@ +var adminDomains = [ + 'localhost.alpha.daplie.me' +, 'localhost.admin.daplie.me' +, 'alpha.localhost.daplie.me' +, 'admin.localhost.daplie.me' +, 'localhost.daplie.invalid' +]; +module.exports.adminDomains = adminDomains; + module.exports.create = function (deps, conf) { 'use strict'; @@ -43,20 +52,14 @@ module.exports.create = function (deps, conf) { */ ] }; - opts.sites.push({ - // greenlock: {} - $id: 'localhost.alpha.daplie.me' - , paths: [ - { $id: '/', modules: [ { $id: 'serve', paths: [ path.resolve(__dirname, '..', '..', 'admin', 'public') ] } ] } - , { $id: '/api/', modules: [ { $id: 'app', path: path.join(__dirname, 'admin') } ] } - ] - }); - opts.sites.push({ - $id: 'localhost.daplie.invalid' - , paths: [ - { $id: '/', modules: [ { $id: 'serve', paths: [ path.resolve(__dirname, '..', '..', 'admin', 'public') ] } ] } - , { $id: '/api/', modules: [ { $id: 'app', path: path.join(__dirname, 'admin') } ] } - ] + adminDomains.forEach(function (id) { + opts.sites.push({ + $id: id + , paths: [ + { $id: '/', modules: [ { $id: 'serve', paths: [ path.resolve(__dirname, '..', '..', 'admin', 'public') ] } ] } + , { $id: '/api/', modules: [ { $id: 'app', path: path.join(__dirname, 'admin') } ] } + ] + }); }); var app = require('../app.js')(deps, conf, opts); diff --git a/lib/modules/http.js b/lib/modules/http.js index 6d78a58..279d556 100644 --- a/lib/modules/http.js +++ b/lib/modules/http.js @@ -6,13 +6,6 @@ module.exports.create = function (deps, conf, greenlockMiddleware) { var domainMatches = require('../domain-utils').match; var separatePort = require('../domain-utils').separatePort; - var adminDomains = [ - /\blocalhost\.admin\./ - , /\blocalhost\.alpha\./ - , /\badmin\.localhost\./ - , /\balpha\.localhost\./ - ]; - function parseHeaders(conn, opts) { // There should already be a `firstChunk` on the opts, but because we might sometimes // need more than that to get all the headers it's easier to always read the data off @@ -51,7 +44,7 @@ module.exports.create = function (deps, conf, greenlockMiddleware) { var result = {}; lines.slice(1).forEach(function (line) { - var match = /(.*)\s*:\s*(.*)/.exec(line); + var match = /([^:]*?)\s*:\s*(.*)/.exec(line); if (match) { result[match[1].toLowerCase()] = match[2]; } else { @@ -186,8 +179,9 @@ module.exports.create = function (deps, conf, greenlockMiddleware) { var adminServer; function checkAdmin(conn, opts, headers) { - var admin = adminDomains.some(function (re) { - return re.test(headers.host); + var host = separatePort(headers.host).host; + var admin = require('./admin').adminDomains.some(function (domain) { + return host === domain; }); if (admin) { @@ -199,7 +193,50 @@ module.exports.create = function (deps, conf, greenlockMiddleware) { return false; } - function checkProxy(mod, conn, opts, headers) { + var proxyServer; + function createProxyServer() { + var http = require('http'); + var agent = new http.Agent(); + agent.createConnection = deps.net.createConnection; + + var proxy = require('http-proxy').createProxyServer({ + agent: agent, + toProxy: true + }); + + proxyServer = http.createServer(function (req, res) { + proxy.web(req, res, req.connection.proxyOpts); + }); + proxyServer.on('upgrade', function (req, socket, head) { + proxy.ws(req, socket, head, socket.proxyOpts); + }); + } + function proxyRequest(mod, conn, opts, headers) { + if (!proxyServer) { + createProxyServer(); + } + + var xHeaders = {}; + // Then add our own `X-Forwarded` headers at the end. + if (conf.http.trustProxy && headers['x-forwarded-proto']) { + xHeaders['X-Forwarded-Proto'] = headers['x-forwarded-proto']; + } else { + xHeaders['X-Forwarded-Proto'] = conn.encrypted ? 'https' : 'http'; + } + var proxyChain = (headers['x-forwarded-for'] || '').split(/ *, */).filter(Boolean); + proxyChain.push(opts.remoteAddress || opts.address || conn.remoteAddress); + xHeaders['X-Forwarded-For'] = proxyChain.join(', '); + xHeaders['X-Forwarded-Host'] = headers.host; + + conn.proxyOpts = { + target: 'http://'+(mod.address || (mod.host || 'localhost')+':'+mod.port), + headers: xHeaders + }; + proxyServer.emit('connection', conn); + conn.unshift(opts.firstChunk); + } + + function proxyWebsocket(mod, conn, opts, headers) { var index = opts.firstChunk.indexOf('\r\n\r\n'); var body = opts.firstChunk.slice(index); @@ -213,7 +250,7 @@ module.exports.create = function (deps, conf, greenlockMiddleware) { if (conf.http.trustProxy && headers['x-forwarded-proto']) { headLines.push('X-Forwarded-Proto: ' + headers['x-forwarded-proto']); } else { - headLines.push('X-Forwarded-Proto: ' + conn.encrypted ? 'https' : 'http'); + headLines.push('X-Forwarded-Proto: ' + (conn.encrypted ? 'https' : 'http')); } var proxyChain = (headers['x-forwarded-for'] || '').split(/ *, */).filter(Boolean); proxyChain.push(opts.remoteAddress || opts.address || conn.remoteAddress); @@ -235,6 +272,14 @@ module.exports.create = function (deps, conf, greenlockMiddleware) { newConnOpts.remotePort = opts.port || conn.remotePort; deps.proxy(conn, newConnOpts, opts.firstChunk); + } + + function checkProxy(mod, conn, opts, headers) { + if ((headers.connection || '').toLowerCase() === 'upgrade') { + proxyWebsocket(mod, conn, opts, headers); + } else { + proxyRequest(mod, conn, opts, headers); + } return true; } diff --git a/lib/modules/tls.js b/lib/modules/tls.js index a18ab2d..f0c4434 100644 --- a/lib/modules/tls.js +++ b/lib/modules/tls.js @@ -36,40 +36,17 @@ module.exports.create = function (deps, config, netHandler) { , 'localPort' ]; function wrapSocket(socket, opts) { - var reader = require('socket-pair').create(function (err, writer) { - if (err) { - reader.emit('error', err); - return; - } - + if (!opts.hyperPeek) { process.nextTick(function () { socket.unshift(opts.firstChunk); }); + } - socket.pipe(writer); - writer.pipe(socket); - - socket.on('error', function (err) { - console.log('wrapped TLS socket error', err); - reader.emit('error', err); - }); - writer.on('error', function (err) { - console.error('socket-pair writer error', err); - // If the writer had an error the reader probably did too, and I don't think we'll - // get much out of emitting this on the original socket, so logging is enough. - }); - }); - - // We can't set these properties the normal way because there is a getter without a setter, - // but we can use defineProperty. We reuse the descriptor even though we will be manipulating - // it because we will only ever set the value and we set it every time. - var descriptor = {enumerable: true, configurable: true, writable: true}; + var wrapped = require('tunnel-packer').wrapSocket(socket); addressNames.forEach(function (name) { - descriptor.value = opts[name] || extractSocketProp(socket, name); - Object.defineProperty(reader, name, descriptor); + wrapped[name] = opts[name] || wrapped[name]; }); - - return reader; + return wrapped; } var le = greenlock.create({ @@ -206,7 +183,7 @@ module.exports.create = function (deps, config, netHandler) { }; var terminateServer = tls.createServer(terminatorOpts, function (socket) { - console.log('(pre-terminated) tls connection, addr:', socket.remoteAddress); + console.log('(post-terminated) tls connection, addr:', extractSocketProp(socket, 'remoteAddress')); netHandler(socket, { servername: socket.servername @@ -217,6 +194,9 @@ module.exports.create = function (deps, config, netHandler) { , remoteFamily: extractSocketProp(socket, 'remoteFamily') }); }); + terminateServer.on('error', function (err) { + console.log('[error] TLS termination server', err); + }); function proxy(socket, opts, mod) { var newConnOpts = require('../domain-utils').separatePort(mod.address || ''); diff --git a/lib/proxy-conn.js b/lib/proxy-conn.js index b9a704c..625a864 100644 --- a/lib/proxy-conn.js +++ b/lib/proxy-conn.js @@ -34,6 +34,7 @@ module.exports.sendBadGateway = sendBadGateway; module.exports.create = function (deps, config) { return function proxy(conn, newConnOpts, firstChunk, decrypt) { var connected = false; + newConnOpts.allowHalfOpen = true; var newConn = deps.net.createConnection(newConnOpts, function () { connected = true; diff --git a/lib/servers.js b/lib/servers.js index e7f4d1f..c4000a5 100644 --- a/lib/servers.js +++ b/lib/servers.js @@ -29,7 +29,7 @@ module.exports.addTcpListener = function (port, handler) { var enableDestroy = require('server-destroy'); var net = require('net'); var resolved; - var server = net.createServer(); + var server = net.createServer({allowHalfOpen: true}); stat = serversMap[port] = { server: server diff --git a/lib/tunnel-manager.js b/lib/tunnel-manager.js new file mode 100644 index 0000000..1b099a4 --- /dev/null +++ b/lib/tunnel-manager.js @@ -0,0 +1,161 @@ +'use strict'; + +module.exports.create = function (deps, config) { + var PromiseA = require('bluebird'); + var fs = PromiseA.promisifyAll(require('fs')); + var stunnel = require('stunnel'); + var activeTunnels = {}; + + var path = require('path'); + var tokensPath = path.join(__dirname, '..', 'var', 'tokens.json'); + var storage = { + _read: function () { + var tokens; + try { + tokens = require(tokensPath); + } catch (err) { + tokens = {}; + } + return tokens; + } + , _write: function (tokens) { + return fs.mkdirAsync(path.dirname(tokensPath)).catch(function (err) { + if (err.code !== 'EEXIST') { + console.error('failed to mkdir', path.dirname(tokensPath), err.toString()); + } + }).then(function () { + return fs.writeFileAsync(tokensPath, JSON.stringify(tokens), 'utf8'); + }); + } + + , all: function () { + var tokens = storage._read(); + return PromiseA.resolve(Object.keys(tokens).map(function (key) { + return tokens[key]; + })); + } + , save: function (result) { + var tokens = storage._read(); + tokens[result.jwt] = result; + storage._write(tokens); + } + , del: function (id) { + var tokens = storage._read(); + delete tokens[id]; + storage._write(tokens); + } + }; + + function addToken(data) { + if (!data.tunnelUrl) { + var decoded; + try { + decoded = JSON.parse(new Buffer(data.jwt.split('.')[1], 'base64').toString('ascii')); + } catch (err) { + console.warn('invalid web token given to tunnel manager', err); + return PromiseA.reject(err); + } + if (!decoded.aud) { + console.warn('tunnel manager given token with no tunnelUrl or audience'); + var err = new Error('missing tunnelUrl and audience'); + return PromiseA.reject(err); + } + data.tunnelUrl = 'wss://' + decoded.aud + '/'; + } + + if (!activeTunnels[data.tunnelUrl]) { + console.log('creating new tunnel client for', data.tunnelUrl); + // We create the tunnel without an initial token so we can append the token and + // get the promise that should tell us more about if it worked or not. + activeTunnels[data.tunnelUrl] = stunnel.connect({ + stunneld: data.tunnelUrl + , net: deps.tunnel.net + // NOTE: the ports here aren't that important since we are providing a custom + // `net.createConnection` that doesn't actually use the port. What is important + // is that any services we are interested in are listed in this object and have + // a '*' sub-property. + , services: { + https: { '*': 443 } + , http: { '*': 80 } + , smtp: { '*': 25 } + , smtps: { '*': 587 /*also 465/starttls*/ } + , ssh: { '*': 22 } + } + }); + } + + console.log('appending token to tunnel at', data.tunnelUrl); + return activeTunnels[data.tunnelUrl].append(data.jwt); + } + + function removeToken(data) { + if (!data.tunnelUrl) { + var decoded; + try { + decoded = JSON.parse(new Buffer(data.jwt.split('.')[1], 'base64').toString('ascii')); + } catch (err) { + console.warn('invalid web token given to tunnel manager', err); + return PromiseA.reject(err); + } + if (!decoded.aud) { + console.warn('tunnel manager given token with no tunnelUrl or audience'); + var err = new Error('missing tunnelUrl and audience'); + return PromiseA.reject(err); + } + data.tunnelUrl = 'wss://' + decoded.aud + '/'; + } + + // Not sure if we actually want to return an error that the token didn't even belong to a + // server that existed, but since it never existed we can consider it as "removed". + if (!activeTunnels[data.tunnelUrl]) { + return PromiseA.resolve(); + } + + console.log('removing token from tunnel at', data.tunnelUrl); + return activeTunnels[data.tunnelUrl].clear(data.jwt); + } + + if (typeof config.tunnel === 'string') { + config.tunnel.split(',').forEach(function (jwt) { + addToken({ jwt: jwt, owner: 'config' }); + }); + } + storage.all().then(function (stored) { + stored.forEach(function (result) { + addToken(result); + }); + }); + + return { + add: function (data) { + return addToken(data).then(function () { + return storage.save(data); + }); + } + , remove: function (data) { + return storage.del(data.jwt).then(function () { + return removeToken(data); + }); + } + , get: function (owner) { + return storage.all().then(function (tokens) { + var result = {}; + tokens.forEach(function (data) { + if (!result[data.owner]) { + result[data.owner] = {}; + } + if (!result[data.owner][data.tunnelUrl]) { + result[data.owner][data.tunnelUrl] = []; + } + data.decoded = JSON.parse(new Buffer(data.jwt.split('.')[0], 'base64')); + result[data.owner][data.tunnelUrl].push(data); + }); + + if (owner) { + return result[owner] || {}; + } + return result; + }); + } + }; +}; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..f0f9b68 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1234 @@ +{ + "name": "goldilocks", + "version": "1.0.0-placeholder", + "lockfileVersion": 1, + "dependencies": { + "accepts": { + "version": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=" + }, + "ajv": { + "version": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=" + }, + "ansi-regex": { + "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "argparse": { + "version": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=" + }, + "array-find-index": { + "version": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + }, + "array-flatten": { + "version": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "asn1": { + "version": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, + "asn1js": { + "version": "https://registry.npmjs.org/asn1js/-/asn1js-1.2.12.tgz", + "integrity": "sha1-h9XueXWWri0qPLAkciDcQv/D8hE=" + }, + "assert-plus": { + "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" + }, + "asynckit": { + "version": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "authenticator": { + "version": "https://registry.npmjs.org/authenticator/-/authenticator-1.1.2.tgz", + "integrity": "sha1-zkVq2pE6S7oJ5HlvSRNBS81u40w=", + "dependencies": { + "authenticator-cli": { + "version": "https://registry.npmjs.org/authenticator-cli/-/authenticator-cli-1.0.2.tgz", + "integrity": "sha1-xtM3PkfSdcjbFAVkWdRIq/HrOt0=" + }, + "qrcode-terminal": { + "version": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.10.0.tgz", + "integrity": "sha1-p2pI4mEKGPl/o6K9UytoKs/4bFM=" + } + } + }, + "aws-sign2": { + "version": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" + }, + "aws4": { + "version": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" + }, + "balanced-match": { + "version": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" + }, + "base64url": { + "version": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz", + "integrity": "sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs=" + }, + "batch": { + "version": "https://registry.npmjs.org/batch/-/batch-0.5.3.tgz", + "integrity": "sha1-PzQU84AyF0O/wQQvmoP/HVgk1GQ=" + }, + "bcrypt-pbkdf": { + "version": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true + }, + "bindings": { + "version": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", + "integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=", + "optional": true + }, + "bluebird": { + "version": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", + "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" + }, + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + }, + "body-parser": { + "version": "git+https://github.com/expressjs/body-parser.git#7b630f701d084267a8b9883b27f627014e003d47" + }, + "boom": { + "version": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=" + }, + "brace-expansion": { + "version": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", + "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=" + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "buffer-equal-constant-time": { + "version": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "buffer-shims": { + "version": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" + }, + "buffer-v6-polyfill": { + "version": "https://registry.npmjs.org/buffer-v6-polyfill/-/buffer-v6-polyfill-1.0.3.tgz", + "integrity": "sha1-vGlcbxnQCmPoMzjDbNaPP13Lo+g=" + }, + "builtin-modules": { + "version": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" + }, + "bytes": { + "version": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", + "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=" + }, + "camelcase": { + "version": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + }, + "camelcase-keys": { + "version": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=" + }, + "capture-stack-trace": { + "version": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" + }, + "caseless": { + "version": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "certpem": { + "version": "https://registry.npmjs.org/certpem/-/certpem-1.0.1.tgz", + "integrity": "sha1-+koljEBXllxGVwCCL7jYB9fy2fU=" + }, + "cli": { + "version": "https://registry.npmjs.org/cli/-/cli-0.11.3.tgz", + "integrity": "sha1-ewzT3pkORSklZnwNuv/cn38qmhU=" + }, + "cluster-rpc": { + "version": "git+https://git.daplie.com/Daplie/cluster-rpc.git#78a9863de385284f8ef6a8b6c4eed70c499f74fc" + }, + "cluster-store": { + "version": "https://registry.npmjs.org/cluster-store/-/cluster-store-2.0.6.tgz", + "integrity": "sha1-yAM+31VnyppTn6iorMp48DFaVy0=" + }, + "co": { + "version": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "colors": { + "version": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" + }, + "combined-stream": { + "version": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=" + }, + "commander": { + "version": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=" + }, + "concat-map": { + "version": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "content-disposition": { + "version": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "content-type": { + "version": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz", + "integrity": "sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0=" + }, + "cookie": { + "version": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-signature": { + "version": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "core-util-is": { + "version": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "country-data": { + "version": "https://registry.npmjs.org/country-data/-/country-data-0.0.24.tgz", + "integrity": "sha1-4SRm/Qo/FLG4gQNxH7XzCINXmfg=" + }, + "create-error-class": { + "version": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=" + }, + "cryptiles": { + "version": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=" + }, + "currency-symbol-map": { + "version": "https://registry.npmjs.org/currency-symbol-map/-/currency-symbol-map-2.2.0.tgz", + "integrity": "sha1-KzwYcv8aws5ZXYJz5Y4f/wJyrqI=" + }, + "currently-unhandled": { + "version": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=" + }, + "daplie-dns": { + "version": "git+https://git.daplie.com/Daplie/daplie-cli-dns.git#a2397f6fb91a4a79334163275237b8990f5b21ea" + }, + "daplie-domains": { + "version": "git+https://git.daplie.com/Daplie/daplie-cli-domains.git#9333ed9b167e6f9ed712dbe3c6ed977dc13ed36c" + }, + "dashdash": { + "version": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dependencies": { + "assert-plus": { + "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "ddns-cli": { + "version": "git+https://git.daplie.com/Daplie/node-ddns-client.git#485a7fe66bdd9c6537798979fda7f1e3653ba97b", + "dependencies": { + "got": { + "version": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", + "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=" + }, + "ipify": { + "version": "https://registry.npmjs.org/ipify/-/ipify-1.1.0.tgz", + "integrity": "sha1-66PK6hfngPqNryOropWD5/3cteQ=" + }, + "timed-out": { + "version": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", + "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=" + }, + "unzip-response": { + "version": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", + "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=" + } + } + }, + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.6.1.tgz", + "integrity": "sha1-eYVQkLosTjEVzH2HaUkdWPBJE1E=" + }, + "decamelize": { + "version": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "delayed-stream": { + "version": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "depd": { + "version": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", + "integrity": "sha1-4b2Cxqq2ztlluXuIsX7T5SjKGMM=" + }, + "destroy": { + "version": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "dns-suite": { + "version": "git+https://git@git.daplie.com/Daplie/dns-suite#a295f9c3e70dc71304305a5e1264ea4c2d36b31e" + }, + "duplexer2": { + "version": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=" + }, + "ecc-jsbn": { + "version": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true + }, + "ecdsa-sig-formatter": { + "version": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz", + "integrity": "sha1-S8kmJ07Dtau1AW5+HWCSGsJisqE=" + }, + "ee-first": { + "version": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "elliptic": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=" + }, + "encodeurl": { + "version": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" + }, + "error-ex": { + "version": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=" + }, + "escape-html": { + "version": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "esprima": { + "version": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" + }, + "etag": { + "version": "https://registry.npmjs.org/etag/-/etag-1.8.0.tgz", + "integrity": "sha1-b2Ma7zNtbEY2K1F2QETOIWvjwFE=" + }, + "eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=" + }, + "exit": { + "version": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" + }, + "express": { + "version": "git+https://github.com/expressjs/express.git#d43b074f0b3b56a91f240e62798c932ba104b79a", + "dependencies": { + "finalhandler": { + "version": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.3.tgz", + "integrity": "sha1-70fneVDpmXgOhgIqVg4yF+DQzIk=", + "dependencies": { + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", + "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=" + } + } + }, + "ms": { + "version": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "qs": { + "version": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" + }, + "serve-static": { + "version": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.1.tgz", + "integrity": "sha1-dEOpZePO1kes61Y5+ga/TRu+ADk=" + }, + "setprototypeof": { + "version": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + } + } + }, + "extend": { + "version": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + }, + "extsprintf": { + "version": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" + }, + "finalhandler": { + "version": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz", + "integrity": "sha1-haF8bFmpRxfSYtYSMNSw6+PUoU0=", + "dependencies": { + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=" + }, + "ms": { + "version": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "find-up": { + "version": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=" + }, + "forever-agent": { + "version": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=" + }, + "forwarded": { + "version": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", + "integrity": "sha1-Ge+YdMSuHCl7zweP3mOgm2aoQ2M=" + }, + "fresh": { + "version": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz", + "integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44=" + }, + "fs.realpath": { + "version": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "get-stdin": { + "version": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + }, + "getpass": { + "version": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dependencies": { + "assert-plus": { + "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "glob": { + "version": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=" + }, + "got": { + "version": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", + "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=" + }, + "graceful-fs": { + "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "graceful-readlink": { + "version": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + }, + "greenlock": { + "version": "git+https://git.daplie.com/Daplie/node-greenlock.git#d985dd371aece59cdfe374963bd9919bffc1bc5b" + }, + "har-schema": { + "version": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" + }, + "har-validator": { + "version": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=" + }, + "hash.js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.0.3.tgz", + "integrity": "sha1-EzL/ABVsCg/92CNgE9B7d6BFFXM=" + }, + "hawk": { + "version": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=" + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=" + }, + "hoek": { + "version": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + }, + "homedir": { + "version": "https://registry.npmjs.org/homedir/-/homedir-0.6.0.tgz", + "integrity": "sha1-KyHbZr8Ipts4JJo+/1LX0YcGrx4=" + }, + "hosted-git-info": { + "version": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.4.2.tgz", + "integrity": "sha1-AHa59GonBQbduq6lZJaJdGBhKmc=" + }, + "http-errors": { + "version": "https://registry.npmjs.org/http-errors/-/http-errors-1.5.1.tgz", + "integrity": "sha1-eIwNLB3iyBuebowBhDtrl+uSB1A=" + }, + "http-proxy": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", + "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=" + }, + "http-signature": { + "version": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=" + }, + "human-readable-ids": { + "version": "https://registry.npmjs.org/human-readable-ids/-/human-readable-ids-1.0.1.tgz", + "integrity": "sha1-D0ux2Qxn/vgQrgsFTPkq4J5eLYA=" + }, + "iconv-lite": { + "version": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", + "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=" + }, + "indent-string": { + "version": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=" + }, + "inflight": { + "version": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=" + }, + "inherits": { + "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ipaddr.js": { + "version": "git+https://github.com/whitequark/ipaddr.js.git#9c557556e495a2c60a3c656e4f9f8b3a1e14dedc" + }, + "ipify": { + "version": "https://registry.npmjs.org/ipify/-/ipify-1.1.0.tgz", + "integrity": "sha1-66PK6hfngPqNryOropWD5/3cteQ=" + }, + "is": { + "version": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", + "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=" + }, + "is-arrayish": { + "version": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-builtin-module": { + "version": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=" + }, + "is-finite": { + "version": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=" + }, + "is-redirect": { + "version": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" + }, + "is-retry-allowed": { + "version": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" + }, + "is-stream": { + "version": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-typedarray": { + "version": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-utf8": { + "version": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "isarray": { + "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isemail": { + "version": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz", + "integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo=" + }, + "isstream": { + "version": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jodid25519": { + "version": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", + "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", + "optional": true + }, + "joi": { + "version": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz", + "integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY=" + }, + "js-yaml": { + "version": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.8.4.tgz", + "integrity": "sha1-UgtFZPhlc7qWZir4Woyvp7S1pvY=" + }, + "jsbn": { + "version": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "json-schema": { + "version": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-stable-stringify": { + "version": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=" + }, + "json-stringify-safe": { + "version": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsonify": { + "version": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "jsonwebtoken": { + "version": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-7.4.1.tgz", + "integrity": "sha1-fKMk9SFfi+A5zTWmxFu4y3SkSPs=", + "dependencies": { + "ms": { + "version": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "jsprim": { + "version": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", + "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", + "dependencies": { + "assert-plus": { + "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "jwa": { + "version": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz", + "integrity": "sha1-oFUs4CIHQs1S4VN3SjKQXDDnVuU=" + }, + "jws": { + "version": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz", + "integrity": "sha1-+ei5M46KhHJ31kRLFGT2GIDgUKI=" + }, + "knuth-shuffle": { + "version": "https://registry.npmjs.org/knuth-shuffle/-/knuth-shuffle-1.0.1.tgz", + "integrity": "sha1-RUlAroFsFOGvbm8J2IKIGPlbUZE=" + }, + "le-acme-core": { + "version": "https://registry.npmjs.org/le-acme-core/-/le-acme-core-2.1.0.tgz", + "integrity": "sha1-1afBvosmnTGZvvZjLfo+BiShZFQ=" + }, + "le-challenge-ddns": { + "version": "git+https://git.daplie.com/Daplie/le-challenge-ddns.git#01ebef901cfb96ecb7ded02299a75a1a9f17167d" + }, + "le-challenge-fs": { + "version": "git+https://git.daplie.com/Daplie/le-challenge-webroot.git#7d904739fbe517da2582a01faeb2407405f99daf" + }, + "le-challenge-sni": { + "version": "https://registry.npmjs.org/le-challenge-sni/-/le-challenge-sni-2.0.1.tgz", + "integrity": "sha1-TiYvG/Us8dGB5kvBh3dremjI9Bc=" + }, + "le-sni-auto": { + "version": "https://registry.npmjs.org/le-sni-auto/-/le-sni-auto-2.1.1.tgz", + "integrity": "sha1-rVvrnYzI2EseEoCCxwcvhMQ8qXs=" + }, + "le-store-certbot": { + "version": "git+https://git.daplie.com/Daplie/le-store-certbot.git#0df0a16d655e30429d5d08522bae70da5f2d58f8" + }, + "le-tls-sni": { + "version": "https://registry.npmjs.org/le-tls-sni/-/le-tls-sni-0.1.4.tgz", + "integrity": "sha1-eFMJoHsOuyQZD+W6YVucx2hc4Zw=" + }, + "load-json-file": { + "version": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=" + }, + "localhost.daplie.me-certificates": { + "version": "https://registry.npmjs.org/localhost.daplie.me-certificates/-/localhost.daplie.me-certificates-1.3.2.tgz", + "integrity": "sha1-zCzAYVDQMssJOK4SIBOlyYVwtsM=" + }, + "lodash.isplainobject": { + "version": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.once": { + "version": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, + "loud-rejection": { + "version": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=" + }, + "lowercase-keys": { + "version": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" + }, + "map-obj": { + "version": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + }, + "media-typer": { + "version": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "meow": { + "version": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dependencies": { + "minimist": { + "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "merge-descriptors": { + "version": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" + }, + "mime-db": { + "version": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", + "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=" + }, + "mime-types": { + "version": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", + "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=" + }, + "minimalistic-assert": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", + "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=" + }, + "mkdirp": { + "version": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dependencies": { + "minimist": { + "version": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "moment": { + "version": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz", + "integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8=" + }, + "ms": { + "version": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=" + }, + "nan": { + "version": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", + "integrity": "sha1-5P805slf37WuzAjeZZb0NgWn20U=", + "optional": true + }, + "negotiator": { + "version": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "node-forge": { + "version": "https://registry.npmjs.org/node-forge/-/node-forge-0.6.49.tgz", + "integrity": "sha1-8e6V1ddGI5OP4Z1piqWibVTS9g8=" + }, + "node-status-codes": { + "version": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", + "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=" + }, + "node.extend": { + "version": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz", + "integrity": "sha1-p7iCyC1sk6SGOlUEvV3o7IYli5Y=" + }, + "normalize-package-data": { + "version": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.8.tgz", + "integrity": "sha1-2Bntoqne29H/pWPqQHHZNngilbs=" + }, + "notp": { + "version": "https://registry.npmjs.org/notp/-/notp-2.0.3.tgz", + "integrity": "sha1-qf0R4lz+HMs5/GaJVE7kwQ75pXc=" + }, + "number-is-nan": { + "version": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "oauth-sign": { + "version": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + }, + "oauth3-cli": { + "version": "git+https://git.daplie.com/OAuth3/oauth3-cli.git#36712f0251a6a6ee41a306ec5c8a54cfcd4e9509", + "dependencies": { + "jsonwebtoken": { + "version": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-5.7.0.tgz", + "integrity": "sha1-HJD5qGzlt0j1+XnBK3BAK0r83bQ=" + }, + "node-uuid": { + "version": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=" + } + } + }, + "oauth3.js": { + "version": "git+https://git.daplie.com/OAuth3/oauth3.js.git#f10dee91670cc9e5f641d9d1c30274b5ba50bde9" + }, + "object-assign": { + "version": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "on-finished": { + "version": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=" + }, + "once": { + "version": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=" + }, + "parse-json": { + "version": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=" + }, + "parseurl": { + "version": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", + "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=" + }, + "path-exists": { + "version": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=" + }, + "path-is-absolute": { + "version": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-to-regexp": { + "version": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "path-type": { + "version": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=" + }, + "performance-now": { + "version": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" + }, + "pify": { + "version": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=" + }, + "pkijs": { + "version": "https://registry.npmjs.org/pkijs/-/pkijs-1.3.33.tgz", + "integrity": "sha1-ponvYhE7fDSOH/wJll0iOeW7TJI=" + }, + "prepend-http": { + "version": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "process-nextick-args": { + "version": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "proxy-addr": { + "version": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.4.tgz", + "integrity": "sha1-J+VF9pYKRKYn2bREZ+NcG2tM4vM=" + }, + "punycode": { + "version": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "pyconf": { + "version": "https://registry.npmjs.org/pyconf/-/pyconf-1.1.2.tgz", + "integrity": "sha1-YaeqKZ/27le4xoetNVpV0ueoams=" + }, + "qrcode-terminal": { + "version": "git+https://github.com/gtanner/qrcode-terminal.git#9b412b3052242e054b85705f5033cd15719ef7e8" + }, + "qs": { + "version": "https://registry.npmjs.org/qs/-/qs-6.2.1.tgz", + "integrity": "sha1-zgPF/wk1vB2daanxTL0Y5WjWdiU=" + }, + "range-parser": { + "version": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "https://registry.npmjs.org/raw-body/-/raw-body-2.2.0.tgz", + "integrity": "sha1-mUl2z2pQlqQRYoQEkvC9xdbn+5Y=" + }, + "read-all-stream": { + "version": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", + "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=" + }, + "read-pkg": { + "version": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=" + }, + "read-pkg-up": { + "version": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=" + }, + "readable-stream": { + "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=" + }, + "recase": { + "version": "git+https://git.daplie.com/coolaj86/recase-js.git#fcff04dcb0198a81576aad68506ae2490872db04" + }, + "redent": { + "version": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=" + }, + "redirect-https": { + "version": "https://registry.npmjs.org/redirect-https/-/redirect-https-1.1.4.tgz", + "integrity": "sha1-qqH8cqxRYjpcSegEJQUf6kO87jI=" + }, + "repeating": { + "version": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=" + }, + "request": { + "version": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "dependencies": { + "qs": { + "version": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" + } + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "rsa-compat": { + "version": "https://registry.npmjs.org/rsa-compat/-/rsa-compat-1.2.7.tgz", + "integrity": "sha1-fEY23nmIhanzyQQ26jgE41sWhMg=" + }, + "safe-buffer": { + "version": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", + "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=" + }, + "safe-replace": { + "version": "https://registry.npmjs.org/safe-replace/-/safe-replace-1.0.2.tgz", + "integrity": "sha1-sYGrQJWs32qwqPhAUXSRyoqZIro=" + }, + "scmp": { + "version": "git+https://github.com/freewil/scmp.git#246bacad4f84fe4e0b0d16cd55d19684cffbaf5c" + }, + "semver": { + "version": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" + }, + "send": { + "version": "https://registry.npmjs.org/send/-/send-0.15.1.tgz", + "integrity": "sha1-igI1TCbm9cynAAZfXwzeupDse18=", + "dependencies": { + "http-errors": { + "version": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz", + "integrity": "sha1-X4uO2YrKVFZWv1cplzh/kEpyIlc=" + }, + "setprototypeof": { + "version": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + } + } + }, + "serve-index": { + "version": "https://registry.npmjs.org/serve-index/-/serve-index-1.8.0.tgz", + "integrity": "sha1-fF2WwT+xMRAfk8HFd0+FFqHnjTs=", + "dependencies": { + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=" + }, + "ms": { + "version": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "serve-static": { + "version": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.3.tgz", + "integrity": "sha1-n0uhni8wMMVH+K+ZEHg47DjVseI=", + "dependencies": { + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", + "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=" + }, + "http-errors": { + "version": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz", + "integrity": "sha1-X4uO2YrKVFZWv1cplzh/kEpyIlc=" + }, + "ms": { + "version": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "send": { + "version": "https://registry.npmjs.org/send/-/send-0.15.3.tgz", + "integrity": "sha1-UBP5+ZAj31DRvZiSwZ4979HVMwk=" + }, + "setprototypeof": { + "version": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + } + } + }, + "server-destroy": { + "version": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=" + }, + "setprototypeof": { + "version": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.2.tgz", + "integrity": "sha1-gaVSFB7BBLiOic44MQOtXGZWTQg=" + }, + "signal-exit": { + "version": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "sni": { + "version": "https://registry.npmjs.org/sni/-/sni-1.0.0.tgz", + "integrity": "sha1-b6Qr35d23i43zsYBIua+yD3wBvU=" + }, + "sntp": { + "version": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=" + }, + "socket-pair": { + "version": "1.0.1", + "dependencies": { + "bluebird": { + "version": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", + "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" + } + } + }, + "spdx-correct": { + "version": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=" + }, + "spdx-expression-parse": { + "version": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=" + }, + "spdx-license-ids": { + "version": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=" + }, + "spliddit": { + "version": "https://registry.npmjs.org/spliddit/-/spliddit-2.1.1.tgz", + "integrity": "sha1-3t32FZD2V3jz7wic2pqaint2+QQ=" + }, + "sprintf-js": { + "version": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sshpk": { + "version": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.0.tgz", + "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=", + "dependencies": { + "assert-plus": { + "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "statuses": { + "version": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + }, + "stream-pair": { + "version": "https://registry.npmjs.org/stream-pair/-/stream-pair-1.0.3.tgz", + "integrity": "sha1-vIdY/jnTgQuva3VMj5BI8PuRNn0=" + }, + "string_decoder": { + "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", + "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=" + }, + "stringstream": { + "version": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" + }, + "strip-ansi": { + "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=" + }, + "strip-bom": { + "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=" + }, + "strip-indent": { + "version": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=" + }, + "stripe": { + "version": "https://registry.npmjs.org/stripe/-/stripe-4.19.1.tgz", + "integrity": "sha1-7cHcc5XM6PqCjyVKtvzSbwdPdt8=", + "dependencies": { + "bluebird": { + "version": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=" + }, + "qs": { + "version": "https://registry.npmjs.org/qs/-/qs-6.0.4.tgz", + "integrity": "sha1-UQGdhHIMk5uCc36EVWp4Izjs6ns=" + } + } + }, + "stunnel": { + "version": "git+https://git.daplie.com/Daplie/node-tunnel-client.git#a0ed74b641730003be6878a56f4c4e70156a833e" + }, + "terminal-forms.js": { + "version": "git+https://git.daplie.com/OAuth3/terminal-forms.js.git#079d94cbf3dc8998beca5a72a827444d0e8dd504" + }, + "thirty-two": { + "version": "https://registry.npmjs.org/thirty-two/-/thirty-two-0.0.2.tgz", + "integrity": "sha1-QlPinYywWPBIAmfFaYwOSSflS2o=" + }, + "timed-out": { + "version": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", + "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=" + }, + "topo": { + "version": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz", + "integrity": "sha1-6ddRYV0buH3IZdsYL6HKCl71NtU=" + }, + "tough-cookie": { + "version": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=" + }, + "trim-newlines": { + "version": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + }, + "tunnel-agent": { + "version": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=" + }, + "tunnel-packer": { + "version": "1.3.0", + "dependencies": { + "sni": { + "version": "https://registry.npmjs.org/sni/-/sni-1.0.0.tgz", + "integrity": "sha1-b6Qr35d23i43zsYBIua+yD3wBvU=" + } + } + }, + "tweetnacl": { + "version": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "type-is": { + "version": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=" + }, + "ultron": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.0.tgz", + "integrity": "sha1-sHoualQagV/Go0zNRTO67DB8qGQ=" + }, + "underscore": { + "version": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" + }, + "unpipe": { + "version": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unzip-response": { + "version": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", + "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=" + }, + "url-parse-lax": { + "version": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=" + }, + "ursa": { + "version": "https://registry.npmjs.org/ursa/-/ursa-0.9.4.tgz", + "integrity": "sha1-Ciq/t9xCZ/czsPjy/H8siV1ApBM=", + "optional": true + }, + "util-deprecate": { + "version": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + }, + "uuid": { + "version": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", + "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=" + }, + "validate-npm-package-license": { + "version": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=" + }, + "vary": { + "version": "https://registry.npmjs.org/vary/-/vary-1.1.1.tgz", + "integrity": "sha1-Z1Neu2lMHVIldFeYRmUyP1h+jTc=" + }, + "verror": { + "version": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=" + }, + "wrappy": { + "version": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "ws": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-2.3.1.tgz", + "integrity": "sha1-a5Sz5EfLajY/eF6vlK9jWejoHIA=" + }, + "xtend": { + "version": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + } + } +} diff --git a/package.json b/package.json index 0f2629a..7cd941a 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "express": "git+https://github.com/expressjs/express.git#4.x", "finalhandler": "^0.4.0", "greenlock": "git+https://git.daplie.com/Daplie/node-greenlock.git#master", + "http-proxy": "^1.16.2", "ipaddr.js": "git+https://github.com/whitequark/ipaddr.js.git#v1.3.0", "ipify": "^1.1.0", "js-yaml": "^3.8.3", @@ -62,8 +63,9 @@ "serve-static": "^1.10.0", "server-destroy": "^1.0.1", "sni": "^1.0.0", - "socket-pair": "^1.0.0", + "socket-pair": "^1.0.1", "stream-pair": "^1.0.3", - "stunnel": "git+https://git.daplie.com/Daplie/node-tunnel-client.git#v1" + "stunnel": "git+https://git.daplie.com/Daplie/node-tunnel-client.git#v1", + "tunnel-packer": "^1.3.0" } } diff --git a/packages/apis/com.daplie.goldilocks/index.js b/packages/apis/com.daplie.goldilocks/index.js index 7134e05..d11faed 100644 --- a/packages/apis/com.daplie.goldilocks/index.js +++ b/packages/apis/com.daplie.goldilocks/index.js @@ -118,6 +118,15 @@ module.exports.create = function (deps, conf) { } , tunnel: function (req, res) { isAuthorized(req, res, function () { + if ('POST' !== req.method) { + res.setHeader('Content-Type', 'application/json'); + return deps.tunneler.get(req.userId).then(function (result) { + res.end(JSON.stringify(result)); + }, function (err) { + res.end(JSON.stringify({ error: { message: err.message, code: err.code, uri: err.uri } })); + }); + } + jsonParser(req, res, function () { console.log('req.body', req.body); @@ -153,8 +162,8 @@ module.exports.create = function (deps, conf) { }); } , request: function (req, res) { - jsonParser(req, res, function () { isAuthorized(req, res, function () { + jsonParser(req, res, function () { deps.request({ method: req.body.method || 'GET' diff --git a/packages/assets/org.oauth3 b/packages/assets/org.oauth3 deleted file mode 160000 index c4cc619..0000000 --- a/packages/assets/org.oauth3 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit c4cc61992805469f86ecd4d74afc18cf6506155b