mirror of
https://github.com/Telecominfraproject/wlan-cloud-ucentralgw.git
synced 2025-11-03 12:17:56 +00:00
Compare commits
3 Commits
add_enroll
...
fix_deadlo
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
115f8c1df9 | ||
|
|
8e5eebec67 | ||
|
|
b3d55d38d5 |
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
@@ -21,7 +21,7 @@ defaults:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
docker:
|
docker:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-20.04
|
||||||
env:
|
env:
|
||||||
DOCKER_REGISTRY_URL: tip-tip-wlan-cloud-ucentral.jfrog.io
|
DOCKER_REGISTRY_URL: tip-tip-wlan-cloud-ucentral.jfrog.io
|
||||||
DOCKER_REGISTRY_USERNAME: ucentral
|
DOCKER_REGISTRY_USERNAME: ucentral
|
||||||
|
|||||||
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
@@ -11,7 +11,7 @@ defaults:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
helm-package:
|
helm-package:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-20.04
|
||||||
env:
|
env:
|
||||||
HELM_REPO_URL: https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/
|
HELM_REPO_URL: https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/
|
||||||
HELM_REPO_USERNAME: ucentral
|
HELM_REPO_USERNAME: ucentral
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
cmake_minimum_required(VERSION 3.13)
|
cmake_minimum_required(VERSION 3.13)
|
||||||
project(owgw VERSION 4.1.0)
|
project(owgw VERSION 3.2.1)
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 20)
|
set(CMAKE_CXX_STANDARD 20)
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED True)
|
set(CMAKE_CXX_STANDARD_REQUIRED True)
|
||||||
|
|||||||
26
PROTOCOL.md
26
PROTOCOL.md
@@ -880,32 +880,6 @@ The device should answer:
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Controller wants the device to perform re-enrollment
|
|
||||||
Controller sends this command to trigger re-enrollment, i.e. update of operational certificate. Extreme care must be taken.
|
|
||||||
```json
|
|
||||||
{ "jsonrpc" : "2.0" ,
|
|
||||||
"method" : "reenroll" ,
|
|
||||||
"params" : {
|
|
||||||
"serial" : <serial number>,
|
|
||||||
"when" : Optional - <UTC time when to apply this config, 0 mean immediate, this is a suggestion>
|
|
||||||
},
|
|
||||||
"id" : <some number>
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
The device should answer:
|
|
||||||
```json
|
|
||||||
{ "jsonrpc" : "2.0" ,
|
|
||||||
"result" : {
|
|
||||||
"serial" : <serial number> ,
|
|
||||||
"status" : {
|
|
||||||
"error" : <0 or the value of $? from the shell running the command, 255 signifies a timeout>,
|
|
||||||
"txt" : <text describing the error or success>
|
|
||||||
},
|
|
||||||
"id" : <same number as request>
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Controller wants the device to switch to another controller
|
#### Controller wants the device to switch to another controller
|
||||||
Controller sends this when the device should change the controller it connects to without looking up a new redirector.
|
Controller sends this when the device should change the controller it connects to without looking up a new redirector.
|
||||||
|
|
||||||
|
|||||||
@@ -1576,15 +1576,6 @@ components:
|
|||||||
format: base64
|
format: base64
|
||||||
description: This is a base64 encoded string of the certificate bundle (the current bundle .tar.gz file from the PKI portal)
|
description: This is a base64 encoded string of the certificate bundle (the current bundle .tar.gz file from the PKI portal)
|
||||||
|
|
||||||
ReenrollRequest:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
serialNumber:
|
|
||||||
type: string
|
|
||||||
when:
|
|
||||||
type: integer
|
|
||||||
format: int64
|
|
||||||
|
|
||||||
PowerCycleRequest:
|
PowerCycleRequest:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
@@ -3065,32 +3056,6 @@ paths:
|
|||||||
404:
|
404:
|
||||||
$ref: '#/components/responses/NotFound'
|
$ref: '#/components/responses/NotFound'
|
||||||
|
|
||||||
/device/{serialNumber}/reenroll:
|
|
||||||
post:
|
|
||||||
tags:
|
|
||||||
- Commands
|
|
||||||
summary: Reenroll operational certificate for the device.
|
|
||||||
operationId: reenrollCertificate
|
|
||||||
parameters:
|
|
||||||
- in: path
|
|
||||||
name: serialNumber
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
required: true
|
|
||||||
requestBody:
|
|
||||||
description: Reenroll operational certificate for the device
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/ReenrollRequest'
|
|
||||||
responses:
|
|
||||||
200:
|
|
||||||
$ref: '#/components/responses/Success'
|
|
||||||
403:
|
|
||||||
$ref: '#/components/responses/Unauthorized'
|
|
||||||
404:
|
|
||||||
$ref: '#/components/responses/NotFound'
|
|
||||||
|
|
||||||
/device/{serialNumber}/powercycle:
|
/device/{serialNumber}/powercycle:
|
||||||
post:
|
post:
|
||||||
tags:
|
tags:
|
||||||
|
|||||||
@@ -213,7 +213,6 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
State_.certificateExpiryDate = PeerCert.expiresOn().timestamp().epochTime();
|
State_.certificateExpiryDate = PeerCert.expiresOn().timestamp().epochTime();
|
||||||
State_.certificateIssuerName = PeerCert.issuerName();
|
|
||||||
|
|
||||||
poco_trace(Logger_,
|
poco_trace(Logger_,
|
||||||
fmt::format("TLS-CONNECTION({}): Session={} CN={} Completed. (t={})", CId_,
|
fmt::format("TLS-CONNECTION({}): Session={} CN={} Completed. (t={})", CId_,
|
||||||
@@ -562,14 +561,14 @@ namespace OpenWifi {
|
|||||||
void AP_WS_Connection::OnSocketShutdown(
|
void AP_WS_Connection::OnSocketShutdown(
|
||||||
[[maybe_unused]] const Poco::AutoPtr<Poco::Net::ShutdownNotification> &pNf) {
|
[[maybe_unused]] const Poco::AutoPtr<Poco::Net::ShutdownNotification> &pNf) {
|
||||||
poco_trace(Logger_, fmt::format("SOCKET-SHUTDOWN({}): Closing.", CId_));
|
poco_trace(Logger_, fmt::format("SOCKET-SHUTDOWN({}): Closing.", CId_));
|
||||||
// std::lock_guard G(ConnectionMutex_);
|
std::lock_guard G(ConnectionMutex_);
|
||||||
return EndConnection();
|
return EndConnection();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AP_WS_Connection::OnSocketError(
|
void AP_WS_Connection::OnSocketError(
|
||||||
[[maybe_unused]] const Poco::AutoPtr<Poco::Net::ErrorNotification> &pNf) {
|
[[maybe_unused]] const Poco::AutoPtr<Poco::Net::ErrorNotification> &pNf) {
|
||||||
poco_trace(Logger_, fmt::format("SOCKET-ERROR({}): Closing.", CId_));
|
poco_trace(Logger_, fmt::format("SOCKET-ERROR({}): Closing.", CId_));
|
||||||
// std::lock_guard G(ConnectionMutex_);
|
std::lock_guard G(ConnectionMutex_);
|
||||||
return EndConnection();
|
return EndConnection();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -653,8 +652,9 @@ namespace OpenWifi {
|
|||||||
|
|
||||||
case Poco::Net::WebSocket::FRAME_OP_TEXT: {
|
case Poco::Net::WebSocket::FRAME_OP_TEXT: {
|
||||||
poco_trace(Logger_,
|
poco_trace(Logger_,
|
||||||
fmt::format("FRAME({}): Frame received (length={}, flags={}). Msg={}",
|
fmt::format("FRAME({}): Frame received (length={}, flags={}). Msg={}",
|
||||||
CId_, IncomingSize, flags, IncomingFrame.begin()));
|
CId_, IncomingSize, flags, IncomingFrame.begin()));
|
||||||
|
|
||||||
|
|
||||||
Poco::JSON::Parser parser;
|
Poco::JSON::Parser parser;
|
||||||
auto ParsedMessage = parser.parse(IncomingFrame.begin());
|
auto ParsedMessage = parser.parse(IncomingFrame.begin());
|
||||||
|
|||||||
@@ -57,8 +57,9 @@ namespace OpenWifi {
|
|||||||
if (request.find("Upgrade") != request.end() &&
|
if (request.find("Upgrade") != request.end() &&
|
||||||
Poco::icompare(request["Upgrade"], "websocket") == 0) {
|
Poco::icompare(request["Upgrade"], "websocket") == 0) {
|
||||||
Utils::SetThreadName("ws:conn-init");
|
Utils::SetThreadName("ws:conn-init");
|
||||||
session_id_++;
|
//session_id_++;
|
||||||
return new AP_WS_RequestHandler(Logger_, session_id_);
|
auto new_session_id = session_id_.fetch_add(1, std::memory_order_seq_cst) + 1;
|
||||||
|
return new AP_WS_RequestHandler(Logger_, new_session_id);
|
||||||
} else {
|
} else {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@@ -71,18 +72,14 @@ namespace OpenWifi {
|
|||||||
bool AP_WS_Server::ValidateCertificate(const std::string &ConnectionId,
|
bool AP_WS_Server::ValidateCertificate(const std::string &ConnectionId,
|
||||||
const Poco::Crypto::X509Certificate &Certificate) {
|
const Poco::Crypto::X509Certificate &Certificate) {
|
||||||
if (IsCertOk()) {
|
if (IsCertOk()) {
|
||||||
// validate certificate agains trusted chain
|
if (!Certificate.issuedBy(*IssuerCert_)) {
|
||||||
for (const auto &cert : ClientCasCerts_) {
|
poco_warning(
|
||||||
if (Certificate.issuedBy(cert)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
poco_warning(
|
|
||||||
Logger(),
|
Logger(),
|
||||||
fmt::format(
|
fmt::format("CERTIFICATE({}): issuer mismatch. Local='{}' Incoming='{}'",
|
||||||
"CERTIFICATE({}): issuer mismatch. Certificate not issued by any trusted CA",
|
ConnectionId, IssuerCert_->issuerName(), Certificate.issuerName()));
|
||||||
ConnectionId)
|
return false;
|
||||||
);
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -137,13 +134,6 @@ namespace OpenWifi {
|
|||||||
Context->addChainCertificate(Issuing);
|
Context->addChainCertificate(Issuing);
|
||||||
Context->addCertificateAuthority(Issuing);
|
Context->addCertificateAuthority(Issuing);
|
||||||
|
|
||||||
// add certificates from clientcas to trust chain
|
|
||||||
ClientCasCerts_ = Poco::Net::X509Certificate::readPEM(Svr.ClientCas());
|
|
||||||
for (const auto &cert : ClientCasCerts_) {
|
|
||||||
Context->addChainCertificate(cert);
|
|
||||||
Context->addCertificateAuthority(cert);
|
|
||||||
}
|
|
||||||
|
|
||||||
Poco::Crypto::RSAKey Key("", Svr.KeyFile(), Svr.KeyFilePassword());
|
Poco::Crypto::RSAKey Key("", Svr.KeyFile(), Svr.KeyFilePassword());
|
||||||
Context->usePrivateKey(Key);
|
Context->usePrivateKey(Key);
|
||||||
|
|
||||||
@@ -525,10 +515,27 @@ namespace OpenWifi {
|
|||||||
Connection = SessionHint->second;
|
Connection = SessionHint->second;
|
||||||
Sessions_[sessionHash].erase(SessionHint);
|
Sessions_[sessionHash].erase(SessionHint);
|
||||||
}
|
}
|
||||||
|
std::atomic_bool duplicate_session = false;
|
||||||
auto deviceHash = MACHash::Hash(SerialNumber);
|
{
|
||||||
std::lock_guard DeviceLock(SerialNumbersMutex_[deviceHash]);
|
auto deviceHash = MACHash::Hash(SerialNumber);
|
||||||
SerialNumbers_[deviceHash][SerialNumber] = Connection;
|
std::lock_guard DeviceLock(SerialNumbersMutex_[deviceHash]);
|
||||||
|
auto DeviceHint = SerialNumbers_[deviceHash].find(SerialNumber);
|
||||||
|
if (DeviceHint == SerialNumbers_[deviceHash].end()) {
|
||||||
|
// No duplicate connection go ahead and add new connection
|
||||||
|
SerialNumbers_[deviceHash][SerialNumber] = Connection;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Mark a duplicate session
|
||||||
|
duplicate_session = true;
|
||||||
|
poco_information(Logger(), fmt::format("[session ID: {}] Found a duplicate connection for device serial: {}", session_id, Utils::IntToSerialNumber(SerialNumber)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (duplicate_session.load()){
|
||||||
|
// This is only called if we have a duplicate session
|
||||||
|
// We remove the new incoming session that we just added a few lines above, forcing the destructor for this new session while not impacting the pointers to the old session.
|
||||||
|
std::lock_guard SessionLock(SessionMutex_[sessionHash]);
|
||||||
|
Sessions_[sessionHash].erase(session_id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AP_WS_Server::EndSession(uint64_t session_id, uint64_t SerialNumber) {
|
bool AP_WS_Server::EndSession(uint64_t session_id, uint64_t SerialNumber) {
|
||||||
|
|||||||
@@ -223,7 +223,6 @@ namespace OpenWifi {
|
|||||||
mutable std::array<std::mutex,MACHashMax> SerialNumbersMutex_;
|
mutable std::array<std::mutex,MACHashMax> SerialNumbersMutex_;
|
||||||
|
|
||||||
std::unique_ptr<Poco::Crypto::X509Certificate> IssuerCert_;
|
std::unique_ptr<Poco::Crypto::X509Certificate> IssuerCert_;
|
||||||
std::vector<Poco::Crypto::X509Certificate> ClientCasCerts_;
|
|
||||||
std::list<std::unique_ptr<Poco::Net::HTTPServer>> WebServers_;
|
std::list<std::unique_ptr<Poco::Net::HTTPServer>> WebServers_;
|
||||||
Poco::ThreadPool DeviceConnectionPool_{"ws:dev-pool", 4, 256};
|
Poco::ThreadPool DeviceConnectionPool_{"ws:dev-pool", 4, 256};
|
||||||
Poco::Net::SocketReactor Reactor_;
|
Poco::Net::SocketReactor Reactor_;
|
||||||
|
|||||||
@@ -170,7 +170,6 @@ namespace OpenWifi {
|
|||||||
{APCommands::Commands::powercycle, false, true, &RESTAPI_device_commandHandler::PowerCycle, 60000ms},
|
{APCommands::Commands::powercycle, false, true, &RESTAPI_device_commandHandler::PowerCycle, 60000ms},
|
||||||
{APCommands::Commands::fixedconfig, false, true, &RESTAPI_device_commandHandler::FixedConfig, 120000ms},
|
{APCommands::Commands::fixedconfig, false, true, &RESTAPI_device_commandHandler::FixedConfig, 120000ms},
|
||||||
{APCommands::Commands::cablediagnostics, false, true, &RESTAPI_device_commandHandler::CableDiagnostics, 120000ms},
|
{APCommands::Commands::cablediagnostics, false, true, &RESTAPI_device_commandHandler::CableDiagnostics, 120000ms},
|
||||||
{APCommands::Commands::reenroll, false, true, &RESTAPI_device_commandHandler::ReEnroll, 120000ms},
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1652,45 +1651,4 @@ namespace OpenWifi {
|
|||||||
*ParsedBody_, *Request, *Response, timeout, nullptr, this,
|
*ParsedBody_, *Request, *Response, timeout, nullptr, this,
|
||||||
Logger_);
|
Logger_);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RESTAPI_device_commandHandler::ReEnroll(
|
|
||||||
const std::string &CMD_UUID, uint64_t CMD_RPC,
|
|
||||||
[[maybe_unused]] std::chrono::milliseconds timeout,
|
|
||||||
[[maybe_unused]] const GWObjects::DeviceRestrictions &Restrictions) {
|
|
||||||
|
|
||||||
if(UserInfo_.userinfo.userRole != SecurityObjects::ROOT &&
|
|
||||||
UserInfo_.userinfo.userRole != SecurityObjects::ADMIN) {
|
|
||||||
CallCanceled("REENROLL", CMD_UUID, CMD_RPC, RESTAPI::Errors::ACCESS_DENIED);
|
|
||||||
return UnAuthorized(RESTAPI::Errors::ACCESS_DENIED);
|
|
||||||
}
|
|
||||||
|
|
||||||
poco_debug(Logger_, fmt::format("REENROLL({},{}): TID={} user={} serial={}", CMD_UUID,
|
|
||||||
CMD_RPC, TransactionId_, Requester(), SerialNumber_));
|
|
||||||
|
|
||||||
if(IsDeviceSimulated(SerialNumber_)) {
|
|
||||||
CallCanceled("REENROLL", CMD_UUID, CMD_RPC, RESTAPI::Errors::SimulatedDeviceNotSupported);
|
|
||||||
return BadRequest(RESTAPI::Errors::SimulatedDeviceNotSupported);
|
|
||||||
}
|
|
||||||
|
|
||||||
GWObjects::ReEnroll PR;
|
|
||||||
if(!PR.from_json(ParsedBody_)) {
|
|
||||||
return BadRequest(RESTAPI::Errors::MissingOrInvalidParameters);
|
|
||||||
}
|
|
||||||
|
|
||||||
GWObjects::CommandDetails Cmd;
|
|
||||||
Cmd.SerialNumber = SerialNumber_;
|
|
||||||
Cmd.SubmittedBy = Requester();
|
|
||||||
Cmd.UUID = CMD_UUID;
|
|
||||||
Cmd.Command = uCentralProtocol::REENROLL;
|
|
||||||
std::ostringstream os;
|
|
||||||
ParsedBody_->stringify(os);
|
|
||||||
Cmd.Details = os.str();
|
|
||||||
Cmd.RunAt = PR.when;
|
|
||||||
Cmd.ErrorCode = 0;
|
|
||||||
Cmd.WaitingForFile = 0;
|
|
||||||
|
|
||||||
return RESTAPI_RPC::WaitForCommand(CMD_RPC, APCommands::Commands::reenroll, false, Cmd,
|
|
||||||
*ParsedBody_, *Request, *Response, timeout, nullptr, this,
|
|
||||||
Logger_);
|
|
||||||
}
|
|
||||||
} // namespace OpenWifi
|
} // namespace OpenWifi
|
||||||
|
|||||||
@@ -74,8 +74,6 @@ namespace OpenWifi {
|
|||||||
const GWObjects::DeviceRestrictions &R);
|
const GWObjects::DeviceRestrictions &R);
|
||||||
void CableDiagnostics(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout,
|
void CableDiagnostics(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout,
|
||||||
const GWObjects::DeviceRestrictions &R);
|
const GWObjects::DeviceRestrictions &R);
|
||||||
void ReEnroll(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout,
|
|
||||||
const GWObjects::DeviceRestrictions &R);
|
|
||||||
|
|
||||||
static auto PathName() {
|
static auto PathName() {
|
||||||
return std::list<std::string>{"/api/v1/device/{serialNumber}/{command}"};
|
return std::list<std::string>{"/api/v1/device/{serialNumber}/{command}"};
|
||||||
|
|||||||
@@ -297,7 +297,6 @@ namespace OpenWifi::GWObjects {
|
|||||||
field_to_json(Obj, "connectionCompletionTime", connectionCompletionTime);
|
field_to_json(Obj, "connectionCompletionTime", connectionCompletionTime);
|
||||||
field_to_json(Obj, "totalConnectionTime", Utils::Now() - started);
|
field_to_json(Obj, "totalConnectionTime", Utils::Now() - started);
|
||||||
field_to_json(Obj, "certificateExpiryDate", certificateExpiryDate);
|
field_to_json(Obj, "certificateExpiryDate", certificateExpiryDate);
|
||||||
field_to_json(Obj, "certificateIssuerName", certificateIssuerName);
|
|
||||||
field_to_json(Obj, "connectReason", connectReason);
|
field_to_json(Obj, "connectReason", connectReason);
|
||||||
field_to_json(Obj, "uptime", uptime);
|
field_to_json(Obj, "uptime", uptime);
|
||||||
field_to_json(Obj, "compatible", Compatible);
|
field_to_json(Obj, "compatible", Compatible);
|
||||||
@@ -359,7 +358,6 @@ namespace OpenWifi::GWObjects {
|
|||||||
field_from_json(Obj, "connectionCompletionTime", connectionCompletionTime);
|
field_from_json(Obj, "connectionCompletionTime", connectionCompletionTime);
|
||||||
field_from_json(Obj, "totalConnectionTime", totalConnectionTime);
|
field_from_json(Obj, "totalConnectionTime", totalConnectionTime);
|
||||||
field_from_json(Obj, "certificateExpiryDate", certificateExpiryDate);
|
field_from_json(Obj, "certificateExpiryDate", certificateExpiryDate);
|
||||||
field_from_json(Obj, "certificateIssuerName", certificateIssuerName);
|
|
||||||
field_from_json(Obj, "connectReason", connectReason);
|
field_from_json(Obj, "connectReason", connectReason);
|
||||||
field_from_json(Obj, "uptime", uptime);
|
field_from_json(Obj, "uptime", uptime);
|
||||||
field_from_json(Obj, "hasRADIUSSessions", hasRADIUSSessions );
|
field_from_json(Obj, "hasRADIUSSessions", hasRADIUSSessions );
|
||||||
@@ -821,14 +819,4 @@ namespace OpenWifi::GWObjects {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ReEnroll::from_json(const Poco::JSON::Object::Ptr &Obj) {
|
|
||||||
try {
|
|
||||||
field_from_json(Obj, "serial", serialNumber);
|
|
||||||
field_from_json(Obj, "when", when);
|
|
||||||
return true;
|
|
||||||
} catch (const Poco::Exception &E) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} // namespace OpenWifi::GWObjects
|
} // namespace OpenWifi::GWObjects
|
||||||
|
|||||||
@@ -42,7 +42,6 @@ namespace OpenWifi::GWObjects {
|
|||||||
uint64_t sessionId = 0;
|
uint64_t sessionId = 0;
|
||||||
double connectionCompletionTime = 0.0;
|
double connectionCompletionTime = 0.0;
|
||||||
std::uint64_t certificateExpiryDate = 0;
|
std::uint64_t certificateExpiryDate = 0;
|
||||||
std::string certificateIssuerName;
|
|
||||||
std::uint64_t hasRADIUSSessions = 0;
|
std::uint64_t hasRADIUSSessions = 0;
|
||||||
bool hasGPS = false;
|
bool hasGPS = false;
|
||||||
std::uint64_t sanity=0;
|
std::uint64_t sanity=0;
|
||||||
@@ -546,12 +545,6 @@ namespace OpenWifi::GWObjects {
|
|||||||
std::uint64_t when;
|
std::uint64_t when;
|
||||||
std::vector<std::string> ports;
|
std::vector<std::string> ports;
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
|
||||||
};
|
|
||||||
struct ReEnroll {
|
|
||||||
std::string serialNumber;
|
|
||||||
std::uint64_t when;
|
|
||||||
|
|
||||||
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
bool from_json(const Poco::JSON::Object::Ptr &Obj);
|
||||||
};
|
};
|
||||||
} // namespace OpenWifi::GWObjects
|
} // namespace OpenWifi::GWObjects
|
||||||
|
|||||||
@@ -3952,10 +3952,8 @@ static std::string DefaultAPSchema = R"foo(
|
|||||||
"inactive-deauth",
|
"inactive-deauth",
|
||||||
"key-mismatch",
|
"key-mismatch",
|
||||||
"beacon-report",
|
"beacon-report",
|
||||||
"radar-detected",
|
"radar-detected"
|
||||||
"ft-finish",
|
]
|
||||||
"sta-authorized"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -7922,9 +7920,7 @@ static std::string DefaultSWITCHSchema = R"foo(
|
|||||||
"inactive-deauth",
|
"inactive-deauth",
|
||||||
"key-mismatch",
|
"key-mismatch",
|
||||||
"beacon-report",
|
"beacon-report",
|
||||||
"radar-detected",
|
"radar-detected"
|
||||||
"ft-finish",
|
|
||||||
"sta-authorized"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,16 +68,6 @@ namespace OpenWifi {
|
|||||||
Context->addCertificateAuthority(Issuing);
|
Context->addCertificateAuthority(Issuing);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!client_cas_.empty()) {
|
|
||||||
// add certificates specified in clientcas
|
|
||||||
std::vector<Poco::Crypto::X509Certificate> Certs =
|
|
||||||
Poco::Net::X509Certificate::readPEM(client_cas_);
|
|
||||||
for (const auto &cert : Certs) {
|
|
||||||
Context->addChainCertificate(cert);
|
|
||||||
Context->addCertificateAuthority(cert);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Poco::Crypto::RSAKey Key("", key_file_, key_file_password_);
|
Poco::Crypto::RSAKey Key("", key_file_, key_file_password_);
|
||||||
Context->usePrivateKey(Key);
|
Context->usePrivateKey(Key);
|
||||||
|
|
||||||
|
|||||||
@@ -45,7 +45,6 @@ namespace OpenWifi {
|
|||||||
[[nodiscard]] inline auto KeyFile() const { return key_file_; };
|
[[nodiscard]] inline auto KeyFile() const { return key_file_; };
|
||||||
[[nodiscard]] inline auto CertFile() const { return cert_file_; };
|
[[nodiscard]] inline auto CertFile() const { return cert_file_; };
|
||||||
[[nodiscard]] inline auto RootCA() const { return root_ca_; };
|
[[nodiscard]] inline auto RootCA() const { return root_ca_; };
|
||||||
[[nodiscard]] inline auto ClientCas() const { return client_cas_; };
|
|
||||||
[[nodiscard]] inline auto KeyFilePassword() const { return key_file_password_; };
|
[[nodiscard]] inline auto KeyFilePassword() const { return key_file_password_; };
|
||||||
[[nodiscard]] inline auto IssuerCertFile() const { return issuer_cert_file_; };
|
[[nodiscard]] inline auto IssuerCertFile() const { return issuer_cert_file_; };
|
||||||
[[nodiscard]] inline auto Name() const { return name_; };
|
[[nodiscard]] inline auto Name() const { return name_; };
|
||||||
|
|||||||
@@ -583,7 +583,6 @@ namespace OpenWifi::RESTAPI::Protocol {
|
|||||||
|
|
||||||
static const char *FIXEDCONFIG = "fixedconfig";
|
static const char *FIXEDCONFIG = "fixedconfig";
|
||||||
static const char *CABLEDIAGNOSTICS = "cable-diagnostics";
|
static const char *CABLEDIAGNOSTICS = "cable-diagnostics";
|
||||||
static const char *REENROLL = "reenroll";
|
|
||||||
} // namespace OpenWifi::RESTAPI::Protocol
|
} // namespace OpenWifi::RESTAPI::Protocol
|
||||||
|
|
||||||
namespace OpenWifi::uCentralProtocol {
|
namespace OpenWifi::uCentralProtocol {
|
||||||
@@ -699,8 +698,6 @@ namespace OpenWifi::uCentralProtocol {
|
|||||||
|
|
||||||
static const char *FIXEDCONFIG = "fixedconfig";
|
static const char *FIXEDCONFIG = "fixedconfig";
|
||||||
static const char *CABLEDIAGNOSTICS = "cable-diagnostics";
|
static const char *CABLEDIAGNOSTICS = "cable-diagnostics";
|
||||||
static const char *REENROLL = "reenroll";
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace OpenWifi::uCentralProtocol
|
} // namespace OpenWifi::uCentralProtocol
|
||||||
|
|
||||||
@@ -800,7 +797,6 @@ namespace OpenWifi::APCommands {
|
|||||||
powercycle,
|
powercycle,
|
||||||
fixedconfig,
|
fixedconfig,
|
||||||
cablediagnostics,
|
cablediagnostics,
|
||||||
reenroll,
|
|
||||||
unknown
|
unknown
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -816,8 +812,7 @@ namespace OpenWifi::APCommands {
|
|||||||
RESTAPI::Protocol::PING, RESTAPI::Protocol::SCRIPT,
|
RESTAPI::Protocol::PING, RESTAPI::Protocol::SCRIPT,
|
||||||
RESTAPI::Protocol::RRM, RESTAPI::Protocol::CERTUPDATE,
|
RESTAPI::Protocol::RRM, RESTAPI::Protocol::CERTUPDATE,
|
||||||
RESTAPI::Protocol::TRANSFER, RESTAPI::Protocol::POWERCYCLE,
|
RESTAPI::Protocol::TRANSFER, RESTAPI::Protocol::POWERCYCLE,
|
||||||
RESTAPI::Protocol::FIXEDCONFIG, RESTAPI::Protocol::CABLEDIAGNOSTICS,
|
RESTAPI::Protocol::FIXEDCONFIG, RESTAPI::Protocol::CABLEDIAGNOSTICS
|
||||||
RESTAPI::Protocol::REENROLL
|
|
||||||
};
|
};
|
||||||
|
|
||||||
inline const char *to_string(Commands Cmd) { return uCentralAPCommands[(uint8_t)Cmd]; }
|
inline const char *to_string(Commands Cmd) { return uCentralAPCommands[(uint8_t)Cmd]; }
|
||||||
|
|||||||
@@ -14,7 +14,6 @@
|
|||||||
#include "nlohmann/json.hpp"
|
#include "nlohmann/json.hpp"
|
||||||
|
|
||||||
#include "Poco/NObserver.h"
|
#include "Poco/NObserver.h"
|
||||||
#include <Poco/Net/Context.h>
|
|
||||||
#include "Poco/Net/SocketNotification.h"
|
#include "Poco/Net/SocketNotification.h"
|
||||||
#include "Poco/Net/NetException.h"
|
#include "Poco/Net/NetException.h"
|
||||||
#include "Poco/Net/WebSocketImpl.h"
|
#include "Poco/Net/WebSocketImpl.h"
|
||||||
@@ -72,7 +71,6 @@ namespace OpenWifi {
|
|||||||
const auto &RootCas =
|
const auto &RootCas =
|
||||||
MicroServiceConfigPath("ucentral.websocket.host.0.rootca", "");
|
MicroServiceConfigPath("ucentral.websocket.host.0.rootca", "");
|
||||||
const auto &Cas = MicroServiceConfigPath("ucentral.websocket.host.0.cas", "");
|
const auto &Cas = MicroServiceConfigPath("ucentral.websocket.host.0.cas", "");
|
||||||
const auto &ClientCasFile = MicroServiceConfigPath("ucentral.websocket.host.0.clientcas", "");
|
|
||||||
|
|
||||||
Poco::Net::Context::Params P;
|
Poco::Net::Context::Params P;
|
||||||
|
|
||||||
@@ -88,7 +86,6 @@ namespace OpenWifi {
|
|||||||
Poco::Crypto::X509Certificate Cert(CertFileName);
|
Poco::Crypto::X509Certificate Cert(CertFileName);
|
||||||
Poco::Crypto::X509Certificate Root(RootCaFileName);
|
Poco::Crypto::X509Certificate Root(RootCaFileName);
|
||||||
Poco::Crypto::X509Certificate Issuing(IssuerFileName);
|
Poco::Crypto::X509Certificate Issuing(IssuerFileName);
|
||||||
std::vector<Poco::Crypto::X509Certificate> ClientCasCerts;
|
|
||||||
Poco::Crypto::RSAKey Key("", KeyFileName, KeyPassword);
|
Poco::Crypto::RSAKey Key("", KeyFileName, KeyPassword);
|
||||||
|
|
||||||
DeviceSecureContext->useCertificate(Cert);
|
DeviceSecureContext->useCertificate(Cert);
|
||||||
@@ -96,11 +93,7 @@ namespace OpenWifi {
|
|||||||
DeviceSecureContext->addCertificateAuthority(Root);
|
DeviceSecureContext->addCertificateAuthority(Root);
|
||||||
DeviceSecureContext->addChainCertificate(Issuing);
|
DeviceSecureContext->addChainCertificate(Issuing);
|
||||||
DeviceSecureContext->addCertificateAuthority(Issuing);
|
DeviceSecureContext->addCertificateAuthority(Issuing);
|
||||||
ClientCasCerts = Poco::Net::X509Certificate::readPEM(ClientCasFile);
|
DeviceSecureContext->addCertificateAuthority(Root);
|
||||||
for (const auto &cert : ClientCasCerts) {
|
|
||||||
DeviceSecureContext->addChainCertificate(cert);
|
|
||||||
DeviceSecureContext->addCertificateAuthority(cert);
|
|
||||||
}
|
|
||||||
DeviceSecureContext->enableSessionCache(true);
|
DeviceSecureContext->enableSessionCache(true);
|
||||||
DeviceSecureContext->setSessionCacheSize(0);
|
DeviceSecureContext->setSessionCacheSize(0);
|
||||||
DeviceSecureContext->setSessionTimeout(120);
|
DeviceSecureContext->setSessionTimeout(120);
|
||||||
|
|||||||
Reference in New Issue
Block a user