https://git.coolaj86.com/coolaj86/telebit.js/issues/11 wildcards forward by default
This commit is contained in:
parent
4bef0187f1
commit
6a1df2ee05
|
@ -2,9 +2,24 @@
|
||||||
|
|
||||||
var Devices = module.exports;
|
var Devices = module.exports;
|
||||||
Devices.add = function (store, servername, newDevice) {
|
Devices.add = function (store, servername, newDevice) {
|
||||||
var devices = store[servername] || [];
|
if (!store[servername]) {
|
||||||
|
store[servername] = [];
|
||||||
|
}
|
||||||
|
var devices = store[servername];
|
||||||
devices.push(newDevice);
|
devices.push(newDevice);
|
||||||
store[servername] = devices;
|
};
|
||||||
|
Devices.alias = function (store, servername, alias) {
|
||||||
|
if (!store[servername]) {
|
||||||
|
store[servername] = [];
|
||||||
|
}
|
||||||
|
if (!store[servername]._primary) {
|
||||||
|
store[servername]._primary = servername;
|
||||||
|
}
|
||||||
|
if (!store[servername].aliases) {
|
||||||
|
store[servername].aliases = {};
|
||||||
|
}
|
||||||
|
store[alias] = store[servername];
|
||||||
|
store[servername].aliases[alias] = true;
|
||||||
};
|
};
|
||||||
Devices.remove = function (store, servername, device) {
|
Devices.remove = function (store, servername, device) {
|
||||||
var devices = store[servername] || [];
|
var devices = store[servername] || [];
|
||||||
|
@ -17,9 +32,11 @@ Devices.remove = function (store, servername, device) {
|
||||||
return devices.splice(index, 1)[0];
|
return devices.splice(index, 1)[0];
|
||||||
};
|
};
|
||||||
Devices.list = function (store, servername) {
|
Devices.list = function (store, servername) {
|
||||||
|
// efficient lookup first
|
||||||
if (store[servername] && store[servername].length) {
|
if (store[servername] && store[servername].length) {
|
||||||
return store[servername];
|
return store[servername]._primary && store[store[servername]._primary] || store[servername];
|
||||||
}
|
}
|
||||||
|
|
||||||
// There wasn't an exact match so check any of the wildcard domains, sorted longest
|
// There wasn't an exact match so check any of the wildcard domains, sorted longest
|
||||||
// first so the one with the biggest natural match with be found first.
|
// first so the one with the biggest natural match with be found first.
|
||||||
var deviceList = [];
|
var deviceList = [];
|
||||||
|
@ -28,10 +45,19 @@ Devices.list = function (store, servername) {
|
||||||
}).sort(function (a, b) {
|
}).sort(function (a, b) {
|
||||||
return b.length - a.length;
|
return b.length - a.length;
|
||||||
}).some(function (pattern) {
|
}).some(function (pattern) {
|
||||||
|
// '.example.com' = '*.example.com'.split(1)
|
||||||
var subPiece = pattern.slice(1);
|
var subPiece = pattern.slice(1);
|
||||||
|
// '.com' = 'sub.example.com'.slice(-4)
|
||||||
|
// '.example.com' = 'sub.example.com'.slice(-12)
|
||||||
if (subPiece === servername.slice(-subPiece.length)) {
|
if (subPiece === servername.slice(-subPiece.length)) {
|
||||||
console.log('"'+servername+'" matches "'+pattern+'"');
|
console.log('[Devices.list] "'+servername+'" matches "'+pattern+'"');
|
||||||
deviceList = store[pattern];
|
deviceList = store[pattern];
|
||||||
|
|
||||||
|
// Devices.alias(store, '*.example.com', 'sub.example.com'
|
||||||
|
// '*.example.com' retrieves a reference to 'example.com'
|
||||||
|
// and this reference then also referenced by 'sub.example.com'
|
||||||
|
// Hence this O(n) check is replaced with the O(1) check above
|
||||||
|
Devices.alias(store, pattern, servername);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -307,6 +307,8 @@ var Server = {
|
||||||
console.log('add', domainname, 'to device lists');
|
console.log('add', domainname, 'to device lists');
|
||||||
srv.domainsMap[domainname] = true;
|
srv.domainsMap[domainname] = true;
|
||||||
Devices.add(state.deviceLists, domainname, srv);
|
Devices.add(state.deviceLists, domainname, srv);
|
||||||
|
// TODO allow subs to go to individual devices
|
||||||
|
Devices.alias(state.deviceLists, domainname, '*.' + domainname);
|
||||||
});
|
});
|
||||||
srv.domains = Object.keys(srv.domainsMap);
|
srv.domains = Object.keys(srv.domainsMap);
|
||||||
srv.currentDesc = (grant.device && (grant.device.id || grant.device.hostname)) || srv.domains.join(',');
|
srv.currentDesc = (grant.device && (grant.device.id || grant.device.hostname)) || srv.domains.join(',');
|
||||||
|
|
Loading…
Reference in New Issue