From 4d26b5a8688f38f125409f65d51d935b35aacd6b Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Tue, 5 Oct 2021 17:02:50 -0700 Subject: [PATCH] no reason for this to be a pointer --- controller/PostgreSQL.cpp | 118 ++++++++++++++++++++------------------ 1 file changed, 62 insertions(+), 56 deletions(-) diff --git a/controller/PostgreSQL.cpp b/controller/PostgreSQL.cpp index 6a7ea2192..53d88d6fd 100644 --- a/controller/PostgreSQL.cpp +++ b/controller/PostgreSQL.cpp @@ -1040,20 +1040,32 @@ void PostgreSQL::commitThread() } try { - nlohmann::json *config = &(qitem.first); - const std::string objtype = (*config)["objtype"]; + nlohmann::json &config = (qitem.first); + const std::string objtype = config["objtype"]; if (objtype == "member") { // fprintf(stderr, "%s: commitThread: member\n", _myAddressStr.c_str()); + std::string memberId; + std::string networkId; try { pqxx::work w(*c->c); - std::string memberId = (*config)["id"]; - std::string networkId = (*config)["nwid"]; + memberId = config["id"]; + networkId = config["nwid"]; + std::string target = "NULL"; - if (!(*config)["remoteTraceTarget"].is_null()) { - target = (*config)["remoteTraceTarget"]; + if (!config["remoteTraceTarget"].is_null()) { + target = config["remoteTraceTarget"]; } + pqxx::row nwrow = w.exec_params1("SELECT COUNT(id) FROM ztc_network WHERE id = $1", networkId); + int nwcount = nwrow[0].as(); + + if (nwcount != 1) { + fprintf(stderr, "network %s does not exist. skipping member upsert\n", networkId.c_str()); + w.abort(); + _pool->unborrow(c); + continue; + } pqxx::result res = w.exec_params0( "INSERT INTO ztc_member (id, network_id, active_bridge, authorized, capabilities, " @@ -1070,21 +1082,21 @@ void PostgreSQL::commitThread() "v_minor = EXCLUDED.v_minor, v_rev = EXCLUDED.v_rev, v_proto = EXCLUDED.v_proto", memberId, networkId, - (bool)(*config)["activeBridge"], - (bool)(*config)["authorized"], - OSUtils::jsonDump((*config)["capabilities"], -1), - OSUtils::jsonString((*config)["identity"], ""), - (uint64_t)(*config)["lastAuthorizedTime"], - (uint64_t)(*config)["lastDeauthorizedTime"], - (bool)(*config)["noAutoAssignIps"], - (int)(*config)["remoteTraceLevel"], + (bool)config["activeBridge"], + (bool)config["authorized"], + OSUtils::jsonDump(config["capabilities"], -1), + OSUtils::jsonString(config["identity"], ""), + (uint64_t)config["lastAuthorizedTime"], + (uint64_t)config["lastDeauthorizedTime"], + (bool)config["noAutoAssignIps"], + (int)config["remoteTraceLevel"], target, - (uint64_t)(*config)["revision"], - OSUtils::jsonDump((*config)["tags"], -1), - (int)(*config)["vMajor"], - (int)(*config)["vMinor"], - (int)(*config)["vRev"], - (int)(*config)["vProto"]); + (uint64_t)config["revision"], + OSUtils::jsonDump(config["tags"], -1), + (int)config["vMajor"], + (int)config["vMinor"], + (int)config["vRev"], + (int)config["vProto"]); res = w.exec_params0("DELETE FROM ztc_member_ip_assignment WHERE member_id = $1 AND network_id = $2", @@ -1092,7 +1104,7 @@ void PostgreSQL::commitThread() std::vector assignments; bool ipAssignError = false; - for (auto i = (*config)["ipAssignments"].begin(); i != (*config)["ipAssignments"].end(); ++i) { + for (auto i = config["ipAssignments"].begin(); i != config["ipAssignments"].end(); ++i) { std::string addr = *i; if (std::find(assignments.begin(), assignments.end(), addr) != assignments.end()) { @@ -1107,8 +1119,6 @@ void PostgreSQL::commitThread() } if (ipAssignError) { fprintf(stderr, "%s: ipAssignError\n", _myAddressStr.c_str()); - delete config; - config = nullptr; w.abort(); _pool->unborrow(c); c.reset(); @@ -1117,13 +1127,13 @@ void PostgreSQL::commitThread() w.commit(); - const uint64_t nwidInt = OSUtils::jsonIntHex((*config)["nwid"], 0ULL); - const uint64_t memberidInt = OSUtils::jsonIntHex((*config)["id"], 0ULL); + const uint64_t nwidInt = OSUtils::jsonIntHex(config["nwid"], 0ULL); + const uint64_t memberidInt = OSUtils::jsonIntHex(config["id"], 0ULL); if (nwidInt && memberidInt) { nlohmann::json nwOrig; nlohmann::json memOrig; - nlohmann::json memNew(*config); + nlohmann::json memNew(config); get(nwidInt, nwOrig, memberidInt, memOrig); @@ -1131,23 +1141,22 @@ void PostgreSQL::commitThread() } else { fprintf(stderr, "%s: Can't notify of change. Error parsing nwid or memberid: %llu-%llu\n", _myAddressStr.c_str(), (unsigned long long)nwidInt, (unsigned long long)memberidInt); } - } catch (std::exception &e) { - fprintf(stderr, "%s ERROR: Error updating member: %s\n", _myAddressStr.c_str(), e.what()); + fprintf(stderr, "%s ERROR: Error updating member %s-%s: %s\n", _myAddressStr.c_str(), networkId.c_str(), memberId.c_str(), e.what()); } } else if (objtype == "network") { try { // fprintf(stderr, "%s: commitThread: network\n", _myAddressStr.c_str()); pqxx::work w(*c->c); - std::string id = (*config)["id"]; + std::string id = config["id"]; std::string remoteTraceTarget = ""; - if(!(*config)["remoteTraceTarget"].is_null()) { - remoteTraceTarget = (*config)["remoteTraceTarget"]; + if(!config["remoteTraceTarget"].is_null()) { + remoteTraceTarget = config["remoteTraceTarget"]; } std::string rulesSource = ""; - if ((*config)["rulesSource"].is_string()) { - rulesSource = (*config)["rulesSource"]; + if (config["rulesSource"].is_string()) { + rulesSource = config["rulesSource"]; } // This ugly query exists because when we want to mirror networks to/from @@ -1176,25 +1185,25 @@ void PostgreSQL::commitThread() "sso_enabled = EXCLUDED.sso_enabled", id, _myAddressStr, - OSUtils::jsonDump((*config)["capabilitles"], -1), - (bool)(*config)["enableBroadcast"], + OSUtils::jsonDump(config["capabilitles"], -1), + (bool)config["enableBroadcast"], OSUtils::now(), - (int)(*config)["mtu"], - (int)(*config)["multicastLimit"], - OSUtils::jsonString((*config)["name"],""), - (bool)(*config)["private"], - (int)(*config)["remoteTraceLevel"], + (int)config["mtu"], + (int)config["multicastLimit"], + OSUtils::jsonString(config["name"],""), + (bool)config["private"], + (int)config["remoteTraceLevel"], remoteTraceTarget, - OSUtils::jsonDump((*config)["rules"], -1), + OSUtils::jsonDump(config["rules"], -1), rulesSource, - OSUtils::jsonDump((*config)["tags"], -1), - OSUtils::jsonDump((*config)["v4AssignMode"],-1), - OSUtils::jsonDump((*config)["v6AssignMode"], -1), - OSUtils::jsonBool((*config)["ssoEnabled"], false)); + OSUtils::jsonDump(config["tags"], -1), + OSUtils::jsonDump(config["v4AssignMode"],-1), + OSUtils::jsonDump(config["v6AssignMode"], -1), + OSUtils::jsonBool(config["ssoEnabled"], false)); res = w.exec_params0("DELETE FROM ztc_network_assignment_pool WHERE network_id = $1", 0); - auto pool = (*config)["ipAssignmentPools"]; + auto pool = config["ipAssignmentPools"]; bool err = false; for (auto i = pool.begin(); i != pool.end(); ++i) { std::string start = (*i)["ipRangeStart"]; @@ -1207,7 +1216,7 @@ void PostgreSQL::commitThread() res = w.exec_params0("DELETE FROM ztc_network_route WHERE network_id = $1", id); - auto routes = (*config)["routes"]; + auto routes = config["routes"]; err = false; for (auto i = routes.begin(); i != routes.end(); ++i) { std::string t = (*i)["target"]; @@ -1234,12 +1243,10 @@ void PostgreSQL::commitThread() fprintf(stderr, "%s: route add error\n", _myAddressStr.c_str()); w.abort(); _pool->unborrow(c); - delete config; - config = nullptr; continue; } - auto dns = (*config)["dns"]; + auto dns = config["dns"]; std::string domain = dns["domain"]; std::stringstream servers; servers << "{"; @@ -1258,10 +1265,10 @@ void PostgreSQL::commitThread() w.commit(); - const uint64_t nwidInt = OSUtils::jsonIntHex((*config)["nwid"], 0ULL); + const uint64_t nwidInt = OSUtils::jsonIntHex(config["nwid"], 0ULL); if (nwidInt) { nlohmann::json nwOrig; - nlohmann::json nwNew(*config); + nlohmann::json nwNew(config); get(nwidInt, nwOrig); @@ -1269,7 +1276,6 @@ void PostgreSQL::commitThread() } else { fprintf(stderr, "%s: Can't notify network changed: %llu\n", _myAddressStr.c_str(), (unsigned long long)nwidInt); } - } catch (std::exception &e) { fprintf(stderr, "%s ERROR: Error updating network: %s\n", _myAddressStr.c_str(), e.what()); } @@ -1278,7 +1284,7 @@ void PostgreSQL::commitThread() try { pqxx::work w(*c->c); - std::string networkId = (*config)["nwid"]; + std::string networkId = config["nwid"]; pqxx::result res = w.exec_params0("UPDATE ztc_network SET deleted = true WHERE id = $1", networkId); @@ -1293,8 +1299,8 @@ void PostgreSQL::commitThread() try { pqxx::work w(*c->c); - std::string memberId = (*config)["id"]; - std::string networkId = (*config)["nwid"]; + std::string memberId = config["id"]; + std::string networkId = config["nwid"]; pqxx::result res = w.exec_params0( "UPDATE ztc_member SET hidden = true, deleted = true WHERE id = $1 AND network_id = $2",