|
@@ -1039,6 +1039,18 @@ public:
|
|
|
{
|
|
|
if (!n.settings.allowManaged)
|
|
|
return false;
|
|
|
+
|
|
|
+ if (n.settings.allowManagedWhitelist.size() > 0) {
|
|
|
+ bool allowed = false;
|
|
|
+ for (InetAddress addr : n.settings.allowManagedWhitelist) {
|
|
|
+ if (addr.containsAddress(target) && addr.netmaskBits() <= target.netmaskBits()) {
|
|
|
+ allowed = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!allowed) return false;
|
|
|
+ }
|
|
|
+
|
|
|
if (target.isDefaultRoute())
|
|
|
return n.settings.allowDefault;
|
|
|
switch(target.ipScope()) {
|
|
@@ -1423,9 +1435,32 @@ public:
|
|
|
if (OSUtils::readFile(nlcpath,nlcbuf)) {
|
|
|
Dictionary<4096> nc;
|
|
|
nc.load(nlcbuf.c_str());
|
|
|
- n.settings.allowManaged = nc.getB("allowManaged",true);
|
|
|
- n.settings.allowGlobal = nc.getB("allowGlobal",false);
|
|
|
- n.settings.allowDefault = nc.getB("allowDefault",false);
|
|
|
+ Buffer<1024> allowManaged;
|
|
|
+ if (nc.get("allowManaged", allowManaged) && allowManaged.size() != 0) {
|
|
|
+ std::string addresses (allowManaged.begin(), allowManaged.size());
|
|
|
+ if (allowManaged.size() <= 5) { // untidy parsing for backward compatibility
|
|
|
+ if (allowManaged[0] == '1' || allowManaged[0] == 't' || allowManaged[0] == 'T') {
|
|
|
+ n.settings.allowManaged = true;
|
|
|
+ } else {
|
|
|
+ n.settings.allowManaged = false;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // this should be a list of IP addresses
|
|
|
+ n.settings.allowManaged = true;
|
|
|
+ size_t pos = 0;
|
|
|
+ while (true) {
|
|
|
+ size_t nextPos = addresses.find(',', pos);
|
|
|
+ std::string address = addresses.substr(pos, (nextPos == std::string::npos ? addresses.size() : nextPos) - pos);
|
|
|
+ n.settings.allowManagedWhitelist.push_back(InetAddress(address));
|
|
|
+ if (nextPos == std::string::npos) break;
|
|
|
+ pos = nextPos + 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ n.settings.allowManaged = true;
|
|
|
+ }
|
|
|
+ n.settings.allowGlobal = nc.getB("allowGlobal", false);
|
|
|
+ n.settings.allowDefault = nc.getB("allowDefault", false);
|
|
|
}
|
|
|
} catch (std::exception &exc) {
|
|
|
#ifdef __WINDOWS__
|