From b1cdccc6b09cd3b1e38db126d2a5eb29acfbce5f Mon Sep 17 00:00:00 2001 From: stephb9959 Date: Mon, 20 Dec 2021 21:33:24 -0800 Subject: [PATCH] Framework update --- CMakeLists.txt | 2 +- build | 2 +- src/AutoDiscovery.h | 6 +- src/JobController.h | 12 ++-- src/RESTAPI/RESTAPI_db_helpers.h | 13 ++++ src/RESTAPI/RESTAPI_inventory_handler.cpp | 3 +- ...ESTAPI_Servers.cpp => RESTAPI_routers.cpp} | 0 src/RESTObjects/RESTAPI_SecurityObjects.cpp | 5 ++ src/RESTObjects/RESTAPI_SecurityObjects.h | 2 +- src/SerialNumberCache.h | 6 +- src/TagServer.h | 6 +- src/WebSocketClientServer.h | 7 ++- src/framework/MicroService.h | 60 ++++++++++++------- test_scripts/curl/cli | 6 +- 14 files changed, 84 insertions(+), 46 deletions(-) rename src/RESTAPI/{RESTAPI_Servers.cpp => RESTAPI_routers.cpp} (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index e8bbd3d..76a2dce 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -82,7 +82,7 @@ add_executable(owprov src/RESTObjects/RESTAPI_ProvObjects.cpp src/RESTObjects/RESTAPI_ProvObjects.h src/RESTObjects/RESTAPI_GWobjects.h src/RESTObjects/RESTAPI_GWobjects.cpp src/RESTObjects/RESTAPI_FMSObjects.h src/RESTObjects/RESTAPI_FMSObjects.cpp - src/RESTAPI/RESTAPI_Servers.cpp + src/RESTAPI/RESTAPI_routers.cpp src/Daemon.cpp src/Daemon.h src/Dashboard.h src/Dashboard.cpp src/StorageService.cpp src/StorageService.h diff --git a/build b/build index eaf7a13..9f72858 100644 --- a/build +++ b/build @@ -1 +1 @@ -87 \ No newline at end of file +88 \ No newline at end of file diff --git a/src/AutoDiscovery.h b/src/AutoDiscovery.h index 1fe89e6..d0ebf8b 100644 --- a/src/AutoDiscovery.h +++ b/src/AutoDiscovery.h @@ -11,8 +11,8 @@ namespace OpenWifi { class AutoDiscovery : public SubSystemServer, Poco::Runnable { public: - static AutoDiscovery *instance() { - static AutoDiscovery * instance_ = new AutoDiscovery; + static auto instance() { + static auto instance_ = new AutoDiscovery; return instance_; } @@ -33,7 +33,7 @@ namespace OpenWifi { } }; - inline AutoDiscovery * AutoDiscovery() { return AutoDiscovery::instance(); } + inline auto AutoDiscovery() { return AutoDiscovery::instance(); } } diff --git a/src/JobController.h b/src/JobController.h index 8f168af..1e67922 100644 --- a/src/JobController.h +++ b/src/JobController.h @@ -78,8 +78,8 @@ namespace OpenWifi { class JobRegistry { public: - static JobRegistry *instance() { - static JobRegistry * instance_ = new JobRegistry; + static auto instance() { + static auto instance_ = new JobRegistry; return instance_; } @@ -100,12 +100,12 @@ namespace OpenWifi { std::map JobTypes_; }; - inline JobRegistry * JobRegistry() { return JobRegistry::instance(); } + inline auto JobRegistry() { return JobRegistry::instance(); } class JobController : public SubSystemServer, Poco::Runnable { public: - static JobController *instance() { - static JobController * instance_ = new JobController; + static auto instance() { + static auto instance_ = new JobController; return instance_; } @@ -125,7 +125,7 @@ namespace OpenWifi { { } }; - inline JobController * JobController() { return JobController::instance(); } + inline auto JobController() { return JobController::instance(); } } diff --git a/src/RESTAPI/RESTAPI_db_helpers.h b/src/RESTAPI/RESTAPI_db_helpers.h index 5a02e56..8210dff 100644 --- a/src/RESTAPI/RESTAPI_db_helpers.h +++ b/src/RESTAPI/RESTAPI_db_helpers.h @@ -174,4 +174,17 @@ namespace OpenWifi { return R.ReturnObject(Answer); } + inline bool NormalizeMac(std::string & Mac) { + Poco::replaceInPlace(Mac,":",""); + Poco::replaceInPlace(Mac,"-",""); + if(Mac.size()!=12) + return false; + for(const auto &i:Mac) { + if(!std::isxdigit(i)) + return false; + } + Poco::toLowerInPlace(Mac); + return true; + } + } diff --git a/src/RESTAPI/RESTAPI_inventory_handler.cpp b/src/RESTAPI/RESTAPI_inventory_handler.cpp index 1ede260..7e201b2 100644 --- a/src/RESTAPI/RESTAPI_inventory_handler.cpp +++ b/src/RESTAPI/RESTAPI_inventory_handler.cpp @@ -142,11 +142,10 @@ namespace OpenWifi{ return BadRequest(RESTAPI::Errors::MissingSerialNumber); } - if(!Utils::ValidSerialNumber(SerialNumber)) { + if(!NormalizeMac(SerialNumber)) { return BadRequest(RESTAPI::Errors::InvalidSerialNumber); } - Poco::toLowerInPlace(SerialNumber); if(DB_.Exists(RESTAPI::Protocol::SERIALNUMBER,SerialNumber)) { return BadRequest(RESTAPI::Errors::SerialNumberExists + " (" + SerialNumber + ")"); } diff --git a/src/RESTAPI/RESTAPI_Servers.cpp b/src/RESTAPI/RESTAPI_routers.cpp similarity index 100% rename from src/RESTAPI/RESTAPI_Servers.cpp rename to src/RESTAPI/RESTAPI_routers.cpp diff --git a/src/RESTObjects/RESTAPI_SecurityObjects.cpp b/src/RESTObjects/RESTAPI_SecurityObjects.cpp index 613c22d..58403b2 100644 --- a/src/RESTObjects/RESTAPI_SecurityObjects.cpp +++ b/src/RESTObjects/RESTAPI_SecurityObjects.cpp @@ -54,6 +54,8 @@ namespace OpenWifi::SecurityObjects { return ADMIN; else if (!Poco::icompare(U,"subscriber")) return SUBSCRIBER; + else if (!Poco::icompare(U,"partner")) + return PARTNER; else if (!Poco::icompare(U,"csr")) return CSR; else if (!Poco::icompare(U, "system")) @@ -72,6 +74,7 @@ namespace OpenWifi::SecurityObjects { case ROOT: return "root"; case ADMIN: return "admin"; case SUBSCRIBER: return "subscriber"; + case PARTNER: return "partner"; case CSR: return "csr"; case SYSTEM: return "system"; case INSTALLER: return "installer"; @@ -265,6 +268,8 @@ namespace OpenWifi::SecurityObjects { field_from_json(Obj,"currentLoginURI",currentLoginURI); field_from_json(Obj,"locale",locale); field_from_json(Obj,"notes",notes); + field_from_json(Obj,"location", location); + field_from_json(Obj,"owner", owner); field_from_json(Obj,"userRole",userRole, UserTypeFromString); field_from_json(Obj,"securityPolicy",securityPolicy); field_from_json(Obj,"userTypeProprietaryInfo",userTypeProprietaryInfo); diff --git a/src/RESTObjects/RESTAPI_SecurityObjects.h b/src/RESTObjects/RESTAPI_SecurityObjects.h index 48d0628..fd01baa 100644 --- a/src/RESTObjects/RESTAPI_SecurityObjects.h +++ b/src/RESTObjects/RESTAPI_SecurityObjects.h @@ -43,7 +43,7 @@ namespace OpenWifi { }; enum USER_ROLE { - UNKNOWN, ROOT, ADMIN, SUBSCRIBER, CSR, SYSTEM, INSTALLER, NOC, ACCOUNTING + UNKNOWN, ROOT, ADMIN, SUBSCRIBER, CSR, SYSTEM, INSTALLER, NOC, ACCOUNTING, PARTNER }; USER_ROLE UserTypeFromString(const std::string &U); diff --git a/src/SerialNumberCache.h b/src/SerialNumberCache.h index a85c4cd..0b3c219 100644 --- a/src/SerialNumberCache.h +++ b/src/SerialNumberCache.h @@ -18,8 +18,8 @@ namespace OpenWifi { typedef std::vector SerialCacheContent; - static SerialNumberCache *instance() { - static SerialNumberCache * instance_ = new SerialNumberCache; + static auto instance() { + static auto instance_ = new SerialNumberCache; return instance_; } @@ -49,7 +49,7 @@ namespace OpenWifi { } }; - inline SerialNumberCache * SerialNumberCache() { return SerialNumberCache::instance(); } + inline auto SerialNumberCache() { return SerialNumberCache::instance(); } } // namespace OpenWiFi diff --git a/src/TagServer.h b/src/TagServer.h index f0e5dd7..48ab170 100644 --- a/src/TagServer.h +++ b/src/TagServer.h @@ -14,8 +14,8 @@ namespace OpenWifi { typedef std::map DictMap; typedef std::map EntityToDict; - static TagServer *instance() { - static TagServer * instance_ = new TagServer; + static auto instance() { + static auto instance_ = new TagServer; return instance_; } @@ -34,6 +34,6 @@ namespace OpenWifi { } }; - inline TagServer * TagServer() { return TagServer::instance(); } + inline auto TagServer() { return TagServer::instance(); } } diff --git a/src/WebSocketClientServer.h b/src/WebSocketClientServer.h index e363773..37ca65d 100644 --- a/src/WebSocketClientServer.h +++ b/src/WebSocketClientServer.h @@ -44,8 +44,8 @@ namespace OpenWifi { class WebSocketClientServer : public SubSystemServer, Poco::Runnable { public: - static WebSocketClientServer *instance() { - static WebSocketClientServer * instance_ = new WebSocketClientServer; + static auto instance() { + static auto instance_ = new WebSocketClientServer; return instance_; } @@ -83,7 +83,7 @@ namespace OpenWifi { } }; - inline WebSocketClientServer * WebSocketClientServer() { return WebSocketClientServer::instance(); } + inline auto WebSocketClientServer() { return WebSocketClientServer::instance(); } class WebSocketClient { public: @@ -154,5 +154,6 @@ namespace OpenWifi { void OnSocketError(const Poco::AutoPtr& pNf); }; + } diff --git a/src/framework/MicroService.h b/src/framework/MicroService.h index a44860f..e141eee 100644 --- a/src/framework/MicroService.h +++ b/src/framework/MicroService.h @@ -96,7 +96,9 @@ namespace OpenWifi { ACCESS_DENIED, INVALID_TOKEN, EXPIRED_TOKEN, - RATE_LIMIT_EXCEEDED + RATE_LIMIT_EXCEEDED, + BAD_MFA_TRANSACTION, + MFA_FAILURE }; class AppServiceRegistry { @@ -1578,7 +1580,7 @@ namespace OpenWifi { if (AlwaysAuthorize_ && !IsAuthorized(Expired, SubOnlyService_)) { if(Expired) return UnAuthorized(RESTAPI::Errors::ExpiredToken, EXPIRED_TOKEN); - return UnAuthorized(RESTAPI::Errors::InvalidCredentials, ACCESS_DENIED); + return UnAuthorized(RESTAPI::Errors::InvalidCredentials, INVALID_TOKEN); } std::string Reason; @@ -1588,19 +1590,19 @@ namespace OpenWifi { ParseParameters(); if (Request->getMethod() == Poco::Net::HTTPRequest::HTTP_GET) - DoGet(); + return DoGet(); else if (Request->getMethod() == Poco::Net::HTTPRequest::HTTP_POST) - DoPost(); + return DoPost(); else if (Request->getMethod() == Poco::Net::HTTPRequest::HTTP_DELETE) - DoDelete(); + return DoDelete(); else if (Request->getMethod() == Poco::Net::HTTPRequest::HTTP_PUT) - DoPut(); + return DoPut(); else - BadRequest(RESTAPI::Errors::UnsupportedHTTPMethod); + return BadRequest(RESTAPI::Errors::UnsupportedHTTPMethod); return; } catch (const Poco::Exception &E) { Logger_.log(E); - BadRequest(RESTAPI::Errors::InternalError); + return BadRequest(RESTAPI::Errors::InternalError); } } @@ -2073,7 +2075,7 @@ namespace OpenWifi { EndPoint_(EndPoint), QueryData_(QueryData), msTimeout_(msTimeout) {}; - inline Poco::Net::HTTPServerResponse::HTTPStatus Do(Poco::JSON::Object::Ptr &ResponseObject); + inline Poco::Net::HTTPServerResponse::HTTPStatus Do(Poco::JSON::Object::Ptr &ResponseObject, const std::string & BearerToken = ""); private: std::string Type_; std::string EndPoint_; @@ -2094,7 +2096,7 @@ namespace OpenWifi { msTimeout_(msTimeout), Body_(Body){}; - inline Poco::Net::HTTPServerResponse::HTTPStatus Do(Poco::JSON::Object::Ptr &ResponseObject); + inline Poco::Net::HTTPServerResponse::HTTPStatus Do(Poco::JSON::Object::Ptr &ResponseObject, const std::string & BearerToken = ""); private: std::string Type_; @@ -2116,7 +2118,7 @@ namespace OpenWifi { QueryData_(QueryData), msTimeout_(msTimeout), Body_(Body){}; - inline Poco::Net::HTTPServerResponse::HTTPStatus Do(Poco::JSON::Object::Ptr &ResponseObject); + inline Poco::Net::HTTPServerResponse::HTTPStatus Do(Poco::JSON::Object::Ptr &ResponseObject, const std::string & BearerToken = ""); private: std::string Type_; std::string EndPoint_; @@ -3648,7 +3650,7 @@ namespace OpenWifi { void DoDelete() final {}; }; - inline Poco::Net::HTTPServerResponse::HTTPStatus OpenAPIRequestGet::Do(Poco::JSON::Object::Ptr &ResponseObject) { + inline Poco::Net::HTTPServerResponse::HTTPStatus OpenAPIRequestGet::Do(Poco::JSON::Object::Ptr &ResponseObject, const std::string & BearerToken) { try { auto Services = MicroService::instance().GetServices(Type_); for(auto const &Svc:Services) { @@ -3665,8 +3667,15 @@ namespace OpenWifi { Poco::Net::HTTPRequest Request(Poco::Net::HTTPRequest::HTTP_GET, Path, Poco::Net::HTTPMessage::HTTP_1_1); - Request.add("X-API-KEY", Svc.AccessKey); - Request.add("X-INTERNAL-NAME", MicroService::instance().PublicEndPoint()); + + if(BearerToken.empty()) { + Request.add("X-API-KEY", Svc.AccessKey); + Request.add("X-INTERNAL-NAME", MicroService::instance().PublicEndPoint()); + } else { + // Authorization: Bearer ${token} + Request.add("Authorization", "Bearer " + BearerToken); + } + Session.sendRequest(Request); Poco::Net::HTTPResponse Response; @@ -3685,7 +3694,7 @@ namespace OpenWifi { return Poco::Net::HTTPServerResponse::HTTP_GATEWAY_TIMEOUT; } - inline Poco::Net::HTTPServerResponse::HTTPStatus OpenAPIRequestPut::Do(Poco::JSON::Object::Ptr &ResponseObject) { + inline Poco::Net::HTTPServerResponse::HTTPStatus OpenAPIRequestPut::Do(Poco::JSON::Object::Ptr &ResponseObject, const std::string & BearerToken) { try { auto Services = MicroService::instance().GetServices(Type_); for(auto const &Svc:Services) { @@ -3708,8 +3717,13 @@ namespace OpenWifi { Request.setContentType("application/json"); Request.setContentLength(obody.str().size()); - Request.add("X-API-KEY", Svc.AccessKey); - Request.add("X-INTERNAL-NAME", MicroService::instance().PublicEndPoint()); + if(BearerToken.empty()) { + Request.add("X-API-KEY", Svc.AccessKey); + Request.add("X-INTERNAL-NAME", MicroService::instance().PublicEndPoint()); + } else { + // Authorization: Bearer ${token} + Request.add("Authorization", "Bearer " + BearerToken); + } std::ostream & os = Session.sendRequest(Request); os << obody.str(); @@ -3733,9 +3747,10 @@ namespace OpenWifi { return Poco::Net::HTTPServerResponse::HTTP_GATEWAY_TIMEOUT; } - inline Poco::Net::HTTPServerResponse::HTTPStatus OpenAPIRequestPost::Do(Poco::JSON::Object::Ptr &ResponseObject) { + inline Poco::Net::HTTPServerResponse::HTTPStatus OpenAPIRequestPost::Do(Poco::JSON::Object::Ptr &ResponseObject, const std::string & BearerToken) { try { auto Services = MicroService::instance().GetServices(Type_); + for(auto const &Svc:Services) { Poco::URI URI(Svc.PrivateEndPoint); Poco::Net::HTTPSClientSession Session(URI.getHost(), URI.getPort()); @@ -3756,8 +3771,13 @@ namespace OpenWifi { Request.setContentType("application/json"); Request.setContentLength(obody.str().size()); - Request.add("X-API-KEY", Svc.AccessKey); - Request.add("X-INTERNAL-NAME", MicroService::instance().PublicEndPoint()); + if(BearerToken.empty()) { + Request.add("X-API-KEY", Svc.AccessKey); + Request.add("X-INTERNAL-NAME", MicroService::instance().PublicEndPoint()); + } else { + // Authorization: Bearer ${token} + Request.add("Authorization", "Bearer " + BearerToken); + } std::ostream & os = Session.sendRequest(Request); os << obody.str(); diff --git a/test_scripts/curl/cli b/test_scripts/curl/cli index 8fae6ee..d7856b6 100755 --- a/test_scripts/curl/cli +++ b/test_scripts/curl/cli @@ -35,7 +35,7 @@ fi token="" result_file=result.json username="tip@ucentral.com" -password="openwifi" +password="Ninja650!!!" browser_list=(firefox sensible-browser xdg-open w3m links links2 lynx youtube-dl) browser="" @@ -43,7 +43,7 @@ login() { payload="{ \"userId\" : \"$username\" , \"password\" : \"$password\" }" token=$(curl ${FLAGS} -X POST -H "Content-Type: application/json" -d "$payload" "https://${OWSEC}/api/v1/oauth2" | jq -r '.access_token') - if [[ "${token}" == "" ]] + if [[ "${token}" == "null" ]] then echo "Could not login. Please verify the host and username/password." exit 13 @@ -459,7 +459,7 @@ affecteddevices() { shopt -s nocasematch case "$1" in - "login") login; help ; logout ;; + "login") login; echo "You are logged in..." ; logout ;; "getroot") login; getroot; logout;; "setroot") login; setroot; logout;; "addentity") login; addentity "$2" ; logout;;