mirror of
https://github.com/Telecominfraproject/wlan-cloud-ucentralsec.git
synced 2025-11-02 03:37:51 +00:00
Merge branch 'main' into release/v2.6.0
This commit is contained in:
@@ -10,6 +10,7 @@
|
|||||||
// Arilia Wireless Inc.
|
// Arilia Wireless Inc.
|
||||||
//
|
//
|
||||||
|
|
||||||
|
|
||||||
#include "Poco/Util/Application.h"
|
#include "Poco/Util/Application.h"
|
||||||
#include "Poco/Util/Option.h"
|
#include "Poco/Util/Option.h"
|
||||||
#include "Poco/Environment.h"
|
#include "Poco/Environment.h"
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ namespace OpenWifi {
|
|||||||
|
|
||||||
auto Reset = GetBoolParameter("reset",false);
|
auto Reset = GetBoolParameter("reset",false);
|
||||||
std::string QRCode;
|
std::string QRCode;
|
||||||
|
|
||||||
if(TotpCache()->StartValidation(UserInfo_.userinfo,false,QRCode,Reset)) {
|
if(TotpCache()->StartValidation(UserInfo_.userinfo,false,QRCode,Reset)) {
|
||||||
return SendFileContent(QRCode, "image/svg+xml","qrcode.svg");
|
return SendFileContent(QRCode, "image/svg+xml","qrcode.svg");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -538,8 +538,8 @@ namespace OpenWifi::AnalyticsObjects {
|
|||||||
|
|
||||||
void WifiClientHistory::to_json(Poco::JSON::Object &Obj) const {
|
void WifiClientHistory::to_json(Poco::JSON::Object &Obj) const {
|
||||||
field_to_json(Obj,"timestamp",timestamp);
|
field_to_json(Obj,"timestamp",timestamp);
|
||||||
field_to_json(Obj,"stationId",stationId);
|
field_to_json(Obj,"station_id",station_id);
|
||||||
field_to_json(Obj,"bssId",bssId);
|
field_to_json(Obj,"bssid",bssid);
|
||||||
field_to_json(Obj,"ssid",ssid);
|
field_to_json(Obj,"ssid",ssid);
|
||||||
field_to_json(Obj,"rssi",rssi);
|
field_to_json(Obj,"rssi",rssi);
|
||||||
field_to_json(Obj,"rx_bitrate",rx_bitrate);
|
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,"connected",connected);
|
||||||
field_to_json(Obj,"inactive",inactive);
|
field_to_json(Obj,"inactive",inactive);
|
||||||
field_to_json(Obj,"tx_retries",tx_retries);
|
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) {
|
bool WifiClientHistory::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj,"timestamp",timestamp);
|
field_from_json(Obj,"timestamp",timestamp);
|
||||||
field_from_json(Obj,"stationId",stationId);
|
field_from_json(Obj,"station_id",station_id);
|
||||||
field_from_json(Obj,"bssId",bssId);
|
field_from_json(Obj,"bssid",bssid);
|
||||||
field_from_json(Obj,"ssid",ssid);
|
field_from_json(Obj,"ssid",ssid);
|
||||||
field_from_json(Obj,"rssi",rssi);
|
field_from_json(Obj,"rssi",rssi);
|
||||||
field_from_json(Obj,"rx_bitrate",rx_bitrate);
|
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,"connected",connected);
|
||||||
field_from_json(Obj,"inactive",inactive);
|
field_from_json(Obj,"inactive",inactive);
|
||||||
field_from_json(Obj,"tx_retries",tx_retries);
|
field_from_json(Obj,"tx_retries",tx_retries);
|
||||||
|
field_from_json(Obj,"venue_id",venue_id);
|
||||||
return true;
|
return true;
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
|
|
||||||
|
|||||||
@@ -376,8 +376,8 @@ namespace OpenWifi {
|
|||||||
|
|
||||||
struct WifiClientHistory {
|
struct WifiClientHistory {
|
||||||
uint64_t timestamp=OpenWifi::Now();
|
uint64_t timestamp=OpenWifi::Now();
|
||||||
std::string stationId;
|
std::string station_id;
|
||||||
std::string bssId;
|
std::string bssid;
|
||||||
std::string ssid;
|
std::string ssid;
|
||||||
int64_t rssi=0;
|
int64_t rssi=0;
|
||||||
uint32_t rx_bitrate=0;
|
uint32_t rx_bitrate=0;
|
||||||
@@ -411,6 +411,7 @@ namespace OpenWifi {
|
|||||||
uint64_t connected=0;
|
uint64_t connected=0;
|
||||||
uint64_t inactive=0;
|
uint64_t inactive=0;
|
||||||
uint64_t tx_retries=0;
|
uint64_t tx_retries=0;
|
||||||
|
std::string venue_id;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
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);
|
||||||
|
|||||||
@@ -3,176 +3,206 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#include "RESTAPI_CertObjects.h"
|
#include "RESTAPI_CertObjects.h"
|
||||||
|
#include "framework/MicroService.h"
|
||||||
|
|
||||||
using OpenWifi::RESTAPI_utils::field_to_json;
|
using OpenWifi::RESTAPI_utils::field_to_json;
|
||||||
using OpenWifi::RESTAPI_utils::field_from_json;
|
using OpenWifi::RESTAPI_utils::field_from_json;
|
||||||
|
|
||||||
namespace OpenWifi {
|
namespace OpenWifi::CertObjects {
|
||||||
namespace CertObjects {
|
void CertificateEntry::to_json(Poco::JSON::Object &Obj) const {
|
||||||
void CertificateEntry::to_json(Poco::JSON::Object &Obj) const {
|
field_to_json(Obj,"id", id);
|
||||||
field_to_json(Obj,"id", id);
|
field_to_json(Obj,"entity", entity);
|
||||||
field_to_json(Obj,"entity", entity);
|
field_to_json(Obj,"creator", creator);
|
||||||
field_to_json(Obj,"creator", creator);
|
field_to_json(Obj,"type", type);
|
||||||
field_to_json(Obj,"type", type);
|
field_to_json(Obj,"status", status);
|
||||||
field_to_json(Obj,"status", status);
|
field_to_json(Obj,"certificate", certificate);
|
||||||
field_to_json(Obj,"certificate", certificate);
|
field_to_json(Obj,"key", key);
|
||||||
field_to_json(Obj,"key", key);
|
field_to_json(Obj,"devid", devid);
|
||||||
field_to_json(Obj,"devid", devid);
|
field_to_json(Obj,"cas", cas);
|
||||||
field_to_json(Obj,"cas", cas);
|
field_to_json(Obj,"manufacturer", manufacturer);
|
||||||
field_to_json(Obj,"manufacturer", manufacturer);
|
field_to_json(Obj,"model", model);
|
||||||
field_to_json(Obj,"model", model);
|
field_to_json(Obj,"redirector", redirector);
|
||||||
field_to_json(Obj,"redirector", redirector);
|
field_to_json(Obj,"commonName", commonName);
|
||||||
field_to_json(Obj,"commonName", commonName);
|
field_to_json(Obj,"certificateId", certificateId);
|
||||||
field_to_json(Obj,"certificateId", certificateId);
|
field_to_json(Obj,"batch", batch);
|
||||||
field_to_json(Obj,"batch", batch);
|
field_to_json(Obj,"created", created);
|
||||||
field_to_json(Obj,"created", created);
|
field_to_json(Obj,"modified", modified);
|
||||||
field_to_json(Obj,"modified", modified);
|
field_to_json(Obj,"revoked", revoked);
|
||||||
field_to_json(Obj,"revoked", revoked);
|
field_to_json(Obj,"revokeCount", revokeCount);
|
||||||
field_to_json(Obj,"revokeCount", revokeCount);
|
field_to_json(Obj,"synched", synched);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CertificateEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool CertificateEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj,"id", id);
|
field_from_json(Obj,"id", id);
|
||||||
field_from_json(Obj,"entity", entity);
|
field_from_json(Obj,"entity", entity);
|
||||||
field_from_json(Obj,"creator", creator);
|
field_from_json(Obj,"creator", creator);
|
||||||
field_from_json(Obj,"type", type);
|
field_from_json(Obj,"type", type);
|
||||||
field_from_json(Obj,"status", status);
|
field_from_json(Obj,"status", status);
|
||||||
field_from_json(Obj,"certificate", certificate);
|
field_from_json(Obj,"certificate", certificate);
|
||||||
field_from_json(Obj,"key", key);
|
field_from_json(Obj,"key", key);
|
||||||
field_from_json(Obj,"devid", devid);
|
field_from_json(Obj,"devid", devid);
|
||||||
field_from_json(Obj,"cas", cas);
|
field_from_json(Obj,"cas", cas);
|
||||||
field_from_json(Obj,"manufacturer", manufacturer);
|
field_from_json(Obj,"manufacturer", manufacturer);
|
||||||
field_from_json(Obj,"model", model);
|
field_from_json(Obj,"model", model);
|
||||||
field_from_json(Obj,"redirector", redirector);
|
field_from_json(Obj,"redirector", redirector);
|
||||||
field_from_json(Obj,"commonName", commonName);
|
field_from_json(Obj,"commonName", commonName);
|
||||||
field_from_json(Obj,"certificateId", certificateId);
|
field_from_json(Obj,"certificateId", certificateId);
|
||||||
field_from_json(Obj,"batch", batch);
|
field_from_json(Obj,"batch", batch);
|
||||||
field_from_json(Obj,"created", created);
|
field_from_json(Obj,"created", created);
|
||||||
field_from_json(Obj,"modified", modified);
|
field_from_json(Obj,"modified", modified);
|
||||||
field_from_json(Obj,"revoked", revoked);
|
field_from_json(Obj,"revoked", revoked);
|
||||||
field_from_json(Obj,"revokeCount", revokeCount);
|
field_from_json(Obj,"revokeCount", revokeCount);
|
||||||
return true;
|
field_from_json(Obj,"synched", synched);
|
||||||
} catch (...) {
|
return true;
|
||||||
}
|
} catch (...) {
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void EntityEntry::to_json(Poco::JSON::Object &Obj) const {
|
void EntityEntry::to_json(Poco::JSON::Object &Obj) const {
|
||||||
field_to_json(Obj,"id", id);
|
field_to_json(Obj,"id", id);
|
||||||
field_to_json(Obj,"creator", creator);
|
field_to_json(Obj,"creator", creator);
|
||||||
field_to_json(Obj,"name", name);
|
field_to_json(Obj,"name", name);
|
||||||
field_to_json(Obj,"description", description);
|
field_to_json(Obj,"description", description);
|
||||||
field_to_json(Obj,"defaultRedirector", defaultRedirector);
|
field_to_json(Obj,"defaultRedirector", defaultRedirector);
|
||||||
field_to_json(Obj,"apiKey", apiKey);
|
field_to_json(Obj,"apiKey", apiKey);
|
||||||
field_to_json(Obj,"serverEnrollmentProfile", serverEnrollmentProfile);
|
field_to_json(Obj,"serverEnrollmentProfile", serverEnrollmentProfile);
|
||||||
field_to_json(Obj,"clientEnrollmentProfile", clientEnrollmentProfile);
|
field_to_json(Obj,"clientEnrollmentProfile", clientEnrollmentProfile);
|
||||||
field_to_json(Obj,"organization", organization);
|
field_to_json(Obj,"organization", organization);
|
||||||
field_to_json(Obj,"created", created);
|
field_to_json(Obj,"created", created);
|
||||||
field_to_json(Obj,"modified", modified);
|
field_to_json(Obj,"modified", modified);
|
||||||
field_to_json(Obj,"suspended", suspended);
|
field_to_json(Obj,"suspended", suspended);
|
||||||
field_to_json(Obj,"deleted", deleted);
|
field_to_json(Obj,"deleted", deleted);
|
||||||
field_to_json(Obj,"notes", notes);
|
field_to_json(Obj,"notes", notes);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EntityEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool EntityEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj,"id", id);
|
field_from_json(Obj,"id", id);
|
||||||
field_from_json(Obj,"creator", creator);
|
field_from_json(Obj,"creator", creator);
|
||||||
field_from_json(Obj,"name", name);
|
field_from_json(Obj,"name", name);
|
||||||
field_from_json(Obj,"description", description);
|
field_from_json(Obj,"description", description);
|
||||||
field_from_json(Obj,"defaultRedirector", defaultRedirector);
|
field_from_json(Obj,"defaultRedirector", defaultRedirector);
|
||||||
field_from_json(Obj,"apiKey", apiKey);
|
field_from_json(Obj,"apiKey", apiKey);
|
||||||
field_from_json(Obj,"serverEnrollmentProfile", serverEnrollmentProfile);
|
field_from_json(Obj,"serverEnrollmentProfile", serverEnrollmentProfile);
|
||||||
field_from_json(Obj,"clientEnrollmentProfile", clientEnrollmentProfile);
|
field_from_json(Obj,"clientEnrollmentProfile", clientEnrollmentProfile);
|
||||||
field_from_json(Obj,"organization", organization);
|
field_from_json(Obj,"organization", organization);
|
||||||
field_from_json(Obj,"created", created);
|
field_from_json(Obj,"created", created);
|
||||||
field_from_json(Obj,"modified", modified);
|
field_from_json(Obj,"modified", modified);
|
||||||
field_from_json(Obj,"suspended", suspended);
|
field_from_json(Obj,"suspended", suspended);
|
||||||
field_from_json(Obj,"deleted", deleted);
|
field_from_json(Obj,"deleted", deleted);
|
||||||
field_from_json(Obj,"notes", notes);
|
field_from_json(Obj,"notes", notes);
|
||||||
return true;
|
return true;
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void BatchEntry::to_json(Poco::JSON::Object &Obj) const {
|
void BatchEntry::to_json(Poco::JSON::Object &Obj) const {
|
||||||
field_to_json(Obj,"id", id);
|
field_to_json(Obj,"id", id);
|
||||||
field_to_json(Obj,"entity", entity);
|
field_to_json(Obj,"entity", entity);
|
||||||
field_to_json(Obj,"creator", creator);
|
field_to_json(Obj,"creator", creator);
|
||||||
field_to_json(Obj,"name", name);
|
field_to_json(Obj,"name", name);
|
||||||
field_to_json(Obj,"description", description);
|
field_to_json(Obj,"description", description);
|
||||||
field_to_json(Obj,"manufacturer", manufacturer);
|
field_to_json(Obj,"manufacturer", manufacturer);
|
||||||
field_to_json(Obj,"model", model);
|
field_to_json(Obj,"model", model);
|
||||||
field_to_json(Obj,"redirector", redirector);
|
field_to_json(Obj,"redirector", redirector);
|
||||||
field_to_json(Obj,"commonNames", commonNames);
|
field_to_json(Obj,"commonNames", commonNames);
|
||||||
field_to_json(Obj,"jobHistory", jobHistory);
|
field_to_json(Obj,"jobHistory", jobHistory);
|
||||||
field_to_json(Obj,"notes", notes);
|
field_to_json(Obj,"notes", notes);
|
||||||
field_to_json(Obj,"submitted", submitted);
|
field_to_json(Obj,"submitted", submitted);
|
||||||
field_to_json(Obj,"started", started);
|
field_to_json(Obj,"started", started);
|
||||||
field_to_json(Obj,"completed", completed);
|
field_to_json(Obj,"completed", completed);
|
||||||
field_to_json(Obj,"modified", modified);
|
field_to_json(Obj,"modified", modified);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BatchEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool BatchEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj,"id", id);
|
field_from_json(Obj,"id", id);
|
||||||
field_from_json(Obj,"entity", entity);
|
field_from_json(Obj,"entity", entity);
|
||||||
field_from_json(Obj,"creator", creator);
|
field_from_json(Obj,"creator", creator);
|
||||||
field_from_json(Obj,"name", name);
|
field_from_json(Obj,"name", name);
|
||||||
field_from_json(Obj,"description", description);
|
field_from_json(Obj,"description", description);
|
||||||
field_from_json(Obj,"manufacturer", manufacturer);
|
field_from_json(Obj,"manufacturer", manufacturer);
|
||||||
field_from_json(Obj,"model", model);
|
field_from_json(Obj,"model", model);
|
||||||
field_from_json(Obj,"redirector", redirector);
|
field_from_json(Obj,"redirector", redirector);
|
||||||
field_from_json(Obj,"commonNames", commonNames);
|
field_from_json(Obj,"commonNames", commonNames);
|
||||||
field_from_json(Obj,"jobHistory", jobHistory);
|
field_from_json(Obj,"jobHistory", jobHistory);
|
||||||
field_from_json(Obj,"notes", notes);
|
field_from_json(Obj,"notes", notes);
|
||||||
field_from_json(Obj,"submitted", submitted);
|
field_from_json(Obj,"submitted", submitted);
|
||||||
field_from_json(Obj,"started", started);
|
field_from_json(Obj,"started", started);
|
||||||
field_from_json(Obj,"completed", completed);
|
field_from_json(Obj,"completed", completed);
|
||||||
field_from_json(Obj,"modified", modified);
|
field_from_json(Obj,"modified", modified);
|
||||||
return true;
|
return true;
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void JobEntry::to_json(Poco::JSON::Object &Obj) const {
|
void JobEntry::to_json(Poco::JSON::Object &Obj) const {
|
||||||
field_to_json(Obj,"id", id);
|
field_to_json(Obj,"id", id);
|
||||||
field_to_json(Obj,"entity", entity);
|
field_to_json(Obj,"entity", entity);
|
||||||
field_to_json(Obj,"creator", creator);
|
field_to_json(Obj,"creator", creator);
|
||||||
field_to_json(Obj,"batch", batch);
|
field_to_json(Obj,"batch", batch);
|
||||||
field_to_json(Obj,"commonNames", commonNames);
|
field_to_json(Obj,"commonNames", commonNames);
|
||||||
field_to_json(Obj,"completedNames", completedNames);
|
field_to_json(Obj,"completedNames", completedNames);
|
||||||
field_to_json(Obj,"errorNames", errorNames);
|
field_to_json(Obj,"errorNames", errorNames);
|
||||||
field_to_json(Obj,"status", status);
|
field_to_json(Obj,"status", status);
|
||||||
field_to_json(Obj,"command", command);
|
field_to_json(Obj,"command", command);
|
||||||
field_to_json(Obj,"parameters", parameters);
|
field_to_json(Obj,"parameters", parameters);
|
||||||
field_to_json(Obj,"submitted", submitted);
|
field_to_json(Obj,"submitted", submitted);
|
||||||
field_to_json(Obj,"started", started);
|
field_to_json(Obj,"started", started);
|
||||||
field_to_json(Obj,"completed", completed);
|
field_to_json(Obj,"completed", completed);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool JobEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
bool JobEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
||||||
try {
|
try {
|
||||||
field_from_json(Obj,"id", id);
|
field_from_json(Obj,"id", id);
|
||||||
field_from_json(Obj,"entity", entity);
|
field_from_json(Obj,"entity", entity);
|
||||||
field_from_json(Obj,"creator", creator);
|
field_from_json(Obj,"creator", creator);
|
||||||
field_from_json(Obj,"batch", batch);
|
field_from_json(Obj,"batch", batch);
|
||||||
field_from_json(Obj,"commonNames", commonNames);
|
field_from_json(Obj,"commonNames", commonNames);
|
||||||
field_from_json(Obj,"completedNames", completedNames);
|
field_from_json(Obj,"completedNames", completedNames);
|
||||||
field_from_json(Obj,"errorNames", errorNames);
|
field_from_json(Obj,"errorNames", errorNames);
|
||||||
field_from_json(Obj,"status", status);
|
field_from_json(Obj,"status", status);
|
||||||
field_from_json(Obj,"command", command);
|
field_from_json(Obj,"command", command);
|
||||||
field_from_json(Obj,"parameters", parameters);
|
field_from_json(Obj,"parameters", parameters);
|
||||||
field_from_json(Obj,"submitted", submitted);
|
field_from_json(Obj,"submitted", submitted);
|
||||||
field_from_json(Obj,"started", started);
|
field_from_json(Obj,"started", started);
|
||||||
field_from_json(Obj,"completed", completed);
|
field_from_json(Obj,"completed", completed);
|
||||||
return true;
|
return true;
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5,97 +5,118 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include "framework/MicroService.h"
|
|
||||||
#include "framework/OpenWifiTypes.h"
|
#include "framework/OpenWifiTypes.h"
|
||||||
#include "RESTObjects/RESTAPI_SecurityObjects.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 {
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
OpenWifi::Types::UUID_t id;
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
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;
|
struct EntityEntry {
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
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 {
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
OpenWifi::Types::UUID_t id;
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
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;
|
struct BatchEntry {
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
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<std::string> commonNames;
|
||||||
|
std::vector<std::string> jobHistory;
|
||||||
|
SecurityObjects::NoteInfoVec notes;
|
||||||
|
uint64_t submitted = 0 ;
|
||||||
|
uint64_t started = 0 ;
|
||||||
|
uint64_t completed = 0 ;
|
||||||
|
uint64_t modified = 0 ;
|
||||||
|
|
||||||
struct BatchEntry {
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
OpenWifi::Types::UUID_t id;
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
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<std::string> commonNames;
|
|
||||||
std::vector<std::string> 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;
|
struct JobEntry {
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
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 {
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
OpenWifi::Types::UUID_t id;
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
OpenWifi::Types::UUID_t entity;
|
};
|
||||||
OpenWifi::Types::UUID_t creator;
|
|
||||||
OpenWifi::Types::UUID_t batch;
|
struct DashBoardYearlyStats {
|
||||||
std::string command;
|
uint64_t year=0;
|
||||||
OpenWifi::Types::StringVec commonNames;
|
OpenWifi::Types::Counted3DMapSII activeCerts;
|
||||||
OpenWifi::Types::StringVec completedNames;
|
OpenWifi::Types::Counted3DMapSII revokedCerts;
|
||||||
OpenWifi::Types::StringVec errorNames;
|
|
||||||
Types::StringPairVec parameters;
|
void to_json(Poco::JSON::Object &Obj) const;
|
||||||
std::string status;
|
};
|
||||||
uint64_t submitted=0;
|
|
||||||
uint64_t started=0;
|
struct Dashboard {
|
||||||
uint64_t completed=0;
|
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<DashBoardYearlyStats> 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);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -9,6 +9,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <type_traits>
|
||||||
#include "framework/OpenWifiTypes.h"
|
#include "framework/OpenWifiTypes.h"
|
||||||
#include "Poco/JSON/Object.h"
|
#include "Poco/JSON/Object.h"
|
||||||
#include "Poco/Data/LOB.h"
|
#include "Poco/Data/LOB.h"
|
||||||
@@ -27,8 +28,13 @@ namespace OpenWifi {
|
|||||||
bool Delete_ = true;
|
bool Delete_ = true;
|
||||||
bool PortalLogin_ = true;
|
bool PortalLogin_ = true;
|
||||||
|
|
||||||
|
AclTemplate() noexcept = default;
|
||||||
|
|
||||||
void to_json(Poco::JSON::Object &Obj) const;
|
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<AclTemplate> );
|
||||||
|
|
||||||
struct WebToken {
|
struct WebToken {
|
||||||
std::string access_token_;
|
std::string access_token_;
|
||||||
|
|||||||
@@ -41,7 +41,6 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::string GenerateQRCode(const std::string &Secret, const std::string &email) {
|
std::string GenerateQRCode(const std::string &Secret, const std::string &email) {
|
||||||
|
|
||||||
std::string uri{
|
std::string uri{
|
||||||
"otpauth://totp/" + Issuer_ + ":" +
|
"otpauth://totp/" + Issuer_ + ":" +
|
||||||
email + "?secret=" + Secret + "&issuer=" + Issuer_
|
email + "?secret=" + Secret + "&issuer=" + Issuer_
|
||||||
@@ -55,10 +54,10 @@ namespace OpenWifi {
|
|||||||
static bool ValidateCode( const std::string &Secret, const std::string &Code, std::string & Expecting) {
|
static bool ValidateCode( const std::string &Secret, const std::string &Code, std::string & Expecting) {
|
||||||
uint64_t Now = OpenWifi::Now();
|
uint64_t Now = OpenWifi::Now();
|
||||||
uint32_t p = CppTotp::totp(CppTotp::Bytes::ByteString{ (const u_char *)Secret.c_str()}, Now, 0, 30, 6);
|
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);
|
sprintf(buffer,"%06u",p);
|
||||||
Expecting = buffer;
|
Expecting = std::string(buffer);
|
||||||
return Code == buffer;
|
return Code == Expecting;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Start() override {
|
int Start() override {
|
||||||
@@ -92,26 +91,13 @@ namespace OpenWifi {
|
|||||||
auto Secret = GenerateSecret(20, Base32Secret);
|
auto Secret = GenerateSecret(20, Base32Secret);
|
||||||
QRCode = GenerateQRCode(Base32Secret, User.email);
|
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,
|
Entry E{ .Subscriber = Subscriber,
|
||||||
.Start = OpenWifi::Now(),
|
.Start = OpenWifi::Now(),
|
||||||
.Done = 0,
|
.Done = 0,
|
||||||
.Verifications = 0,
|
.Verifications = 0,
|
||||||
.Secret = Secret,
|
.Secret = Secret,
|
||||||
.QRCode = QRCode,
|
.QRCode = QRCode,
|
||||||
.LastCode = 0
|
.LastCode = ""
|
||||||
};
|
};
|
||||||
Cache_[User.id] = E;
|
Cache_[User.id] = E;
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -13,9 +13,10 @@
|
|||||||
|
|
||||||
namespace OpenWifi {
|
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",
|
"$id": "https://openwrt.org/ucentral.schema.json",
|
||||||
@@ -518,7 +519,7 @@ namespace OpenWifi {
|
|||||||
"maximum": 4050
|
"maximum": 4050
|
||||||
},
|
},
|
||||||
"proto": {
|
"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",
|
"type": "string",
|
||||||
"enum": [
|
"enum": [
|
||||||
"802.1ad",
|
"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": {
|
"interface.ipv4": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
@@ -722,6 +764,12 @@ namespace OpenWifi {
|
|||||||
"items": {
|
"items": {
|
||||||
"$ref": "#/$defs/interface.ipv4.dhcp-lease"
|
"$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": {
|
"interface.ipv6": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
@@ -782,6 +920,18 @@ namespace OpenWifi {
|
|||||||
},
|
},
|
||||||
"dhcpv6": {
|
"dhcpv6": {
|
||||||
"$ref": "#/$defs/interface.ipv6.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": {
|
"gateway-fqdn": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "fqdn",
|
"format": "uc-fqdn",
|
||||||
"default": "ucentral.splash"
|
"default": "ucentral.splash"
|
||||||
},
|
},
|
||||||
"max-clients": {
|
"max-clients": {
|
||||||
@@ -901,6 +1051,7 @@ namespace OpenWifi {
|
|||||||
"psk",
|
"psk",
|
||||||
"psk2",
|
"psk2",
|
||||||
"psk-mixed",
|
"psk-mixed",
|
||||||
|
"psk2-radius",
|
||||||
"wpa",
|
"wpa",
|
||||||
"wpa2",
|
"wpa2",
|
||||||
"wpa-mixed",
|
"wpa-mixed",
|
||||||
@@ -961,6 +1112,10 @@ namespace OpenWifi {
|
|||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"default": false
|
"default": false
|
||||||
},
|
},
|
||||||
|
"reduced-neighbor-reporting": {
|
||||||
|
"type": "boolean",
|
||||||
|
"default": false
|
||||||
|
},
|
||||||
"lci": {
|
"lci": {
|
||||||
"type": "string"
|
"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.",
|
"decription": "This option allows embedding custom vendor specific IEs inside the beacons of a BSS in AP mode.",
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
|
"fils-discovery-interval": {
|
||||||
|
"type": "integer",
|
||||||
|
"default": 20,
|
||||||
|
"maximum": 10000
|
||||||
|
},
|
||||||
"encryption": {
|
"encryption": {
|
||||||
"$ref": "#/$defs/interface.ssid.encryption"
|
"$ref": "#/$defs/interface.ssid.encryption"
|
||||||
},
|
},
|
||||||
@@ -2087,6 +2247,10 @@ namespace OpenWifi {
|
|||||||
"auto-channel": {
|
"auto-channel": {
|
||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"default": false
|
"default": false
|
||||||
|
},
|
||||||
|
"ipv6": {
|
||||||
|
"type": "boolean",
|
||||||
|
"default": false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2193,7 +2357,7 @@ namespace OpenWifi {
|
|||||||
"properties": {
|
"properties": {
|
||||||
"fqdn": {
|
"fqdn": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "fqdn"
|
"format": "uc-fqdn"
|
||||||
},
|
},
|
||||||
"suffix-matching": {
|
"suffix-matching": {
|
||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
@@ -2444,8 +2608,7 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
)"_json;
|
||||||
)"_json;
|
|
||||||
|
|
||||||
class custom_error_handler : public nlohmann::json_schema::basic_error_handler
|
class custom_error_handler : public nlohmann::json_schema::basic_error_handler
|
||||||
{
|
{
|
||||||
@@ -2460,9 +2623,18 @@ namespace OpenWifi {
|
|||||||
void ConfigurationValidator::Init() {
|
void ConfigurationValidator::Init() {
|
||||||
if(Initialized_)
|
if(Initialized_)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
std::string GitSchema;
|
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 {
|
try {
|
||||||
if(Utils::wgets(GitUCentralJSONSchemaFile, GitSchema)) {
|
auto GitURI = MicroService::instance().ConfigGetString("ucentral.datamodel.uri",GitUCentralJSONSchemaFile);
|
||||||
|
if(Utils::wgets(GitURI, GitSchema)) {
|
||||||
RootSchema_ = json::parse(GitSchema);
|
RootSchema_ = json::parse(GitSchema);
|
||||||
Logger().information("Using uCentral validation schema from GIT.");
|
Logger().information("Using uCentral validation schema from GIT.");
|
||||||
} else {
|
} else {
|
||||||
@@ -2528,6 +2700,17 @@ namespace OpenWifi {
|
|||||||
return IsCIDRv4(value) || IsCIDRv6(value);
|
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)
|
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}$"};
|
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 (...) {
|
} catch (...) {
|
||||||
}
|
}
|
||||||
throw std::invalid_argument(value + " is not a valid URI: should be something like https://hello.world.com.");
|
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") {
|
} else if(format == "ip") {
|
||||||
if (IsIP(value))
|
if (IsIP(value))
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -4400,7 +4400,7 @@ namespace OpenWifi {
|
|||||||
Path,
|
Path,
|
||||||
Poco::Net::HTTPMessage::HTTP_1_1);
|
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()) {
|
if(BearerToken.empty()) {
|
||||||
Request.add("X-API-KEY", Svc.AccessKey);
|
Request.add("X-API-KEY", Svc.AccessKey);
|
||||||
@@ -4458,7 +4458,7 @@ namespace OpenWifi {
|
|||||||
for (const auto &qp : QueryData_)
|
for (const auto &qp : QueryData_)
|
||||||
URI.addQueryParameter(qp.first, qp.second);
|
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());
|
std::string Path(URI.getPathAndQuery());
|
||||||
|
|
||||||
@@ -4537,7 +4537,7 @@ namespace OpenWifi {
|
|||||||
for (const auto &qp : QueryData_)
|
for (const auto &qp : QueryData_)
|
||||||
URI.addQueryParameter(qp.first, qp.second);
|
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());
|
std::string Path(URI.getPathAndQuery());
|
||||||
|
|
||||||
@@ -4613,7 +4613,7 @@ namespace OpenWifi {
|
|||||||
for (const auto &qp : QueryData_)
|
for (const auto &qp : QueryData_)
|
||||||
URI.addQueryParameter(qp.first, qp.second);
|
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());
|
std::string Path(URI.getPathAndQuery());
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <cstring>
|
||||||
#include "Poco/String.h"
|
#include "Poco/String.h"
|
||||||
|
|
||||||
#if defined(__GNUC__)
|
#if defined(__GNUC__)
|
||||||
@@ -428,6 +429,7 @@ namespace OpenWifi::uCentralProtocol {
|
|||||||
static const char *RADIUSACCT = "acct";
|
static const char *RADIUSACCT = "acct";
|
||||||
static const char *RADIUSAUTH = "auth";
|
static const char *RADIUSAUTH = "auth";
|
||||||
static const char *RADIUSDST = "dst";
|
static const char *RADIUSDST = "dst";
|
||||||
|
static const char *IES = "ies";
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace OpenWifi::uCentralProtocol::Events {
|
namespace OpenWifi::uCentralProtocol::Events {
|
||||||
@@ -457,25 +459,28 @@ namespace OpenWifi::uCentralProtocol::Events {
|
|||||||
ET_TELEMETRY
|
ET_TELEMETRY
|
||||||
};
|
};
|
||||||
|
|
||||||
inline static EVENT_MSG EventFromString(const std::string & Method) {
|
inline EVENT_MSG EventFromString(const std::string & Method) {
|
||||||
static std::vector<std::pair<const char *,EVENT_MSG>> Values{
|
if(strcmp(STATE,Method.c_str())==0)
|
||||||
{ CFGPENDING , ET_CFGPENDING },
|
return ET_STATE;
|
||||||
{ CONNECT, ET_CONNECT },
|
else if(strcmp(HEALTHCHECK,Method.c_str())==0)
|
||||||
{ CRASHLOG, ET_CRASHLOG },
|
return ET_HEALTHCHECK;
|
||||||
{ DEVICEUPDATE, ET_DEVICEUPDATE },
|
else if(strcmp(CONNECT,Method.c_str())==0)
|
||||||
{ HEALTHCHECK, ET_HEALTHCHECK },
|
return ET_CONNECT;
|
||||||
{ LOG, ET_LOG },
|
else if(strcmp(CFGPENDING,Method.c_str())==0)
|
||||||
{ PING, ET_PING },
|
return ET_CFGPENDING;
|
||||||
{ RECOVERY, ET_RECOVERY },
|
else if(strcmp(CRASHLOG,Method.c_str())==0)
|
||||||
{ STATE, ET_STATE },
|
return ET_CRASHLOG;
|
||||||
{ TELEMETRY, ET_TELEMETRY }
|
else if(strcmp(DEVICEUPDATE,Method.c_str())==0)
|
||||||
};
|
return ET_DEVICEUPDATE;
|
||||||
|
else if(strcmp(LOG,Method.c_str())==0)
|
||||||
std::string L = Poco::toLower(Method);
|
return ET_LOG;
|
||||||
auto hint = std::find_if(cbegin(Values),cend(Values),[&](const std::pair<const char *,EVENT_MSG> &v) ->bool { return strcmp(v.first,L.c_str())==0; });
|
else if(strcmp(PING,Method.c_str())==0)
|
||||||
if(hint == cend(Values))
|
return ET_PING;
|
||||||
return ET_UNKNOWN;
|
else if(strcmp(RECOVERY,Method.c_str())==0)
|
||||||
return hint->second;
|
return ET_RECOVERY;
|
||||||
|
else if(strcmp(TELEMETRY,Method.c_str())==0)
|
||||||
|
return ET_TELEMETRY;
|
||||||
|
return ET_UNKNOWN;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
null
|
|
||||||
Reference in New Issue
Block a user