summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--controller/DB.cpp70
-rw-r--r--controller/DB.hpp20
-rw-r--r--controller/EmbeddedNetworkController.cpp14
-rw-r--r--controller/EmbeddedNetworkController.hpp67
4 files changed, 97 insertions, 74 deletions
diff --git a/controller/DB.cpp b/controller/DB.cpp
index 2f09205b..688fede2 100644
--- a/controller/DB.cpp
+++ b/controller/DB.cpp
@@ -27,6 +27,76 @@ using json = nlohmann::json;
namespace ZeroTier {
+void DB::initNetwork(nlohmann::json &network)
+{
+ if (!network.count("private")) network["private"] = true;
+ if (!network.count("creationTime")) network["creationTime"] = OSUtils::now();
+ if (!network.count("name")) network["name"] = "";
+ if (!network.count("multicastLimit")) network["multicastLimit"] = (uint64_t)32;
+ if (!network.count("enableBroadcast")) network["enableBroadcast"] = true;
+ if (!network.count("v4AssignMode")) network["v4AssignMode"] = {{"zt",false}};
+ if (!network.count("v6AssignMode")) network["v6AssignMode"] = {{"rfc4193",false},{"zt",false},{"6plane",false}};
+ if (!network.count("authTokens")) network["authTokens"] = {{}};
+ if (!network.count("capabilities")) network["capabilities"] = nlohmann::json::array();
+ if (!network.count("tags")) network["tags"] = nlohmann::json::array();
+ if (!network.count("routes")) network["routes"] = nlohmann::json::array();
+ if (!network.count("ipAssignmentPools")) network["ipAssignmentPools"] = nlohmann::json::array();
+ if (!network.count("anchors")) network["anchors"] = nlohmann::json::array();
+ if (!network.count("mtu")) network["mtu"] = ZT_DEFAULT_MTU;
+ if (!network.count("remoteTraceTarget")) network["remoteTraceTarget"] = nlohmann::json();
+ if (!network.count("removeTraceLevel")) network["remoteTraceLevel"] = 0;
+ if (!network.count("rules")) {
+ // If unspecified, rules are set to allow anything and behave like a flat L2 segment
+ network["rules"] = {{
+ { "not",false },
+ { "or", false },
+ { "type","ACTION_ACCEPT" }
+ }};
+ }
+ network["objtype"] = "network";
+}
+
+void DB::initMember(nlohmann::json &member)
+{
+ if (!member.count("authorized")) member["authorized"] = false;
+ if (!member.count("ipAssignments")) member["ipAssignments"] = nlohmann::json::array();
+ if (!member.count("activeBridge")) member["activeBridge"] = false;
+ if (!member.count("tags")) member["tags"] = nlohmann::json::array();
+ if (!member.count("capabilities")) member["capabilities"] = nlohmann::json::array();
+ if (!member.count("creationTime")) member["creationTime"] = OSUtils::now();
+ if (!member.count("noAutoAssignIps")) member["noAutoAssignIps"] = false;
+ if (!member.count("revision")) member["revision"] = 0ULL;
+ if (!member.count("lastDeauthorizedTime")) member["lastDeauthorizedTime"] = 0ULL;
+ if (!member.count("lastAuthorizedTime")) member["lastAuthorizedTime"] = 0ULL;
+ if (!member.count("lastAuthorizedCredentialType")) member["lastAuthorizedCredentialType"] = nlohmann::json();
+ if (!member.count("lastAuthorizedCredential")) member["lastAuthorizedCredential"] = nlohmann::json();
+ if (!member.count("vMajor")) member["vMajor"] = -1;
+ if (!member.count("vMinor")) member["vMinor"] = -1;
+ if (!member.count("vRev")) member["vRev"] = -1;
+ if (!member.count("vProto")) member["vProto"] = -1;
+ if (!member.count("remoteTraceTarget")) member["remoteTraceTarget"] = nlohmann::json();
+ if (!member.count("removeTraceLevel")) member["remoteTraceLevel"] = 0;
+ member["objtype"] = "member";
+}
+
+void DB::cleanNetwork(nlohmann::json &network)
+{
+ network.erase("clock");
+ network.erase("authorizedMemberCount");
+ network.erase("activeMemberCount");
+ network.erase("totalMemberCount");
+ network.erase("lastModified");
+}
+
+void DB::cleanMember(nlohmann::json &member)
+{
+ member.erase("clock");
+ member.erase("physicalAddr");
+ member.erase("recentLog");
+ member.erase("lastModified");
+ member.erase("lastRequestMetaData");
+}
+
DB::DB(EmbeddedNetworkController *const nc,const Identity &myId,const char *path) :
_controller(nc),
_myId(myId),
diff --git a/controller/DB.hpp b/controller/DB.hpp
index 4c7a16b2..abd1483e 100644
--- a/controller/DB.hpp
+++ b/controller/DB.hpp
@@ -58,6 +58,26 @@ public:
int64_t mostRecentDeauthTime;
};
+ /**
+ * Ensure that all network fields are present
+ */
+ static void initNetwork(nlohmann::json &network);
+
+ /**
+ * Ensure that all member fields are present
+ */
+ static void initMember(nlohmann::json &member);
+
+ /**
+ * Remove old and temporary network fields
+ */
+ static void cleanNetwork(nlohmann::json &network);
+
+ /**
+ * Remove old and temporary member fields
+ */
+ static void cleanMember(nlohmann::json &member);
+
DB(EmbeddedNetworkController *const nc,const Identity &myId,const char *path);
virtual ~DB();
diff --git a/controller/EmbeddedNetworkController.cpp b/controller/EmbeddedNetworkController.cpp
index 2032f097..37eff0a4 100644
--- a/controller/EmbeddedNetworkController.cpp
+++ b/controller/EmbeddedNetworkController.cpp
@@ -648,7 +648,7 @@ unsigned int EmbeddedNetworkController::handleControlPlaneHttpPOST(
json member,network;
_db->get(nwid,network,address,member);
json origMember(member); // for detecting changes
- _initMember(member);
+ DB::initMember(member);
try {
if (b.count("activeBridge")) member["activeBridge"] = OSUtils::jsonBool(b["activeBridge"],false);
@@ -734,7 +734,7 @@ unsigned int EmbeddedNetworkController::handleControlPlaneHttpPOST(
member["address"] = addrs; // legacy
member["nwid"] = nwids;
- _cleanMember(member);
+ DB::cleanMember(member);
_db->save(&origMember,member);
responseBody = OSUtils::jsonDump(member);
responseContentType = "application/json";
@@ -767,7 +767,7 @@ unsigned int EmbeddedNetworkController::handleControlPlaneHttpPOST(
json network;
_db->get(nwid,network);
json origNetwork(network); // for detecting changes
- _initNetwork(network);
+ DB::initNetwork(network);
try {
if (b.count("name")) network["name"] = OSUtils::jsonString(b["name"],"");
@@ -981,7 +981,7 @@ unsigned int EmbeddedNetworkController::handleControlPlaneHttpPOST(
network["id"] = nwids;
network["nwid"] = nwids; // legacy
- _cleanNetwork(network);
+ DB::cleanNetwork(network);
_db->save(&origNetwork,network);
responseBody = OSUtils::jsonDump(network);
@@ -1183,7 +1183,7 @@ void EmbeddedNetworkController::_request(
}
origMember = member;
const bool newMember = ((!member.is_object())||(member.size() == 0));
- _initMember(member);
+ DB::initMember(member);
{
const std::string haveIdStr(OSUtils::jsonString(member["identity"],""));
@@ -1281,7 +1281,7 @@ void EmbeddedNetworkController::_request(
}
} else {
// If they are not authorized, STOP!
- _cleanMember(member);
+ DB::cleanMember(member);
_db->save(&origMember,member);
_sender->ncSendError(nwid,requestPacketId,identity.address(),NetworkController::NC_ERROR_ACCESS_DENIED);
return;
@@ -1646,7 +1646,7 @@ void EmbeddedNetworkController::_request(
return;
}
- _cleanMember(member);
+ DB::cleanMember(member);
_db->save(&origMember,member);
_sender->ncSendConfig(nwid,requestPacketId,identity.address(),*(nc.get()),metaData.getUI(ZT_NETWORKCONFIG_REQUEST_METADATA_KEY_VERSION,0) < 6);
}
diff --git a/controller/EmbeddedNetworkController.hpp b/controller/EmbeddedNetworkController.hpp
index 5864100d..e9b4764a 100644
--- a/controller/EmbeddedNetworkController.hpp
+++ b/controller/EmbeddedNetworkController.hpp
@@ -105,73 +105,6 @@ private:
void _request(uint64_t nwid,const InetAddress &fromAddr,uint64_t requestPacketId,const Identity &identity,const Dictionary<ZT_NETWORKCONFIG_METADATA_DICT_CAPACITY> &metaData);
void _startThreads();
- // These init objects with default and static/informational fields
- inline void _initMember(nlohmann::json &member)
- {
- if (!member.count("authorized")) member["authorized"] = false;
- if (!member.count("ipAssignments")) member["ipAssignments"] = nlohmann::json::array();
- if (!member.count("activeBridge")) member["activeBridge"] = false;
- if (!member.count("tags")) member["tags"] = nlohmann::json::array();
- if (!member.count("capabilities")) member["capabilities"] = nlohmann::json::array();
- if (!member.count("creationTime")) member["creationTime"] = OSUtils::now();
- if (!member.count("noAutoAssignIps")) member["noAutoAssignIps"] = false;
- if (!member.count("revision")) member["revision"] = 0ULL;
- if (!member.count("lastDeauthorizedTime")) member["lastDeauthorizedTime"] = 0ULL;
- if (!member.count("lastAuthorizedTime")) member["lastAuthorizedTime"] = 0ULL;
- if (!member.count("lastAuthorizedCredentialType")) member["lastAuthorizedCredentialType"] = nlohmann::json();
- if (!member.count("lastAuthorizedCredential")) member["lastAuthorizedCredential"] = nlohmann::json();
- if (!member.count("vMajor")) member["vMajor"] = -1;
- if (!member.count("vMinor")) member["vMinor"] = -1;
- if (!member.count("vRev")) member["vRev"] = -1;
- if (!member.count("vProto")) member["vProto"] = -1;
- if (!member.count("remoteTraceTarget")) member["remoteTraceTarget"] = nlohmann::json();
- if (!member.count("removeTraceLevel")) member["remoteTraceLevel"] = 0;
- member["objtype"] = "member";
- }
- inline void _initNetwork(nlohmann::json &network)
- {
- if (!network.count("private")) network["private"] = true;
- if (!network.count("creationTime")) network["creationTime"] = OSUtils::now();
- if (!network.count("name")) network["name"] = "";
- if (!network.count("multicastLimit")) network["multicastLimit"] = (uint64_t)32;
- if (!network.count("enableBroadcast")) network["enableBroadcast"] = true;
- if (!network.count("v4AssignMode")) network["v4AssignMode"] = {{"zt",false}};
- if (!network.count("v6AssignMode")) network["v6AssignMode"] = {{"rfc4193",false},{"zt",false},{"6plane",false}};
- if (!network.count("authTokens")) network["authTokens"] = {{}};
- if (!network.count("capabilities")) network["capabilities"] = nlohmann::json::array();
- if (!network.count("tags")) network["tags"] = nlohmann::json::array();
- if (!network.count("routes")) network["routes"] = nlohmann::json::array();
- if (!network.count("ipAssignmentPools")) network["ipAssignmentPools"] = nlohmann::json::array();
- if (!network.count("mtu")) network["mtu"] = ZT_DEFAULT_MTU;
- if (!network.count("remoteTraceTarget")) network["remoteTraceTarget"] = nlohmann::json();
- if (!network.count("removeTraceLevel")) network["remoteTraceLevel"] = 0;
- if (!network.count("rules")) {
- // If unspecified, rules are set to allow anything and behave like a flat L2 segment
- network["rules"] = {{
- { "not",false },
- { "or", false },
- { "type","ACTION_ACCEPT" }
- }};
- }
- network["objtype"] = "network";
- }
- inline void _cleanNetwork(nlohmann::json &network)
- {
- network.erase("clock");
- network.erase("authorizedMemberCount");
- network.erase("activeMemberCount");
- network.erase("totalMemberCount");
- network.erase("lastModified");
- }
- inline void _cleanMember(nlohmann::json &member)
- {
- member.erase("clock");
- member.erase("physicalAddr");
- member.erase("recentLog");
- member.erase("lastModified");
- member.erase("lastRequestMetaData");
- }
-
struct _RQEntry
{
uint64_t nwid;