mirror of
				https://git.coolaj86.com/coolaj86/telebit.js.git
				synced 2025-11-04 02:32:47 +00:00 
			
		
		
		
	get domains by device
This commit is contained in:
		
							parent
							
								
									4eb6a42bb8
								
							
						
					
					
						commit
						5ade07e224
					
				
							
								
								
									
										35
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								README.md
									
									
									
									
									
								
							@ -33,7 +33,27 @@ Installs as `stunnel.js` with the alias `jstunnel`
 | 
			
		||||
npm install -g stunnel
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Advanced Usage
 | 
			
		||||
### Usage with OAuth3.org
 | 
			
		||||
 | 
			
		||||
Daplie's OAuth3.org tunnel service is in Beta.
 | 
			
		||||
 | 
			
		||||
**Terms of Service**: The Software and Services shall be used for Good, not Evil.
 | 
			
		||||
Examples of good: education, business, pleasure. Examples of evil: crime, abuse, extortion.
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
stunnel.js --agree-tos --email john@example.com --locals http:*:4080,https:*:8443 --device
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
stunnel.js \
 | 
			
		||||
  --agree-tos --email <EMAIL> \
 | 
			
		||||
  --locals <List of <SCHEME>:<EXTERNAL_DOMAINNAME>:<INTERNAL_PORT>> \
 | 
			
		||||
  --device [HOSTNAME] \
 | 
			
		||||
  --domains [Comma-separated list of domains to attach to device] \
 | 
			
		||||
  --oauth3-url <Tunnel Service OAuth3 URL>
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Advanced Usage (DIY)
 | 
			
		||||
 | 
			
		||||
How to use `stunnel.js` with your own instance of `stunneld.js`:
 | 
			
		||||
 | 
			
		||||
@ -70,19 +90,6 @@ stunnel.js \
 | 
			
		||||
-k, --insecure    ignore invalid ssl certificates from stunneld
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Usage
 | 
			
		||||
 | 
			
		||||
**NOT YET IMPLEMENTED**
 | 
			
		||||
 | 
			
		||||
Daplie's tunneling service is not yet publicly available.
 | 
			
		||||
 | 
			
		||||
**Terms of Service**: The Software and Services shall be used for Good, not Evil.
 | 
			
		||||
Examples of good: education, business, pleasure. Examples of evil: crime, abuse, extortion.
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
stunnel.js --agree-tos --email john@example.com --locals http:john.example.com:4080,https:john.example.com:8443
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Library
 | 
			
		||||
