From 8ed86d358220cdb2b9061c883f808a77718bde79 Mon Sep 17 00:00:00 2001 From: stephb9959 Date: Tue, 31 May 2022 11:50:37 -0700 Subject: [PATCH 01/20] Framework update. --- src/RESTObjects/RESTAPI_SecurityObjects.h | 8 +- src/framework/ConfigurationValidator.cpp | 207 +++++++++++++++++++++- src/framework/MicroService.h | 8 +- test_scripts/curl/token.json | 1 - 4 files changed, 210 insertions(+), 14 deletions(-) delete mode 100644 test_scripts/curl/token.json diff --git a/src/RESTObjects/RESTAPI_SecurityObjects.h b/src/RESTObjects/RESTAPI_SecurityObjects.h index ac3b6bd..a3f06e8 100644 --- a/src/RESTObjects/RESTAPI_SecurityObjects.h +++ b/src/RESTObjects/RESTAPI_SecurityObjects.h @@ -9,6 +9,7 @@ #pragma once #include +#include #include "framework/OpenWifiTypes.h" #include "Poco/JSON/Object.h" #include "Poco/Data/LOB.h" @@ -27,8 +28,13 @@ namespace OpenWifi { bool Delete_ = true; bool PortalLogin_ = true; + AclTemplate() noexcept = default; + void to_json(Poco::JSON::Object &Obj) const; - bool from_json(const Poco::JSON::Object::Ptr &Obj); }; + bool from_json(const Poco::JSON::Object::Ptr &Obj); + }; + + static_assert( std::is_nothrow_move_constructible_v ); struct WebToken { std::string access_token_; diff --git a/src/framework/ConfigurationValidator.cpp b/src/framework/ConfigurationValidator.cpp index f73c63a..7a4a571 100644 --- a/src/framework/ConfigurationValidator.cpp +++ b/src/framework/ConfigurationValidator.cpp @@ -13,9 +13,10 @@ namespace OpenWifi { - static const std::string GitUCentralJSONSchemaFile{"https://raw.githubusercontent.com/blogic/ucentral-schema/main/ucentral.schema.json"}; +static const std::string GitUCentralJSONSchemaFile{ + "https://raw.githubusercontent.com/blogic/ucentral-schema/main/ucentral.schema.json"}; - static json DefaultUCentralSchema = R"( +static json DefaultUCentralSchema = R"( { "$id": "https://openwrt.org/ucentral.schema.json", @@ -518,7 +519,7 @@ namespace OpenWifi { "maximum": 4050 }, "proto": { - "decription": "The L2 vlan tag that shall be added (1q,1ad) ", + "decription": "The L2 vlan tag that shall be added (1q,1ad ) ", "type": "string", "enum": [ "802.1ad", @@ -669,6 +670,47 @@ namespace OpenWifi { } } }, + "interface.ipv4.port-forward": { + "type": "object", + "properties": { + "protocol": { + "type": "string", + "enum": [ + "tcp", + "udp", + "any" + ], + "default": "any" + }, + "external-port": { + "type": [ + "integer", + "string" + ], + "minimum": 0, + "maximum": 65535, + "format": "uc-portrange" + }, + "internal-address": { + "type": "string", + "format": "ipv4", + "example": "0.0.0.120" + }, + "internal-port": { + "type": [ + "integer", + "string" + ], + "minimum": 0, + "maximum": 65535, + "format": "uc-portrange" + } + }, + "required": [ + "external-port", + "internal-address" + ] + }, "interface.ipv4": { "type": "object", "properties": { @@ -722,6 +764,12 @@ namespace OpenWifi { "items": { "$ref": "#/$defs/interface.ipv4.dhcp-lease" } + }, + "port-forward": { + "type": "array", + "items": { + "$ref": "#/$defs/interface.ipv4.port-forward" + } } } }, @@ -751,6 +799,96 @@ namespace OpenWifi { } } }, + "interface.ipv6.port-forward": { + "type": "object", + "properties": { + "protocol": { + "type": "string", + "enum": [ + "tcp", + "udp", + "any" + ], + "default": "any" + }, + "external-port": { + "type": [ + "integer", + "string" + ], + "minimum": 0, + "maximum": 65535, + "format": "uc-portrange" + }, + "internal-address": { + "type": "string", + "format": "ipv6", + "example": "::1234:abcd" + }, + "internal-port": { + "type": [ + "integer", + "string" + ], + "minimum": 0, + "maximum": 65535, + "format": "uc-portrange" + } + }, + "required": [ + "external-port", + "internal-address" + ] + }, + "interface.ipv6.traffic-allow": { + "type": "object", + "properties": { + "protocol": { + "type": "string", + "default": "any" + }, + "source-address": { + "type": "string", + "format": "uc-cidr6", + "example": "2001:db8:1234:abcd::/64", + "default": "::/0" + }, + "source-ports": { + "type": "array", + "minItems": 1, + "items": { + "type": [ + "integer", + "string" + ], + "minimum": 0, + "maximum": 65535, + "format": "uc-portrange" + } + }, + "destination-address": { + "type": "string", + "format": "ipv6", + "example": "::1000" + }, + "destination-ports": { + "type": "array", + "minItems": 1, + "items": { + "type": [ + "integer", + "string" + ], + "minimum": 0, + "maximum": 65535, + "format": "uc-portrange" + } + } + }, + "required": [ + "destination-address" + ] + }, "interface.ipv6": { "type": "object", "properties": { @@ -782,6 +920,18 @@ namespace OpenWifi { }, "dhcpv6": { "$ref": "#/$defs/interface.ipv6.dhcpv6" + }, + "port-forward": { + "type": "array", + "items": { + "$ref": "#/$defs/interface.ipv6.port-forward" + } + }, + "traffic-allow": { + "type": "array", + "items": { + "$ref": "#/$defs/interface.ipv6.traffic-allow" + } } } }, @@ -866,7 +1016,7 @@ namespace OpenWifi { }, "gateway-fqdn": { "type": "string", - "format": "fqdn", + "format": "uc-fqdn", "default": "ucentral.splash" }, "max-clients": { @@ -901,6 +1051,7 @@ namespace OpenWifi { "psk", "psk2", "psk-mixed", + "psk2-radius", "wpa", "wpa2", "wpa-mixed", @@ -961,6 +1112,10 @@ namespace OpenWifi { "type": "boolean", "default": false }, + "reduced-neighbor-reporting": { + "type": "boolean", + "default": false + }, "lci": { "type": "string" }, @@ -1527,6 +1682,11 @@ namespace OpenWifi { "decription": "This option allows embedding custom vendor specific IEs inside the beacons of a BSS in AP mode.", "type": "string" }, + "fils-discovery-interval": { + "type": "integer", + "default": 20, + "maximum": 10000 + }, "encryption": { "$ref": "#/$defs/interface.ssid.encryption" }, @@ -2087,6 +2247,10 @@ namespace OpenWifi { "auto-channel": { "type": "boolean", "default": false + }, + "ipv6": { + "type": "boolean", + "default": false } } }, @@ -2193,7 +2357,7 @@ namespace OpenWifi { "properties": { "fqdn": { "type": "string", - "format": "fqdn" + "format": "uc-fqdn" }, "suffix-matching": { "type": "boolean", @@ -2444,8 +2608,7 @@ namespace OpenWifi { } } } - - )"_json; +)"_json; class custom_error_handler : public nlohmann::json_schema::basic_error_handler { @@ -2460,9 +2623,18 @@ namespace OpenWifi { void ConfigurationValidator::Init() { if(Initialized_) return; + std::string GitSchema; + if(MicroService::instance().ConfigGetBool("ucentral.datamodel.internal",true)) { + RootSchema_ = DefaultUCentralSchema; + Logger().information("Using uCentral validation from built-in default."); + Initialized_ = Working_ = true; + return; + } + try { - if(Utils::wgets(GitUCentralJSONSchemaFile, GitSchema)) { + auto GitURI = MicroService::instance().ConfigGetString("ucentral.datamodel.uri",GitUCentralJSONSchemaFile); + if(Utils::wgets(GitURI, GitSchema)) { RootSchema_ = json::parse(GitSchema); Logger().information("Using uCentral validation schema from GIT."); } else { @@ -2528,6 +2700,17 @@ namespace OpenWifi { return IsCIDRv4(value) || IsCIDRv6(value); } + static inline bool IsPortRangeIsValid(const std::string &r) { + const auto ports = Poco::StringTokenizer("-",r,Poco::StringTokenizer::TOK_TRIM); + + for(const auto &port:ports) { + uint32_t port_num = std::stoul(port); + if(port_num==0 || port_num>65535) + return false; + } + return true; + } + void ConfigurationValidator::my_format_checker(const std::string &format, const std::string &value) { static const std::regex host_regex{"^(?=.{1,254}$)((?=[a-z0-9-]{1,63}\\.)(xn--+)?[a-z0-9]+(-[a-z0-9]+)*\\.)+[a-z]{2,63}$"}; @@ -2578,6 +2761,14 @@ namespace OpenWifi { } catch (...) { } throw std::invalid_argument(value + " is not a valid URI: should be something like https://hello.world.com."); + } else if(format == "uc-portrange") { + try { + if(IsPortRangeIsValid(value)) + return; + throw std::invalid_argument(value + " is not a valid port range: should an integer between 1-65535 or a port range like post-port."); + } catch (...) { + } + throw std::invalid_argument(value + " is not a valid port range: should an integer between 1-65535 or a port range like post-port."); } else if(format == "ip") { if (IsIP(value)) return; diff --git a/src/framework/MicroService.h b/src/framework/MicroService.h index 171b0c2..9b129bb 100644 --- a/src/framework/MicroService.h +++ b/src/framework/MicroService.h @@ -4400,7 +4400,7 @@ namespace OpenWifi { Path, Poco::Net::HTTPMessage::HTTP_1_1); - Poco::Logger::get("REST-CALLER-GET").debug(fmt::format(" {}", URI.toString())); + poco_debug(Poco::Logger::get("REST-CALLER-GET"),fmt::format(" {}", URI.toString())); if(BearerToken.empty()) { Request.add("X-API-KEY", Svc.AccessKey); @@ -4458,7 +4458,7 @@ namespace OpenWifi { for (const auto &qp : QueryData_) URI.addQueryParameter(qp.first, qp.second); - Poco::Logger::get("REST-CALLER-PUT").debug(fmt::format("{}", URI.toString())); + poco_debug(Poco::Logger::get("REST-CALLER-PUT"),fmt::format("{}", URI.toString())); std::string Path(URI.getPathAndQuery()); @@ -4537,7 +4537,7 @@ namespace OpenWifi { for (const auto &qp : QueryData_) URI.addQueryParameter(qp.first, qp.second); - Poco::Logger::get("REST-CALLER-POST").debug(fmt::format(" {}", URI.toString())); + poco_debug(Poco::Logger::get("REST-CALLER-POST"),fmt::format(" {}", URI.toString())); std::string Path(URI.getPathAndQuery()); @@ -4613,7 +4613,7 @@ namespace OpenWifi { for (const auto &qp : QueryData_) URI.addQueryParameter(qp.first, qp.second); - Poco::Logger::get("REST-CALLER-DELETE").debug(fmt::format(" {}", URI.toString())); + poco_debug(Poco::Logger::get("REST-CALLER-DELETE"),fmt::format(" {}", URI.toString())); std::string Path(URI.getPathAndQuery()); diff --git a/test_scripts/curl/token.json b/test_scripts/curl/token.json deleted file mode 100644 index 19765bd..0000000 --- a/test_scripts/curl/token.json +++ /dev/null @@ -1 +0,0 @@ -null From cafc243e55712d91b64cf766934465891e70c49c Mon Sep 17 00:00:00 2001 From: stephb9959 Date: Tue, 31 May 2022 23:26:05 -0700 Subject: [PATCH 02/20] Framework update. --- src/framework/ow_constants.h | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/framework/ow_constants.h b/src/framework/ow_constants.h index 0d87d11..a27f409 100644 --- a/src/framework/ow_constants.h +++ b/src/framework/ow_constants.h @@ -5,6 +5,7 @@ #pragma once #include +#include #include "Poco/String.h" #if defined(__GNUC__) @@ -428,6 +429,7 @@ namespace OpenWifi::uCentralProtocol { static const char *RADIUSACCT = "acct"; static const char *RADIUSAUTH = "auth"; static const char *RADIUSDST = "dst"; + static const char *IES = "ies"; } namespace OpenWifi::uCentralProtocol::Events { @@ -458,7 +460,7 @@ namespace OpenWifi::uCentralProtocol::Events { }; inline static EVENT_MSG EventFromString(const std::string & Method) { - static std::vector> Values{ + static std::vector> EventValues{ { CFGPENDING , ET_CFGPENDING }, { CONNECT, ET_CONNECT }, { CRASHLOG, ET_CRASHLOG }, @@ -471,11 +473,12 @@ namespace OpenWifi::uCentralProtocol::Events { { TELEMETRY, ET_TELEMETRY } }; - std::string L = Poco::toLower(Method); - auto hint = std::find_if(cbegin(Values),cend(Values),[&](const std::pair &v) ->bool { return strcmp(v.first,L.c_str())==0; }); - if(hint == cend(Values)) - return ET_UNKNOWN; - return hint->second; + const auto l_method = Poco::toLower(Method); + for(const auto &[event_name,event_type]:EventValues) { + if(std::strcmp(event_name,Method.c_str())==0) + return event_type; + } + return ET_UNKNOWN; }; } From 4b131465fbbb84692cbedee779baf5a543002f0a Mon Sep 17 00:00:00 2001 From: stephb9959 Date: Tue, 31 May 2022 23:53:47 -0700 Subject: [PATCH 03/20] Framework update. --- src/RESTObjects/RESTAPI_AnalyticsObjects.cpp | 10 +- src/RESTObjects/RESTAPI_AnalyticsObjects.h | 5 +- src/RESTObjects/RESTAPI_CertObjects.cpp | 342 ++++++++++--------- src/RESTObjects/RESTAPI_CertObjects.h | 183 +++++----- 4 files changed, 297 insertions(+), 243 deletions(-) diff --git a/src/RESTObjects/RESTAPI_AnalyticsObjects.cpp b/src/RESTObjects/RESTAPI_AnalyticsObjects.cpp index aebe317..e7738ba 100644 --- a/src/RESTObjects/RESTAPI_AnalyticsObjects.cpp +++ b/src/RESTObjects/RESTAPI_AnalyticsObjects.cpp @@ -538,8 +538,8 @@ namespace OpenWifi::AnalyticsObjects { void WifiClientHistory::to_json(Poco::JSON::Object &Obj) const { field_to_json(Obj,"timestamp",timestamp); - field_to_json(Obj,"stationId",stationId); - field_to_json(Obj,"bssId",bssId); + field_to_json(Obj,"station_id",station_id); + field_to_json(Obj,"bssid",bssid); field_to_json(Obj,"ssid",ssid); field_to_json(Obj,"rssi",rssi); field_to_json(Obj,"rx_bitrate",rx_bitrate); @@ -573,13 +573,14 @@ namespace OpenWifi::AnalyticsObjects { field_to_json(Obj,"connected",connected); field_to_json(Obj,"inactive",inactive); field_to_json(Obj,"tx_retries",tx_retries); + field_to_json(Obj,"venue_id",venue_id); } bool WifiClientHistory::from_json(const Poco::JSON::Object::Ptr &Obj) { try { field_from_json(Obj,"timestamp",timestamp); - field_from_json(Obj,"stationId",stationId); - field_from_json(Obj,"bssId",bssId); + field_from_json(Obj,"station_id",station_id); + field_from_json(Obj,"bssid",bssid); field_from_json(Obj,"ssid",ssid); field_from_json(Obj,"rssi",rssi); field_from_json(Obj,"rx_bitrate",rx_bitrate); @@ -613,6 +614,7 @@ namespace OpenWifi::AnalyticsObjects { field_from_json(Obj,"connected",connected); field_from_json(Obj,"inactive",inactive); field_from_json(Obj,"tx_retries",tx_retries); + field_from_json(Obj,"venue_id",venue_id); return true; } catch(...) { diff --git a/src/RESTObjects/RESTAPI_AnalyticsObjects.h b/src/RESTObjects/RESTAPI_AnalyticsObjects.h index 6573aca..c1328f4 100644 --- a/src/RESTObjects/RESTAPI_AnalyticsObjects.h +++ b/src/RESTObjects/RESTAPI_AnalyticsObjects.h @@ -376,8 +376,8 @@ namespace OpenWifi { struct WifiClientHistory { uint64_t timestamp=OpenWifi::Now(); - std::string stationId; - std::string bssId; + std::string station_id; + std::string bssid; std::string ssid; int64_t rssi=0; uint32_t rx_bitrate=0; @@ -411,6 +411,7 @@ namespace OpenWifi { uint64_t connected=0; uint64_t inactive=0; uint64_t tx_retries=0; + std::string venue_id; void to_json(Poco::JSON::Object &Obj) const; bool from_json(const Poco::JSON::Object::Ptr &Obj); diff --git a/src/RESTObjects/RESTAPI_CertObjects.cpp b/src/RESTObjects/RESTAPI_CertObjects.cpp index f3aca35..ea55bd4 100644 --- a/src/RESTObjects/RESTAPI_CertObjects.cpp +++ b/src/RESTObjects/RESTAPI_CertObjects.cpp @@ -3,176 +3,206 @@ // #include "RESTAPI_CertObjects.h" +#include "framework/MicroService.h" using OpenWifi::RESTAPI_utils::field_to_json; using OpenWifi::RESTAPI_utils::field_from_json; -namespace OpenWifi { - namespace CertObjects { - void CertificateEntry::to_json(Poco::JSON::Object &Obj) const { - field_to_json(Obj,"id", id); - field_to_json(Obj,"entity", entity); - field_to_json(Obj,"creator", creator); - field_to_json(Obj,"type", type); - field_to_json(Obj,"status", status); - field_to_json(Obj,"certificate", certificate); - field_to_json(Obj,"key", key); - field_to_json(Obj,"devid", devid); - field_to_json(Obj,"cas", cas); - field_to_json(Obj,"manufacturer", manufacturer); - field_to_json(Obj,"model", model); - field_to_json(Obj,"redirector", redirector); - field_to_json(Obj,"commonName", commonName); - field_to_json(Obj,"certificateId", certificateId); - field_to_json(Obj,"batch", batch); - field_to_json(Obj,"created", created); - field_to_json(Obj,"modified", modified); - field_to_json(Obj,"revoked", revoked); - field_to_json(Obj,"revokeCount", revokeCount); - } +namespace OpenWifi::CertObjects { + void CertificateEntry::to_json(Poco::JSON::Object &Obj) const { + field_to_json(Obj,"id", id); + field_to_json(Obj,"entity", entity); + field_to_json(Obj,"creator", creator); + field_to_json(Obj,"type", type); + field_to_json(Obj,"status", status); + field_to_json(Obj,"certificate", certificate); + field_to_json(Obj,"key", key); + field_to_json(Obj,"devid", devid); + field_to_json(Obj,"cas", cas); + field_to_json(Obj,"manufacturer", manufacturer); + field_to_json(Obj,"model", model); + field_to_json(Obj,"redirector", redirector); + field_to_json(Obj,"commonName", commonName); + field_to_json(Obj,"certificateId", certificateId); + field_to_json(Obj,"batch", batch); + field_to_json(Obj,"created", created); + field_to_json(Obj,"modified", modified); + field_to_json(Obj,"revoked", revoked); + field_to_json(Obj,"revokeCount", revokeCount); + field_to_json(Obj,"synched", synched); + } - bool CertificateEntry::from_json(const Poco::JSON::Object::Ptr &Obj) { - try { - field_from_json(Obj,"id", id); - field_from_json(Obj,"entity", entity); - field_from_json(Obj,"creator", creator); - field_from_json(Obj,"type", type); - field_from_json(Obj,"status", status); - field_from_json(Obj,"certificate", certificate); - field_from_json(Obj,"key", key); - field_from_json(Obj,"devid", devid); - field_from_json(Obj,"cas", cas); - field_from_json(Obj,"manufacturer", manufacturer); - field_from_json(Obj,"model", model); - field_from_json(Obj,"redirector", redirector); - field_from_json(Obj,"commonName", commonName); - field_from_json(Obj,"certificateId", certificateId); - field_from_json(Obj,"batch", batch); - field_from_json(Obj,"created", created); - field_from_json(Obj,"modified", modified); - field_from_json(Obj,"revoked", revoked); - field_from_json(Obj,"revokeCount", revokeCount); - return true; - } catch (...) { - } - return false; + bool CertificateEntry::from_json(const Poco::JSON::Object::Ptr &Obj) { + try { + field_from_json(Obj,"id", id); + field_from_json(Obj,"entity", entity); + field_from_json(Obj,"creator", creator); + field_from_json(Obj,"type", type); + field_from_json(Obj,"status", status); + field_from_json(Obj,"certificate", certificate); + field_from_json(Obj,"key", key); + field_from_json(Obj,"devid", devid); + field_from_json(Obj,"cas", cas); + field_from_json(Obj,"manufacturer", manufacturer); + field_from_json(Obj,"model", model); + field_from_json(Obj,"redirector", redirector); + field_from_json(Obj,"commonName", commonName); + field_from_json(Obj,"certificateId", certificateId); + field_from_json(Obj,"batch", batch); + field_from_json(Obj,"created", created); + field_from_json(Obj,"modified", modified); + field_from_json(Obj,"revoked", revoked); + field_from_json(Obj,"revokeCount", revokeCount); + field_from_json(Obj,"synched", synched); + return true; + } catch (...) { } + return false; + } - void EntityEntry::to_json(Poco::JSON::Object &Obj) const { - field_to_json(Obj,"id", id); - field_to_json(Obj,"creator", creator); - field_to_json(Obj,"name", name); - field_to_json(Obj,"description", description); - field_to_json(Obj,"defaultRedirector", defaultRedirector); - field_to_json(Obj,"apiKey", apiKey); - field_to_json(Obj,"serverEnrollmentProfile", serverEnrollmentProfile); - field_to_json(Obj,"clientEnrollmentProfile", clientEnrollmentProfile); - field_to_json(Obj,"organization", organization); - field_to_json(Obj,"created", created); - field_to_json(Obj,"modified", modified); - field_to_json(Obj,"suspended", suspended); - field_to_json(Obj,"deleted", deleted); - field_to_json(Obj,"notes", notes); - } + void EntityEntry::to_json(Poco::JSON::Object &Obj) const { + field_to_json(Obj,"id", id); + field_to_json(Obj,"creator", creator); + field_to_json(Obj,"name", name); + field_to_json(Obj,"description", description); + field_to_json(Obj,"defaultRedirector", defaultRedirector); + field_to_json(Obj,"apiKey", apiKey); + field_to_json(Obj,"serverEnrollmentProfile", serverEnrollmentProfile); + field_to_json(Obj,"clientEnrollmentProfile", clientEnrollmentProfile); + field_to_json(Obj,"organization", organization); + field_to_json(Obj,"created", created); + field_to_json(Obj,"modified", modified); + field_to_json(Obj,"suspended", suspended); + field_to_json(Obj,"deleted", deleted); + field_to_json(Obj,"notes", notes); + } - bool EntityEntry::from_json(const Poco::JSON::Object::Ptr &Obj) { - try { - field_from_json(Obj,"id", id); - field_from_json(Obj,"creator", creator); - field_from_json(Obj,"name", name); - field_from_json(Obj,"description", description); - field_from_json(Obj,"defaultRedirector", defaultRedirector); - field_from_json(Obj,"apiKey", apiKey); - field_from_json(Obj,"serverEnrollmentProfile", serverEnrollmentProfile); - field_from_json(Obj,"clientEnrollmentProfile", clientEnrollmentProfile); - field_from_json(Obj,"organization", organization); - field_from_json(Obj,"created", created); - field_from_json(Obj,"modified", modified); - field_from_json(Obj,"suspended", suspended); - field_from_json(Obj,"deleted", deleted); - field_from_json(Obj,"notes", notes); - return true; - } catch (...) { - } - return false; + bool EntityEntry::from_json(const Poco::JSON::Object::Ptr &Obj) { + try { + field_from_json(Obj,"id", id); + field_from_json(Obj,"creator", creator); + field_from_json(Obj,"name", name); + field_from_json(Obj,"description", description); + field_from_json(Obj,"defaultRedirector", defaultRedirector); + field_from_json(Obj,"apiKey", apiKey); + field_from_json(Obj,"serverEnrollmentProfile", serverEnrollmentProfile); + field_from_json(Obj,"clientEnrollmentProfile", clientEnrollmentProfile); + field_from_json(Obj,"organization", organization); + field_from_json(Obj,"created", created); + field_from_json(Obj,"modified", modified); + field_from_json(Obj,"suspended", suspended); + field_from_json(Obj,"deleted", deleted); + field_from_json(Obj,"notes", notes); + return true; + } catch (...) { } + return false; + } - void BatchEntry::to_json(Poco::JSON::Object &Obj) const { - field_to_json(Obj,"id", id); - field_to_json(Obj,"entity", entity); - field_to_json(Obj,"creator", creator); - field_to_json(Obj,"name", name); - field_to_json(Obj,"description", description); - field_to_json(Obj,"manufacturer", manufacturer); - field_to_json(Obj,"model", model); - field_to_json(Obj,"redirector", redirector); - field_to_json(Obj,"commonNames", commonNames); - field_to_json(Obj,"jobHistory", jobHistory); - field_to_json(Obj,"notes", notes); - field_to_json(Obj,"submitted", submitted); - field_to_json(Obj,"started", started); - field_to_json(Obj,"completed", completed); - field_to_json(Obj,"modified", modified); - } + void BatchEntry::to_json(Poco::JSON::Object &Obj) const { + field_to_json(Obj,"id", id); + field_to_json(Obj,"entity", entity); + field_to_json(Obj,"creator", creator); + field_to_json(Obj,"name", name); + field_to_json(Obj,"description", description); + field_to_json(Obj,"manufacturer", manufacturer); + field_to_json(Obj,"model", model); + field_to_json(Obj,"redirector", redirector); + field_to_json(Obj,"commonNames", commonNames); + field_to_json(Obj,"jobHistory", jobHistory); + field_to_json(Obj,"notes", notes); + field_to_json(Obj,"submitted", submitted); + field_to_json(Obj,"started", started); + field_to_json(Obj,"completed", completed); + field_to_json(Obj,"modified", modified); + } - bool BatchEntry::from_json(const Poco::JSON::Object::Ptr &Obj) { - try { - field_from_json(Obj,"id", id); - field_from_json(Obj,"entity", entity); - field_from_json(Obj,"creator", creator); - field_from_json(Obj,"name", name); - field_from_json(Obj,"description", description); - field_from_json(Obj,"manufacturer", manufacturer); - field_from_json(Obj,"model", model); - field_from_json(Obj,"redirector", redirector); - field_from_json(Obj,"commonNames", commonNames); - field_from_json(Obj,"jobHistory", jobHistory); - field_from_json(Obj,"notes", notes); - field_from_json(Obj,"submitted", submitted); - field_from_json(Obj,"started", started); - field_from_json(Obj,"completed", completed); - field_from_json(Obj,"modified", modified); - return true; - } catch (...) { - } - return false; + bool BatchEntry::from_json(const Poco::JSON::Object::Ptr &Obj) { + try { + field_from_json(Obj,"id", id); + field_from_json(Obj,"entity", entity); + field_from_json(Obj,"creator", creator); + field_from_json(Obj,"name", name); + field_from_json(Obj,"description", description); + field_from_json(Obj,"manufacturer", manufacturer); + field_from_json(Obj,"model", model); + field_from_json(Obj,"redirector", redirector); + field_from_json(Obj,"commonNames", commonNames); + field_from_json(Obj,"jobHistory", jobHistory); + field_from_json(Obj,"notes", notes); + field_from_json(Obj,"submitted", submitted); + field_from_json(Obj,"started", started); + field_from_json(Obj,"completed", completed); + field_from_json(Obj,"modified", modified); + return true; + } catch (...) { } + return false; + } - void JobEntry::to_json(Poco::JSON::Object &Obj) const { - field_to_json(Obj,"id", id); - field_to_json(Obj,"entity", entity); - field_to_json(Obj,"creator", creator); - field_to_json(Obj,"batch", batch); - field_to_json(Obj,"commonNames", commonNames); - field_to_json(Obj,"completedNames", completedNames); - field_to_json(Obj,"errorNames", errorNames); - field_to_json(Obj,"status", status); - field_to_json(Obj,"command", command); - field_to_json(Obj,"parameters", parameters); - field_to_json(Obj,"submitted", submitted); - field_to_json(Obj,"started", started); - field_to_json(Obj,"completed", completed); - } + void JobEntry::to_json(Poco::JSON::Object &Obj) const { + field_to_json(Obj,"id", id); + field_to_json(Obj,"entity", entity); + field_to_json(Obj,"creator", creator); + field_to_json(Obj,"batch", batch); + field_to_json(Obj,"commonNames", commonNames); + field_to_json(Obj,"completedNames", completedNames); + field_to_json(Obj,"errorNames", errorNames); + field_to_json(Obj,"status", status); + field_to_json(Obj,"command", command); + field_to_json(Obj,"parameters", parameters); + field_to_json(Obj,"submitted", submitted); + field_to_json(Obj,"started", started); + field_to_json(Obj,"completed", completed); + } - bool JobEntry::from_json(const Poco::JSON::Object::Ptr &Obj) { - try { - field_from_json(Obj,"id", id); - field_from_json(Obj,"entity", entity); - field_from_json(Obj,"creator", creator); - field_from_json(Obj,"batch", batch); - field_from_json(Obj,"commonNames", commonNames); - field_from_json(Obj,"completedNames", completedNames); - field_from_json(Obj,"errorNames", errorNames); - field_from_json(Obj,"status", status); - field_from_json(Obj,"command", command); - field_from_json(Obj,"parameters", parameters); - field_from_json(Obj,"submitted", submitted); - field_from_json(Obj,"started", started); - field_from_json(Obj,"completed", completed); - return true; - } catch (...) { - } - return false; + bool JobEntry::from_json(const Poco::JSON::Object::Ptr &Obj) { + try { + field_from_json(Obj,"id", id); + field_from_json(Obj,"entity", entity); + field_from_json(Obj,"creator", creator); + field_from_json(Obj,"batch", batch); + field_from_json(Obj,"commonNames", commonNames); + field_from_json(Obj,"completedNames", completedNames); + field_from_json(Obj,"errorNames", errorNames); + field_from_json(Obj,"status", status); + field_from_json(Obj,"command", command); + field_from_json(Obj,"parameters", parameters); + field_from_json(Obj,"submitted", submitted); + field_from_json(Obj,"started", started); + field_from_json(Obj,"completed", completed); + return true; + } catch (...) { } + return false; + } + + void DashBoardYearlyStats::to_json(Poco::JSON::Object &Obj) const { + field_to_json(Obj, "year", year); + field_to_json(Obj, "activeCerts", activeCerts); + field_to_json(Obj, "revokedCerts", revokedCerts); + } + + void Dashboard::to_json(Poco::JSON::Object &Obj) const { + field_to_json(Obj,"snapshot", snapshot); + field_to_json(Obj,"numberOfIssuedCerts", numberOfIssuedCerts); + field_to_json(Obj,"numberOfRevokedCerts", numberOfRevokedCerts); + field_to_json(Obj,"activeCertsPerOrganization", activeCertsPerOrganization); + field_to_json(Obj,"revokedCertsPerOrganization", revokedCertsPerOrganization); + field_to_json(Obj,"numberOfRedirectors", numberOfRedirectors); + field_to_json(Obj,"deviceTypes", deviceTypes); + field_to_json(Obj,"monthlyNumberOfCerts", monthlyNumberOfCerts); + field_to_json(Obj,"monthlyNumberOfCertsPerOrgPerYear", monthlyNumberOfCertsPerOrgPerYear); + } + + void Dashboard::reset() { + snapshot=0; + numberOfRevokedCerts = numberOfIssuedCerts = 0; + activeCertsPerOrganization.clear(); + revokedCertsPerOrganization.clear(); + numberOfRedirectors.clear(); + deviceTypes.clear(); + monthlyNumberOfCerts.clear(); + monthlyNumberOfCertsPerOrgPerYear.clear(); } } \ No newline at end of file diff --git a/src/RESTObjects/RESTAPI_CertObjects.h b/src/RESTObjects/RESTAPI_CertObjects.h index aeed486..40b75a0 100644 --- a/src/RESTObjects/RESTAPI_CertObjects.h +++ b/src/RESTObjects/RESTAPI_CertObjects.h @@ -5,97 +5,118 @@ #pragma once #include -#include "framework/MicroService.h" #include "framework/OpenWifiTypes.h" #include "RESTObjects/RESTAPI_SecurityObjects.h" -namespace OpenWifi { +namespace OpenWifi::CertObjects { - namespace CertObjects { + struct CertificateEntry { + OpenWifi::Types::UUID_t id; + OpenWifi::Types::UUID_t entity; + OpenWifi::Types::UUID_t creator; + std::string type; + std::string status; + std::string certificate; + std::string key; + std::string devid; + std::string cas; + std::string manufacturer; + std::string model; + std::string redirector; + std::string commonName; + std::string certificateId; + OpenWifi::Types::UUID_t batch; + uint64_t created = 0; + uint64_t modified = 0; + uint64_t revoked = 0; + uint64_t revokeCount = 0; + uint64_t synched = 0; - struct CertificateEntry { - OpenWifi::Types::UUID_t id; - OpenWifi::Types::UUID_t entity; - OpenWifi::Types::UUID_t creator; - std::string type; - std::string status; - std::string certificate; - std::string key; - std::string devid; - std::string cas; - std::string manufacturer; - std::string model; - std::string redirector; - std::string commonName; - std::string certificateId; - OpenWifi::Types::UUID_t batch; - uint64_t created = 0; - uint64_t modified = 0; - uint64_t revoked = 0; - uint64_t revokeCount = 0; + void to_json(Poco::JSON::Object &Obj) const; + bool from_json(const Poco::JSON::Object::Ptr &Obj); + }; - void to_json(Poco::JSON::Object &Obj) const; - bool from_json(const Poco::JSON::Object::Ptr &Obj); - }; + struct EntityEntry { + OpenWifi::Types::UUID_t id; + OpenWifi::Types::UUID_t creator; + std::string name; + std::string description; + std::string defaultRedirector; + std::string apiKey; + std::string serverEnrollmentProfile; + std::string clientEnrollmentProfile; + std::string organization; + SecurityObjects::NoteInfoVec notes; + bool suspended=false; + bool deleted=false; + uint64_t created = 0 ; + uint64_t modified = 0 ; - struct EntityEntry { - OpenWifi::Types::UUID_t id; - OpenWifi::Types::UUID_t creator; - std::string name; - std::string description; - std::string defaultRedirector; - std::string apiKey; - std::string serverEnrollmentProfile; - std::string clientEnrollmentProfile; - std::string organization; - SecurityObjects::NoteInfoVec notes; - bool suspended=false; - bool deleted=false; - uint64_t created = 0 ; - uint64_t modified = 0 ; + void to_json(Poco::JSON::Object &Obj) const; + bool from_json(const Poco::JSON::Object::Ptr &Obj); + }; - void to_json(Poco::JSON::Object &Obj) const; - bool from_json(const Poco::JSON::Object::Ptr &Obj); - }; + struct BatchEntry { + OpenWifi::Types::UUID_t id; + OpenWifi::Types::UUID_t entity; + OpenWifi::Types::UUID_t creator; + std::string name; + std::string description; + std::string manufacturer; + std::string model; + std::string redirector; + std::vector commonNames; + std::vector jobHistory; + SecurityObjects::NoteInfoVec notes; + uint64_t submitted = 0 ; + uint64_t started = 0 ; + uint64_t completed = 0 ; + uint64_t modified = 0 ; - struct BatchEntry { - OpenWifi::Types::UUID_t id; - OpenWifi::Types::UUID_t entity; - OpenWifi::Types::UUID_t creator; - std::string name; - std::string description; - std::string manufacturer; - std::string model; - std::string redirector; - std::vector commonNames; - std::vector jobHistory; - SecurityObjects::NoteInfoVec notes; - uint64_t submitted = 0 ; - uint64_t started = 0 ; - uint64_t completed = 0 ; - uint64_t modified = 0 ; + void to_json(Poco::JSON::Object &Obj) const; + bool from_json(const Poco::JSON::Object::Ptr &Obj); + }; - void to_json(Poco::JSON::Object &Obj) const; - bool from_json(const Poco::JSON::Object::Ptr &Obj); - }; + struct JobEntry { + OpenWifi::Types::UUID_t id; + OpenWifi::Types::UUID_t entity; + OpenWifi::Types::UUID_t creator; + OpenWifi::Types::UUID_t batch; + std::string command; + OpenWifi::Types::StringVec commonNames; + OpenWifi::Types::StringVec completedNames; + OpenWifi::Types::StringVec errorNames; + Types::StringPairVec parameters; + std::string status; + uint64_t submitted=0; + uint64_t started=0; + uint64_t completed=0; - struct JobEntry { - OpenWifi::Types::UUID_t id; - OpenWifi::Types::UUID_t entity; - OpenWifi::Types::UUID_t creator; - OpenWifi::Types::UUID_t batch; - std::string command; - OpenWifi::Types::StringVec commonNames; - OpenWifi::Types::StringVec completedNames; - OpenWifi::Types::StringVec errorNames; - Types::StringPairVec parameters; - std::string status; - uint64_t submitted=0; - uint64_t started=0; - uint64_t completed=0; + void to_json(Poco::JSON::Object &Obj) const; + bool from_json(const Poco::JSON::Object::Ptr &Obj); + }; + + struct DashBoardYearlyStats { + uint64_t year=0; + OpenWifi::Types::Counted3DMapSII activeCerts; + OpenWifi::Types::Counted3DMapSII revokedCerts; + + void to_json(Poco::JSON::Object &Obj) const; + }; + + struct Dashboard { + uint64_t snapshot=0; + uint64_t numberOfIssuedCerts=0; + uint64_t numberOfRevokedCerts=0; + OpenWifi::Types::CountedMap activeCertsPerOrganization; + OpenWifi::Types::CountedMap revokedCertsPerOrganization; + OpenWifi::Types::CountedMap numberOfRedirectors; + OpenWifi::Types::CountedMap deviceTypes; + OpenWifi::Types::CountedMap monthlyNumberOfCerts; + std::vector monthlyNumberOfCertsPerOrgPerYear; + + void to_json(Poco::JSON::Object &Obj) const; + void reset(); + }; - void to_json(Poco::JSON::Object &Obj) const; - bool from_json(const Poco::JSON::Object::Ptr &Obj); - }; - } } \ No newline at end of file From 2beef2daba90f7a3ce52f0b7d6a73fbe447040c4 Mon Sep 17 00:00:00 2001 From: Dmitry Dunaev Date: Fri, 3 Jun 2022 19:31:22 +0300 Subject: [PATCH 04/20] [WIFI-9174] Fix: switch from deprecated bitnami charts to mirrored ones Signed-off-by: Dmitry Dunaev --- helm/Chart.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/helm/Chart.yaml b/helm/Chart.yaml index 36576be..afcf047 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -5,14 +5,14 @@ name: owsec version: 0.1.0 dependencies: - name: postgresql - repository: https://charts.bitnami.com/bitnami + repository: https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/ version: 10.9.2 condition: postgresql.enabled - name: mysql - repository: https://charts.bitnami.com/bitnami + repository: https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/ version: 8.8.3 condition: mysql.enabled - name: mariadb - repository: https://charts.bitnami.com/bitnami + repository: https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/ version: 9.4.2 condition: mariadb.enabled From 6ad434c02facc37179718a4beeaf41a43c4abb43 Mon Sep 17 00:00:00 2001 From: stephb9959 Date: Tue, 14 Jun 2022 07:13:10 -0700 Subject: [PATCH 05/20] Framework update. --- src/Daemon.cpp | 1 + src/TotpCache.h | 19 +++-------------- src/framework/ow_constants.h | 40 +++++++++++++++++++----------------- 3 files changed, 25 insertions(+), 35 deletions(-) diff --git a/src/Daemon.cpp b/src/Daemon.cpp index 1b1a698..122a94e 100644 --- a/src/Daemon.cpp +++ b/src/Daemon.cpp @@ -10,6 +10,7 @@ // Arilia Wireless Inc. // + #include "Poco/Util/Application.h" #include "Poco/Util/Option.h" #include "Poco/Environment.h" diff --git a/src/TotpCache.h b/src/TotpCache.h index 6de63c7..3225140 100644 --- a/src/TotpCache.h +++ b/src/TotpCache.h @@ -55,10 +55,10 @@ namespace OpenWifi { static bool ValidateCode( const std::string &Secret, const std::string &Code, std::string & Expecting) { uint64_t Now = OpenWifi::Now(); uint32_t p = CppTotp::totp(CppTotp::Bytes::ByteString{ (const u_char *)Secret.c_str()}, Now, 0, 30, 6); - char buffer[16]; + char buffer[16]{0}; sprintf(buffer,"%06u",p); - Expecting = buffer; - return Code == buffer; + Expecting = std::string(buffer); + return Code == Expecting; } int Start() override { @@ -92,19 +92,6 @@ namespace OpenWifi { auto Secret = GenerateSecret(20, Base32Secret); QRCode = GenerateQRCode(Base32Secret, User.email); -/* - struct Entry { - bool Subscriber=false; - uint64_t Start = 0; - uint64_t Done = 0 ; - uint64_t Verifications = 0 ; - std::string Secret; - std::string QRCode; - std::string LastCode; - }; - - */ - Entry E{ .Subscriber = Subscriber, .Start = OpenWifi::Now(), .Done = 0, diff --git a/src/framework/ow_constants.h b/src/framework/ow_constants.h index a27f409..443a457 100644 --- a/src/framework/ow_constants.h +++ b/src/framework/ow_constants.h @@ -459,25 +459,27 @@ namespace OpenWifi::uCentralProtocol::Events { ET_TELEMETRY }; - inline static EVENT_MSG EventFromString(const std::string & Method) { - static std::vector> EventValues{ - { CFGPENDING , ET_CFGPENDING }, - { CONNECT, ET_CONNECT }, - { CRASHLOG, ET_CRASHLOG }, - { DEVICEUPDATE, ET_DEVICEUPDATE }, - { HEALTHCHECK, ET_HEALTHCHECK }, - { LOG, ET_LOG }, - { PING, ET_PING }, - { RECOVERY, ET_RECOVERY }, - { STATE, ET_STATE }, - { TELEMETRY, ET_TELEMETRY } - }; - - const auto l_method = Poco::toLower(Method); - for(const auto &[event_name,event_type]:EventValues) { - if(std::strcmp(event_name,Method.c_str())==0) - return event_type; - } + inline EVENT_MSG EventFromString(const std::string & Method) { + if(strcmp(STATE,Method.c_str())==0) + return ET_STATE; + else if(strcmp(HEALTHCHECK,Method.c_str())==0) + return ET_HEALTHCHECK; + else if(strcmp(CONNECT,Method.c_str())==0) + return ET_CONNECT; + else if(strcmp(CFGPENDING,Method.c_str())==0) + return ET_CFGPENDING; + else if(strcmp(CRASHLOG,Method.c_str())==0) + return ET_CRASHLOG; + else if(strcmp(DEVICEUPDATE,Method.c_str())==0) + return ET_DEVICEUPDATE; + else if(strcmp(LOG,Method.c_str())==0) + return ET_LOG; + else if(strcmp(PING,Method.c_str())==0) + return ET_PING; + else if(strcmp(RECOVERY,Method.c_str())==0) + return ET_RECOVERY; + else if(strcmp(TELEMETRY,Method.c_str())==0) + return ET_TELEMETRY; return ET_UNKNOWN; }; } From a7e9c96f8d7e68f8ce732f3fb47e33f7fd50574d Mon Sep 17 00:00:00 2001 From: stephb9959 Date: Tue, 14 Jun 2022 07:22:17 -0700 Subject: [PATCH 06/20] Fixing bug --- src/RESTAPI/RESTAPI_totp_handler.cpp | 10 ++++++++++ src/TotpCache.h | 19 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/RESTAPI/RESTAPI_totp_handler.cpp b/src/RESTAPI/RESTAPI_totp_handler.cpp index 1e24fe0..e8422ab 100644 --- a/src/RESTAPI/RESTAPI_totp_handler.cpp +++ b/src/RESTAPI/RESTAPI_totp_handler.cpp @@ -11,25 +11,35 @@ namespace OpenWifi { auto Reset = GetBoolParameter("reset",false); std::string QRCode; + std::cout << __LINE__ << std::endl; if(TotpCache()->StartValidation(UserInfo_.userinfo,false,QRCode,Reset)) { + std::cout << __LINE__ << std::endl; return SendFileContent(QRCode, "image/svg+xml","qrcode.svg"); } + std::cout << __LINE__ << std::endl; return BadRequest(RESTAPI::Errors::InvalidCommand); } void RESTAPI_totp_handler::DoPut() { + std::cout << __LINE__ << std::endl; auto Value = GetParameter("value",""); + std::cout << __LINE__ << std::endl; auto nextIndex = GetParameter("index",0); + std::cout << __LINE__ << std::endl; bool moreCodes=false; + std::cout << __LINE__ << std::endl; RESTAPI::Errors::msg Err; + std::cout << __LINE__ << std::endl; if(TotpCache()->ContinueValidation(UserInfo_.userinfo,false,Value,nextIndex,moreCodes, Err)) { Poco::JSON::Object Answer; Answer.set("nextIndex", nextIndex); Answer.set("moreCodes", moreCodes); + std::cout << __LINE__ << std::endl; return ReturnObject(Answer); } + std::cout << __LINE__ << std::endl; return BadRequest(Err); } diff --git a/src/TotpCache.h b/src/TotpCache.h index 3225140..3708124 100644 --- a/src/TotpCache.h +++ b/src/TotpCache.h @@ -31,24 +31,32 @@ namespace OpenWifi { } static std::string GenerateSecret(uint Size, std::string & Base32Secret) { + std::cout << __LINE__ << std::endl; std::string R; + std::cout << __LINE__ << std::endl; for(;Size;Size--) { R += (char) MicroService::instance().Random(33,127); } + std::cout << __LINE__ << std::endl; Base32Secret = CppTotp::Bytes::toBase32( CppTotp::Bytes::ByteString{ (const u_char *)R.c_str()}); + std::cout << __LINE__ << std::endl; return R; } std::string GenerateQRCode(const std::string &Secret, const std::string &email) { + std::cout << __LINE__ << std::endl; std::string uri{ "otpauth://totp/" + Issuer_ + ":" + email + "?secret=" + Secret + "&issuer=" + Issuer_ }; + std::cout << __LINE__ << std::endl; qrcodegen::QrCode qr0 = qrcodegen::QrCode::encodeText(uri.c_str(), qrcodegen::QrCode::Ecc::MEDIUM); + std::cout << __LINE__ << std::endl; std::string svg = qrcodegen::toSvgString(qr0, 4); // See QrCodeGeneratorDemo + std::cout << __LINE__ << std::endl; return svg; } @@ -71,9 +79,13 @@ namespace OpenWifi { }; inline bool StartValidation(const SecurityObjects::UserInfo &User, bool Subscriber, std::string & QRCode, bool Reset) { + std::cout << __LINE__ << std::endl; auto Hint = Cache_.find(User.id); + std::cout << __LINE__ << std::endl; if(Hint!=Cache_.end() && Hint->second.Subscriber==Subscriber) { + std::cout << __LINE__ << std::endl; if(Reset) { + std::cout << __LINE__ << std::endl; std::string Base32Secret; Hint->second.Subscriber = Subscriber; Hint->second.Start = OpenWifi::Now(); @@ -82,15 +94,21 @@ namespace OpenWifi { Hint->second.Secret = GenerateSecret(20,Base32Secret); Hint->second.QRCode = QRCode = GenerateQRCode(Base32Secret, User.email); Hint->second.LastCode.clear(); + std::cout << __LINE__ << std::endl; } else { + std::cout << __LINE__ << std::endl; QRCode = Hint->second.QRCode; } return true; } + std::cout << __LINE__ << std::endl; std::string Base32Secret; + std::cout << __LINE__ << std::endl; auto Secret = GenerateSecret(20, Base32Secret); + std::cout << __LINE__ << std::endl; QRCode = GenerateQRCode(Base32Secret, User.email); + std::cout << __LINE__ << std::endl; Entry E{ .Subscriber = Subscriber, .Start = OpenWifi::Now(), @@ -101,6 +119,7 @@ namespace OpenWifi { .LastCode = 0 }; Cache_[User.id] = E; + std::cout << __LINE__ << std::endl; return true; } From 1d534cb9741bd8cdb51c50d7d0ebb8a297b25366 Mon Sep 17 00:00:00 2001 From: stephb9959 Date: Tue, 14 Jun 2022 07:26:44 -0700 Subject: [PATCH 07/20] Fixing bug --- src/TotpCache.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/TotpCache.h b/src/TotpCache.h index 3708124..e7ad295 100644 --- a/src/TotpCache.h +++ b/src/TotpCache.h @@ -116,7 +116,7 @@ namespace OpenWifi { .Verifications = 0, .Secret = Secret, .QRCode = QRCode, - .LastCode = 0 + .LastCode = "" }; Cache_[User.id] = E; std::cout << __LINE__ << std::endl; From 5e12f00558a22abb7f8f306968f94f0f447b5847 Mon Sep 17 00:00:00 2001 From: Stephane Bourque Date: Tue, 14 Jun 2022 07:26:44 -0700 Subject: [PATCH 08/20] Fixing bug: https://telecominfraproject.atlassian.net/browse/WIFI-9471 Signed-off-by: stephb9959 --- src/RESTAPI/RESTAPI_totp_handler.cpp | 11 ----------- src/TotpCache.h | 22 +--------------------- 2 files changed, 1 insertion(+), 32 deletions(-) diff --git a/src/RESTAPI/RESTAPI_totp_handler.cpp b/src/RESTAPI/RESTAPI_totp_handler.cpp index e8422ab..f39b0f7 100644 --- a/src/RESTAPI/RESTAPI_totp_handler.cpp +++ b/src/RESTAPI/RESTAPI_totp_handler.cpp @@ -11,35 +11,24 @@ namespace OpenWifi { auto Reset = GetBoolParameter("reset",false); std::string QRCode; - std::cout << __LINE__ << std::endl; - if(TotpCache()->StartValidation(UserInfo_.userinfo,false,QRCode,Reset)) { - std::cout << __LINE__ << std::endl; return SendFileContent(QRCode, "image/svg+xml","qrcode.svg"); } - std::cout << __LINE__ << std::endl; return BadRequest(RESTAPI::Errors::InvalidCommand); } void RESTAPI_totp_handler::DoPut() { - std::cout << __LINE__ << std::endl; auto Value = GetParameter("value",""); - std::cout << __LINE__ << std::endl; auto nextIndex = GetParameter("index",0); - std::cout << __LINE__ << std::endl; bool moreCodes=false; - std::cout << __LINE__ << std::endl; RESTAPI::Errors::msg Err; - std::cout << __LINE__ << std::endl; if(TotpCache()->ContinueValidation(UserInfo_.userinfo,false,Value,nextIndex,moreCodes, Err)) { Poco::JSON::Object Answer; Answer.set("nextIndex", nextIndex); Answer.set("moreCodes", moreCodes); - std::cout << __LINE__ << std::endl; return ReturnObject(Answer); } - std::cout << __LINE__ << std::endl; return BadRequest(Err); } diff --git a/src/TotpCache.h b/src/TotpCache.h index 3708124..1034f20 100644 --- a/src/TotpCache.h +++ b/src/TotpCache.h @@ -31,32 +31,23 @@ namespace OpenWifi { } static std::string GenerateSecret(uint Size, std::string & Base32Secret) { - std::cout << __LINE__ << std::endl; std::string R; - std::cout << __LINE__ << std::endl; for(;Size;Size--) { R += (char) MicroService::instance().Random(33,127); } - std::cout << __LINE__ << std::endl; Base32Secret = CppTotp::Bytes::toBase32( CppTotp::Bytes::ByteString{ (const u_char *)R.c_str()}); - std::cout << __LINE__ << std::endl; return R; } std::string GenerateQRCode(const std::string &Secret, const std::string &email) { - std::cout << __LINE__ << std::endl; - std::string uri{ "otpauth://totp/" + Issuer_ + ":" + email + "?secret=" + Secret + "&issuer=" + Issuer_ }; - std::cout << __LINE__ << std::endl; qrcodegen::QrCode qr0 = qrcodegen::QrCode::encodeText(uri.c_str(), qrcodegen::QrCode::Ecc::MEDIUM); - std::cout << __LINE__ << std::endl; std::string svg = qrcodegen::toSvgString(qr0, 4); // See QrCodeGeneratorDemo - std::cout << __LINE__ << std::endl; return svg; } @@ -79,13 +70,9 @@ namespace OpenWifi { }; inline bool StartValidation(const SecurityObjects::UserInfo &User, bool Subscriber, std::string & QRCode, bool Reset) { - std::cout << __LINE__ << std::endl; auto Hint = Cache_.find(User.id); - std::cout << __LINE__ << std::endl; if(Hint!=Cache_.end() && Hint->second.Subscriber==Subscriber) { - std::cout << __LINE__ << std::endl; if(Reset) { - std::cout << __LINE__ << std::endl; std::string Base32Secret; Hint->second.Subscriber = Subscriber; Hint->second.Start = OpenWifi::Now(); @@ -94,21 +81,15 @@ namespace OpenWifi { Hint->second.Secret = GenerateSecret(20,Base32Secret); Hint->second.QRCode = QRCode = GenerateQRCode(Base32Secret, User.email); Hint->second.LastCode.clear(); - std::cout << __LINE__ << std::endl; } else { - std::cout << __LINE__ << std::endl; QRCode = Hint->second.QRCode; } return true; } - std::cout << __LINE__ << std::endl; std::string Base32Secret; - std::cout << __LINE__ << std::endl; auto Secret = GenerateSecret(20, Base32Secret); - std::cout << __LINE__ << std::endl; QRCode = GenerateQRCode(Base32Secret, User.email); - std::cout << __LINE__ << std::endl; Entry E{ .Subscriber = Subscriber, .Start = OpenWifi::Now(), @@ -116,10 +97,9 @@ namespace OpenWifi { .Verifications = 0, .Secret = Secret, .QRCode = QRCode, - .LastCode = 0 + .LastCode = "" }; Cache_[User.id] = E; - std::cout << __LINE__ << std::endl; return true; } From 3be0fd45d9c793d05f7168875777384c9edc3e8d Mon Sep 17 00:00:00 2001 From: stephb9959 Date: Thu, 19 May 2022 00:42:24 -0700 Subject: [PATCH 09/20] Framework update. Signed-off-by: jaspreetsachdev --- src/framework/MicroService.h | 7 ++--- src/framework/orm.h | 52 ++++++++++++++++++++++-------------- src/framework/ow_constants.h | 8 +++++- 3 files changed, 43 insertions(+), 24 deletions(-) diff --git a/src/framework/MicroService.h b/src/framework/MicroService.h index a23c6ef..171b0c2 100644 --- a/src/framework/MicroService.h +++ b/src/framework/MicroService.h @@ -4148,10 +4148,10 @@ namespace OpenWifi { Producer.produce( cppkafka::MessageBuilder(Msg->Topic()).key(Msg->Key()).payload(Msg->Payload())); } + } catch (const cppkafka::HandleException &E) { + KafkaManager()->Logger().warning(fmt::format("Caught a Kafka exception (producer): {}", E.what())); } catch( const Poco::Exception &E) { KafkaManager()->Logger().log(E); - } catch (const cppkafka::HandleException &E) { - KafkaManager()->Logger().error(fmt::format("{}: Exception --> {}", E.get_error().to_string(), E.what())); } catch (...) { KafkaManager()->Logger().error("std::exception"); } @@ -4212,7 +4212,8 @@ namespace OpenWifi { if (Msg.get_error()) { if (!Msg.is_eof()) { KafkaManager()->Logger().error(fmt::format("Error: {}", Msg.get_error().to_string())); - }if(!AutoCommit) + } + if(!AutoCommit) Consumer.async_commit(Msg); continue; } diff --git a/src/framework/orm.h b/src/framework/orm.h index 8559bdf..3b78430 100644 --- a/src/framework/orm.h +++ b/src/framework/orm.h @@ -208,7 +208,8 @@ namespace ORM { int Place=0; for(const auto &i:Fields) { - FieldNames_[i.Name] = Place; + std::string FieldName = Poco::toLower(i.Name); + FieldNames_[FieldName] = Place; if(!first) { CreateFields_ += ", "; SelectFields_ += ", "; @@ -218,9 +219,9 @@ namespace ORM { SelectList_ += "("; } - CreateFields_ += i.Name + " " + FieldTypeToChar(Type_, i.Type,i.Size) + (i.Index ? " unique primary key" : ""); - SelectFields_ += i.Name ; - UpdateFields_ += i.Name + "=?"; + CreateFields_ += FieldName + " " + FieldTypeToChar(Type_, i.Type,i.Size) + (i.Index ? " unique primary key" : ""); + SelectFields_ += FieldName ; + UpdateFields_ += FieldName + "=?"; SelectList_ += "?"; first = false; Place++; @@ -235,12 +236,13 @@ namespace ORM { IndexLine = std::string("CREATE INDEX IF NOT EXISTS ") + j.Name + std::string(" ON ") + TableName_+ " ("; bool first_entry=true; for(const auto &k:j.Entries) { - assert(FieldNames_.find(k.FieldName) != FieldNames_.end()); + auto IndexFieldName = Poco::toLower(k.FieldName); + assert(ValidFieldName(IndexFieldName)); if(!first_entry) { IndexLine += " , "; } first_entry = false; - IndexLine += k.FieldName + std::string(" ") + std::string(k.Type == Indextype::ASC ? "ASC" : "DESC") ; + IndexLine += IndexFieldName + std::string(" ") + std::string(k.Type == Indextype::ASC ? "ASC" : "DESC") ; } IndexLine += " )"; IndexCreation_.template emplace_back(IndexLine); @@ -255,12 +257,13 @@ namespace ORM { IndexLine += " INDEX " + j.Name + " ( " ; bool first_entry=true; for(const auto &k:j.Entries) { - assert(FieldNames_.find(k.FieldName) != FieldNames_.end()); + auto IndexFieldName = Poco::toLower(k.FieldName); + assert(FieldNames_.find(IndexFieldName) != FieldNames_.end()); if(!first_entry) { IndexLine += " ,"; } first_entry = false; - IndexLine += k.FieldName + std::string(k.Type == Indextype::ASC ? " ASC" : " DESC"); + IndexLine += IndexFieldName + std::string(k.Type == Indextype::ASC ? " ASC" : " DESC"); } IndexLine += " ) "; } @@ -275,27 +278,27 @@ namespace ORM { [[nodiscard]] const std::string & UpdateFields() const { return UpdateFields_; }; inline std::string OP(field_name_t F, SqlComparison O , bool V) { - assert( FieldNames_.find(F) != FieldNames_.end() ); + assert(ValidFieldName(F)); return std::string{"("} + F + SQLCOMPS[O] + (V ? "true" : "false") + ")" ; } inline std::string OP(field_name_t F, SqlComparison O , int V) { - assert( FieldNames_.find(F) != FieldNames_.end() ); + assert(ValidFieldName(F)); return std::string{"("} + F + SQLCOMPS[O] + std::to_string(V) + ")" ; } inline std::string OP(field_name_t F, SqlComparison O , uint64_t V) { - assert( FieldNames_.find(F) != FieldNames_.end() ); + assert(ValidFieldName(F)); return std::string{"("} + F + SQLCOMPS[O] + std::to_string(V) + ")" ; } std::string OP(field_name_t F, SqlComparison O , const std::string & V) { - assert( FieldNames_.find(F) != FieldNames_.end() ); + assert(ValidFieldName(F)); return std::string{"("} + F + SQLCOMPS[O] + "'" + Escape(V) + "')" ; } std::string OP(field_name_t F, SqlComparison O , const char * V) { - assert( FieldNames_.find(F) != FieldNames_.end() ); + assert(ValidFieldName(F)); return std::string{"("} + F + SQLCOMPS[O] + "'" + Escape(V) + "')" ; } @@ -417,7 +420,7 @@ namespace ORM { template bool GetRecord(field_name_t FieldName, const T & Value, RecordType & R) { try { - assert( FieldNames_.find(FieldName) != FieldNames_.end() ); + assert(ValidFieldName(FieldName)); if(Cache_) { if(Cache_->GetFromCache(FieldName, Value, R)) @@ -455,7 +458,7 @@ namespace ORM { typename T0, typename T1> bool GR(field_name_t FieldName, T & R,T0 &V0, T1 &V1) { try { - assert( FieldNames_.find(FieldName) != FieldNames_.end() ); + assert( ValidFieldName(FieldName) ); Poco::Data::Session Session = Pool_.get(); Poco::Data::Statement Select(Session); @@ -513,7 +516,7 @@ namespace ORM { template bool UpdateRecord(field_name_t FieldName, const T & Value, const RecordType & R) { try { - assert( FieldNames_.find(FieldName) != FieldNames_.end() ); + assert( ValidFieldName(FieldName) ); Poco::Data::Session Session = Pool_.get(); Poco::Data::Statement Update(Session); @@ -567,7 +570,7 @@ namespace ORM { template bool GetNameAndDescription(field_name_t FieldName, const T & Value, std::string & Name, std::string & Description ) { try { - assert( FieldNames_.find(FieldName) != FieldNames_.end() ); + assert( ValidFieldName(FieldName) ); Poco::Data::Session Session = Pool_.get(); Poco::Data::Statement Select(Session); RecordTuple RT; @@ -594,7 +597,7 @@ namespace ORM { template bool DeleteRecord(field_name_t FieldName, const T & Value) { try { - assert( FieldNames_.find(FieldName) != FieldNames_.end() ); + assert( ValidFieldName(FieldName) ); Poco::Data::Session Session = Pool_.get(); Poco::Data::Statement Delete(Session); @@ -632,7 +635,7 @@ namespace ORM { bool Exists(field_name_t FieldName, const std::string & Value) { try { - assert( FieldNames_.find(FieldName) != FieldNames_.end() ); + assert( ValidFieldName(FieldName) ); RecordType R; if(GetRecord(FieldName,Value,R)) @@ -721,7 +724,7 @@ namespace ORM { template bool ManipulateVectorMember( X T, field_name_t FieldName, const std::string & ParentUUID, const std::string & ChildUUID, bool Add) { try { - assert( FieldNames_.find(FieldName) != FieldNames_.end() ); + assert( ValidFieldName(FieldName) ); RecordType R; if(GetRecord(FieldName, ParentUUID, R)) { @@ -870,6 +873,15 @@ namespace ORM { return false; } + inline bool ValidFieldName(const std::string &FieldName) { + return FieldNames_.find(Poco::toLower(FieldName)) != FieldNames_.end(); + } + + inline bool ValidFieldName(const char *FieldName) { + std::string Field{FieldName}; + return ValidFieldName(Field); + } + [[nodiscard]] inline std::string ComputeRange(uint64_t From, uint64_t HowMany) { if(From<1) From=0; switch(Type_) { diff --git a/src/framework/ow_constants.h b/src/framework/ow_constants.h index 74b8711..944afd0 100644 --- a/src/framework/ow_constants.h +++ b/src/framework/ow_constants.h @@ -415,7 +415,13 @@ namespace OpenWifi::uCentralProtocol { static const char *SCRIPT = "script"; static const char *TYPE = "type"; -} + + static const char *RADIUS = "radius"; + static const char *RADIUSDATA = "data"; + static const char *RADIUSACCT = "acct"; + static const char *RADIUSAUTH = "auth"; + static const char *RADIUSDST = "dst"; + } namespace OpenWifi::uCentralProtocol::Events { From cce2528ec4d1ec0f1a74fdb2f8177eac2b409635 Mon Sep 17 00:00:00 2001 From: stephb9959 Date: Thu, 19 May 2022 16:10:34 -0700 Subject: [PATCH 10/20] Framework update. Signed-off-by: jaspreetsachdev --- src/framework/orm.h | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/framework/orm.h b/src/framework/orm.h index 3b78430..7b358a9 100644 --- a/src/framework/orm.h +++ b/src/framework/orm.h @@ -688,7 +688,7 @@ namespace ORM { } if(!ItemList.empty()) ItemList += " , "; - auto hint = FieldNames_.find(T[0]); + auto hint = FieldNames_.find(Poco::toLower(T[0])); if(hint==FieldNames_.end()) { return false; } @@ -898,12 +898,17 @@ namespace ORM { Poco::Logger & Logger() { return Logger_; } - bool DeleteRecordsFromCache(const char *FieldName, const std::string &Value ) { + inline bool DeleteRecordsFromCache(const char *FieldName, const std::string &Value ) { if(Cache_) Cache_->Delete(FieldName, Value); return true; } + inline void GetFieldNames( OpenWifi::Types::StringVec & F) { + for(const auto &[field,_]:FieldNames_) + F.push_back(field); + } + protected: std::string TableName_; OpenWifi::DBType Type_; From 6942de0475586e72d82bb516597d6f494eb30956 Mon Sep 17 00:00:00 2001 From: stephb9959 Date: Sun, 22 May 2022 22:27:42 -0700 Subject: [PATCH 11/20] Framework update. Signed-off-by: jaspreetsachdev --- src/RESTObjects/RESTAPI_GWobjects.cpp | 95 +++++++++++++++++++++++++++ src/RESTObjects/RESTAPI_GWobjects.h | 49 ++++++++++++++ src/framework/ow_constants.h | 7 ++ 3 files changed, 151 insertions(+) diff --git a/src/RESTObjects/RESTAPI_GWobjects.cpp b/src/RESTObjects/RESTAPI_GWobjects.cpp index 0515bc6..285517d 100644 --- a/src/RESTObjects/RESTAPI_GWobjects.cpp +++ b/src/RESTObjects/RESTAPI_GWobjects.cpp @@ -272,5 +272,100 @@ namespace OpenWifi::GWObjects { field_to_json(Obj,"capabilities", capabilities); }; + void ScriptRequest::to_json(Poco::JSON::Object &Obj) const { + field_to_json(Obj,"serialNumber",serialNumber); + field_to_json(Obj,"timeout",timeout); + field_to_json(Obj,"type",type); + field_to_json(Obj,"script",script); + field_to_json(Obj,"scriptId",scriptId); + field_to_json(Obj,"when",when); + } + + bool ScriptRequest::from_json(const Poco::JSON::Object::Ptr &Obj) { + try { + field_from_json(Obj,"serialNumber",serialNumber); + field_from_json(Obj,"timeout",timeout); + field_from_json(Obj,"type",type); + field_from_json(Obj,"script",script); + field_from_json(Obj,"scriptId",scriptId); + field_from_json(Obj,"when",when); + return true; + } catch (const Poco::Exception &E) { + } + return false; + + } + + void RadiusProxyPoolList::to_json(Poco::JSON::Object &Obj) const { + field_to_json(Obj,"pools",pools); + } + + bool RadiusProxyPoolList::from_json(const Poco::JSON::Object::Ptr &Obj) { + try { + field_from_json(Obj,"pools",pools); + return true; + } catch (const Poco::Exception &E) { + } + return false; + } + + void RadiusProxyPool::to_json(Poco::JSON::Object &Obj) const { + field_to_json(Obj,"name",name); + field_to_json(Obj,"description",description); + field_to_json(Obj,"authConfig",authConfig); + field_to_json(Obj,"acctConfig",acctConfig); + } + + bool RadiusProxyPool::from_json(const Poco::JSON::Object::Ptr &Obj) { + try { + field_from_json(Obj,"name",name); + field_from_json(Obj,"description",description); + field_from_json(Obj,"authConfig",authConfig); + field_from_json(Obj,"acctConfig",acctConfig); + return true; + } catch (const Poco::Exception &E) { + } + return false; + } + + void RadiusProxyServerConfig::to_json(Poco::JSON::Object &Obj) const { + field_to_json(Obj,"policy",strategy); + field_to_json(Obj,"monitor",monitor); + field_to_json(Obj,"monitorMethod",monitorMethod); + field_to_json(Obj,"methodParameters",methodParameters); + field_to_json(Obj,"servers",servers); + } + + bool RadiusProxyServerConfig::from_json(const Poco::JSON::Object::Ptr &Obj) { + try { + field_from_json(Obj,"policy",strategy); + field_from_json(Obj,"monitor",monitor); + field_from_json(Obj,"monitorMethod",monitorMethod); + field_from_json(Obj,"methodParameters",methodParameters); + field_from_json(Obj,"servers",servers); + return true; + } catch (const Poco::Exception &E) { + } + return false; + } + + void RadiusProxyServerEntry::to_json(Poco::JSON::Object &Obj) const { + field_to_json(Obj,"name",name); + field_to_json(Obj,"ip",ip); + field_to_json(Obj,"port",port); + field_to_json(Obj,"weight",weight); + } + + bool RadiusProxyServerEntry::from_json(const Poco::JSON::Object::Ptr &Obj) { + try { + field_from_json(Obj,"name",name); + field_from_json(Obj,"ip",ip); + field_from_json(Obj,"port",port); + field_from_json(Obj,"weight",weight); + return true; + } catch (const Poco::Exception &E) { + } + return false; + } } diff --git a/src/RESTObjects/RESTAPI_GWobjects.h b/src/RESTObjects/RESTAPI_GWobjects.h index 187f7ec..7395545 100644 --- a/src/RESTObjects/RESTAPI_GWobjects.h +++ b/src/RESTObjects/RESTAPI_GWobjects.h @@ -199,4 +199,53 @@ namespace OpenWifi::GWObjects { void to_json(Poco::JSON::Object &Obj) const; }; + + struct ScriptRequest { + uint64_t timeout=30; + std::string serialNumber; + std::string type; + std::string script; + std::string scriptId; + uint64_t when=0; + void to_json(Poco::JSON::Object &Obj) const; + bool from_json(const Poco::JSON::Object::Ptr &Obj); + }; + + struct RadiusProxyServerEntry { + std::string name; + std::string ip; + uint16_t port=0; + uint64_t weight=0; + + void to_json(Poco::JSON::Object &Obj) const; + bool from_json(const Poco::JSON::Object::Ptr &Obj); + }; + + struct RadiusProxyServerConfig { + std::string strategy; + bool monitor=false; + std::string monitorMethod; + std::vector methodParameters; + std::vector servers; + + void to_json(Poco::JSON::Object &Obj) const; + bool from_json(const Poco::JSON::Object::Ptr &Obj); + }; + + struct RadiusProxyPool { + std::string name; + std::string description; + RadiusProxyServerConfig authConfig; + RadiusProxyServerConfig acctConfig; + + void to_json(Poco::JSON::Object &Obj) const; + bool from_json(const Poco::JSON::Object::Ptr &Obj); + }; + + struct RadiusProxyPoolList { + std::vector pools; + + void to_json(Poco::JSON::Object &Obj) const; + bool from_json(const Poco::JSON::Object::Ptr &Obj); + }; } diff --git a/src/framework/ow_constants.h b/src/framework/ow_constants.h index 944afd0..0d87d11 100644 --- a/src/framework/ow_constants.h +++ b/src/framework/ow_constants.h @@ -188,6 +188,13 @@ namespace OpenWifi::RESTAPI::Errors { static const struct msg FailedToVerifyDigicert{1136,"Failed to verify the DigiCert information provided."}; static const struct msg CouldNotPerformCommand{1137,"Could not perform command."}; + static const struct msg PoolNameInvalid{1138,"Pool name is invalid."}; + static const struct msg InvalidRadiusProxyStrategy{1139,"Strategy name must be: random, round_robin, weighted."}; + static const struct msg InvalidRadiusProxyMonitorMethod{1140,"monitorMethod must be: none, https, radius."}; + static const struct msg MustHaveAtLeastOneRadiusServer{1141,"Must have at least one RADIUS server."}; + static const struct msg InvalidRadiusServerEntry{1142,"RADIUS Server IP address invalid or port missing."}; + static const struct msg InvalidRadiusServerWeigth{1143,"RADIUS Server IP weight cannot be 0."}; + } From c0d0435efa1e3866be6263e7e5d7589db2846c5c Mon Sep 17 00:00:00 2001 From: stephb9959 Date: Tue, 31 May 2022 11:50:37 -0700 Subject: [PATCH 12/20] Framework update. Signed-off-by: jaspreetsachdev --- src/RESTObjects/RESTAPI_SecurityObjects.h | 8 +- src/framework/ConfigurationValidator.cpp | 207 +++++++++++++++++++++- src/framework/MicroService.h | 8 +- test_scripts/curl/token.json | 1 - 4 files changed, 210 insertions(+), 14 deletions(-) delete mode 100644 test_scripts/curl/token.json diff --git a/src/RESTObjects/RESTAPI_SecurityObjects.h b/src/RESTObjects/RESTAPI_SecurityObjects.h index ac3b6bd..a3f06e8 100644 --- a/src/RESTObjects/RESTAPI_SecurityObjects.h +++ b/src/RESTObjects/RESTAPI_SecurityObjects.h @@ -9,6 +9,7 @@ #pragma once #include +#include #include "framework/OpenWifiTypes.h" #include "Poco/JSON/Object.h" #include "Poco/Data/LOB.h" @@ -27,8 +28,13 @@ namespace OpenWifi { bool Delete_ = true; bool PortalLogin_ = true; + AclTemplate() noexcept = default; + void to_json(Poco::JSON::Object &Obj) const; - bool from_json(const Poco::JSON::Object::Ptr &Obj); }; + bool from_json(const Poco::JSON::Object::Ptr &Obj); + }; + + static_assert( std::is_nothrow_move_constructible_v ); struct WebToken { std::string access_token_; diff --git a/src/framework/ConfigurationValidator.cpp b/src/framework/ConfigurationValidator.cpp index f73c63a..7a4a571 100644 --- a/src/framework/ConfigurationValidator.cpp +++ b/src/framework/ConfigurationValidator.cpp @@ -13,9 +13,10 @@ namespace OpenWifi { - static const std::string GitUCentralJSONSchemaFile{"https://raw.githubusercontent.com/blogic/ucentral-schema/main/ucentral.schema.json"}; +static const std::string GitUCentralJSONSchemaFile{ + "https://raw.githubusercontent.com/blogic/ucentral-schema/main/ucentral.schema.json"}; - static json DefaultUCentralSchema = R"( +static json DefaultUCentralSchema = R"( { "$id": "https://openwrt.org/ucentral.schema.json", @@ -518,7 +519,7 @@ namespace OpenWifi { "maximum": 4050 }, "proto": { - "decription": "The L2 vlan tag that shall be added (1q,1ad) ", + "decription": "The L2 vlan tag that shall be added (1q,1ad ) ", "type": "string", "enum": [ "802.1ad", @@ -669,6 +670,47 @@ namespace OpenWifi { } } }, + "interface.ipv4.port-forward": { + "type": "object", + "properties": { + "protocol": { + "type": "string", + "enum": [ + "tcp", + "udp", + "any" + ], + "default": "any" + }, + "external-port": { + "type": [ + "integer", + "string" + ], + "minimum": 0, + "maximum": 65535, + "format": "uc-portrange" + }, + "internal-address": { + "type": "string", + "format": "ipv4", + "example": "0.0.0.120" + }, + "internal-port": { + "type": [ + "integer", + "string" + ], + "minimum": 0, + "maximum": 65535, + "format": "uc-portrange" + } + }, + "required": [ + "external-port", + "internal-address" + ] + }, "interface.ipv4": { "type": "object", "properties": { @@ -722,6 +764,12 @@ namespace OpenWifi { "items": { "$ref": "#/$defs/interface.ipv4.dhcp-lease" } + }, + "port-forward": { + "type": "array", + "items": { + "$ref": "#/$defs/interface.ipv4.port-forward" + } } } }, @@ -751,6 +799,96 @@ namespace OpenWifi { } } }, + "interface.ipv6.port-forward": { + "type": "object", + "properties": { + "protocol": { + "type": "string", + "enum": [ + "tcp", + "udp", + "any" + ], + "default": "any" + }, + "external-port": { + "type": [ + "integer", + "string" + ], + "minimum": 0, + "maximum": 65535, + "format": "uc-portrange" + }, + "internal-address": { + "type": "string", + "format": "ipv6", + "example": "::1234:abcd" + }, + "internal-port": { + "type": [ + "integer", + "string" + ], + "minimum": 0, + "maximum": 65535, + "format": "uc-portrange" + } + }, + "required": [ + "external-port", + "internal-address" + ] + }, + "interface.ipv6.traffic-allow": { + "type": "object", + "properties": { + "protocol": { + "type": "string", + "default": "any" + }, + "source-address": { + "type": "string", + "format": "uc-cidr6", + "example": "2001:db8:1234:abcd::/64", + "default": "::/0" + }, + "source-ports": { + "type": "array", + "minItems": 1, + "items": { + "type": [ + "integer", + "string" + ], + "minimum": 0, + "maximum": 65535, + "format": "uc-portrange" + } + }, + "destination-address": { + "type": "string", + "format": "ipv6", + "example": "::1000" + }, + "destination-ports": { + "type": "array", + "minItems": 1, + "items": { + "type": [ + "integer", + "string" + ], + "minimum": 0, + "maximum": 65535, + "format": "uc-portrange" + } + } + }, + "required": [ + "destination-address" + ] + }, "interface.ipv6": { "type": "object", "properties": { @@ -782,6 +920,18 @@ namespace OpenWifi { }, "dhcpv6": { "$ref": "#/$defs/interface.ipv6.dhcpv6" + }, + "port-forward": { + "type": "array", + "items": { + "$ref": "#/$defs/interface.ipv6.port-forward" + } + }, + "traffic-allow": { + "type": "array", + "items": { + "$ref": "#/$defs/interface.ipv6.traffic-allow" + } } } }, @@ -866,7 +1016,7 @@ namespace OpenWifi { }, "gateway-fqdn": { "type": "string", - "format": "fqdn", + "format": "uc-fqdn", "default": "ucentral.splash" }, "max-clients": { @@ -901,6 +1051,7 @@ namespace OpenWifi { "psk", "psk2", "psk-mixed", + "psk2-radius", "wpa", "wpa2", "wpa-mixed", @@ -961,6 +1112,10 @@ namespace OpenWifi { "type": "boolean", "default": false }, + "reduced-neighbor-reporting": { + "type": "boolean", + "default": false + }, "lci": { "type": "string" }, @@ -1527,6 +1682,11 @@ namespace OpenWifi { "decription": "This option allows embedding custom vendor specific IEs inside the beacons of a BSS in AP mode.", "type": "string" }, + "fils-discovery-interval": { + "type": "integer", + "default": 20, + "maximum": 10000 + }, "encryption": { "$ref": "#/$defs/interface.ssid.encryption" }, @@ -2087,6 +2247,10 @@ namespace OpenWifi { "auto-channel": { "type": "boolean", "default": false + }, + "ipv6": { + "type": "boolean", + "default": false } } }, @@ -2193,7 +2357,7 @@ namespace OpenWifi { "properties": { "fqdn": { "type": "string", - "format": "fqdn" + "format": "uc-fqdn" }, "suffix-matching": { "type": "boolean", @@ -2444,8 +2608,7 @@ namespace OpenWifi { } } } - - )"_json; +)"_json; class custom_error_handler : public nlohmann::json_schema::basic_error_handler { @@ -2460,9 +2623,18 @@ namespace OpenWifi { void ConfigurationValidator::Init() { if(Initialized_) return; + std::string GitSchema; + if(MicroService::instance().ConfigGetBool("ucentral.datamodel.internal",true)) { + RootSchema_ = DefaultUCentralSchema; + Logger().information("Using uCentral validation from built-in default."); + Initialized_ = Working_ = true; + return; + } + try { - if(Utils::wgets(GitUCentralJSONSchemaFile, GitSchema)) { + auto GitURI = MicroService::instance().ConfigGetString("ucentral.datamodel.uri",GitUCentralJSONSchemaFile); + if(Utils::wgets(GitURI, GitSchema)) { RootSchema_ = json::parse(GitSchema); Logger().information("Using uCentral validation schema from GIT."); } else { @@ -2528,6 +2700,17 @@ namespace OpenWifi { return IsCIDRv4(value) || IsCIDRv6(value); } + static inline bool IsPortRangeIsValid(const std::string &r) { + const auto ports = Poco::StringTokenizer("-",r,Poco::StringTokenizer::TOK_TRIM); + + for(const auto &port:ports) { + uint32_t port_num = std::stoul(port); + if(port_num==0 || port_num>65535) + return false; + } + return true; + } + void ConfigurationValidator::my_format_checker(const std::string &format, const std::string &value) { static const std::regex host_regex{"^(?=.{1,254}$)((?=[a-z0-9-]{1,63}\\.)(xn--+)?[a-z0-9]+(-[a-z0-9]+)*\\.)+[a-z]{2,63}$"}; @@ -2578,6 +2761,14 @@ namespace OpenWifi { } catch (...) { } throw std::invalid_argument(value + " is not a valid URI: should be something like https://hello.world.com."); + } else if(format == "uc-portrange") { + try { + if(IsPortRangeIsValid(value)) + return; + throw std::invalid_argument(value + " is not a valid port range: should an integer between 1-65535 or a port range like post-port."); + } catch (...) { + } + throw std::invalid_argument(value + " is not a valid port range: should an integer between 1-65535 or a port range like post-port."); } else if(format == "ip") { if (IsIP(value)) return; diff --git a/src/framework/MicroService.h b/src/framework/MicroService.h index 171b0c2..9b129bb 100644 --- a/src/framework/MicroService.h +++ b/src/framework/MicroService.h @@ -4400,7 +4400,7 @@ namespace OpenWifi { Path, Poco::Net::HTTPMessage::HTTP_1_1); - Poco::Logger::get("REST-CALLER-GET").debug(fmt::format(" {}", URI.toString())); + poco_debug(Poco::Logger::get("REST-CALLER-GET"),fmt::format(" {}", URI.toString())); if(BearerToken.empty()) { Request.add("X-API-KEY", Svc.AccessKey); @@ -4458,7 +4458,7 @@ namespace OpenWifi { for (const auto &qp : QueryData_) URI.addQueryParameter(qp.first, qp.second); - Poco::Logger::get("REST-CALLER-PUT").debug(fmt::format("{}", URI.toString())); + poco_debug(Poco::Logger::get("REST-CALLER-PUT"),fmt::format("{}", URI.toString())); std::string Path(URI.getPathAndQuery()); @@ -4537,7 +4537,7 @@ namespace OpenWifi { for (const auto &qp : QueryData_) URI.addQueryParameter(qp.first, qp.second); - Poco::Logger::get("REST-CALLER-POST").debug(fmt::format(" {}", URI.toString())); + poco_debug(Poco::Logger::get("REST-CALLER-POST"),fmt::format(" {}", URI.toString())); std::string Path(URI.getPathAndQuery()); @@ -4613,7 +4613,7 @@ namespace OpenWifi { for (const auto &qp : QueryData_) URI.addQueryParameter(qp.first, qp.second); - Poco::Logger::get("REST-CALLER-DELETE").debug(fmt::format(" {}", URI.toString())); + poco_debug(Poco::Logger::get("REST-CALLER-DELETE"),fmt::format(" {}", URI.toString())); std::string Path(URI.getPathAndQuery()); diff --git a/test_scripts/curl/token.json b/test_scripts/curl/token.json deleted file mode 100644 index 19765bd..0000000 --- a/test_scripts/curl/token.json +++ /dev/null @@ -1 +0,0 @@ -null From 2f8eb90c5a515b0816cefffa66939214685832f2 Mon Sep 17 00:00:00 2001 From: Johann Hoffmann Date: Mon, 23 May 2022 13:15:31 +0200 Subject: [PATCH 13/20] Enable CI for pull requests in release branches Signed-off-by: Johann Hoffmann Signed-off-by: jaspreetsachdev --- .github/workflows/ci.yml | 1 + .github/workflows/cleanup.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4f46ee9..80b06f0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,6 +13,7 @@ on: pull_request: branches: - main + - 'release/*' defaults: run: diff --git a/.github/workflows/cleanup.yml b/.github/workflows/cleanup.yml index 11122c4..a252d2e 100644 --- a/.github/workflows/cleanup.yml +++ b/.github/workflows/cleanup.yml @@ -4,6 +4,7 @@ on: pull_request: branches: - main + - 'release/*' types: [ closed ] defaults: From 9060fef03d6efbcc9cf112aa15d5d51fd741b773 Mon Sep 17 00:00:00 2001 From: Dmitry Dunaev Date: Mon, 23 May 2022 15:16:30 +0300 Subject: [PATCH 14/20] [WIFI-7555] Fix: helm path Signed-off-by: Dmitry Dunaev Signed-off-by: jaspreetsachdev --- .github/workflows/release.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a542efd..768cba9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -22,7 +22,7 @@ jobs: path: wlan-cloud-ucentralsec - name: Build package - working-directory: wlan-cloud-ucentralsec/chart + working-directory: wlan-cloud-ucentralsec/helm run: | helm plugin install https://github.com/aslafy-z/helm-git --version 0.10.0 helm repo add bitnami https://charts.bitnami.com/bitnami @@ -32,7 +32,7 @@ jobs: helm package . -d dist - name: Generate GitHub release body - working-directory: wlan-cloud-ucentralsec/chart + working-directory: wlan-cloud-ucentralsec/helm run: | pip3 install yq -q echo "Docker image - tip-tip-wlan-cloud-ucentral.jfrog.io/owsec:$GITHUB_REF_NAME" > release.txt @@ -42,5 +42,5 @@ jobs: - name: Create GitHub release uses: softprops/action-gh-release@v1 with: - body_path: wlan-cloud-ucentralsec/chart/release.txt - files: wlan-cloud-ucentralsec/chart/dist/* + body_path: wlan-cloud-ucentralsec/helm/release.txt + files: wlan-cloud-ucentralsec/helm/dist/* From 94997a1f9fb57452225455bab223125321033be8 Mon Sep 17 00:00:00 2001 From: stephb9959 Date: Tue, 31 May 2022 23:26:05 -0700 Subject: [PATCH 15/20] Framework update. Signed-off-by: jaspreetsachdev --- src/framework/ow_constants.h | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/framework/ow_constants.h b/src/framework/ow_constants.h index 0d87d11..a27f409 100644 --- a/src/framework/ow_constants.h +++ b/src/framework/ow_constants.h @@ -5,6 +5,7 @@ #pragma once #include +#include #include "Poco/String.h" #if defined(__GNUC__) @@ -428,6 +429,7 @@ namespace OpenWifi::uCentralProtocol { static const char *RADIUSACCT = "acct"; static const char *RADIUSAUTH = "auth"; static const char *RADIUSDST = "dst"; + static const char *IES = "ies"; } namespace OpenWifi::uCentralProtocol::Events { @@ -458,7 +460,7 @@ namespace OpenWifi::uCentralProtocol::Events { }; inline static EVENT_MSG EventFromString(const std::string & Method) { - static std::vector> Values{ + static std::vector> EventValues{ { CFGPENDING , ET_CFGPENDING }, { CONNECT, ET_CONNECT }, { CRASHLOG, ET_CRASHLOG }, @@ -471,11 +473,12 @@ namespace OpenWifi::uCentralProtocol::Events { { TELEMETRY, ET_TELEMETRY } }; - std::string L = Poco::toLower(Method); - auto hint = std::find_if(cbegin(Values),cend(Values),[&](const std::pair &v) ->bool { return strcmp(v.first,L.c_str())==0; }); - if(hint == cend(Values)) - return ET_UNKNOWN; - return hint->second; + const auto l_method = Poco::toLower(Method); + for(const auto &[event_name,event_type]:EventValues) { + if(std::strcmp(event_name,Method.c_str())==0) + return event_type; + } + return ET_UNKNOWN; }; } From 760cad9a1480da396e7ab6766c7f642c0ed40006 Mon Sep 17 00:00:00 2001 From: stephb9959 Date: Tue, 31 May 2022 23:53:47 -0700 Subject: [PATCH 16/20] Framework update. Signed-off-by: jaspreetsachdev --- src/RESTObjects/RESTAPI_AnalyticsObjects.cpp | 10 +- src/RESTObjects/RESTAPI_AnalyticsObjects.h | 5 +- src/RESTObjects/RESTAPI_CertObjects.cpp | 342 ++++++++++--------- src/RESTObjects/RESTAPI_CertObjects.h | 183 +++++----- 4 files changed, 297 insertions(+), 243 deletions(-) diff --git a/src/RESTObjects/RESTAPI_AnalyticsObjects.cpp b/src/RESTObjects/RESTAPI_AnalyticsObjects.cpp index aebe317..e7738ba 100644 --- a/src/RESTObjects/RESTAPI_AnalyticsObjects.cpp +++ b/src/RESTObjects/RESTAPI_AnalyticsObjects.cpp @@ -538,8 +538,8 @@ namespace OpenWifi::AnalyticsObjects { void WifiClientHistory::to_json(Poco::JSON::Object &Obj) const { field_to_json(Obj,"timestamp",timestamp); - field_to_json(Obj,"stationId",stationId); - field_to_json(Obj,"bssId",bssId); + field_to_json(Obj,"station_id",station_id); + field_to_json(Obj,"bssid",bssid); field_to_json(Obj,"ssid",ssid); field_to_json(Obj,"rssi",rssi); field_to_json(Obj,"rx_bitrate",rx_bitrate); @@ -573,13 +573,14 @@ namespace OpenWifi::AnalyticsObjects { field_to_json(Obj,"connected",connected); field_to_json(Obj,"inactive",inactive); field_to_json(Obj,"tx_retries",tx_retries); + field_to_json(Obj,"venue_id",venue_id); } bool WifiClientHistory::from_json(const Poco::JSON::Object::Ptr &Obj) { try { field_from_json(Obj,"timestamp",timestamp); - field_from_json(Obj,"stationId",stationId); - field_from_json(Obj,"bssId",bssId); + field_from_json(Obj,"station_id",station_id); + field_from_json(Obj,"bssid",bssid); field_from_json(Obj,"ssid",ssid); field_from_json(Obj,"rssi",rssi); field_from_json(Obj,"rx_bitrate",rx_bitrate); @@ -613,6 +614,7 @@ namespace OpenWifi::AnalyticsObjects { field_from_json(Obj,"connected",connected); field_from_json(Obj,"inactive",inactive); field_from_json(Obj,"tx_retries",tx_retries); + field_from_json(Obj,"venue_id",venue_id); return true; } catch(...) { diff --git a/src/RESTObjects/RESTAPI_AnalyticsObjects.h b/src/RESTObjects/RESTAPI_AnalyticsObjects.h index 6573aca..c1328f4 100644 --- a/src/RESTObjects/RESTAPI_AnalyticsObjects.h +++ b/src/RESTObjects/RESTAPI_AnalyticsObjects.h @@ -376,8 +376,8 @@ namespace OpenWifi { struct WifiClientHistory { uint64_t timestamp=OpenWifi::Now(); - std::string stationId; - std::string bssId; + std::string station_id; + std::string bssid; std::string ssid; int64_t rssi=0; uint32_t rx_bitrate=0; @@ -411,6 +411,7 @@ namespace OpenWifi { uint64_t connected=0; uint64_t inactive=0; uint64_t tx_retries=0; + std::string venue_id; void to_json(Poco::JSON::Object &Obj) const; bool from_json(const Poco::JSON::Object::Ptr &Obj); diff --git a/src/RESTObjects/RESTAPI_CertObjects.cpp b/src/RESTObjects/RESTAPI_CertObjects.cpp index f3aca35..ea55bd4 100644 --- a/src/RESTObjects/RESTAPI_CertObjects.cpp +++ b/src/RESTObjects/RESTAPI_CertObjects.cpp @@ -3,176 +3,206 @@ // #include "RESTAPI_CertObjects.h" +#include "framework/MicroService.h" using OpenWifi::RESTAPI_utils::field_to_json; using OpenWifi::RESTAPI_utils::field_from_json; -namespace OpenWifi { - namespace CertObjects { - void CertificateEntry::to_json(Poco::JSON::Object &Obj) const { - field_to_json(Obj,"id", id); - field_to_json(Obj,"entity", entity); - field_to_json(Obj,"creator", creator); - field_to_json(Obj,"type", type); - field_to_json(Obj,"status", status); - field_to_json(Obj,"certificate", certificate); - field_to_json(Obj,"key", key); - field_to_json(Obj,"devid", devid); - field_to_json(Obj,"cas", cas); - field_to_json(Obj,"manufacturer", manufacturer); - field_to_json(Obj,"model", model); - field_to_json(Obj,"redirector", redirector); - field_to_json(Obj,"commonName", commonName); - field_to_json(Obj,"certificateId", certificateId); - field_to_json(Obj,"batch", batch); - field_to_json(Obj,"created", created); - field_to_json(Obj,"modified", modified); - field_to_json(Obj,"revoked", revoked); - field_to_json(Obj,"revokeCount", revokeCount); - } +namespace OpenWifi::CertObjects { + void CertificateEntry::to_json(Poco::JSON::Object &Obj) const { + field_to_json(Obj,"id", id); + field_to_json(Obj,"entity", entity); + field_to_json(Obj,"creator", creator); + field_to_json(Obj,"type", type); + field_to_json(Obj,"status", status); + field_to_json(Obj,"certificate", certificate); + field_to_json(Obj,"key", key); + field_to_json(Obj,"devid", devid); + field_to_json(Obj,"cas", cas); + field_to_json(Obj,"manufacturer", manufacturer); + field_to_json(Obj,"model", model); + field_to_json(Obj,"redirector", redirector); + field_to_json(Obj,"commonName", commonName); + field_to_json(Obj,"certificateId", certificateId); + field_to_json(Obj,"batch", batch); + field_to_json(Obj,"created", created); + field_to_json(Obj,"modified", modified); + field_to_json(Obj,"revoked", revoked); + field_to_json(Obj,"revokeCount", revokeCount); + field_to_json(Obj,"synched", synched); + } - bool CertificateEntry::from_json(const Poco::JSON::Object::Ptr &Obj) { - try { - field_from_json(Obj,"id", id); - field_from_json(Obj,"entity", entity); - field_from_json(Obj,"creator", creator); - field_from_json(Obj,"type", type); - field_from_json(Obj,"status", status); - field_from_json(Obj,"certificate", certificate); - field_from_json(Obj,"key", key); - field_from_json(Obj,"devid", devid); - field_from_json(Obj,"cas", cas); - field_from_json(Obj,"manufacturer", manufacturer); - field_from_json(Obj,"model", model); - field_from_json(Obj,"redirector", redirector); - field_from_json(Obj,"commonName", commonName); - field_from_json(Obj,"certificateId", certificateId); - field_from_json(Obj,"batch", batch); - field_from_json(Obj,"created", created); - field_from_json(Obj,"modified", modified); - field_from_json(Obj,"revoked", revoked); - field_from_json(Obj,"revokeCount", revokeCount); - return true; - } catch (...) { - } - return false; + bool CertificateEntry::from_json(const Poco::JSON::Object::Ptr &Obj) { + try { + field_from_json(Obj,"id", id); + field_from_json(Obj,"entity", entity); + field_from_json(Obj,"creator", creator); + field_from_json(Obj,"type", type); + field_from_json(Obj,"status", status); + field_from_json(Obj,"certificate", certificate); + field_from_json(Obj,"key", key); + field_from_json(Obj,"devid", devid); + field_from_json(Obj,"cas", cas); + field_from_json(Obj,"manufacturer", manufacturer); + field_from_json(Obj,"model", model); + field_from_json(Obj,"redirector", redirector); + field_from_json(Obj,"commonName", commonName); + field_from_json(Obj,"certificateId", certificateId); + field_from_json(Obj,"batch", batch); + field_from_json(Obj,"created", created); + field_from_json(Obj,"modified", modified); + field_from_json(Obj,"revoked", revoked); + field_from_json(Obj,"revokeCount", revokeCount); + field_from_json(Obj,"synched", synched); + return true; + } catch (...) { } + return false; + } - void EntityEntry::to_json(Poco::JSON::Object &Obj) const { - field_to_json(Obj,"id", id); - field_to_json(Obj,"creator", creator); - field_to_json(Obj,"name", name); - field_to_json(Obj,"description", description); - field_to_json(Obj,"defaultRedirector", defaultRedirector); - field_to_json(Obj,"apiKey", apiKey); - field_to_json(Obj,"serverEnrollmentProfile", serverEnrollmentProfile); - field_to_json(Obj,"clientEnrollmentProfile", clientEnrollmentProfile); - field_to_json(Obj,"organization", organization); - field_to_json(Obj,"created", created); - field_to_json(Obj,"modified", modified); - field_to_json(Obj,"suspended", suspended); - field_to_json(Obj,"deleted", deleted); - field_to_json(Obj,"notes", notes); - } + void EntityEntry::to_json(Poco::JSON::Object &Obj) const { + field_to_json(Obj,"id", id); + field_to_json(Obj,"creator", creator); + field_to_json(Obj,"name", name); + field_to_json(Obj,"description", description); + field_to_json(Obj,"defaultRedirector", defaultRedirector); + field_to_json(Obj,"apiKey", apiKey); + field_to_json(Obj,"serverEnrollmentProfile", serverEnrollmentProfile); + field_to_json(Obj,"clientEnrollmentProfile", clientEnrollmentProfile); + field_to_json(Obj,"organization", organization); + field_to_json(Obj,"created", created); + field_to_json(Obj,"modified", modified); + field_to_json(Obj,"suspended", suspended); + field_to_json(Obj,"deleted", deleted); + field_to_json(Obj,"notes", notes); + } - bool EntityEntry::from_json(const Poco::JSON::Object::Ptr &Obj) { - try { - field_from_json(Obj,"id", id); - field_from_json(Obj,"creator", creator); - field_from_json(Obj,"name", name); - field_from_json(Obj,"description", description); - field_from_json(Obj,"defaultRedirector", defaultRedirector); - field_from_json(Obj,"apiKey", apiKey); - field_from_json(Obj,"serverEnrollmentProfile", serverEnrollmentProfile); - field_from_json(Obj,"clientEnrollmentProfile", clientEnrollmentProfile); - field_from_json(Obj,"organization", organization); - field_from_json(Obj,"created", created); - field_from_json(Obj,"modified", modified); - field_from_json(Obj,"suspended", suspended); - field_from_json(Obj,"deleted", deleted); - field_from_json(Obj,"notes", notes); - return true; - } catch (...) { - } - return false; + bool EntityEntry::from_json(const Poco::JSON::Object::Ptr &Obj) { + try { + field_from_json(Obj,"id", id); + field_from_json(Obj,"creator", creator); + field_from_json(Obj,"name", name); + field_from_json(Obj,"description", description); + field_from_json(Obj,"defaultRedirector", defaultRedirector); + field_from_json(Obj,"apiKey", apiKey); + field_from_json(Obj,"serverEnrollmentProfile", serverEnrollmentProfile); + field_from_json(Obj,"clientEnrollmentProfile", clientEnrollmentProfile); + field_from_json(Obj,"organization", organization); + field_from_json(Obj,"created", created); + field_from_json(Obj,"modified", modified); + field_from_json(Obj,"suspended", suspended); + field_from_json(Obj,"deleted", deleted); + field_from_json(Obj,"notes", notes); + return true; + } catch (...) { } + return false; + } - void BatchEntry::to_json(Poco::JSON::Object &Obj) const { - field_to_json(Obj,"id", id); - field_to_json(Obj,"entity", entity); - field_to_json(Obj,"creator", creator); - field_to_json(Obj,"name", name); - field_to_json(Obj,"description", description); - field_to_json(Obj,"manufacturer", manufacturer); - field_to_json(Obj,"model", model); - field_to_json(Obj,"redirector", redirector); - field_to_json(Obj,"commonNames", commonNames); - field_to_json(Obj,"jobHistory", jobHistory); - field_to_json(Obj,"notes", notes); - field_to_json(Obj,"submitted", submitted); - field_to_json(Obj,"started", started); - field_to_json(Obj,"completed", completed); - field_to_json(Obj,"modified", modified); - } + void BatchEntry::to_json(Poco::JSON::Object &Obj) const { + field_to_json(Obj,"id", id); + field_to_json(Obj,"entity", entity); + field_to_json(Obj,"creator", creator); + field_to_json(Obj,"name", name); + field_to_json(Obj,"description", description); + field_to_json(Obj,"manufacturer", manufacturer); + field_to_json(Obj,"model", model); + field_to_json(Obj,"redirector", redirector); + field_to_json(Obj,"commonNames", commonNames); + field_to_json(Obj,"jobHistory", jobHistory); + field_to_json(Obj,"notes", notes); + field_to_json(Obj,"submitted", submitted); + field_to_json(Obj,"started", started); + field_to_json(Obj,"completed", completed); + field_to_json(Obj,"modified", modified); + } - bool BatchEntry::from_json(const Poco::JSON::Object::Ptr &Obj) { - try { - field_from_json(Obj,"id", id); - field_from_json(Obj,"entity", entity); - field_from_json(Obj,"creator", creator); - field_from_json(Obj,"name", name); - field_from_json(Obj,"description", description); - field_from_json(Obj,"manufacturer", manufacturer); - field_from_json(Obj,"model", model); - field_from_json(Obj,"redirector", redirector); - field_from_json(Obj,"commonNames", commonNames); - field_from_json(Obj,"jobHistory", jobHistory); - field_from_json(Obj,"notes", notes); - field_from_json(Obj,"submitted", submitted); - field_from_json(Obj,"started", started); - field_from_json(Obj,"completed", completed); - field_from_json(Obj,"modified", modified); - return true; - } catch (...) { - } - return false; + bool BatchEntry::from_json(const Poco::JSON::Object::Ptr &Obj) { + try { + field_from_json(Obj,"id", id); + field_from_json(Obj,"entity", entity); + field_from_json(Obj,"creator", creator); + field_from_json(Obj,"name", name); + field_from_json(Obj,"description", description); + field_from_json(Obj,"manufacturer", manufacturer); + field_from_json(Obj,"model", model); + field_from_json(Obj,"redirector", redirector); + field_from_json(Obj,"commonNames", commonNames); + field_from_json(Obj,"jobHistory", jobHistory); + field_from_json(Obj,"notes", notes); + field_from_json(Obj,"submitted", submitted); + field_from_json(Obj,"started", started); + field_from_json(Obj,"completed", completed); + field_from_json(Obj,"modified", modified); + return true; + } catch (...) { } + return false; + } - void JobEntry::to_json(Poco::JSON::Object &Obj) const { - field_to_json(Obj,"id", id); - field_to_json(Obj,"entity", entity); - field_to_json(Obj,"creator", creator); - field_to_json(Obj,"batch", batch); - field_to_json(Obj,"commonNames", commonNames); - field_to_json(Obj,"completedNames", completedNames); - field_to_json(Obj,"errorNames", errorNames); - field_to_json(Obj,"status", status); - field_to_json(Obj,"command", command); - field_to_json(Obj,"parameters", parameters); - field_to_json(Obj,"submitted", submitted); - field_to_json(Obj,"started", started); - field_to_json(Obj,"completed", completed); - } + void JobEntry::to_json(Poco::JSON::Object &Obj) const { + field_to_json(Obj,"id", id); + field_to_json(Obj,"entity", entity); + field_to_json(Obj,"creator", creator); + field_to_json(Obj,"batch", batch); + field_to_json(Obj,"commonNames", commonNames); + field_to_json(Obj,"completedNames", completedNames); + field_to_json(Obj,"errorNames", errorNames); + field_to_json(Obj,"status", status); + field_to_json(Obj,"command", command); + field_to_json(Obj,"parameters", parameters); + field_to_json(Obj,"submitted", submitted); + field_to_json(Obj,"started", started); + field_to_json(Obj,"completed", completed); + } - bool JobEntry::from_json(const Poco::JSON::Object::Ptr &Obj) { - try { - field_from_json(Obj,"id", id); - field_from_json(Obj,"entity", entity); - field_from_json(Obj,"creator", creator); - field_from_json(Obj,"batch", batch); - field_from_json(Obj,"commonNames", commonNames); - field_from_json(Obj,"completedNames", completedNames); - field_from_json(Obj,"errorNames", errorNames); - field_from_json(Obj,"status", status); - field_from_json(Obj,"command", command); - field_from_json(Obj,"parameters", parameters); - field_from_json(Obj,"submitted", submitted); - field_from_json(Obj,"started", started); - field_from_json(Obj,"completed", completed); - return true; - } catch (...) { - } - return false; + bool JobEntry::from_json(const Poco::JSON::Object::Ptr &Obj) { + try { + field_from_json(Obj,"id", id); + field_from_json(Obj,"entity", entity); + field_from_json(Obj,"creator", creator); + field_from_json(Obj,"batch", batch); + field_from_json(Obj,"commonNames", commonNames); + field_from_json(Obj,"completedNames", completedNames); + field_from_json(Obj,"errorNames", errorNames); + field_from_json(Obj,"status", status); + field_from_json(Obj,"command", command); + field_from_json(Obj,"parameters", parameters); + field_from_json(Obj,"submitted", submitted); + field_from_json(Obj,"started", started); + field_from_json(Obj,"completed", completed); + return true; + } catch (...) { } + return false; + } + + void DashBoardYearlyStats::to_json(Poco::JSON::Object &Obj) const { + field_to_json(Obj, "year", year); + field_to_json(Obj, "activeCerts", activeCerts); + field_to_json(Obj, "revokedCerts", revokedCerts); + } + + void Dashboard::to_json(Poco::JSON::Object &Obj) const { + field_to_json(Obj,"snapshot", snapshot); + field_to_json(Obj,"numberOfIssuedCerts", numberOfIssuedCerts); + field_to_json(Obj,"numberOfRevokedCerts", numberOfRevokedCerts); + field_to_json(Obj,"activeCertsPerOrganization", activeCertsPerOrganization); + field_to_json(Obj,"revokedCertsPerOrganization", revokedCertsPerOrganization); + field_to_json(Obj,"numberOfRedirectors", numberOfRedirectors); + field_to_json(Obj,"deviceTypes", deviceTypes); + field_to_json(Obj,"monthlyNumberOfCerts", monthlyNumberOfCerts); + field_to_json(Obj,"monthlyNumberOfCertsPerOrgPerYear", monthlyNumberOfCertsPerOrgPerYear); + } + + void Dashboard::reset() { + snapshot=0; + numberOfRevokedCerts = numberOfIssuedCerts = 0; + activeCertsPerOrganization.clear(); + revokedCertsPerOrganization.clear(); + numberOfRedirectors.clear(); + deviceTypes.clear(); + monthlyNumberOfCerts.clear(); + monthlyNumberOfCertsPerOrgPerYear.clear(); } } \ No newline at end of file diff --git a/src/RESTObjects/RESTAPI_CertObjects.h b/src/RESTObjects/RESTAPI_CertObjects.h index aeed486..40b75a0 100644 --- a/src/RESTObjects/RESTAPI_CertObjects.h +++ b/src/RESTObjects/RESTAPI_CertObjects.h @@ -5,97 +5,118 @@ #pragma once #include -#include "framework/MicroService.h" #include "framework/OpenWifiTypes.h" #include "RESTObjects/RESTAPI_SecurityObjects.h" -namespace OpenWifi { +namespace OpenWifi::CertObjects { - namespace CertObjects { + struct CertificateEntry { + OpenWifi::Types::UUID_t id; + OpenWifi::Types::UUID_t entity; + OpenWifi::Types::UUID_t creator; + std::string type; + std::string status; + std::string certificate; + std::string key; + std::string devid; + std::string cas; + std::string manufacturer; + std::string model; + std::string redirector; + std::string commonName; + std::string certificateId; + OpenWifi::Types::UUID_t batch; + uint64_t created = 0; + uint64_t modified = 0; + uint64_t revoked = 0; + uint64_t revokeCount = 0; + uint64_t synched = 0; - struct CertificateEntry { - OpenWifi::Types::UUID_t id; - OpenWifi::Types::UUID_t entity; - OpenWifi::Types::UUID_t creator; - std::string type; - std::string status; - std::string certificate; - std::string key; - std::string devid; - std::string cas; - std::string manufacturer; - std::string model; - std::string redirector; - std::string commonName; - std::string certificateId; - OpenWifi::Types::UUID_t batch; - uint64_t created = 0; - uint64_t modified = 0; - uint64_t revoked = 0; - uint64_t revokeCount = 0; + void to_json(Poco::JSON::Object &Obj) const; + bool from_json(const Poco::JSON::Object::Ptr &Obj); + }; - void to_json(Poco::JSON::Object &Obj) const; - bool from_json(const Poco::JSON::Object::Ptr &Obj); - }; + struct EntityEntry { + OpenWifi::Types::UUID_t id; + OpenWifi::Types::UUID_t creator; + std::string name; + std::string description; + std::string defaultRedirector; + std::string apiKey; + std::string serverEnrollmentProfile; + std::string clientEnrollmentProfile; + std::string organization; + SecurityObjects::NoteInfoVec notes; + bool suspended=false; + bool deleted=false; + uint64_t created = 0 ; + uint64_t modified = 0 ; - struct EntityEntry { - OpenWifi::Types::UUID_t id; - OpenWifi::Types::UUID_t creator; - std::string name; - std::string description; - std::string defaultRedirector; - std::string apiKey; - std::string serverEnrollmentProfile; - std::string clientEnrollmentProfile; - std::string organization; - SecurityObjects::NoteInfoVec notes; - bool suspended=false; - bool deleted=false; - uint64_t created = 0 ; - uint64_t modified = 0 ; + void to_json(Poco::JSON::Object &Obj) const; + bool from_json(const Poco::JSON::Object::Ptr &Obj); + }; - void to_json(Poco::JSON::Object &Obj) const; - bool from_json(const Poco::JSON::Object::Ptr &Obj); - }; + struct BatchEntry { + OpenWifi::Types::UUID_t id; + OpenWifi::Types::UUID_t entity; + OpenWifi::Types::UUID_t creator; + std::string name; + std::string description; + std::string manufacturer; + std::string model; + std::string redirector; + std::vector commonNames; + std::vector jobHistory; + SecurityObjects::NoteInfoVec notes; + uint64_t submitted = 0 ; + uint64_t started = 0 ; + uint64_t completed = 0 ; + uint64_t modified = 0 ; - struct BatchEntry { - OpenWifi::Types::UUID_t id; - OpenWifi::Types::UUID_t entity; - OpenWifi::Types::UUID_t creator; - std::string name; - std::string description; - std::string manufacturer; - std::string model; - std::string redirector; - std::vector commonNames; - std::vector jobHistory; - SecurityObjects::NoteInfoVec notes; - uint64_t submitted = 0 ; - uint64_t started = 0 ; - uint64_t completed = 0 ; - uint64_t modified = 0 ; + void to_json(Poco::JSON::Object &Obj) const; + bool from_json(const Poco::JSON::Object::Ptr &Obj); + }; - void to_json(Poco::JSON::Object &Obj) const; - bool from_json(const Poco::JSON::Object::Ptr &Obj); - }; + struct JobEntry { + OpenWifi::Types::UUID_t id; + OpenWifi::Types::UUID_t entity; + OpenWifi::Types::UUID_t creator; + OpenWifi::Types::UUID_t batch; + std::string command; + OpenWifi::Types::StringVec commonNames; + OpenWifi::Types::StringVec completedNames; + OpenWifi::Types::StringVec errorNames; + Types::StringPairVec parameters; + std::string status; + uint64_t submitted=0; + uint64_t started=0; + uint64_t completed=0; - struct JobEntry { - OpenWifi::Types::UUID_t id; - OpenWifi::Types::UUID_t entity; - OpenWifi::Types::UUID_t creator; - OpenWifi::Types::UUID_t batch; - std::string command; - OpenWifi::Types::StringVec commonNames; - OpenWifi::Types::StringVec completedNames; - OpenWifi::Types::StringVec errorNames; - Types::StringPairVec parameters; - std::string status; - uint64_t submitted=0; - uint64_t started=0; - uint64_t completed=0; + void to_json(Poco::JSON::Object &Obj) const; + bool from_json(const Poco::JSON::Object::Ptr &Obj); + }; + + struct DashBoardYearlyStats { + uint64_t year=0; + OpenWifi::Types::Counted3DMapSII activeCerts; + OpenWifi::Types::Counted3DMapSII revokedCerts; + + void to_json(Poco::JSON::Object &Obj) const; + }; + + struct Dashboard { + uint64_t snapshot=0; + uint64_t numberOfIssuedCerts=0; + uint64_t numberOfRevokedCerts=0; + OpenWifi::Types::CountedMap activeCertsPerOrganization; + OpenWifi::Types::CountedMap revokedCertsPerOrganization; + OpenWifi::Types::CountedMap numberOfRedirectors; + OpenWifi::Types::CountedMap deviceTypes; + OpenWifi::Types::CountedMap monthlyNumberOfCerts; + std::vector monthlyNumberOfCertsPerOrgPerYear; + + void to_json(Poco::JSON::Object &Obj) const; + void reset(); + }; - void to_json(Poco::JSON::Object &Obj) const; - bool from_json(const Poco::JSON::Object::Ptr &Obj); - }; - } } \ No newline at end of file From 23d16e619a284da1b7dc5958e95b1f1e1da52795 Mon Sep 17 00:00:00 2001 From: stephb9959 Date: Tue, 14 Jun 2022 07:13:10 -0700 Subject: [PATCH 17/20] Framework update. Signed-off-by: jaspreetsachdev --- src/Daemon.cpp | 1 + src/TotpCache.h | 19 +++-------------- src/framework/ow_constants.h | 40 +++++++++++++++++++----------------- 3 files changed, 25 insertions(+), 35 deletions(-) diff --git a/src/Daemon.cpp b/src/Daemon.cpp index 1b1a698..122a94e 100644 --- a/src/Daemon.cpp +++ b/src/Daemon.cpp @@ -10,6 +10,7 @@ // Arilia Wireless Inc. // + #include "Poco/Util/Application.h" #include "Poco/Util/Option.h" #include "Poco/Environment.h" diff --git a/src/TotpCache.h b/src/TotpCache.h index 6de63c7..3225140 100644 --- a/src/TotpCache.h +++ b/src/TotpCache.h @@ -55,10 +55,10 @@ namespace OpenWifi { static bool ValidateCode( const std::string &Secret, const std::string &Code, std::string & Expecting) { uint64_t Now = OpenWifi::Now(); uint32_t p = CppTotp::totp(CppTotp::Bytes::ByteString{ (const u_char *)Secret.c_str()}, Now, 0, 30, 6); - char buffer[16]; + char buffer[16]{0}; sprintf(buffer,"%06u",p); - Expecting = buffer; - return Code == buffer; + Expecting = std::string(buffer); + return Code == Expecting; } int Start() override { @@ -92,19 +92,6 @@ namespace OpenWifi { auto Secret = GenerateSecret(20, Base32Secret); QRCode = GenerateQRCode(Base32Secret, User.email); -/* - struct Entry { - bool Subscriber=false; - uint64_t Start = 0; - uint64_t Done = 0 ; - uint64_t Verifications = 0 ; - std::string Secret; - std::string QRCode; - std::string LastCode; - }; - - */ - Entry E{ .Subscriber = Subscriber, .Start = OpenWifi::Now(), .Done = 0, diff --git a/src/framework/ow_constants.h b/src/framework/ow_constants.h index a27f409..443a457 100644 --- a/src/framework/ow_constants.h +++ b/src/framework/ow_constants.h @@ -459,25 +459,27 @@ namespace OpenWifi::uCentralProtocol::Events { ET_TELEMETRY }; - inline static EVENT_MSG EventFromString(const std::string & Method) { - static std::vector> EventValues{ - { CFGPENDING , ET_CFGPENDING }, - { CONNECT, ET_CONNECT }, - { CRASHLOG, ET_CRASHLOG }, - { DEVICEUPDATE, ET_DEVICEUPDATE }, - { HEALTHCHECK, ET_HEALTHCHECK }, - { LOG, ET_LOG }, - { PING, ET_PING }, - { RECOVERY, ET_RECOVERY }, - { STATE, ET_STATE }, - { TELEMETRY, ET_TELEMETRY } - }; - - const auto l_method = Poco::toLower(Method); - for(const auto &[event_name,event_type]:EventValues) { - if(std::strcmp(event_name,Method.c_str())==0) - return event_type; - } + inline EVENT_MSG EventFromString(const std::string & Method) { + if(strcmp(STATE,Method.c_str())==0) + return ET_STATE; + else if(strcmp(HEALTHCHECK,Method.c_str())==0) + return ET_HEALTHCHECK; + else if(strcmp(CONNECT,Method.c_str())==0) + return ET_CONNECT; + else if(strcmp(CFGPENDING,Method.c_str())==0) + return ET_CFGPENDING; + else if(strcmp(CRASHLOG,Method.c_str())==0) + return ET_CRASHLOG; + else if(strcmp(DEVICEUPDATE,Method.c_str())==0) + return ET_DEVICEUPDATE; + else if(strcmp(LOG,Method.c_str())==0) + return ET_LOG; + else if(strcmp(PING,Method.c_str())==0) + return ET_PING; + else if(strcmp(RECOVERY,Method.c_str())==0) + return ET_RECOVERY; + else if(strcmp(TELEMETRY,Method.c_str())==0) + return ET_TELEMETRY; return ET_UNKNOWN; }; } From 8ad2e12f129c309ceb6494c2e02dbb32119fc666 Mon Sep 17 00:00:00 2001 From: Dmitry Dunaev Date: Fri, 3 Jun 2022 19:31:22 +0300 Subject: [PATCH 18/20] [WIFI-9174] Fix: switch from deprecated bitnami charts to mirrored ones Signed-off-by: Dmitry Dunaev Signed-off-by: jaspreetsachdev --- helm/Chart.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/helm/Chart.yaml b/helm/Chart.yaml index 36576be..afcf047 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -5,14 +5,14 @@ name: owsec version: 0.1.0 dependencies: - name: postgresql - repository: https://charts.bitnami.com/bitnami + repository: https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/ version: 10.9.2 condition: postgresql.enabled - name: mysql - repository: https://charts.bitnami.com/bitnami + repository: https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/ version: 8.8.3 condition: mysql.enabled - name: mariadb - repository: https://charts.bitnami.com/bitnami + repository: https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/ version: 9.4.2 condition: mariadb.enabled From 7e1a962b57684062b7e6279abc86a43f9c5be538 Mon Sep 17 00:00:00 2001 From: stephb9959 Date: Tue, 14 Jun 2022 07:22:17 -0700 Subject: [PATCH 19/20] Fixing bug Signed-off-by: jaspreetsachdev --- src/RESTAPI/RESTAPI_totp_handler.cpp | 10 ++++++++++ src/TotpCache.h | 19 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/RESTAPI/RESTAPI_totp_handler.cpp b/src/RESTAPI/RESTAPI_totp_handler.cpp index 1e24fe0..e8422ab 100644 --- a/src/RESTAPI/RESTAPI_totp_handler.cpp +++ b/src/RESTAPI/RESTAPI_totp_handler.cpp @@ -11,25 +11,35 @@ namespace OpenWifi { auto Reset = GetBoolParameter("reset",false); std::string QRCode; + std::cout << __LINE__ << std::endl; if(TotpCache()->StartValidation(UserInfo_.userinfo,false,QRCode,Reset)) { + std::cout << __LINE__ << std::endl; return SendFileContent(QRCode, "image/svg+xml","qrcode.svg"); } + std::cout << __LINE__ << std::endl; return BadRequest(RESTAPI::Errors::InvalidCommand); } void RESTAPI_totp_handler::DoPut() { + std::cout << __LINE__ << std::endl; auto Value = GetParameter("value",""); + std::cout << __LINE__ << std::endl; auto nextIndex = GetParameter("index",0); + std::cout << __LINE__ << std::endl; bool moreCodes=false; + std::cout << __LINE__ << std::endl; RESTAPI::Errors::msg Err; + std::cout << __LINE__ << std::endl; if(TotpCache()->ContinueValidation(UserInfo_.userinfo,false,Value,nextIndex,moreCodes, Err)) { Poco::JSON::Object Answer; Answer.set("nextIndex", nextIndex); Answer.set("moreCodes", moreCodes); + std::cout << __LINE__ << std::endl; return ReturnObject(Answer); } + std::cout << __LINE__ << std::endl; return BadRequest(Err); } diff --git a/src/TotpCache.h b/src/TotpCache.h index 3225140..3708124 100644 --- a/src/TotpCache.h +++ b/src/TotpCache.h @@ -31,24 +31,32 @@ namespace OpenWifi { } static std::string GenerateSecret(uint Size, std::string & Base32Secret) { + std::cout << __LINE__ << std::endl; std::string R; + std::cout << __LINE__ << std::endl; for(;Size;Size--) { R += (char) MicroService::instance().Random(33,127); } + std::cout << __LINE__ << std::endl; Base32Secret = CppTotp::Bytes::toBase32( CppTotp::Bytes::ByteString{ (const u_char *)R.c_str()}); + std::cout << __LINE__ << std::endl; return R; } std::string GenerateQRCode(const std::string &Secret, const std::string &email) { + std::cout << __LINE__ << std::endl; std::string uri{ "otpauth://totp/" + Issuer_ + ":" + email + "?secret=" + Secret + "&issuer=" + Issuer_ }; + std::cout << __LINE__ << std::endl; qrcodegen::QrCode qr0 = qrcodegen::QrCode::encodeText(uri.c_str(), qrcodegen::QrCode::Ecc::MEDIUM); + std::cout << __LINE__ << std::endl; std::string svg = qrcodegen::toSvgString(qr0, 4); // See QrCodeGeneratorDemo + std::cout << __LINE__ << std::endl; return svg; } @@ -71,9 +79,13 @@ namespace OpenWifi { }; inline bool StartValidation(const SecurityObjects::UserInfo &User, bool Subscriber, std::string & QRCode, bool Reset) { + std::cout << __LINE__ << std::endl; auto Hint = Cache_.find(User.id); + std::cout << __LINE__ << std::endl; if(Hint!=Cache_.end() && Hint->second.Subscriber==Subscriber) { + std::cout << __LINE__ << std::endl; if(Reset) { + std::cout << __LINE__ << std::endl; std::string Base32Secret; Hint->second.Subscriber = Subscriber; Hint->second.Start = OpenWifi::Now(); @@ -82,15 +94,21 @@ namespace OpenWifi { Hint->second.Secret = GenerateSecret(20,Base32Secret); Hint->second.QRCode = QRCode = GenerateQRCode(Base32Secret, User.email); Hint->second.LastCode.clear(); + std::cout << __LINE__ << std::endl; } else { + std::cout << __LINE__ << std::endl; QRCode = Hint->second.QRCode; } return true; } + std::cout << __LINE__ << std::endl; std::string Base32Secret; + std::cout << __LINE__ << std::endl; auto Secret = GenerateSecret(20, Base32Secret); + std::cout << __LINE__ << std::endl; QRCode = GenerateQRCode(Base32Secret, User.email); + std::cout << __LINE__ << std::endl; Entry E{ .Subscriber = Subscriber, .Start = OpenWifi::Now(), @@ -101,6 +119,7 @@ namespace OpenWifi { .LastCode = 0 }; Cache_[User.id] = E; + std::cout << __LINE__ << std::endl; return true; } From e679dc7458cdb23a2164d117dedc7f709d6fd5a8 Mon Sep 17 00:00:00 2001 From: Stephane Bourque Date: Tue, 14 Jun 2022 07:26:44 -0700 Subject: [PATCH 20/20] Fixing bug: https://telecominfraproject.atlassian.net/browse/WIFI-9471 Signed-off-by: stephb9959 Signed-off-by: jaspreetsachdev --- src/RESTAPI/RESTAPI_totp_handler.cpp | 11 ----------- src/TotpCache.h | 22 +--------------------- 2 files changed, 1 insertion(+), 32 deletions(-) diff --git a/src/RESTAPI/RESTAPI_totp_handler.cpp b/src/RESTAPI/RESTAPI_totp_handler.cpp index e8422ab..f39b0f7 100644 --- a/src/RESTAPI/RESTAPI_totp_handler.cpp +++ b/src/RESTAPI/RESTAPI_totp_handler.cpp @@ -11,35 +11,24 @@ namespace OpenWifi { auto Reset = GetBoolParameter("reset",false); std::string QRCode; - std::cout << __LINE__ << std::endl; - if(TotpCache()->StartValidation(UserInfo_.userinfo,false,QRCode,Reset)) { - std::cout << __LINE__ << std::endl; return SendFileContent(QRCode, "image/svg+xml","qrcode.svg"); } - std::cout << __LINE__ << std::endl; return BadRequest(RESTAPI::Errors::InvalidCommand); } void RESTAPI_totp_handler::DoPut() { - std::cout << __LINE__ << std::endl; auto Value = GetParameter("value",""); - std::cout << __LINE__ << std::endl; auto nextIndex = GetParameter("index",0); - std::cout << __LINE__ << std::endl; bool moreCodes=false; - std::cout << __LINE__ << std::endl; RESTAPI::Errors::msg Err; - std::cout << __LINE__ << std::endl; if(TotpCache()->ContinueValidation(UserInfo_.userinfo,false,Value,nextIndex,moreCodes, Err)) { Poco::JSON::Object Answer; Answer.set("nextIndex", nextIndex); Answer.set("moreCodes", moreCodes); - std::cout << __LINE__ << std::endl; return ReturnObject(Answer); } - std::cout << __LINE__ << std::endl; return BadRequest(Err); } diff --git a/src/TotpCache.h b/src/TotpCache.h index 3708124..1034f20 100644 --- a/src/TotpCache.h +++ b/src/TotpCache.h @@ -31,32 +31,23 @@ namespace OpenWifi { } static std::string GenerateSecret(uint Size, std::string & Base32Secret) { - std::cout << __LINE__ << std::endl; std::string R; - std::cout << __LINE__ << std::endl; for(;Size;Size--) { R += (char) MicroService::instance().Random(33,127); } - std::cout << __LINE__ << std::endl; Base32Secret = CppTotp::Bytes::toBase32( CppTotp::Bytes::ByteString{ (const u_char *)R.c_str()}); - std::cout << __LINE__ << std::endl; return R; } std::string GenerateQRCode(const std::string &Secret, const std::string &email) { - std::cout << __LINE__ << std::endl; - std::string uri{ "otpauth://totp/" + Issuer_ + ":" + email + "?secret=" + Secret + "&issuer=" + Issuer_ }; - std::cout << __LINE__ << std::endl; qrcodegen::QrCode qr0 = qrcodegen::QrCode::encodeText(uri.c_str(), qrcodegen::QrCode::Ecc::MEDIUM); - std::cout << __LINE__ << std::endl; std::string svg = qrcodegen::toSvgString(qr0, 4); // See QrCodeGeneratorDemo - std::cout << __LINE__ << std::endl; return svg; } @@ -79,13 +70,9 @@ namespace OpenWifi { }; inline bool StartValidation(const SecurityObjects::UserInfo &User, bool Subscriber, std::string & QRCode, bool Reset) { - std::cout << __LINE__ << std::endl; auto Hint = Cache_.find(User.id); - std::cout << __LINE__ << std::endl; if(Hint!=Cache_.end() && Hint->second.Subscriber==Subscriber) { - std::cout << __LINE__ << std::endl; if(Reset) { - std::cout << __LINE__ << std::endl; std::string Base32Secret; Hint->second.Subscriber = Subscriber; Hint->second.Start = OpenWifi::Now(); @@ -94,21 +81,15 @@ namespace OpenWifi { Hint->second.Secret = GenerateSecret(20,Base32Secret); Hint->second.QRCode = QRCode = GenerateQRCode(Base32Secret, User.email); Hint->second.LastCode.clear(); - std::cout << __LINE__ << std::endl; } else { - std::cout << __LINE__ << std::endl; QRCode = Hint->second.QRCode; } return true; } - std::cout << __LINE__ << std::endl; std::string Base32Secret; - std::cout << __LINE__ << std::endl; auto Secret = GenerateSecret(20, Base32Secret); - std::cout << __LINE__ << std::endl; QRCode = GenerateQRCode(Base32Secret, User.email); - std::cout << __LINE__ << std::endl; Entry E{ .Subscriber = Subscriber, .Start = OpenWifi::Now(), @@ -116,10 +97,9 @@ namespace OpenWifi { .Verifications = 0, .Secret = Secret, .QRCode = QRCode, - .LastCode = 0 + .LastCode = "" }; Cache_[User.id] = E; - std::cout << __LINE__ << std::endl; return true; }