|
@@ -453,6 +453,8 @@ void EmbeddedNetworkController::init(const Identity &signingId,Sender *sender)
|
|
|
{
|
|
|
this->_sender = sender;
|
|
|
this->_signingId = signingId;
|
|
|
+ char tmp[64];
|
|
|
+ this->_signingIdAddressString = signingId.address().toString(tmp);
|
|
|
}
|
|
|
|
|
|
void EmbeddedNetworkController::request(
|
|
@@ -1085,51 +1087,80 @@ unsigned int EmbeddedNetworkController::handleControlPlaneHttpDELETE(
|
|
|
|
|
|
void EmbeddedNetworkController::handleRemoteTrace(const ZT_RemoteTrace &rt)
|
|
|
{
|
|
|
- // Convert Dictionary into JSON object
|
|
|
- json d;
|
|
|
- char *saveptr = (char *)0;
|
|
|
- for(char *l=Utils::stok(rt.data,"\n",&saveptr);(l);l=Utils::stok((char *)0,"\n",&saveptr)) {
|
|
|
- char *eq = strchr(l,'=');
|
|
|
- if (eq > l) {
|
|
|
- std::string k(l,(unsigned long)(eq - l));
|
|
|
- std::string v;
|
|
|
- ++eq;
|
|
|
- while (*eq) {
|
|
|
- if (*eq == '\\') {
|
|
|
- ++eq;
|
|
|
- if (*eq) {
|
|
|
- switch(*eq) {
|
|
|
- case 'r':
|
|
|
- v.push_back('\r');
|
|
|
- break;
|
|
|
- case 'n':
|
|
|
- v.push_back('\n');
|
|
|
- break;
|
|
|
- case '0':
|
|
|
- v.push_back((char)0);
|
|
|
- break;
|
|
|
- case 'e':
|
|
|
- v.push_back('=');
|
|
|
- break;
|
|
|
- default:
|
|
|
- v.push_back(*eq);
|
|
|
- break;
|
|
|
- }
|
|
|
+ try {
|
|
|
+ std::vector<uint64_t> nw4m(_db.networksForMember(rt.origin));
|
|
|
+ if (nw4m.empty()) // ignore these for unknown members
|
|
|
+ return;
|
|
|
+
|
|
|
+ // Convert Dictionary into JSON object
|
|
|
+ json d;
|
|
|
+ char *saveptr = (char *)0;
|
|
|
+ for(char *l=Utils::stok(rt.data,"\n",&saveptr);(l);l=Utils::stok((char *)0,"\n",&saveptr)) {
|
|
|
+ char *eq = strchr(l,'=');
|
|
|
+ if (eq > l) {
|
|
|
+ std::string k(l,(unsigned long)(eq - l));
|
|
|
+ std::string v;
|
|
|
+ ++eq;
|
|
|
+ while (*eq) {
|
|
|
+ if (*eq == '\\') {
|
|
|
++eq;
|
|
|
+ if (*eq) {
|
|
|
+ switch(*eq) {
|
|
|
+ case 'r':
|
|
|
+ v.push_back('\r');
|
|
|
+ break;
|
|
|
+ case 'n':
|
|
|
+ v.push_back('\n');
|
|
|
+ break;
|
|
|
+ case '0':
|
|
|
+ v.push_back((char)0);
|
|
|
+ break;
|
|
|
+ case 'e':
|
|
|
+ v.push_back('=');
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ v.push_back(*eq);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ ++eq;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ v.push_back(*(eq++));
|
|
|
}
|
|
|
- } else {
|
|
|
- v.push_back(*(eq++));
|
|
|
}
|
|
|
+ if (v.length() > 0)
|
|
|
+ d[k] = v;
|
|
|
}
|
|
|
- if (v.length() > 0)
|
|
|
- d[k] = v;
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- char p[128];
|
|
|
- OSUtils::ztsnprintf(p,sizeof(p),"trace/%.10llx_%.16llx.json",rt.origin,OSUtils::now());
|
|
|
- _db.writeRaw(p,OSUtils::jsonDump(d));
|
|
|
- //fprintf(stdout,"%s\n",OSUtils::jsonDump(d).c_str()); fflush(stdout);
|
|
|
+ bool accept = false;
|
|
|
+ for(std::vector<uint64_t>::const_iterator nwid(nw4m.begin());nwid!=nw4m.end();++nwid) {
|
|
|
+ json nconf;
|
|
|
+ if (_db.getNetwork(*nwid,nconf)) {
|
|
|
+ try {
|
|
|
+ if (OSUtils::jsonString(nconf["remoteTraceTarget"],"") == _signingIdAddressString) {
|
|
|
+ accept = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ } catch ( ... ) {} // ignore missing fields or other errors, drop trace message
|
|
|
+ }
|
|
|
+ if (_db.getNetworkMember(*nwid,rt.origin,nconf)) {
|
|
|
+ try {
|
|
|
+ if (OSUtils::jsonString(nconf["remoteTraceTarget"],"") == _signingIdAddressString) {
|
|
|
+ accept = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ } catch ( ... ) {} // ignore missing fields or other errors, drop trace message
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (accept) {
|
|
|
+ char p[128];
|
|
|
+ OSUtils::ztsnprintf(p,sizeof(p),"trace/%.10llx_%.16llx.json",rt.origin,OSUtils::now());
|
|
|
+ _db.writeRaw(p,OSUtils::jsonDump(d));
|
|
|
+ }
|
|
|
+ } catch ( ... ) {
|
|
|
+ // drop invalid trace messages if an error occurs
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
void EmbeddedNetworkController::threadMain()
|
|
@@ -1381,6 +1412,16 @@ void EmbeddedNetworkController::_request(
|
|
|
nc->mtu = std::max(std::min((unsigned int)OSUtils::jsonInt(network["mtu"],ZT_DEFAULT_MTU),(unsigned int)ZT_MAX_MTU),(unsigned int)ZT_MIN_MTU);
|
|
|
nc->multicastLimit = (unsigned int)OSUtils::jsonInt(network["multicastLimit"],32ULL);
|
|
|
|
|
|
+ std::string rtt(OSUtils::jsonString(member["remoteTraceTarget"],""));
|
|
|
+ if (rtt.length() == 10) {
|
|
|
+ nc->remoteTraceTarget = Address(Utils::hexStrToU64(rtt.c_str()));
|
|
|
+ } else {
|
|
|
+ rtt = OSUtils::jsonString(network["remoteTraceTarget"],"");
|
|
|
+ if (rtt.length() == 10) {
|
|
|
+ nc->remoteTraceTarget = Address(Utils::hexStrToU64(rtt.c_str()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
for(std::vector<Address>::const_iterator ab(ns.activeBridges.begin());ab!=ns.activeBridges.end();++ab)
|
|
|
nc->addSpecialist(*ab,ZT_NETWORKCONFIG_SPECIALIST_TYPE_ACTIVE_BRIDGE);
|
|
|
|