From 14efffa61271cfb735fe4ce57e6d1a01a075ffa5 Mon Sep 17 00:00:00 2001 From: stephb9959 Date: Wed, 4 Oct 2023 15:25:26 -0700 Subject: [PATCH] https://telecominfraproject.atlassian.net/browse/WIFI-7831 Signed-off-by: stephb9959 --- build | 2 +- openapi/radius_endpoints.yaml | 12 ++++-- .../RESTAPI_radius_endpoint_handler.cpp | 4 ++ src/RESTObjects/RESTAPI_ProvObjects.h | 6 +-- src/RadiusEndpointUpdater.h | 37 +++++++++++++++++-- 5 files changed, 51 insertions(+), 10 deletions(-) diff --git a/build b/build index 9cd72aa..e77a963 100644 --- a/build +++ b/build @@ -1 +1 @@ -72 \ No newline at end of file +73 \ No newline at end of file diff --git a/openapi/radius_endpoints.yaml b/openapi/radius_endpoints.yaml index a8d0cc9..ea9ac35 100644 --- a/openapi/radius_endpoints.yaml +++ b/openapi/radius_endpoints.yaml @@ -54,11 +54,17 @@ components: type: object properties: Authentication: - $ref: '#/components/schemas/RADIUSServer' + type: array + items: + $ref: '#/components/schemas/RADIUSServer' Accounting: - $ref: '#/components/schemas/RADIUSServer' + type: array + items: + $ref: '#/components/schemas/RADIUSServer' CoA: - $ref: '#/components/schemas/RADIUSServer' + type: array + items: + $ref: '#/components/schemas/RADIUSServer' AccountingInterval: type: integer format: int32 diff --git a/src/RESTAPI/RESTAPI_radius_endpoint_handler.cpp b/src/RESTAPI/RESTAPI_radius_endpoint_handler.cpp index 11efe66..1d791d8 100644 --- a/src/RESTAPI/RESTAPI_radius_endpoint_handler.cpp +++ b/src/RESTAPI/RESTAPI_radius_endpoint_handler.cpp @@ -45,6 +45,10 @@ namespace OpenWifi { return true; } + static bool ValidRadiusServer(const std::vector &ServerList) { + return std::all_of(ServerList.begin(),ServerList.end(),[](const ProvObjects::RADIUSServer &Server)->bool { return ValidRadiusServer(Server); }); + } + void RESTAPI_radius_endpoint_handler::DoPost() { auto id = GetBinding("id"); if(id.empty()) { diff --git a/src/RESTObjects/RESTAPI_ProvObjects.h b/src/RESTObjects/RESTAPI_ProvObjects.h index 9a93259..6cd9725 100644 --- a/src/RESTObjects/RESTAPI_ProvObjects.h +++ b/src/RESTObjects/RESTAPI_ProvObjects.h @@ -860,9 +860,9 @@ namespace OpenWifi::ProvObjects { }; struct RADIUSEndPointRadiusType { - RADIUSServer Authentication; - RADIUSServer Accounting; - RADIUSServer CoA; + std::vector Authentication; + std::vector Accounting; + std::vector CoA; std::uint64_t AccountingInterval = 60; void to_json(Poco::JSON::Object &Obj) const; diff --git a/src/RadiusEndpointUpdater.h b/src/RadiusEndpointUpdater.h index a230873..26982c4 100644 --- a/src/RadiusEndpointUpdater.h +++ b/src/RadiusEndpointUpdater.h @@ -12,6 +12,28 @@ namespace OpenWifi { class RadiusEndpointUpdater { public: + + void AddServers(const std::vector &ServerList, Poco::JSON::Object &O) { + O.set("methodParameters", Poco::JSON::Array()); + O.set("monitor" , false); + O.set("monitorMethod", "none"); + O.set("strategy", "random"); + Poco::JSON::Array ServerArray; + for(const auto &server:ServerList) { + Poco::JSON::Object InnerServer; + InnerServer.set("allowSelfSigned", false); + InnerServer.set("certificate", ""); + InnerServer.set("ignore", false); + InnerServer.set("ip",server.IP); + InnerServer.set("port", server.Port); + InnerServer.set("secret", server.Secret); + InnerServer.set("name", server.Hostname); + InnerServer.set("radsec", false); + ServerArray.add(InnerServer); + } + O.set("servers", ServerArray); + } + inline bool UpdateEndpoints( [[maybe_unused]] std::string & Error, [[maybe_unused]] uint64_t &ErrorNum ) { @@ -45,6 +67,7 @@ namespace OpenWifi { InnerServer.set("name", fmt::format("Server {}",i)); InnerServer.set("ip", Server.Hostname); InnerServer.set("radsecPort", Server.Port); + InnerServer.set("radsec", true); InnerServer.set("radsecCert", Utils::base64encode((const u_char *)OA.certificate.c_str(),OA.certificate.size())); InnerServer.set("radsecKey", Utils::base64encode((const u_char *)OA.privateKey.c_str(),OA.privateKey.size())); Poco::JSON::Array CaCerts; @@ -79,6 +102,7 @@ namespace OpenWifi { InnerServer.set("ignore", false); InnerServer.set("name", fmt::format("Server {}",i)); InnerServer.set("ip", Server.Hostname); + InnerServer.set("radsec", true); InnerServer.set("radsecPort", Server.Port); InnerServer.set("radsecCert", Utils::base64encode((const u_char *)GRCertificate.certificate.c_str(),GRCertificate.certificate.size())); InnerServer.set("radsecKey", Utils::base64encode((const u_char *)GRAccountInfo.CSRPrivateKey.c_str(),GRAccountInfo.CSRPrivateKey.size())); @@ -105,6 +129,7 @@ namespace OpenWifi { InnerServer.set("ignore", false); InnerServer.set("name", fmt::format("Server {}",i)); InnerServer.set("ip", Server.Hostname); + InnerServer.set("radsec", true); InnerServer.set("radsecPort", Server.Port); InnerServer.set("radsecCert", Utils::base64encode((const u_char *)Server.Certificate.c_str(), Server.Certificate.size())); InnerServer.set("radsecKey", Utils::base64encode((const u_char *)Server.PrivateKey.c_str(), Server.PrivateKey.size())); @@ -122,9 +147,15 @@ namespace OpenWifi { RadiusPools.add(PoolEntry); } else if(Endpoint.Type=="radius") { PoolEntry.set("radsecPoolType", "radius"); - for (const auto &Server: Endpoint.RadsecServers) { - - } + const auto &server = Endpoint.RadiusServers[0]; + Poco::JSON::Object ServerEntry; + Poco::JSON::Object AcctConfig, AuthConfig, CoAConfig, InnerServer; + AddServers(server.Authentication,AuthConfig); + AddServers(server.Accounting,AcctConfig); + AddServers(server.CoA,CoAConfig); + PoolEntry.set("authConfig", AuthConfig); + PoolEntry.set("acctConfig", AcctConfig); + PoolEntry.set("coaConfig", CoAConfig); } }