fixed some problems with the DDNS
This commit is contained in:
		
							parent
							
								
									bc301b94c9
								
							
						
					
					
						commit
						fcb2de516f
					
				
							
								
								
									
										62
									
								
								lib/ddns.js
									
									
									
									
									
								
							
							
						
						
									
										62
									
								
								lib/ddns.js
									
									
									
									
									
								
							@ -5,6 +5,7 @@ module.exports.create = function (deps, conf) {
 | 
				
			|||||||
  var request = PromiseA.promisify(require('request'));
 | 
					  var request = PromiseA.promisify(require('request'));
 | 
				
			||||||
  var OAUTH3 = require('../packages/assets/org.oauth3');
 | 
					  var OAUTH3 = require('../packages/assets/org.oauth3');
 | 
				
			||||||
  require('../packages/assets/org.oauth3/oauth3.dns.js');
 | 
					  require('../packages/assets/org.oauth3/oauth3.dns.js');
 | 
				
			||||||
 | 
					  OAUTH3._hooks = require('../packages/assets/org.oauth3/oauth3.node.storage.js');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  function dnsType(addr) {
 | 
					  function dnsType(addr) {
 | 
				
			||||||
    if (/^\d+\.\d+\.\d+\.\d+$/.test(addr)) {
 | 
					    if (/^\d+\.\d+\.\d+\.\d+$/.test(addr)) {
 | 
				
			||||||
@ -25,9 +26,15 @@ module.exports.create = function (deps, conf) {
 | 
				
			|||||||
        return PromiseA.reject(new Error('no sessions with DNS grants'));
 | 
					        return PromiseA.reject(new Error('no sessions with DNS grants'));
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      return OAUTH3.discover(session.aud).then(function (directives) {
 | 
					      // The OAUTH3 library stores some things on the root session object that we usually
 | 
				
			||||||
 | 
					      // just leave inside the token, but we need to pull those out before we use it here
 | 
				
			||||||
 | 
					      session.provider_uri = session.provider_uri || session.token.provider_uri || session.token.iss;
 | 
				
			||||||
 | 
					      session.client_uri = session.client_uri || session.token.azp;
 | 
				
			||||||
 | 
					      session.scope = session.scope || session.token.scp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return OAUTH3.discover(session.token.aud).then(function (directives) {
 | 
				
			||||||
        return request({
 | 
					        return request({
 | 
				
			||||||
          url: 'https://'+directives.api+'/api/org.oauth3.dns/acl/devices/' + conf.device.hostname
 | 
					          url: directives.api+'/api/com.daplie.domains/acl/devices/' + conf.device.hostname
 | 
				
			||||||
        , method: 'POST'
 | 
					        , method: 'POST'
 | 
				
			||||||
        , headers: {
 | 
					        , headers: {
 | 
				
			||||||
            'Authorization': 'Bearer ' + session.refresh_token
 | 
					            'Authorization': 'Bearer ' + session.refresh_token
 | 
				
			||||||
@ -38,6 +45,43 @@ module.exports.create = function (deps, conf) {
 | 
				
			|||||||
              { value: addr, type:  dnsType(addr) }
 | 
					              { value: addr, type:  dnsType(addr) }
 | 
				
			||||||
            ]
 | 
					            ]
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
 | 
					        }).then(function () {
 | 
				
			||||||
 | 
					          return OAUTH3.api(directives.api, {session: session, api: 'dns.list'}).then(function (list) {
 | 
				
			||||||
 | 
					            return list.filter(function (record) {
 | 
				
			||||||
 | 
					              return record.device === conf.device.hostname;
 | 
				
			||||||
 | 
					            }).map(function (record) {
 | 
				
			||||||
 | 
					              var split = record.zone.split('.');
 | 
				
			||||||
 | 
					              return {
 | 
				
			||||||
 | 
					                tld: split.slice(1).join('.'),
 | 
				
			||||||
 | 
					                sld: split[0],
 | 
				
			||||||
 | 
					                sub: record.host.slice(0, -(record.zone.length + 1))
 | 
				
			||||||
 | 
					              };
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					        }).then(function (domains) {
 | 
				
			||||||
 | 
					          var common = {
 | 
				
			||||||
 | 
					            api: 'devices.detach',
 | 
				
			||||||
 | 
					            session: session,
 | 
				
			||||||
 | 
					            device: conf.device.hostname
 | 
				
			||||||
 | 
					          };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          return PromiseA.all(domains.map(function (record) {
 | 
				
			||||||
 | 
					            return OAUTH3.api(directives.api, Object.assign({}, common, record));
 | 
				
			||||||
 | 
					          })).then(function () {
 | 
				
			||||||
 | 
					            return domains;
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					        }).then(function (domains) {
 | 
				
			||||||
 | 
					          var common = {
 | 
				
			||||||
 | 
					            api: 'devices.attach',
 | 
				
			||||||
 | 
					            session: session,
 | 
				
			||||||
 | 
					            device: conf.device.hostname,
 | 
				
			||||||
 | 
					            ip: addr,
 | 
				
			||||||
 | 
					            ttl: 300
 | 
				
			||||||
 | 
					          };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          return PromiseA.all(domains.map(function (record) {
 | 
				
			||||||
 | 
					            return OAUTH3.api(directives.api, Object.assign({}, common, record));
 | 
				
			||||||
 | 
					          }));
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
@ -53,9 +97,9 @@ module.exports.create = function (deps, conf) {
 | 
				
			|||||||
        return PromiseA.reject(new Error('no sessions with DNS grants'));
 | 
					        return PromiseA.reject(new Error('no sessions with DNS grants'));
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      return OAUTH3.discover(session.aud).then(function (directives) {
 | 
					      return OAUTH3.discover(session.token.aud).then(function (directives) {
 | 
				
			||||||
        return request({
 | 
					        return request({
 | 
				
			||||||
          url: 'https://'+directives.api+'/api/org.oauth3.dns/acl/devices'
 | 
					          url: directives.api+'/api/org.oauth3.dns/acl/devices'
 | 
				
			||||||
        , method: 'GET'
 | 
					        , method: 'GET'
 | 
				
			||||||
        , headers: {
 | 
					        , headers: {
 | 
				
			||||||
            'Authorization': 'Bearer ' + session.refresh_token
 | 
					            'Authorization': 'Bearer ' + session.refresh_token
 | 
				
			||||||
@ -95,17 +139,25 @@ module.exports.create = function (deps, conf) {
 | 
				
			|||||||
        return;
 | 
					        return;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      OAUTH3.discover(session.aud).then(function (directives) {
 | 
					      OAUTH3.discover(session.token.aud).then(function (directives) {
 | 
				
			||||||
        return deps.loopback.checkPublicAddr(directives.api);
 | 
					        return deps.loopback.checkPublicAddr(directives.api);
 | 
				
			||||||
      }).then(function (addr) {
 | 
					      }).then(function (addr) {
 | 
				
			||||||
        if (publicAddress !== addr) {
 | 
					        if (publicAddress !== addr) {
 | 
				
			||||||
 | 
					          if (conf.debug) {
 | 
				
			||||||
 | 
					            console.log('previous public address',publicAddress, 'does not match current public address', addr);
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
          publicAddress = addr;
 | 
					          publicAddress = addr;
 | 
				
			||||||
          setDeviceAddress(addr);
 | 
					          setDeviceAddress(addr);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					      }, function (err) {
 | 
				
			||||||
 | 
					        if (conf.debug) {
 | 
				
			||||||
 | 
					          console.error('error getting public address', err);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  recheckPubAddr();
 | 
				
			||||||
  setInterval(recheckPubAddr, 5*60*1000);
 | 
					  setInterval(recheckPubAddr, 5*60*1000);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return {
 | 
					  return {
 | 
				
			||||||
 | 
				
			|||||||
@ -22,6 +22,7 @@ function create(conf) {
 | 
				
			|||||||
  config = conf;
 | 
					  config = conf;
 | 
				
			||||||
  var deps = {
 | 
					  var deps = {
 | 
				
			||||||
    messenger: process
 | 
					    messenger: process
 | 
				
			||||||
 | 
					  , PromiseA: require('bluebird')
 | 
				
			||||||
    // Note that if a custom createConnections is used it will be called with different
 | 
					    // Note that if a custom createConnections is used it will be called with different
 | 
				
			||||||
    // sets of custom options based on what is actually being proxied. Most notably the
 | 
					    // sets of custom options based on what is actually being proxied. Most notably the
 | 
				
			||||||
    // HTTP proxying connection creation is not something we currently control.
 | 
					    // HTTP proxying connection creation is not something we currently control.
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user