=======
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -12,23 +12,34 @@ function collectProxies(val, memo) {
 | 
			
		||||
  var vals = val.split(/,/g);
 | 
			
		||||
 | 
			
		||||
  function parseProxy(location) {
 | 
			
		||||
    // john.example.com
 | 
			
		||||
    // https:3443
 | 
			
		||||
    // http:john.example.com:3000
 | 
			
		||||
    // http://john.example.com:3000
 | 
			
		||||
    var parts = location.split(':');
 | 
			
		||||
    var dual = false;
 | 
			
		||||
    if (/\./.test(parts[0])) {
 | 
			
		||||
      //dual = true;
 | 
			
		||||
      parts[2] = parts[1];
 | 
			
		||||
    if (1 === parts.length) {
 | 
			
		||||
      // john.example.com -> :john.example.com:0
 | 
			
		||||
      parts[1] = parts[0];
 | 
			
		||||
      parts[0] = 'https';
 | 
			
		||||
 | 
			
		||||
      parts[0] = '';
 | 
			
		||||
      parts[2] = 0;
 | 
			
		||||
 | 
			
		||||
      dual = true;
 | 
			
		||||
    }
 | 
			
		||||
    else if (2 === parts.length) {
 | 
			
		||||
      // https:3443 -> https:*:3443
 | 
			
		||||
      parts[2] = parts[1];
 | 
			
		||||
 | 
			
		||||
      parts[1] = '*';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    parts[0] = parts[0].toLowerCase();
 | 
			
		||||
    parts[1] = parts[1].toLowerCase().replace(/(\/\/)?/, '') || '*';
 | 
			
		||||
    parts[2] = parseInt(parts[2], 10) || 0;
 | 
			
		||||
    if (!parts[2]) {
 | 
			
		||||
      // TODO grab OS list of standard ports?
 | 
			
		||||
      if ('http' === parts[0]) {
 | 
			
		||||
      if (!parts[0] || 'http' === parts[0]) {
 | 
			
		||||
        parts[2] = 80;
 | 
			
		||||
      }
 | 
			
		||||
      else if ('https' === parts[0]) {
 | 
			
		||||
@ -40,16 +51,16 @@ function collectProxies(val, memo) {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    memo.push({
 | 
			
		||||
      protocol: parts[0]
 | 
			
		||||
      protocol: parts[0] || 'https'
 | 
			
		||||
    , hostname: parts[1]
 | 
			
		||||
    , port: parts[2]
 | 
			
		||||
    , port: parts[2] || 443
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    if (dual) {
 | 
			
		||||
      memo.push({
 | 
			
		||||
        protocol: 'http'
 | 
			
		||||
      , hostname: parts[1]
 | 
			
		||||
      , port: parts[2]
 | 
			
		||||
      , port: 80
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
@ -70,6 +81,7 @@ program
 | 
			
		||||
  })
 | 
			
		||||
  .option('-k --insecure', 'Allow TLS connections to stunneld without valid certs (rejectUnauthorized: false)')
 | 
			
		||||
  .option('--locals <LINE>', 'comma separated list of <proto>:<//><servername>:<port> to which matching incoming http and https should forward (reverse proxy). Ex: https://john.example.com,tls:*:1337', collectProxies, [ ]) // --reverse-proxies
 | 
			
		||||
  .option('--device [HOSTNAME]', 'Tunnel all domains associated with this device instead of specific domainnames. Use with --locals <proto>:*:<port>. Ex: macbook-pro.local (the output of `hostname`)')
 | 
			
		||||
  .option('--stunneld <URL>', 'the domain (or ip address) at which you are running stunneld.js (the proxy)') // --proxy
 | 
			
		||||
  .option('--secret <STRING>', 'the same secret used by stunneld (used for JWT authentication)')
 | 
			
		||||
  .option('--token <STRING>', 'a pre-generated token for use with stunneld (instead of generating one with --secret)')
 | 
			
		||||
@ -95,7 +107,14 @@ function connectTunnel() {
 | 
			
		||||
    console.log('[local proxy]', proxy.protocol + '://' + proxy.hostname + ':' + proxy.port);
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  stunnel.connect(program);
 | 
			
		||||
  stunnel.connect({
 | 
			
		||||
    stunneld: program.stunneld
 | 
			
		||||
  , locals: program.locals
 | 
			
		||||
  , services: program.services
 | 
			
		||||
  , net: program.net
 | 
			
		||||
  , insecure: program.insecure
 | 
			
		||||
  , token: program.token
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function rawTunnel() {
 | 
			
		||||
@ -119,7 +138,7 @@ function rawTunnel() {
 | 
			
		||||
  }
 | 
			
		||||
  program.stunneld = location.protocol + '//' + location.hostname + (location.port ? ':' + location.port : '');
 | 
			
		||||
 | 
			
		||||
  tokenData.domains = Object.keys(domainsMap);
 | 
			
		||||
  tokenData.domains = Object.keys(domainsMap).filter(Boolean);
 | 
			
		||||
 | 
			
		||||
  program.token = program.token || jwt.sign(tokenData, program.secret);
 | 
			
		||||
 | 
			
		||||
@ -134,9 +153,27 @@ function daplieTunnel() {
 | 
			
		||||
    email: program.email
 | 
			
		||||
  , providerUri: program.oauth3Url
 | 
			
		||||
  }).then(function (oauth3) {
 | 
			
		||||
    return oauth3.api('tunnel.token', { data: { device: 'test.local', domains: [] } }).then(function (results) {
 | 
			
		||||
      console.log('tunnel.token results');
 | 
			
		||||
      console.log(results);
 | 
			
		||||
    var data = { device: null, domains: [] };
 | 
			
		||||
    var domains = Object.keys(domainsMap).filter(Boolean);
 | 
			
		||||
    if (program.device) {
 | 
			
		||||
      // TODO use device API to select device by id
 | 
			
		||||
      data.device = { hostname: program.device };
 | 
			
		||||
      if (true === program.device) {
 | 
			
		||||
        data.device.hostname = require('os').hostname();
 | 
			
		||||
        console.log("Using device hostname '" + data.device.hostname + "'");
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    if (domains.length) {
 | 
			
		||||
      data.domains = domains;
 | 
			
		||||
    }
 | 
			
		||||
    return oauth3.api('tunnel.token', { data: data }).then(function (results) {
 | 
			
		||||
      var token = new Buffer(results.jwt.split('.')[1], 'base64').toString('utf8');
 | 
			
		||||
      console.log('tunnel token issued:');
 | 
			
		||||
      console.log(token);
 | 
			
		||||
      program.token = results.jwt;
 | 
			
		||||
      program.stunneld = results.tunnelUrl || ('wss://' + token.aud + '/');
 | 
			
		||||
 | 
			
		||||
      connectTunnel();
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
@ -145,6 +182,10 @@ var domainsMap = {};
 | 
			
		||||
program.locals.forEach(function (proxy) {
 | 
			
		||||
  domainsMap[proxy.hostname] = true;
 | 
			
		||||
});
 | 
			
		||||
if (domainsMap.hasOwnProperty('*')) {
 | 
			
		||||
  //delete domainsMap['*'];
 | 
			
		||||
  domainsMap['*'] = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if (!(program.secret || program.token) && !program.stunneld) {
 | 
			
		||||
  daplieTunnel();
 | 
			
		||||
 | 
			
		||||
@ -13,7 +13,7 @@
 | 
			
		||||
  },
 | 
			
		||||
  "repository": {
 | 
			
		||||
    "type": "git",
 | 
			
		||||
    "url": "git+ssh://git@github.com/Daplie/node-tunnel-client.git"
 | 
			
		||||
    "url": "git+ssh://git@git.daplie.com/Daplie/node-tunnel-client.git"
 | 
			
		||||
  },
 | 
			
		||||
  "keywords": [
 | 
			
		||||
    "cli",
 | 
			
		||||
@ -42,9 +42,9 @@
 | 
			
		||||
  "author": "AJ ONeal <coolaj86@gmail.com> (https://coolaj86.com/)",
 | 
			
		||||
  "license": "(MIT OR Apache-2.0)",
 | 
			
		||||
  "bugs": {
 | 
			
		||||
    "url": "https://github.com/Daplie/node-tunnel-client/issues"
 | 
			
		||||
    "url": "https://git.daplie.com/Daplie/node-tunnel-client/issues"
 | 
			
		||||
  },
 | 
			
		||||
  "homepage": "https://github.com/Daplie/node-tunnel-client#readme",
 | 
			
		||||
  "homepage": "https://git.daplie.com/Daplie/node-tunnel-client#readme",
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "commander": "^2.9.0",
 | 
			
		||||
    "oauth3.js": "git+https://git.daplie.com:OAuth3/oauth3.js.git#v1",
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user