mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-06-05 20:13:44 +02:00
Rules parsing stuff.
This commit is contained in:
parent
ce001198d8
commit
cc808cc2dd
1 changed files with 27 additions and 24 deletions
|
@ -14,15 +14,6 @@
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
|
||||||
* --
|
|
||||||
*
|
|
||||||
* ZeroTier may be used and distributed under the terms of the GPLv3, which
|
|
||||||
* are available at: http://www.gnu.org/licenses/gpl-3.0.html
|
|
||||||
*
|
|
||||||
* If you would like to embed ZeroTier into a commercial application or
|
|
||||||
* redistribute it in a modified binary form, please contact ZeroTier Networks
|
|
||||||
* LLC. Start here: http://www.zerotier.com/
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
@ -639,7 +630,6 @@ NetworkController::ResultCode SqliteNetworkController::doNetworkConfigRequest(co
|
||||||
member["id"] = identity.address().toString();
|
member["id"] = identity.address().toString();
|
||||||
member["address"] = member["id"];
|
member["address"] = member["id"];
|
||||||
member["nwid"] = network["id"];
|
member["nwid"] = network["id"];
|
||||||
member["lastModified"] = now;
|
|
||||||
member["memberRevision"] = member.value("memberRevision",0ULL) + 1;
|
member["memberRevision"] = member.value("memberRevision",0ULL) + 1;
|
||||||
|
|
||||||
// Update member log
|
// Update member log
|
||||||
|
@ -666,14 +656,12 @@ NetworkController::ResultCode SqliteNetworkController::doNetworkConfigRequest(co
|
||||||
member["recentLog"] = recentLog;
|
member["recentLog"] = recentLog;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!member.value("authorized",false)) {
|
// Stop if network is private and member is not authorized
|
||||||
if (network.value("private",true)) {
|
if ( (network.value("private",true)) && (!member.value("authorized",false)) ) {
|
||||||
_writeJson(memberJP,member);
|
_writeJson(memberJP,member);
|
||||||
return NetworkController::NETCONF_QUERY_ACCESS_DENIED;
|
return NetworkController::NETCONF_QUERY_ACCESS_DENIED;
|
||||||
} else {
|
|
||||||
member["authorized"] = true; // auto-authorize on public networks
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
// Else compose and send network config
|
||||||
|
|
||||||
nc.networkId = nwid;
|
nc.networkId = nwid;
|
||||||
nc.type = network.value("private",true) ? ZT_NETWORK_TYPE_PRIVATE : ZT_NETWORK_TYPE_PUBLIC;
|
nc.type = network.value("private",true) ? ZT_NETWORK_TYPE_PRIVATE : ZT_NETWORK_TYPE_PUBLIC;
|
||||||
|
@ -1094,6 +1082,7 @@ unsigned int SqliteNetworkController::handleControlPlaneHttpPOST(
|
||||||
try {
|
try {
|
||||||
if (b.count("authorized")) member["authorized"] = b.value("authorized",false);
|
if (b.count("authorized")) member["authorized"] = b.value("authorized",false);
|
||||||
if ((b.count("identity"))&&(!member.count("identity"))) member["identity"] = b.value("identity",""); // allow identity to be populated only if not already known
|
if ((b.count("identity"))&&(!member.count("identity"))) member["identity"] = b.value("identity",""); // allow identity to be populated only if not already known
|
||||||
|
|
||||||
if (b.count("ipAssignments")) {
|
if (b.count("ipAssignments")) {
|
||||||
auto ipa = b["ipAssignments"];
|
auto ipa = b["ipAssignments"];
|
||||||
if (ipa.is_array()) {
|
if (ipa.is_array()) {
|
||||||
|
@ -1119,8 +1108,8 @@ unsigned int SqliteNetworkController::handleControlPlaneHttpPOST(
|
||||||
member["id"] = addrs;
|
member["id"] = addrs;
|
||||||
member["address"] = addrs; // legacy
|
member["address"] = addrs; // legacy
|
||||||
member["nwid"] = nwids;
|
member["nwid"] = nwids;
|
||||||
member["lastModified"] = OSUtils::now();
|
|
||||||
member["memberRevision"] = member.value("memberRevision",0ULL) + 1;
|
member["memberRevision"] = member.value("memberRevision",0ULL) + 1;
|
||||||
|
member["objtype"] = "member";
|
||||||
|
|
||||||
_writeJson(_memberJP(nwid,Address(address),true).c_str(),member);
|
_writeJson(_memberJP(nwid,Address(address),true).c_str(),member);
|
||||||
|
|
||||||
|
@ -1144,12 +1133,12 @@ unsigned int SqliteNetworkController::handleControlPlaneHttpPOST(
|
||||||
auto hops2 = hops[i];
|
auto hops2 = hops[i];
|
||||||
if (hops2.is_array()) {
|
if (hops2.is_array()) {
|
||||||
for(unsigned long j=0;j<hops2.size();++j) {
|
for(unsigned long j=0;j<hops2.size();++j) {
|
||||||
std::string hop = hops2[j];
|
std::string s = hops2[j];
|
||||||
test->hops[test->hopCount].addresses[test->hops[test->hopCount].breadth++] = Utils::hexStrToU64(hop.c_str()) & 0xffffffffffULL;
|
test->hops[test->hopCount].addresses[test->hops[test->hopCount].breadth++] = Utils::hexStrToU64(s.c_str()) & 0xffffffffffULL;
|
||||||
}
|
}
|
||||||
} else if (hops2.is_string()) {
|
} else if (hops2.is_string()) {
|
||||||
std::string hop = hops2;
|
std::string s = hops2;
|
||||||
test->hops[test->hopCount].addresses[test->hops[test->hopCount].breadth++] = Utils::hexStrToU64(hop.c_str()) & 0xffffffffffULL;
|
test->hops[test->hopCount].addresses[test->hops[test->hopCount].breadth++] = Utils::hexStrToU64(s.c_str()) & 0xffffffffffULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1303,11 +1292,20 @@ unsigned int SqliteNetworkController::handleControlPlaneHttpPOST(
|
||||||
if (b.count("rules")) {
|
if (b.count("rules")) {
|
||||||
auto rules = b["rules"];
|
auto rules = b["rules"];
|
||||||
if (rules.is_array()) {
|
if (rules.is_array()) {
|
||||||
|
json nrules = json::array();
|
||||||
for(unsigned long i=0;i<rules.size();++i) {
|
for(unsigned long i=0;i<rules.size();++i) {
|
||||||
auto rule = rules[i];
|
json rule = rules[i];
|
||||||
if (rule.is_object()) {
|
if (rule.is_object()) {
|
||||||
|
ZT_VirtualNetworkRule ztr;
|
||||||
|
if (_parseRule(rule,ztr)) {
|
||||||
|
rule = _renderRule(ztr);
|
||||||
|
if ((rule.is_object())&&(rule.count("type"))) {
|
||||||
|
nrules.push_back(rule);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
network["rules"] = nrules;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch ( ... ) {
|
} catch ( ... ) {
|
||||||
|
@ -1323,12 +1321,17 @@ unsigned int SqliteNetworkController::handleControlPlaneHttpPOST(
|
||||||
if (!network.count("activeBridges")) network["activeBridges"] = json::array();
|
if (!network.count("activeBridges")) network["activeBridges"] = json::array();
|
||||||
|
|
||||||
if (!network.count("rules")) {
|
if (!network.count("rules")) {
|
||||||
|
// If unspecified, rules are set to allow anything and behave like a flat L2 segment
|
||||||
|
network["rules"] = {
|
||||||
|
{ "not",false },
|
||||||
|
{ "type","ACTION_ACCEPT" }
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
network["id"] = nwids;
|
network["id"] = nwids;
|
||||||
network["nwid"] = nwids; // legacy
|
network["nwid"] = nwids; // legacy
|
||||||
network["lastModified"] = OSUtils::now();
|
|
||||||
network["revision"] = network.value("revision",0ULL) + 1ULL;
|
network["revision"] = network.value("revision",0ULL) + 1ULL;
|
||||||
|
network["objtype"] = "network";
|
||||||
|
|
||||||
_writeJson(_networkJP(nwid,true),network);
|
_writeJson(_networkJP(nwid,true),network);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue