mirror of
https://github.com/Telecominfraproject/wlan-cloud-owprov.git
synced 2026-01-27 10:22:54 +00:00
Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
This commit is contained in:
@@ -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}
|
||||
|
||||
@@ -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_;
|
||||
}
|
||||
|
||||
85
src/OpenRoamin_GlobalReach.cpp
Normal file
85
src/OpenRoamin_GlobalReach.cpp
Normal file
@@ -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<Poco::JSON::Object::Ptr>();
|
||||
|
||||
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<Poco::JSON::Object::Ptr>();
|
||||
|
||||
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
|
||||
37
src/OpenRoamin_GlobalReach.h
Normal file
37
src/OpenRoamin_GlobalReach.h
Normal file
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -39,6 +39,8 @@ namespace OpenWifi {
|
||||
OpLocationDB_ = std::make_unique<OpenWifi::OpLocationDB>(dbType_, *Pool_, Logger());
|
||||
OpContactDB_ = std::make_unique<OpenWifi::OpContactDB>(dbType_, *Pool_, Logger());
|
||||
OverridesDB_ = std::make_unique<OpenWifi::OverridesDB>(dbType_, *Pool_, Logger());
|
||||
GLBLRAccountInfoDB_ = std::make_unique<OpenWifi::GLBLRAccountInfoDB>(dbType_, *Pool_, Logger());
|
||||
GLBLRCertsDB_ = std::make_unique<OpenWifi::GLBLRCertsDB>(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();
|
||||
|
||||
@@ -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<ProvObjects::ExpandedUseEntry> ExpandedInUseList;
|
||||
typedef std::map<std::string, ProvObjects::ExpandedUseEntryList> 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<OpenWifi::OpLocationDB> OpLocationDB_;
|
||||
std::unique_ptr<OpenWifi::OpContactDB> OpContactDB_;
|
||||
std::unique_ptr<OpenWifi::OverridesDB> OverridesDB_;
|
||||
std::unique_ptr<OpenWifi::GLBLRAccountInfoDB> GLBLRAccountInfoDB_;
|
||||
std::unique_ptr<OpenWifi::GLBLRCertsDB> GLBLRCertsDB_;
|
||||
std::string DefaultOperator_;
|
||||
|
||||
typedef std::function<bool(const char *FieldName, std::string &Value)> exist_func;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
85
src/storage/storage_glblraccounts.cpp
Normal file
85
src/storage/storage_glblraccounts.cpp
Normal file
@@ -0,0 +1,85 @@
|
||||
//
|
||||
// Created by stephane bourque on 2023-09-11.
|
||||
//
|
||||
|
||||
#include "storage_glblraccounts.h"
|
||||
#include <framework/orm.h>
|
||||
#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<std::string> 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<OpenWifi::GLBLRAccountsDBRecordType, OpenWifi::ProvObjects::GLBLRAccountInfo>::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<OpenWifi::SecurityObjects::NoteInfo>(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<OpenWifi::GLBLRAccountsDBRecordType, OpenWifi::ProvObjects::GLBLRAccountInfo>::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);
|
||||
}
|
||||
31
src/storage/storage_glblraccounts.h
Normal file
31
src/storage/storage_glblraccounts.h
Normal file
@@ -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<std::string,
|
||||
std::string, std::string, std::string, uint64_t, uint64_t,
|
||||
std::string,
|
||||
std::string,
|
||||
std::string,
|
||||
std::string,
|
||||
std::string,
|
||||
std::string>
|
||||
GLBLRAccountsDBRecordType;
|
||||
|
||||
class GLBLRAccountInfoDB : public ORM::DB<GLBLRAccountsDBRecordType, ProvObjects::GLBLRAccountInfo> {
|
||||
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
|
||||
76
src/storage/storage_glblrcerts.cpp
Normal file
76
src/storage/storage_glblrcerts.cpp
Normal file
@@ -0,0 +1,76 @@
|
||||
//
|
||||
// Created by stephane bourque on 2023-09-11.
|
||||
//
|
||||
|
||||
#include "storage_glblrcerts.h"
|
||||
|
||||
#include <framework/orm.h>
|
||||
#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<std::string> 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<OpenWifi::GLBLRCertsDBRecordType, OpenWifi::ProvObjects::GLBLRCertificateInfo>::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<OpenWifi::GLBLRCertsDBRecordType, OpenWifi::ProvObjects::GLBLRCertificateInfo>::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);
|
||||
}
|
||||
37
src/storage/storage_glblrcerts.h
Normal file
37
src/storage/storage_glblrcerts.h
Normal file
@@ -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<GLBLRCertsDBRecordType, ProvObjects::GLBLRCertificateInfo> {
|
||||
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
|
||||
Reference in New Issue
Block a user