forked from coolaj86/goldilocks.js
		
	tunneling tunnels
This commit is contained in:
		
							parent
							
								
									c4e3cb3c07
								
							
						
					
					
						commit
						20c7bc977c
					
				
							
								
								
									
										70
									
								
								lib/app.js
									
									
									
									
									
								
							
							
						
						
									
										70
									
								
								lib/app.js
									
									
									
									
									
								
							@ -15,9 +15,12 @@ module.exports = function (opts) {
 | 
			
		||||
  //var server;
 | 
			
		||||
  var serveInit;
 | 
			
		||||
  var app;
 | 
			
		||||
  var tun;
 | 
			
		||||
  var request;
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
  function _reloadWrite(data, enc, cb) {
 | 
			
		||||
    /*jshint validthis: true */
 | 
			
		||||
    // /*jshint validthis: true */ /*
 | 
			
		||||
    if (this.headersSent) {
 | 
			
		||||
      this.__write(data, enc, cb);
 | 
			
		||||
      return;
 | 
			
		||||
@ -35,6 +38,7 @@ module.exports = function (opts) {
 | 
			
		||||
    this.__write(this.__my_livereload);
 | 
			
		||||
    this.__write(data, enc, cb);
 | 
			
		||||
  }
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  function createServeInit() {
 | 
			
		||||
@ -49,6 +53,7 @@ module.exports = function (opts) {
 | 
			
		||||
    var ownersPath = path.join(__dirname, '..', 'var', 'owners.json');
 | 
			
		||||
 | 
			
		||||
    var scmp = require('scmp');
 | 
			
		||||
    request = request || PromiseA.promisify(require('request'));
 | 
			
		||||
 | 
			
		||||
    return require('../packages/apis/com.daplie.caddy').create({
 | 
			
		||||
      PromiseA: PromiseA
 | 
			
		||||
@ -100,10 +105,38 @@ module.exports = function (opts) {
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    , recase: require('recase').create({})
 | 
			
		||||
    , request: PromiseA.promisify(require('request'))
 | 
			
		||||
    , request: request
 | 
			
		||||
    , options: opts
 | 
			
		||||
    , api: {
 | 
			
		||||
        tunnel: function (deps, session) {
 | 
			
		||||
        // TODO move loopback to oauth3.api('tunnel:loopback')
 | 
			
		||||
        loopback: function (deps, session, opts2) {
 | 
			
		||||
          var crypto = require('crypto');
 | 
			
		||||
          var token = crypto.randomBytes(16).toString('hex');
 | 
			
		||||
          var keyAuthorization = crypto.randomBytes(16).toString('hex');
 | 
			
		||||
          var nonce = crypto.randomBytes(16).toString('hex');
 | 
			
		||||
 | 
			
		||||
          // TODO set token and keyAuthorization to /.well-known/cloud-challenge/:token
 | 
			
		||||
          return request({
 | 
			
		||||
            method: 'POST'
 | 
			
		||||
          , url: 'https://oauth3.org/api/org.oauth3.tunnel/loopback'
 | 
			
		||||
          , json: {
 | 
			
		||||
              address: opts2.address
 | 
			
		||||
            , port: opts2.port
 | 
			
		||||
            , token: token
 | 
			
		||||
            , keyAuthorization: keyAuthorization
 | 
			
		||||
            , servername: opts2.servername
 | 
			
		||||
            , nonce: nonce
 | 
			
		||||
            , scheme: 'https'
 | 
			
		||||
            , iat: Date.now()
 | 
			
		||||
            }
 | 
			
		||||
          }).then(function (result) {
 | 
			
		||||
            // TODO this will always fail at the moment
 | 
			
		||||
            console.log('loopback result:');
 | 
			
		||||
            return result;
 | 
			
		||||
          });
 | 
			
		||||
        }
 | 
			
		||||
      , tunnel: function (deps, session) {
 | 
			
		||||
          // TODO save session to config and turn tunnel on
 | 
			
		||||
          var OAUTH3 = deps.OAUTH3;
 | 
			
		||||
          var url = require('url');
 | 
			
		||||
          var providerUri = session.token.aud;
 | 
			
		||||
@ -115,6 +148,7 @@ module.exports = function (opts) {
 | 
			
		||||
          //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) {
 | 
			
		||||
              var domainsMap = {};
 | 
			
		||||
              domains.forEach(function (d) {
 | 
			
		||||
@ -126,14 +160,15 @@ module.exports = function (opts) {
 | 
			
		||||
                }
 | 
			
		||||
                domainsMap[d.name] = true;
 | 
			
		||||
              });
 | 
			
		||||
            */
 | 
			
		||||
 | 
			
		||||
              //console.log('domains matching hostname', Object.keys(domainsMap));
 | 
			
		||||
              //console.log('device', deps.options.device);
 | 
			
		||||
              return oauth3.api('tunnel.token', {
 | 
			
		||||
                data: {
 | 
			
		||||
                  // filter to all domains that are on this device
 | 
			
		||||
                  domains: Object.keys(domainsMap)
 | 
			
		||||
                , device: {
 | 
			
		||||
                  //domains: Object.keys(domainsMap)
 | 
			
		||||
                  device: {
 | 
			
		||||
                    hostname: deps.options.device.hostname
 | 
			
		||||
                  , id: deps.options.device.uid || deps.options.device.id
 | 
			
		||||
                  }
 | 
			
		||||
@ -142,17 +177,34 @@ module.exports = function (opts) {
 | 
			
		||||
                console.log('got a token from the tunnel server?');
 | 
			
		||||
                console.log(result);
 | 
			
		||||
                if (!result.tunnelUrl) {
 | 
			
		||||
                  result.tunnelUrl = ('wss://' + (new Buffer(results.jwt.split('.')[1], 'base64').toString('ascii')).aud + '/');
 | 
			
		||||
                  result.tunnelUrl = ('wss://' + (new Buffer(result.jwt.split('.')[1], 'base64').toString('ascii')).aud + '/');
 | 
			
		||||
                }
 | 
			
		||||
                var opts = {
 | 
			
		||||
                  token: results.jwt
 | 
			
		||||
                , stunneld: results.tunnelUrl
 | 
			
		||||
                var opts3 = {
 | 
			
		||||
                  token: result.jwt
 | 
			
		||||
                , stunneld: result.tunnelUrl
 | 
			
		||||
                  // we'll provide faux networking and pipe as we please
 | 
			
		||||
                , services: { https: { '*': 443 }, http: { '*': 80 }, smtp: { '*': 25}, smtps: { '*': 587 /*also 465/starttls*/ } /*, ssh: { '*': 22 }*/ }
 | 
			
		||||
                , net: opts.net
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
                if (tun) {
 | 
			
		||||
                  if (tun.append) {
 | 
			
		||||
                    tun.append(result.jwt);
 | 
			
		||||
                  }
 | 
			
		||||
                  else if (tun.end) {
 | 
			
		||||
                    tun.end();
 | 
			
		||||
                    tun = null;
 | 
			
		||||
                  }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (!tun) {
 | 
			
		||||
                  tun = stunnel.connect(opts3);
 | 
			
		||||
                  opts.tun = true;
 | 
			
		||||
                }
 | 
			
		||||
              });
 | 
			
		||||
            /*
 | 
			
		||||
            });
 | 
			
		||||
            */
 | 
			
		||||
          });
 | 
			
		||||
          //, { token: token, refresh: refresh });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -124,7 +124,13 @@ module.exports.create = function (deps) {
 | 
			
		||||
 | 
			
		||||
          return deps.storage.owners.get(req.userId).then(function (session) {
 | 
			
		||||
            session.token.id = req.userId;
 | 
			
		||||
            return api.tunnel(deps, session);
 | 
			
		||||
            return api.tunnel(deps, session).then(function () {
 | 
			
		||||
              res.setHeader('Content-Type', 'application/json;');
 | 
			
		||||
              res.end(JSON.stringify({ success: true }));
 | 
			
		||||
            }, function (err) {
 | 
			
		||||
              res.setHeader('Content-Type', 'application/json;');
 | 
			
		||||
              res.end(JSON.stringify({ error: { message: err.message, code: err.code, uri: err.uri } }));
 | 
			
		||||
            });
 | 
			
		||||
          });
 | 
			
		||||
        });
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user