summaryrefslogtreecommitdiff
path: root/controller
diff options
context:
space:
mode:
Diffstat (limited to 'controller')
-rw-r--r--controller/EmbeddedNetworkController.cpp26
-rw-r--r--controller/EmbeddedNetworkController.hpp1
-rw-r--r--controller/JSONDB.cpp44
-rw-r--r--controller/JSONDB.hpp2
4 files changed, 53 insertions, 20 deletions
diff --git a/controller/EmbeddedNetworkController.cpp b/controller/EmbeddedNetworkController.cpp
index 3ca0f536..f5bfce4e 100644
--- a/controller/EmbeddedNetworkController.cpp
+++ b/controller/EmbeddedNetworkController.cpp
@@ -645,16 +645,8 @@ unsigned int EmbeddedNetworkController::handleControlPlaneHttpPOST(
}
// Member is being de-authorized, so spray Revocation objects to all online members
- if (!newAuth) {
- Revocation rev((uint32_t)_node->prng(),nwid,0,now,ZT_REVOCATION_FLAG_FAST_PROPAGATE,Address(address),Revocation::CREDENTIAL_TYPE_COM);
- rev.sign(_signingId);
-
- Mutex::Lock _l(_memberStatus_m);
- for(auto i=_memberStatus.begin();i!=_memberStatus.end();++i) {
- if ((i->first.networkId == nwid)&&(i->second.online(now)))
- _node->ncSendRevocation(Address(i->first.nodeId),rev);
- }
- }
+ if (!newAuth)
+ onNetworkMemberDeauthorize(nwid,address);
}
}
@@ -1154,6 +1146,20 @@ void EmbeddedNetworkController::onNetworkMemberUpdate(const uint64_t networkId,c
} catch ( ... ) {}
}
+void EmbeddedNetworkController::onNetworkMemberDeauthorize(const uint64_t networkId,const uint64_t memberId)
+{
+ const uint64_t now = OSUtils::now();
+ Revocation rev((uint32_t)_node->prng(),networkId,0,now,ZT_REVOCATION_FLAG_FAST_PROPAGATE,Address(memberId),Revocation::CREDENTIAL_TYPE_COM);
+ rev.sign(_signingId);
+ {
+ Mutex::Lock _l(_memberStatus_m);
+ for(auto i=_memberStatus.begin();i!=_memberStatus.end();++i) {
+ if ((i->first.networkId == networkId)&&(i->second.online(now)))
+ _node->ncSendRevocation(Address(i->first.nodeId),rev);
+ }
+ }
+}
+
void EmbeddedNetworkController::threadMain()
throw()
{
diff --git a/controller/EmbeddedNetworkController.hpp b/controller/EmbeddedNetworkController.hpp
index cbbe07ac..d1217d60 100644
--- a/controller/EmbeddedNetworkController.hpp
+++ b/controller/EmbeddedNetworkController.hpp
@@ -96,6 +96,7 @@ public:
// Called on update via POST or by JSONDB on external update of network or network member records
void onNetworkUpdate(const uint64_t networkId);
void onNetworkMemberUpdate(const uint64_t networkId,const uint64_t memberId);
+ void onNetworkMemberDeauthorize(const uint64_t networkId,const uint64_t memberId);
void threadMain()
throw();
diff --git a/controller/JSONDB.cpp b/controller/JSONDB.cpp
index 9813239e..f362acf3 100644
--- a/controller/JSONDB.cpp
+++ b/controller/JSONDB.cpp
@@ -294,9 +294,9 @@ void JSONDB::threadMain()
if (obj.is_array()) {
for(unsigned long i=0;i<obj.size();++i)
- _add(obj[i]);
+ _addOrUpdate(obj[i]);
} else if (obj.is_object()) {
- _add(obj);
+ _addOrUpdate(obj);
}
} catch ( ... ) {} // ignore malformed JSON
@@ -399,14 +399,14 @@ void JSONDB::threadMain()
#endif
}
-bool JSONDB::_add(const nlohmann::json &j)
+bool JSONDB::_addOrUpdate(const nlohmann::json &j)
{
try {
if (j.is_object()) {
std::string id(OSUtils::jsonString(j["id"],"0"));
- std::string objtype(OSUtils::jsonString(j["objtype"],""));
-
+ const std::string objtype(OSUtils::jsonString(j["objtype"],""));
if ((id.length() == 16)&&(objtype == "network")) {
+
const uint64_t nwid = Utils::hexStrToU64(id.c_str());
if (nwid) {
bool update;
@@ -421,23 +421,49 @@ bool JSONDB::_add(const nlohmann::json &j)
_recomputeSummaryInfo(nwid);
return true;
}
+
} else if ((id.length() == 10)&&(objtype == "member")) {
+
const uint64_t mid = Utils::hexStrToU64(id.c_str());
const uint64_t nwid = Utils::hexStrToU64(OSUtils::jsonString(j["nwid"],"0").c_str());
if ((mid)&&(nwid)) {
- bool update;
+ bool update = false;
+ bool deauth = false;
{
Mutex::Lock _l(_networks_m);
std::vector<uint8_t> &m = _networks[nwid].members[mid];
- update = !m.empty();
+ if (!m.empty()) {
+ update = true;
+ nlohmann::json oldm(nlohmann::json::from_msgpack(m));
+ deauth = ((OSUtils::jsonBool(oldm["authorized"],false))&&(!OSUtils::jsonBool(j["authorized"],false)));
+ }
m = nlohmann::json::to_msgpack(j);
_members[mid].insert(nwid);
}
- if (update)
+ if (update) {
_parent->onNetworkMemberUpdate(nwid,mid);
+ if (deauth)
+ _parent->onNetworkMemberDeauthorize(nwid,mid);
+ }
_recomputeSummaryInfo(nwid);
return true;
}
+
+ } else if (objtype == "_delete") { // pseudo-object-type, only used in Central harnessed mode
+
+ const std::string deleteType(OSUtils::jsonString(j["deleteType"],""));
+ id = OSUtils::jsonString(j["deleteId"],"");
+ if ((deleteType == "network")&&(id.length() == 16)) {
+ eraseNetwork(Utils::hexStrToU64(id.c_str()));
+ } else if ((deleteType == "member")&&(id.length() == 10)) {
+ const std::string networkId(OSUtils::jsonString(j["deleteNetworkId"],""));
+ const uint64_t nwid = Utils::hexStrToU64(networkId.c_str());
+ const uint64_t mid = Utils::hexStrToU64(id.c_str());
+ if (networkId.length() == 16)
+ eraseNetworkMember(nwid,mid,true);
+ _parent->onNetworkMemberDeauthorize(nwid,mid);
+ }
+
}
}
} catch ( ... ) {}
@@ -455,7 +481,7 @@ bool JSONDB::_load(const std::string &p)
std::string buf;
if (OSUtils::readFile((p + ZT_PATH_SEPARATOR_S + *di).c_str(),buf)) {
try {
- _add(OSUtils::jsonParse(buf));
+ _addOrUpdate(OSUtils::jsonParse(buf));
} catch ( ... ) {}
}
} else {
diff --git a/controller/JSONDB.hpp b/controller/JSONDB.hpp
index 66d0138a..44f4d7f5 100644
--- a/controller/JSONDB.hpp
+++ b/controller/JSONDB.hpp
@@ -157,7 +157,7 @@ public:
throw();
private:
- bool _add(const nlohmann::json &j);
+ bool _addOrUpdate(const nlohmann::json &j);
bool _load(const std::string &p);
void _recomputeSummaryInfo(const uint64_t networkId);
std::string _genPath(const std::string &n,bool create);