Răsfoiți Sursa

Rules parsing stuff.

Adam Ierymenko 9 ani în urmă
părinte
comite
cc808cc2dd
1 a modificat fișierele cu 27 adăugiri și 24 ștergeri
  1. 27 24
      controller/SqliteNetworkController.cpp

+ 27 - 24
controller/SqliteNetworkController.cpp

@@ -14,15 +14,6 @@
  *
  * You should have received a copy of the GNU General Public License
  * 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>
@@ -639,7 +630,6 @@ NetworkController::ResultCode SqliteNetworkController::doNetworkConfigRequest(co
 	member["id"] = identity.address().toString();
 	member["address"] = member["id"];
 	member["nwid"] = network["id"];
-	member["lastModified"] = now;
 	member["memberRevision"] = member.value("memberRevision",0ULL) + 1;
 
 	// Update member log
@@ -666,14 +656,12 @@ NetworkController::ResultCode SqliteNetworkController::doNetworkConfigRequest(co
 		member["recentLog"] = recentLog;
 	}
 
-	if (!member.value("authorized",false)) {
-		if (network.value("private",true)) {
-			_writeJson(memberJP,member);
-			return NetworkController::NETCONF_QUERY_ACCESS_DENIED;
-		} else {
-			member["authorized"] = true; // auto-authorize on public networks
-		}
+	// Stop if network is private and member is not authorized
+	if ( (network.value("private",true)) && (!member.value("authorized",false)) ) {
+		_writeJson(memberJP,member);
+		return NetworkController::NETCONF_QUERY_ACCESS_DENIED;
 	}
+	// Else compose and send network config
 
 	nc.networkId = nwid;
 	nc.type = network.value("private",true) ? ZT_NETWORK_TYPE_PRIVATE : ZT_NETWORK_TYPE_PUBLIC;
@@ -1094,6 +1082,7 @@ unsigned int SqliteNetworkController::handleControlPlaneHttpPOST(
 					try {
 						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("ipAssignments")) {
 							auto ipa = b["ipAssignments"];
 							if (ipa.is_array()) {
@@ -1119,8 +1108,8 @@ unsigned int SqliteNetworkController::handleControlPlaneHttpPOST(
 					member["id"] = addrs;
 					member["address"] = addrs; // legacy
 					member["nwid"] = nwids;
-					member["lastModified"] = OSUtils::now();
 					member["memberRevision"] = member.value("memberRevision",0ULL) + 1;
+					member["objtype"] = "member";
 
 					_writeJson(_memberJP(nwid,Address(address),true).c_str(),member);
 
@@ -1144,12 +1133,12 @@ unsigned int SqliteNetworkController::handleControlPlaneHttpPOST(
 							auto hops2 = hops[i];
 							if (hops2.is_array()) {
 								for(unsigned long j=0;j<hops2.size();++j) {
-									std::string hop = hops2[j];
-									test->hops[test->hopCount].addresses[test->hops[test->hopCount].breadth++] = Utils::hexStrToU64(hop.c_str()) & 0xffffffffffULL;
+									std::string s = hops2[j];
+									test->hops[test->hopCount].addresses[test->hops[test->hopCount].breadth++] = Utils::hexStrToU64(s.c_str()) & 0xffffffffffULL;
 								}
 							} else if (hops2.is_string()) {
-								std::string hop = hops2;
-								test->hops[test->hopCount].addresses[test->hops[test->hopCount].breadth++] = Utils::hexStrToU64(hop.c_str()) & 0xffffffffffULL;
+								std::string s = hops2;
+								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")) {
 						auto rules = b["rules"];
 						if (rules.is_array()) {
+							json nrules = json::array();
 							for(unsigned long i=0;i<rules.size();++i) {
-								auto rule = rules[i];
+								json rule = rules[i];
 								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 ( ... ) {
@@ -1323,12 +1321,17 @@ unsigned int SqliteNetworkController::handleControlPlaneHttpPOST(
 				if (!network.count("activeBridges")) network["activeBridges"] = json::array();
 
 				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["nwid"] = nwids; // legacy
-				network["lastModified"] = OSUtils::now();
 				network["revision"] = network.value("revision",0ULL) + 1ULL;
+				network["objtype"] = "network";
 
 				_writeJson(_networkJP(nwid,true),network);