From 5cc00a2e7280e10d3a1ed09b6a46577bfa4e541b Mon Sep 17 00:00:00 2001 From: stephb9959 Date: Mon, 11 Sep 2023 14:43:30 -0700 Subject: [PATCH] https://telecominfraproject.atlassian.net/browse/WIFI-7831 Signed-off-by: stephb9959 --- CMakeLists.txt | 2 +- build | 2 +- src/Daemon.cpp | 5 +- src/OpenRoamin_GlobalReach.cpp | 85 +++++++++++++++++++ src/OpenRoamin_GlobalReach.h | 37 +++++++++ src/RESTObjects/RESTAPI_ProvObjects.cpp | 56 +++++++++++++ src/RESTObjects/RESTAPI_ProvObjects.h | 25 ++++++ src/StorageService.cpp | 26 ++++++ src/StorageService.h | 44 +++++----- src/framework/ow_constants.h | 1 + src/framework/utils.cpp | 104 ++++++++++++++++++++++++ src/framework/utils.h | 2 + src/storage/storage_glblraccounts.cpp | 85 +++++++++++++++++++ src/storage/storage_glblraccounts.h | 31 +++++++ src/storage/storage_glblrcerts.cpp | 76 +++++++++++++++++ src/storage/storage_glblrcerts.h | 37 +++++++++ 16 files changed, 596 insertions(+), 22 deletions(-) create mode 100644 src/OpenRoamin_GlobalReach.cpp create mode 100644 src/OpenRoamin_GlobalReach.h create mode 100644 src/storage/storage_glblraccounts.cpp create mode 100644 src/storage/storage_glblraccounts.h create mode 100644 src/storage/storage_glblrcerts.cpp create mode 100644 src/storage/storage_glblrcerts.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 707f6279..6790ea5b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -209,7 +209,7 @@ add_executable(owprov src/ProvWebSocketClient.cpp src/ProvWebSocketClient.h src/Tasks/VenueRebooter.h src/Tasks/VenueUpgrade.h src/sdks/SDK_fms.cpp src/sdks/SDK_fms.h - src/RESTAPI/RESTAPI_overrides_handler.cpp src/RESTAPI/RESTAPI_overrides_handler.h) + src/RESTAPI/RESTAPI_overrides_handler.cpp src/RESTAPI/RESTAPI_overrides_handler.h src/OpenRoamin_GlobalReach.cpp src/OpenRoamin_GlobalReach.h src/storage/storage_glblraccounts.cpp src/storage/storage_glblraccounts.h src/storage/storage_glblrcerts.cpp src/storage/storage_glblrcerts.h) target_link_libraries(owprov PUBLIC ${Poco_LIBRARIES} diff --git a/build b/build index bf0d87ab..3cacc0b9 100644 --- a/build +++ b/build @@ -1 +1 @@ -4 \ No newline at end of file +12 \ No newline at end of file diff --git a/src/Daemon.cpp b/src/Daemon.cpp index 7c502164..55a39382 100644 --- a/src/Daemon.cpp +++ b/src/Daemon.cpp @@ -23,6 +23,7 @@ #include "UI_Prov_WebSocketNotifications.h" #include "framework/ConfigurationValidator.h" #include "framework/UI_WebSocketClientServer.h" +#include "OpenRoamin_GlobalReach.h" namespace OpenWifi { class Daemon *Daemon::instance_ = nullptr; @@ -35,7 +36,9 @@ namespace OpenWifi { ConfigurationValidator(), SerialNumberCache(), AutoDiscovery(), JobController(), UI_WebSocketClientServer(), FindCountryFromIP(), - Signup(), FileDownloader()}); + Signup(), FileDownloader(), + OpenRoaming_GlobalReach() + }); } return instance_; } diff --git a/src/OpenRoamin_GlobalReach.cpp b/src/OpenRoamin_GlobalReach.cpp new file mode 100644 index 00000000..d5fa293a --- /dev/null +++ b/src/OpenRoamin_GlobalReach.cpp @@ -0,0 +1,85 @@ +// +// Created by stephane bourque on 2023-09-11. +// + +#include "OpenRoamin_GlobalReach.h" + +namespace OpenWifi { + + int OpenRoaming_GlobalReach::Start() { + poco_information(Logger(), "Starting..."); + return 0; + } + + void OpenRoaming_GlobalReach::Stop() { + poco_information(Logger(), "Stopping..."); + poco_information(Logger(), "Stopped..."); + } + + bool OpenRoaming_GlobalReach::GetAccountInfo(const std::string &AccountName, ProvObjects::GLBLRAccountInfo &Account) { +/* Poco::URI URI{"https://config.openro.am/v1/config"}; + + std::string Path(URI.getPathAndQuery()); + + Poco::Net::HTTPRequest Request(Poco::Net::HTTPRequest::HTTP_GET, Path, + Poco::Net::HTTPMessage::HTTP_1_1); + + Request.add("Authorization", "Bearer " + BearerToken); + + Poco::Net::HTTPSClientSession Session(URI.getHost(), URI.getPort()); + Session.setTimeout(Poco::Timespan(10000, 10000)); + + Session.sendRequest(Request); + + Poco::Net::HTTPResponse Response; + std::istream &is = Session.receiveResponse(Response); + Poco::JSON::Parser P; + Result= P.parse(is).extract(); + + std::cout << Response.getStatus() << " : " ; + Result->stringify(std::cout); + std::cout << std::endl; + */ + return true; + } + + bool OpenRoaming_GlobalReach::CreateRadsecCertificate(const std::string &AccountName, ProvObjects::GLBLRCertificateInfo &NewCertificate) { +/* + Poco::URI URI{"https://config.openro.am/v1/radsec/issue"}; + + std::string Path(URI.getPathAndQuery()); + + Poco::Net::HTTPRequest Request(Poco::Net::HTTPRequest::HTTP_POST, Path, + Poco::Net::HTTPMessage::HTTP_1_1); + + Request.add("Authorization", "Bearer " + BearerToken); + + Poco::Net::HTTPSClientSession Session(URI.getHost(), URI.getPort()); + Session.setTimeout(Poco::Timespan(10000, 10000)); + + std::ostringstream os; + Body.stringify(os); + Request.setContentType("application/json"); + Request.setContentLength(os.str().size()); + + auto &body = Session.sendRequest(Request); + body << os.str(); + + Poco::Net::HTTPResponse Response; + std::istream &is = Session.receiveResponse(Response); + Poco::JSON::Parser P; + Result= P.parse(is).extract(); + + std::cout << Response.getStatus() << " : " ; + Result->stringify(std::cout); + std::cout << std::endl; +*/ + return true; + } + + bool OpenRoaming_GlobalReach::GetRadsecCertificate(const std::string &AccountName, std::string &CertificateId, + ProvObjects::GLBLRCertificateInfo &NewCertificate) { + return true; + } + +} // OpenWifi \ No newline at end of file diff --git a/src/OpenRoamin_GlobalReach.h b/src/OpenRoamin_GlobalReach.h new file mode 100644 index 00000000..767329c3 --- /dev/null +++ b/src/OpenRoamin_GlobalReach.h @@ -0,0 +1,37 @@ +// +// Created by stephane bourque on 2023-09-11. +// + +#pragma once + +#include "framework/SubSystemServer.h" +#include "Poco/JSON/Object.h" +#include "RESTObjects/RESTAPI_ProvObjects.h" + +namespace OpenWifi { + + class OpenRoaming_GlobalReach : public SubSystemServer { + public: + static auto instance() { + static auto instance_ = new OpenRoaming_GlobalReach; + return instance_; + } + + int Start() override; + void Stop() override; + bool GetAccountInfo(const std::string &AccountName, ProvObjects::GLBLRAccountInfo &Account); + bool CreateRadsecCertificate(const std::string &AccountName, ProvObjects::GLBLRCertificateInfo &NewCertificate); + bool GetRadsecCertificate(const std::string &AccountName, std::string & CertificateId, ProvObjects::GLBLRCertificateInfo &NewCertificate); + + private: + std::string CreateJWTToken(const std::string &AccountName); + + OpenRoaming_GlobalReach() noexcept + : SubSystemServer("OpenRoaming_GlobalReach", "GLBL-REACH", "globalreach") { + } + }; + + inline auto OpenRoaming_GlobalReach() { return OpenRoaming_GlobalReach::instance(); } + +} // OpenWifi + diff --git a/src/RESTObjects/RESTAPI_ProvObjects.cpp b/src/RESTObjects/RESTAPI_ProvObjects.cpp index 533d0f4a..bafd9ac0 100644 --- a/src/RESTObjects/RESTAPI_ProvObjects.cpp +++ b/src/RESTObjects/RESTAPI_ProvObjects.cpp @@ -1194,4 +1194,60 @@ namespace OpenWifi::ProvObjects { return false; } + void GLBLRAccountInfo::to_json(Poco::JSON::Object &Obj) const { + info.to_json(Obj); + field_to_json(Obj, "privateKey", privateKey); + field_to_json(Obj, "country", country); + field_to_json(Obj, "province", province); + field_to_json(Obj, "city", city); + field_to_json(Obj, "organization", organization); + field_to_json(Obj, "commonName", commonName); + } + + bool GLBLRAccountInfo::from_json(const Poco::JSON::Object::Ptr &Obj) { + try { + info.from_json(Obj); + field_from_json(Obj, "privateKey", privateKey); + field_from_json(Obj, "country", country); + field_from_json(Obj, "province", province); + field_from_json(Obj, "city", city); + field_from_json(Obj, "organization", organization); + field_from_json(Obj, "commonName", commonName); + return true; + } catch (const Poco::Exception &E) { + + } + return false; + } + + void GLBLRCertificateInfo::to_json(Poco::JSON::Object &Obj) const { + field_to_json(Obj, "id", id); + field_to_json(Obj, "name", name); + field_to_json(Obj, "accountId", accountId); + field_to_json(Obj, "csr", csr); + field_to_json(Obj, "certificate", certificate); + field_to_json(Obj, "certificateChain", certificateChain); + field_to_json(Obj, "certificateId", certificateId); + field_to_json(Obj, "expiresAt", expiresAt); + field_to_json(Obj, "created", created); + } + + bool GLBLRCertificateInfo::from_json(const Poco::JSON::Object::Ptr &Obj) { + try { + field_from_json(Obj, "id", id); + field_from_json(Obj, "name", name); + field_from_json(Obj, "accountId", accountId); + field_from_json(Obj, "csr", csr); + field_from_json(Obj, "certificate", certificate); + field_from_json(Obj, "certificateChain", certificateChain); + field_from_json(Obj, "certificateId", certificateId); + field_from_json(Obj, "expiresAt", expiresAt); + field_from_json(Obj, "created", created); + return true; + } catch (const Poco::Exception &E) { + + } + return false; + } + } // namespace OpenWifi::ProvObjects diff --git a/src/RESTObjects/RESTAPI_ProvObjects.h b/src/RESTObjects/RESTAPI_ProvObjects.h index 9f4edf37..ffdc1363 100644 --- a/src/RESTObjects/RESTAPI_ProvObjects.h +++ b/src/RESTObjects/RESTAPI_ProvObjects.h @@ -746,4 +746,29 @@ namespace OpenWifi::ProvObjects { bool CreateObjectInfo(const Poco::JSON::Object::Ptr &O, const SecurityObjects::UserInfo &U, ObjectInfo &I); bool CreateObjectInfo(const SecurityObjects::UserInfo &U, ObjectInfo &I); + + struct GLBLRAccountInfo { + ObjectInfo info; + std::string privateKey; + std::string country, province, city, organization, commonName; + + void to_json(Poco::JSON::Object &Obj) const; + bool from_json(const Poco::JSON::Object::Ptr &Obj); + }; + + struct GLBLRCertificateInfo { + std::string id; + std::string name; + std::string accountId; + std::string csr; + std::string certificate; + std::string certificateChain; + std::string certificateId; + std::uint64_t expiresAt=0; + std::uint64_t created=0; + + void to_json(Poco::JSON::Object &Obj) const; + bool from_json(const Poco::JSON::Object::Ptr &Obj); + }; + }; // namespace OpenWifi::ProvObjects diff --git a/src/StorageService.cpp b/src/StorageService.cpp index fdec47af..1a1e193f 100644 --- a/src/StorageService.cpp +++ b/src/StorageService.cpp @@ -39,6 +39,8 @@ namespace OpenWifi { OpLocationDB_ = std::make_unique(dbType_, *Pool_, Logger()); OpContactDB_ = std::make_unique(dbType_, *Pool_, Logger()); OverridesDB_ = std::make_unique(dbType_, *Pool_, Logger()); + GLBLRAccountInfoDB_ = std::make_unique(dbType_, *Pool_, Logger()); + GLBLRCertsDB_ = std::make_unique(dbType_, *Pool_, Logger()); EntityDB_->Create(); PolicyDB_->Create(); @@ -59,6 +61,8 @@ namespace OpenWifi { OpLocationDB_->Create(); OpContactDB_->Create(); OverridesDB_->Create(); + GLBLRAccountInfoDB_->Create(); + GLBLRCertsDB_->Create(); ExistFunc_[EntityDB_->Prefix()] = [=](const char *F, std::string &V) -> bool { return EntityDB_->Exists(F, V); @@ -117,6 +121,14 @@ namespace OpenWifi { ExistFunc_[OverridesDB_->Prefix()] = [=](const char *F, std::string &V) -> bool { return OverridesDB_->Exists(F, V); }; + ExistFunc_[GLBLRAccountInfoDB_->Prefix()] = [=](const char *F, std::string &V) -> bool { + return GLBLRAccountInfoDB_->Exists(F, V); + }; + ExistFunc_[GLBLRCertsDB_->Prefix()] = [=](const char *F, std::string &V) -> bool { + return GLBLRCertsDB_->Exists(F, V); + }; + + ExpandFunc_[EntityDB_->Prefix()] = [=](const char *F, std::string &V, std::string &Name, std::string &Description) -> bool { @@ -207,6 +219,20 @@ namespace OpenWifi { [[maybe_unused]] std::string &Name, [[maybe_unused]] std::string &Description) -> bool { return false; }; + ExpandFunc_[GLBLRAccountInfoDB_->Prefix()] = + [=]([[maybe_unused]] const char *F, [[maybe_unused]] std::string &V, + [[maybe_unused]] std::string &Name, + [[maybe_unused]] std::string &Description) -> bool { return false; }; + ExpandFunc_[OverridesDB_->Prefix()] = + [=]([[maybe_unused]] const char *F, [[maybe_unused]] std::string &V, + [[maybe_unused]] std::string &Name, + [[maybe_unused]] std::string &Description) -> bool { return false; }; + + ExpandFunc_[GLBLRCertsDB_->Prefix()] = + [=]([[maybe_unused]] const char *F, [[maybe_unused]] std::string &V, + [[maybe_unused]] std::string &Name, + [[maybe_unused]] std::string &Description) -> bool { return false; }; + InventoryDB_->InitializeSerialCache(); ConsistencyCheck(); diff --git a/src/StorageService.h b/src/StorageService.h index d160a135..adafaa87 100644 --- a/src/StorageService.h +++ b/src/StorageService.h @@ -28,6 +28,8 @@ #include "storage/storage_tags.h" #include "storage/storage_variables.h" #include "storage/storage_venue.h" +#include "storage/storage_glblraccounts.h" +#include "storage/storage_glblrcerts.h" #include "Poco/URI.h" #include "framework/ow_constants.h" @@ -47,25 +49,27 @@ namespace OpenWifi { typedef std::list ExpandedInUseList; typedef std::map ExpandedListMap; - OpenWifi::EntityDB &EntityDB() { return *EntityDB_; }; - OpenWifi::PolicyDB &PolicyDB() { return *PolicyDB_; }; - OpenWifi::VenueDB &VenueDB() { return *VenueDB_; }; - OpenWifi::LocationDB &LocationDB() { return *LocationDB_; }; - OpenWifi::ContactDB &ContactDB() { return *ContactDB_; }; - OpenWifi::InventoryDB &InventoryDB() { return *InventoryDB_; }; - OpenWifi::ManagementRoleDB &RolesDB() { return *RolesDB_; }; - OpenWifi::ConfigurationDB &ConfigurationDB() { return *ConfigurationDB_; }; - OpenWifi::TagsDictionaryDB &TagsDictionaryDB() { return *TagsDictionaryDB_; }; - OpenWifi::TagsObjectDB &TagsObjectDB() { return *TagsObjectDB_; }; - OpenWifi::MapDB &MapDB() { return *MapDB_; }; - OpenWifi::SignupDB &SignupDB() { return *SignupDB_; }; - OpenWifi::VariablesDB &VariablesDB() { return *VariablesDB_; }; - OpenWifi::OperatorDB &OperatorDB() { return *OperatorDB_; }; - OpenWifi::ServiceClassDB &ServiceClassDB() { return *ServiceClassDB_; }; - OpenWifi::SubscriberDeviceDB &SubscriberDeviceDB() { return *SubscriberDeviceDB_; }; - OpenWifi::OpLocationDB &OpLocationDB() { return *OpLocationDB_; }; - OpenWifi::OpContactDB &OpContactDB() { return *OpContactDB_; }; - OpenWifi::OverridesDB &OverridesDB() { return *OverridesDB_; }; + inline OpenWifi::EntityDB &EntityDB() { return *EntityDB_; }; + inline OpenWifi::PolicyDB &PolicyDB() { return *PolicyDB_; }; + inline OpenWifi::VenueDB &VenueDB() { return *VenueDB_; }; + inline OpenWifi::LocationDB &LocationDB() { return *LocationDB_; }; + inline OpenWifi::ContactDB &ContactDB() { return *ContactDB_; }; + inline OpenWifi::InventoryDB &InventoryDB() { return *InventoryDB_; }; + inline OpenWifi::ManagementRoleDB &RolesDB() { return *RolesDB_; }; + inline OpenWifi::ConfigurationDB &ConfigurationDB() { return *ConfigurationDB_; }; + inline OpenWifi::TagsDictionaryDB &TagsDictionaryDB() { return *TagsDictionaryDB_; }; + inline OpenWifi::TagsObjectDB &TagsObjectDB() { return *TagsObjectDB_; }; + inline OpenWifi::MapDB &MapDB() { return *MapDB_; }; + inline OpenWifi::SignupDB &SignupDB() { return *SignupDB_; }; + inline OpenWifi::VariablesDB &VariablesDB() { return *VariablesDB_; }; + inline OpenWifi::OperatorDB &OperatorDB() { return *OperatorDB_; }; + inline OpenWifi::ServiceClassDB &ServiceClassDB() { return *ServiceClassDB_; }; + inline OpenWifi::SubscriberDeviceDB &SubscriberDeviceDB() { return *SubscriberDeviceDB_; }; + inline OpenWifi::OpLocationDB &OpLocationDB() { return *OpLocationDB_; }; + inline OpenWifi::OpContactDB &OpContactDB() { return *OpContactDB_; }; + inline OpenWifi::OverridesDB &OverridesDB() { return *OverridesDB_; }; + inline OpenWifi::GLBLRAccountInfoDB &GLBLRAccountInfoDB() { return *GLBLRAccountInfoDB_; } + inline OpenWifi::GLBLRCertsDB &GLBLRCertsDB() { return *GLBLRCertsDB_; } bool Validate(const Poco::URI::QueryParameters &P, RESTAPI::Errors::msg &Error); bool Validate(const Types::StringVec &P, std::string &Error); @@ -125,6 +129,8 @@ namespace OpenWifi { std::unique_ptr OpLocationDB_; std::unique_ptr OpContactDB_; std::unique_ptr OverridesDB_; + std::unique_ptr GLBLRAccountInfoDB_; + std::unique_ptr GLBLRCertsDB_; std::string DefaultOperator_; typedef std::function exist_func; diff --git a/src/framework/ow_constants.h b/src/framework/ow_constants.h index c1a1bf76..2d45a3d8 100644 --- a/src/framework/ow_constants.h +++ b/src/framework/ow_constants.h @@ -40,6 +40,7 @@ namespace OpenWifi { }; } +#define DBGLINE std::cout << __LINE__ << ":" << __FILE__ << ", " << __func__ << std::endl; namespace OpenWifi::RESTAPI::Errors { struct msg { uint64_t err_num; diff --git a/src/framework/utils.cpp b/src/framework/utils.cpp index a0f4c111..c37ff648 100644 --- a/src/framework/utils.cpp +++ b/src/framework/utils.cpp @@ -3,6 +3,7 @@ // #include "Poco/Path.h" +#include "Poco/TemporaryFile.h" #include "framework/AppServiceRegistry.h" #include "framework/utils.h" @@ -608,4 +609,107 @@ namespace OpenWifi::Utils { return DT.timestamp().epochTime(); } + bool CreateX509CSR(const std::string &Country, const std::string &Province, const std::string &City, + const std::string &Organization, const std::string &CommonName, int bits ) { + int ret = 0; + RSA *r = nullptr; + BIGNUM *bne = nullptr; + + int nVersion = 0; + unsigned long e = RSA_F4; + + X509_REQ *x509_req = nullptr; + X509_NAME *x509_name = nullptr; + EVP_PKEY *pKey = nullptr; +// RSA *tem = nullptr; + BIO *out = nullptr; +// BIO *bio_err = nullptr; + + const char *szCountry = Country.c_str(); + const char *szProvince = Province.c_str(); + const char *szCity = City.c_str(); + const char *szOrganization = Organization.c_str(); + const char *szCommon = CommonName.c_str(); + + Poco::TemporaryFile CsrPath; + +// 1. generate rsa key + bne = BN_new(); + ret = BN_set_word(bne,e); + if(ret != 1){ + goto free_all; + } + + r = RSA_new(); + ret = RSA_generate_key_ex(r, bits, bne, nullptr); + if(ret != 1){ + goto free_all; + } + +// 2. set version of x509 req + x509_req = X509_REQ_new(); + ret = X509_REQ_set_version(x509_req, nVersion); + if (ret != 1){ + goto free_all; + } + +// 3. set subject of x509 req + x509_name = X509_REQ_get_subject_name(x509_req); + + ret = X509_NAME_add_entry_by_txt(x509_name,"C", MBSTRING_ASC, (const unsigned char*)szCountry, -1, -1, 0); + if (ret != 1){ + goto free_all; + } + + ret = X509_NAME_add_entry_by_txt(x509_name,"ST", MBSTRING_ASC, (const unsigned char*)szProvince, -1, -1, 0); + if (ret != 1){ + goto free_all; + } + + ret = X509_NAME_add_entry_by_txt(x509_name,"L", MBSTRING_ASC, (const unsigned char*)szCity, -1, -1, 0); + if (ret != 1){ + goto free_all; + } + + ret = X509_NAME_add_entry_by_txt(x509_name,"O", MBSTRING_ASC, (const unsigned char*)szOrganization, -1, -1, 0); + if (ret != 1){ + goto free_all; + } + + ret = X509_NAME_add_entry_by_txt(x509_name,"CN", MBSTRING_ASC, (const unsigned char*)szCommon, -1, -1, 0); + if (ret != 1){ + goto free_all; + } + +// 4. set public key of x509 req + pKey = EVP_PKEY_new(); + EVP_PKEY_assign_RSA(pKey, r); + r = nullptr; // will be free rsa when EVP_PKEY_free(pKey) + + ret = X509_REQ_set_pubkey(x509_req, pKey); + if (ret != 1){ + goto free_all; + } + +// 5. set sign key of x509 req + ret = X509_REQ_sign(x509_req, pKey, EVP_sha1()); // return x509_req->signature->length + if (ret <= 0){ + goto free_all; + } + + out = BIO_new_file(CsrPath.path().c_str(),"w"); + ret = PEM_write_bio_X509_REQ(out, x509_req); + +// 6. free + free_all: + X509_REQ_free(x509_req); + BIO_free_all(out); + + EVP_PKEY_free(pKey); + BN_free(bne); + + return (ret == 1); + + } + } // namespace OpenWifi::Utils diff --git a/src/framework/utils.h b/src/framework/utils.h index 3979dca8..89ba52a1 100644 --- a/src/framework/utils.h +++ b/src/framework/utils.h @@ -247,4 +247,6 @@ namespace OpenWifi::Utils { return count; } + bool CreateX509CSR(const std::string &Country, const std::string &Province, const std::string &City, + const std::string &Organization, const std::string &CommonName, int bits=2048); } // namespace OpenWifi::Utils diff --git a/src/storage/storage_glblraccounts.cpp b/src/storage/storage_glblraccounts.cpp new file mode 100644 index 00000000..7f616c33 --- /dev/null +++ b/src/storage/storage_glblraccounts.cpp @@ -0,0 +1,85 @@ +// +// Created by stephane bourque on 2023-09-11. +// + +#include "storage_glblraccounts.h" +#include +#include "framework/OpenWifiTypes.h" +#include "framework/RESTAPI_utils.h" + +#include "RESTObjects/RESTAPI_SecurityObjects.h" + +namespace OpenWifi { + + static ORM::FieldVec GLBLRAccountInfoDB_Fields{// object info + ORM::Field{"id", 64, true}, + ORM::Field{"name", ORM::FieldType::FT_TEXT}, + ORM::Field{"description", ORM::FieldType::FT_TEXT}, + ORM::Field{"notes", ORM::FieldType::FT_TEXT}, + ORM::Field{"created", ORM::FieldType::FT_BIGINT}, + ORM::Field{"modified", ORM::FieldType::FT_BIGINT}, + ORM::Field{"privateKey", ORM::FieldType::FT_TEXT}, + ORM::Field{"country", ORM::FieldType::FT_TEXT}, + ORM::Field{"province", ORM::FieldType::FT_TEXT}, + ORM::Field{"city", ORM::FieldType::FT_TEXT}, + ORM::Field{"organization", ORM::FieldType::FT_TEXT}, + ORM::Field{"commonName", ORM::FieldType::FT_TEXT} + }; + + static ORM::IndexVec GLBLRAccountInfoDB_Indexes{ + {std::string("glblr_name_index"), + ORM::IndexEntryVec{{std::string("name"), ORM::Indextype::ASC}}}}; + + GLBLRAccountInfoDB::GLBLRAccountInfoDB(OpenWifi::DBType T, Poco::Data::SessionPool &P, Poco::Logger &L) + : DB(T, "glblr_accts", GLBLRAccountInfoDB_Fields, GLBLRAccountInfoDB_Indexes, P, L, "glr") {} + + bool GLBLRAccountInfoDB::Upgrade([[maybe_unused]] uint32_t from, uint32_t &to) { + to = Version(); + std::vector Script{}; + + for (const auto &i : Script) { + try { + auto Session = Pool_.get(); + Session << i, Poco::Data::Keywords::now; + } catch (...) { + } + } + return true; + } + +} // namespace OpenWifi + +template <> +void ORM::DB::Convert( + const OpenWifi::GLBLRAccountsDBRecordType &In, OpenWifi::ProvObjects::GLBLRAccountInfo &Out) { + Out.info.id = In.get<0>(); + Out.info.name = In.get<1>(); + Out.info.description = In.get<2>(); + Out.info.notes = + OpenWifi::RESTAPI_utils::to_object_array(In.get<3>()); + Out.info.created = In.get<4>(); + Out.info.modified = In.get<5>(); + Out.privateKey =In.get<6>(); + Out.country = In.get<7>(); + Out.province = In.get<8>(); + Out.city = In.get<9>(); + Out.organization = In.get<10>(); + Out.commonName = In.get<11>(); +} + +template <> +void ORM::DB::Convert( + const OpenWifi::ProvObjects::GLBLRAccountInfo &In, OpenWifi::GLBLRAccountsDBRecordType &Out) { + Out.set<0>(In.info.id); + Out.set<1>(In.info.name); + Out.set<2>(In.info.description); + Out.set<3>(OpenWifi::RESTAPI_utils::to_string(In.info.notes)); + Out.set<4>(In.info.created); + Out.set<5>(In.info.modified); + Out.set<6>(In.privateKey); + Out.set<7>(In.country); + Out.set<8>(In.province); + Out.set<9>(In.city); + Out.set<10>(In.organization); + Out.set<11>(In.commonName); +} diff --git a/src/storage/storage_glblraccounts.h b/src/storage/storage_glblraccounts.h new file mode 100644 index 00000000..bc213c1a --- /dev/null +++ b/src/storage/storage_glblraccounts.h @@ -0,0 +1,31 @@ +// +// Created by stephane bourque on 2023-09-11. +// + + +#pragma once + +#include "RESTObjects/RESTAPI_ProvObjects.h" +#include "framework/orm.h" + +namespace OpenWifi { + + typedef Poco::Tuple + GLBLRAccountsDBRecordType; + + class GLBLRAccountInfoDB : public ORM::DB { + public: + GLBLRAccountInfoDB(OpenWifi::DBType T, Poco::Data::SessionPool &P, Poco::Logger &L); + virtual ~GLBLRAccountInfoDB(){}; + bool Upgrade(uint32_t from, uint32_t &to) override; + private: + + }; +} // namespace OpenWifi diff --git a/src/storage/storage_glblrcerts.cpp b/src/storage/storage_glblrcerts.cpp new file mode 100644 index 00000000..fe0900de --- /dev/null +++ b/src/storage/storage_glblrcerts.cpp @@ -0,0 +1,76 @@ +// +// Created by stephane bourque on 2023-09-11. +// + +#include "storage_glblrcerts.h" + +#include +#include "framework/OpenWifiTypes.h" +#include "framework/RESTAPI_utils.h" + +#include "RESTObjects/RESTAPI_SecurityObjects.h" + +namespace OpenWifi { + + static ORM::FieldVec GLBLRCertsDB_Fields{// object info + ORM::Field{"id", 64, true}, + ORM::Field{"name", ORM::FieldType::FT_TEXT}, + ORM::Field{"accountId", ORM::FieldType::FT_TEXT}, + ORM::Field{"csr", ORM::FieldType::FT_TEXT}, + ORM::Field{"certificate", ORM::FieldType::FT_TEXT}, + ORM::Field{"certificateChain", ORM::FieldType::FT_TEXT}, + ORM::Field{"certificateId", ORM::FieldType::FT_TEXT}, + ORM::Field{"expiresAt", ORM::FieldType::FT_BIGINT}, + ORM::Field{"created", ORM::FieldType::FT_BIGINT} + }; + + static ORM::IndexVec GLBLRCertsDB_Indexes{ + {std::string("glblr_cert_id_index"), + ORM::IndexEntryVec{{std::string("name"), ORM::Indextype::ASC}}}}; + + GLBLRCertsDB::GLBLRCertsDB(OpenWifi::DBType T, Poco::Data::SessionPool &P, Poco::Logger &L) + : DB(T, "glblr_certs", GLBLRCertsDB_Fields, GLBLRCertsDB_Indexes, P, L, "glc") {} + + bool GLBLRCertsDB::Upgrade([[maybe_unused]] uint32_t from, uint32_t &to) { + to = Version(); + std::vector Script{}; + + for (const auto &i : Script) { + try { + auto Session = Pool_.get(); + Session << i, Poco::Data::Keywords::now; + } catch (...) { + } + } + return true; + } + +} // namespace OpenWifi + +template <> +void ORM::DB::Convert( + const OpenWifi::GLBLRCertsDBRecordType &In, OpenWifi::ProvObjects::GLBLRCertificateInfo &Out) { + Out.id = In.get<0>(); + Out.name = In.get<1>(); + Out.accountId = In.get<2>(); + Out.csr = In.get<3>(); + Out.certificate = In.get<4>(); + Out.certificateChain = In.get<5>(); + Out.certificateId = In.get<6>(); + Out.expiresAt = In.get<7>(); + Out.created = In.get<8>(); +} + +template <> +void ORM::DB::Convert( + const OpenWifi::ProvObjects::GLBLRCertificateInfo &In, OpenWifi::GLBLRCertsDBRecordType &Out) { + Out.set<0>(In.id); + Out.set<1>(In.name); + Out.set<2>(In.accountId); + Out.set<3>(In.csr); + Out.set<4>(In.certificate); + Out.set<5>(In.certificateChain); + Out.set<6>(In.certificateId); + Out.set<7>(In.expiresAt); + Out.set<8>(In.created); +} diff --git a/src/storage/storage_glblrcerts.h b/src/storage/storage_glblrcerts.h new file mode 100644 index 00000000..da097bc8 --- /dev/null +++ b/src/storage/storage_glblrcerts.h @@ -0,0 +1,37 @@ +// +// Created by stephane bourque on 2023-09-11. +// + +// +// Created by stephane bourque on 2023-09-11. +// + + +#pragma once + +#include "RESTObjects/RESTAPI_ProvObjects.h" +#include "framework/orm.h" + +namespace OpenWifi { + + typedef Poco::Tuple< + std::string, + std::string, + std::string, + std::string, + std::string, + std::string, + std::string, + uint64_t, + uint64_t> + GLBLRCertsDBRecordType; + + class GLBLRCertsDB : public ORM::DB { + public: + GLBLRCertsDB(OpenWifi::DBType T, Poco::Data::SessionPool &P, Poco::Logger &L); + virtual ~GLBLRCertsDB(){}; + bool Upgrade(uint32_t from, uint32_t &to) override; + private: + + }; +} // namespace OpenWifi