|
|
|
|
@ -168,6 +168,15 @@ struct MemberRecord
|
|
|
|
|
bool activeBridge; |
|
|
|
|
uint64_t lastRequestTime; |
|
|
|
|
MemberRecentHistory recentHistory; |
|
|
|
|
|
|
|
|
|
MemberRecord() : |
|
|
|
|
rowid(0), |
|
|
|
|
authorized(false), |
|
|
|
|
activeBridge(false), |
|
|
|
|
lastRequestTime(0) |
|
|
|
|
{ |
|
|
|
|
nodeId[0] = (char)0; |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
struct NetworkRecord |
|
|
|
|
@ -182,6 +191,20 @@ struct NetworkRecord
|
|
|
|
|
uint64_t creationTime; |
|
|
|
|
uint64_t revision; |
|
|
|
|
uint64_t memberRevisionCounter; |
|
|
|
|
|
|
|
|
|
NetworkRecord() : |
|
|
|
|
name((const char *)0), |
|
|
|
|
flags(0), |
|
|
|
|
isPrivate(true), |
|
|
|
|
enableBroadcast(false), |
|
|
|
|
allowPassiveBridging(false), |
|
|
|
|
multicastLimit(0), |
|
|
|
|
creationTime(0), |
|
|
|
|
revision(0), |
|
|
|
|
memberRevisionCounter(0) |
|
|
|
|
{ |
|
|
|
|
id[0] = (char)0; |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
} // anonymous namespace
|
|
|
|
|
@ -469,11 +492,9 @@ NetworkController::ResultCode SqliteNetworkController::doNetworkConfigRequest(co
|
|
|
|
|
const uint64_t now = OSUtils::now(); |
|
|
|
|
|
|
|
|
|
NetworkRecord network; |
|
|
|
|
memset(&network,0,sizeof(network)); |
|
|
|
|
Utils::snprintf(network.id,sizeof(network.id),"%.16llx",(unsigned long long)nwid); |
|
|
|
|
|
|
|
|
|
MemberRecord member; |
|
|
|
|
memset(&member,0,sizeof(member)); |
|
|
|
|
Utils::snprintf(member.nodeId,sizeof(member.nodeId),"%.10llx",(unsigned long long)identity.address().toInt()); |
|
|
|
|
|
|
|
|
|
{ // begin lock
|
|
|
|
|
@ -567,41 +588,38 @@ NetworkController::ResultCode SqliteNetworkController::doNetworkConfigRequest(co
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Update Member.history
|
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
std::string fastr; |
|
|
|
|
if (fromAddr) { |
|
|
|
|
fastr.push_back('"'); |
|
|
|
|
fastr.append(_jsonEscape(fromAddr.toString())); |
|
|
|
|
fastr.push_back('"'); |
|
|
|
|
} |
|
|
|
|
char mh[4096]; |
|
|
|
|
char mh[1024]; |
|
|
|
|
Utils::snprintf(mh,sizeof(mh), |
|
|
|
|
"{" |
|
|
|
|
"\"ts\":%llu," |
|
|
|
|
"\"authorized\":%s," |
|
|
|
|
"\"clientMajorVersion\":%u," |
|
|
|
|
"\"clientMinorVersion\":%u," |
|
|
|
|
"\"clientRevision\":%u," |
|
|
|
|
"\"fromAddr\":%s" |
|
|
|
|
"}", |
|
|
|
|
"{\"ts\":%llu,\"authorized\":%s,\"clientMajorVersion\":%u,\"clientMinorVersion\":%u,\"clientRevision\":%u,\"fromAddr\":", |
|
|
|
|
(unsigned long long)now, |
|
|
|
|
(member.authorized) ? "true" : "false", |
|
|
|
|
((member.authorized) ? "true" : "false"), |
|
|
|
|
metaData.getUI(ZT_NETWORKCONFIG_REQUEST_METADATA_KEY_NODE_MAJOR_VERSION,0), |
|
|
|
|
metaData.getUI(ZT_NETWORKCONFIG_REQUEST_METADATA_KEY_NODE_MINOR_VERSION,0), |
|
|
|
|
metaData.getUI(ZT_NETWORKCONFIG_REQUEST_METADATA_KEY_NODE_REVISION,0), |
|
|
|
|
(fastr.length() > 0) ? fastr.c_str() : "null"); |
|
|
|
|
metaData.getUI(ZT_NETWORKCONFIG_REQUEST_METADATA_KEY_NODE_REVISION,0)); |
|
|
|
|
member.recentHistory.push_front(std::string(mh)); |
|
|
|
|
if (fromAddr) { |
|
|
|
|
member.recentHistory.front().push_back('"'); |
|
|
|
|
member.recentHistory.front().append(_jsonEscape(fromAddr.toString())); |
|
|
|
|
member.recentHistory.front().append("\"}"); |
|
|
|
|
} else { |
|
|
|
|
member.recentHistory.front().append("null}"); |
|
|
|
|
} |
|
|
|
|
while (member.recentHistory.size() > ZT_NETCONF_DB_MEMBER_HISTORY_LENGTH) |
|
|
|
|
member.recentHistory.pop_back(); |
|
|
|
|
std::string rhblob(member.recentHistory.toBlob()); |
|
|
|
|
sqlite3_reset(_sUpdateMemberHistory); |
|
|
|
|
sqlite3_bind_int64(_sUpdateMemberHistory,1,(int64_t)now); |
|
|
|
|
sqlite3_bind_blob(_sUpdateMemberHistory,2,(const void *)rhblob.data(),rhblob.length(),SQLITE_STATIC); |
|
|
|
|
sqlite3_bind_int64(_sUpdateMemberHistory,1,(sqlite3_int64)now); |
|
|
|
|
sqlite3_bind_blob(_sUpdateMemberHistory,2,(const void *)rhblob.data(),(int)rhblob.length(),SQLITE_STATIC); |
|
|
|
|
sqlite3_bind_int64(_sUpdateMemberHistory,3,member.rowid); |
|
|
|
|
sqlite3_step(_sUpdateMemberHistory); |
|
|
|
|
if (sqlite3_step(_sUpdateMemberHistory) != SQLITE_DONE) { |
|
|
|
|
printf("!!! %s\n",sqlite3_errmsg(_db)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Don't proceed if member is not authorized
|
|
|
|
|
// Don't proceed if member is not authorized! ---------------------------
|
|
|
|
|
|
|
|
|
|
if (!member.authorized) |
|
|
|
|
return NetworkController::NETCONF_QUERY_ACCESS_DENIED; |
|
|
|
|
|
|
|
|
|
|