From b4699e9178a34021f48017d21aedc649ebe7b157 Mon Sep 17 00:00:00 2001 From: Carsten Schafer Date: Mon, 11 Aug 2025 15:35:48 -0400 Subject: [PATCH 01/14] Add extra logging for SSL errors Signed-off-by: Carsten Schafer --- src/AP_WS_Connection.cpp | 26 +++++++++++++++++++++++++- src/AP_WS_Connection.h | 3 ++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/AP_WS_Connection.cpp b/src/AP_WS_Connection.cpp index 6dba49bb..ae7232c8 100644 --- a/src/AP_WS_Connection.cpp +++ b/src/AP_WS_Connection.cpp @@ -18,6 +18,8 @@ #include #include +#include +#include #include #include @@ -31,6 +33,26 @@ namespace OpenWifi { + void AP_WS_Connection::LogOpenSslErrors() { + if (ERR_peek_error() == 0) { + poco_warning("No OpenSsl errors"); + return; + } + + BIO* bio = BIO_new(BIO_s_mem()); + if (!bio) + return; + + ERR_print_errors(bio); // writes and clears the error queue + + char* data = nullptr; + long len = BIO_get_mem_data(bio, &data); + if (len > 0 && data) { + poco_warning(Logger_, std::string(data, static_cast(len))); + } + BIO_free(bio); + } + void AP_WS_Connection::LogException(const Poco::Exception &E) { poco_information(Logger_, fmt::format("EXCEPTION({}): {}", CId_, E.displayText())); } @@ -730,6 +752,7 @@ namespace OpenWifi { CId_, E.displayText(), IncomingFrame.begin() == nullptr ? "" : IncomingFrame.begin(), State_.sessionId)); + LogOpenSslErrors(); KillConnection=true; } catch (const Poco::Net::SSLException &E) { poco_warning(Logger_, @@ -737,6 +760,7 @@ namespace OpenWifi { E.displayText(), IncomingFrame.begin() == nullptr ? "" : IncomingFrame.begin(), State_.sessionId)); + LogOpenSslErrors(); KillConnection=true; } catch (const Poco::Net::NetException &E) { poco_warning(Logger_, @@ -921,4 +945,4 @@ namespace OpenWifi { } } -} // namespace OpenWifi \ No newline at end of file +} // namespace OpenWifi diff --git a/src/AP_WS_Connection.h b/src/AP_WS_Connection.h index 4acd5657..a60c3e78 100644 --- a/src/AP_WS_Connection.h +++ b/src/AP_WS_Connection.h @@ -30,6 +30,7 @@ namespace OpenWifi { Poco::Logger &L, std::pair, std::shared_ptr> R); ~AP_WS_Connection(); + void LogOpenSslErrors(); void EndConnection(); void ProcessJSONRPCEvent(Poco::JSON::Object::Ptr &Doc); void ProcessJSONRPCResult(Poco::JSON::Object::Ptr Doc); @@ -175,4 +176,4 @@ namespace OpenWifi { }; -} // namespace OpenWifi \ No newline at end of file +} // namespace OpenWifi From 8e5e51a52a9c8c5670e8f51556b15f45dd1e5116 Mon Sep 17 00:00:00 2001 From: Carsten Schafer Date: Mon, 11 Aug 2025 15:49:08 -0400 Subject: [PATCH 02/14] Correct call to poco_warning Signed-off-by: Carsten Schafer --- src/AP_WS_Connection.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AP_WS_Connection.cpp b/src/AP_WS_Connection.cpp index ae7232c8..0ea49640 100644 --- a/src/AP_WS_Connection.cpp +++ b/src/AP_WS_Connection.cpp @@ -35,7 +35,7 @@ namespace OpenWifi { void AP_WS_Connection::LogOpenSslErrors() { if (ERR_peek_error() == 0) { - poco_warning("No OpenSsl errors"); + poco_warning(Logger_, "No OpenSsl errors"); return; } From 6ae1eeb2ea3a2d91b065df17f8f62eb907e93e56 Mon Sep 17 00:00:00 2001 From: Carsten Schafer Date: Wed, 20 Aug 2025 14:10:16 -0400 Subject: [PATCH 03/14] Upgrade to debian bookworm, resolve compile issues, work around IOExceptions test Signed-off-by: Carsten Schafer --- Dockerfile | 4 ++-- src/AP_WS_Connection.cpp | 13 ++++++++++--- src/framework/MicroService.h | 1 + src/framework/MicroServiceFuncs.h | 1 + src/storage/storage_device.cpp | 19 +++++++++---------- 5 files changed, 23 insertions(+), 15 deletions(-) diff --git a/Dockerfile b/Dockerfile index b1409954..536ce980 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -ARG DEBIAN_VERSION=11.5-slim +ARG DEBIAN_VERSION=bookworm ARG POCO_VERSION=poco-tip-v2 ARG CPPKAFKA_VERSION=tip-v1 ARG VALIJASON_VERSION=tip-v1.0.2 @@ -100,7 +100,7 @@ RUN mkdir -p $APP_ROOT $APP_CONFIG && \ RUN apt-get update && apt-get install --no-install-recommends -y \ librdkafka++1 gosu gettext ca-certificates bash jq curl wget \ - libmariadb-dev-compat libpq5 unixodbc postgresql-client libfmt7 sqlite3 + libmariadb-dev-compat libpq5 unixodbc postgresql-client libfmt9 sqlite3 COPY readiness_check /readiness_check COPY test_scripts/curl/cli /cli diff --git a/src/AP_WS_Connection.cpp b/src/AP_WS_Connection.cpp index 0ea49640..65ae503b 100644 --- a/src/AP_WS_Connection.cpp +++ b/src/AP_WS_Connection.cpp @@ -627,8 +627,15 @@ namespace OpenWifi { bool KillConnection=false; try { - int Op, flags; - auto IncomingSize = WS_->receiveFrame(IncomingFrame, flags); + int Op, flags; + int IncomingSize; + //auto TS = Poco::Timespan(360, 0); + + //if (WS_->poll(TS, 1)) { + IncomingSize = WS_->receiveFrame(IncomingFrame, flags); + //} else{ + // return; + //} Op = flags & Poco::Net::WebSocket::FRAME_OP_BITMASK; @@ -775,7 +782,7 @@ namespace OpenWifi { E.displayText(), IncomingFrame.begin() == nullptr ? "" : IncomingFrame.begin(), State_.sessionId)); - KillConnection=true; + //KillConnection=true; } catch (const Poco::Exception &E) { poco_warning(Logger_, fmt::format("Exception({}): Text:{} Payload:{} Session:{}", CId_, diff --git a/src/framework/MicroService.h b/src/framework/MicroService.h index a991316f..b75ef625 100644 --- a/src/framework/MicroService.h +++ b/src/framework/MicroService.h @@ -14,6 +14,7 @@ #include #include #include +#include // This must be defined for poco_debug and poco_trace macros to function. diff --git a/src/framework/MicroServiceFuncs.h b/src/framework/MicroServiceFuncs.h index 2d22392e..25e06821 100644 --- a/src/framework/MicroServiceFuncs.h +++ b/src/framework/MicroServiceFuncs.h @@ -5,6 +5,7 @@ #pragma once #include +#include #include "framework/OpenWifiTypes.h" diff --git a/src/storage/storage_device.cpp b/src/storage/storage_device.cpp index db65e0ee..885653c5 100644 --- a/src/storage/storage_device.cpp +++ b/src/storage/storage_device.cpp @@ -202,15 +202,14 @@ namespace OpenWifi { std::string st; std::string whereClause = ""; - if(!platform.empty()) { + if (!platform.empty()) { if (includeProvisioned == false) { - - whereClause = fmt::format("WHERE entity='' and venue='' and DeviceType='" + platform + "'"); + //whereClause = fmt::format("WHERE entity='' and venue='' and DeviceType='" + platform + "'"); + whereClause = fmt::format("WHERE entity='' and venue='' and DeviceType='{}'", platform); } else { - whereClause = fmt::format("WHERE DeviceType='" + platform + "'"); + //whereClause = fmt::format("WHERE DeviceType='" + platform + "'"); + whereClause = fmt::format("WHERE DeviceType='{}'", platform); } - - //st = "SELECT SerialNumber From Devices WHERE DeviceType='" + platform + "' "; } else { if (includeProvisioned == false) { @@ -218,7 +217,7 @@ namespace OpenWifi { } //st = "SELECT SerialNumber From Devices "; } - + st = fmt::format("SELECT SerialNumber From Devices {}", whereClause); if (orderBy.empty()) @@ -896,9 +895,9 @@ namespace OpenWifi { if (includeProvisioned == false) { whereClause = fmt::format("WHERE DeviceType='{}' and entity='' and venue=''",platform); } else { - whereClause = fmt::format("WHERE DeviceType='{}'", platform); + whereClause = fmt::format("WHERE DeviceType='{}'", platform); } - + } st = @@ -907,7 +906,7 @@ namespace OpenWifi { ComputeRange(From, HowMany)); //Logger().information(fmt::format(" GetDevices st is {} ", st)); - + Select << ConvertParams(st), Poco::Data::Keywords::into(Records); Select.execute(); From 218694872f2bd0ef36ffc33e1f3fcd924a51f6c8 Mon Sep 17 00:00:00 2001 From: Adam Capparelli Date: Thu, 21 Aug 2025 08:47:39 -0400 Subject: [PATCH 04/14] Fix some compile errors. Signed-off-by: Adam Capparelli --- Dockerfile | 2 +- src/AP_WS_Connection.cpp | 39 ++++--------------------------- src/AP_WS_Server.cpp | 1 - src/framework/MicroService.h | 1 + src/framework/SubSystemServer.cpp | 1 - 5 files changed, 6 insertions(+), 38 deletions(-) diff --git a/Dockerfile b/Dockerfile index 536ce980..b24fd296 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ ARG DEBIAN_VERSION=bookworm -ARG POCO_VERSION=poco-tip-v2 +ARG POCO_VERSION=poco-tip-v3-tag ARG CPPKAFKA_VERSION=tip-v1 ARG VALIJASON_VERSION=tip-v1.0.2 ARG APP_NAME=owgw diff --git a/src/AP_WS_Connection.cpp b/src/AP_WS_Connection.cpp index 65ae503b..6dba49bb 100644 --- a/src/AP_WS_Connection.cpp +++ b/src/AP_WS_Connection.cpp @@ -18,8 +18,6 @@ #include #include -#include -#include #include #include @@ -33,26 +31,6 @@ namespace OpenWifi { - void AP_WS_Connection::LogOpenSslErrors() { - if (ERR_peek_error() == 0) { - poco_warning(Logger_, "No OpenSsl errors"); - return; - } - - BIO* bio = BIO_new(BIO_s_mem()); - if (!bio) - return; - - ERR_print_errors(bio); // writes and clears the error queue - - char* data = nullptr; - long len = BIO_get_mem_data(bio, &data); - if (len > 0 && data) { - poco_warning(Logger_, std::string(data, static_cast(len))); - } - BIO_free(bio); - } - void AP_WS_Connection::LogException(const Poco::Exception &E) { poco_information(Logger_, fmt::format("EXCEPTION({}): {}", CId_, E.displayText())); } @@ -627,15 +605,8 @@ namespace OpenWifi { bool KillConnection=false; try { - int Op, flags; - int IncomingSize; - //auto TS = Poco::Timespan(360, 0); - - //if (WS_->poll(TS, 1)) { - IncomingSize = WS_->receiveFrame(IncomingFrame, flags); - //} else{ - // return; - //} + int Op, flags; + auto IncomingSize = WS_->receiveFrame(IncomingFrame, flags); Op = flags & Poco::Net::WebSocket::FRAME_OP_BITMASK; @@ -759,7 +730,6 @@ namespace OpenWifi { CId_, E.displayText(), IncomingFrame.begin() == nullptr ? "" : IncomingFrame.begin(), State_.sessionId)); - LogOpenSslErrors(); KillConnection=true; } catch (const Poco::Net::SSLException &E) { poco_warning(Logger_, @@ -767,7 +737,6 @@ namespace OpenWifi { E.displayText(), IncomingFrame.begin() == nullptr ? "" : IncomingFrame.begin(), State_.sessionId)); - LogOpenSslErrors(); KillConnection=true; } catch (const Poco::Net::NetException &E) { poco_warning(Logger_, @@ -782,7 +751,7 @@ namespace OpenWifi { E.displayText(), IncomingFrame.begin() == nullptr ? "" : IncomingFrame.begin(), State_.sessionId)); - //KillConnection=true; + KillConnection=true; } catch (const Poco::Exception &E) { poco_warning(Logger_, fmt::format("Exception({}): Text:{} Payload:{} Session:{}", CId_, @@ -952,4 +921,4 @@ namespace OpenWifi { } } -} // namespace OpenWifi +} // namespace OpenWifi \ No newline at end of file diff --git a/src/AP_WS_Server.cpp b/src/AP_WS_Server.cpp index e37511b8..52dae456 100644 --- a/src/AP_WS_Server.cpp +++ b/src/AP_WS_Server.cpp @@ -120,7 +120,6 @@ namespace OpenWifi { P.verificationDepth = 9; P.loadDefaultCAs = Svr.RootCA().empty(); P.cipherList = "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"; - P.dhUse2048Bits = true; P.caLocation = Svr.Cas(); auto Context = Poco::AutoPtr( diff --git a/src/framework/MicroService.h b/src/framework/MicroService.h index b75ef625..6fb1da7a 100644 --- a/src/framework/MicroService.h +++ b/src/framework/MicroService.h @@ -41,6 +41,7 @@ namespace OpenWifi { #include "Poco/Util/OptionSet.h" #include "Poco/Util/PropertyFileConfiguration.h" #include "Poco/Util/ServerApplication.h" +#include "Poco/ThreadPool.h" #include "framework/OpenWifiTypes.h" diff --git a/src/framework/SubSystemServer.cpp b/src/framework/SubSystemServer.cpp index 1061cfd4..5be9c9d3 100644 --- a/src/framework/SubSystemServer.cpp +++ b/src/framework/SubSystemServer.cpp @@ -35,7 +35,6 @@ namespace OpenWifi { P.verificationDepth = 9; P.loadDefaultCAs = root_ca_.empty(); P.cipherList = "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"; - P.dhUse2048Bits = true; P.caLocation = cas_; // P.securityLevel = From 680b6a16e30f9e8e63dbcfbb7a409e36ca444e8f Mon Sep 17 00:00:00 2001 From: Adam Capparelli Date: Thu, 21 Aug 2025 09:07:13 -0400 Subject: [PATCH 05/14] Fix more compilation errors. Signed-off-by: Adam Capparelli --- src/AP_WS_Connection.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/AP_WS_Connection.cpp b/src/AP_WS_Connection.cpp index 6dba49bb..7817a141 100644 --- a/src/AP_WS_Connection.cpp +++ b/src/AP_WS_Connection.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include From cab0d8aee64b9dd646b71e9bc0877f579aa69312 Mon Sep 17 00:00:00 2001 From: Carsten Schafer Date: Thu, 21 Aug 2025 09:37:07 -0400 Subject: [PATCH 06/14] Remove test code Signed-off-by: Carsten Schafer --- src/AP_WS_Connection.cpp | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/AP_WS_Connection.cpp b/src/AP_WS_Connection.cpp index 65ae503b..25bb5145 100644 --- a/src/AP_WS_Connection.cpp +++ b/src/AP_WS_Connection.cpp @@ -628,14 +628,7 @@ namespace OpenWifi { bool KillConnection=false; try { int Op, flags; - int IncomingSize; - //auto TS = Poco::Timespan(360, 0); - - //if (WS_->poll(TS, 1)) { - IncomingSize = WS_->receiveFrame(IncomingFrame, flags); - //} else{ - // return; - //} + auto IncomingSize = WS_->receiveFrame(IncomingFrame, flags); Op = flags & Poco::Net::WebSocket::FRAME_OP_BITMASK; @@ -782,7 +775,7 @@ namespace OpenWifi { E.displayText(), IncomingFrame.begin() == nullptr ? "" : IncomingFrame.begin(), State_.sessionId)); - //KillConnection=true; + KillConnection=true; } catch (const Poco::Exception &E) { poco_warning(Logger_, fmt::format("Exception({}): Text:{} Payload:{} Session:{}", CId_, From 9e3735ced8a03d4a40d3b45bcf979095579abe21 Mon Sep 17 00:00:00 2001 From: Adam Capparelli Date: Thu, 21 Aug 2025 13:03:58 -0400 Subject: [PATCH 07/14] Switch to newer poco. Signed-off-by: Adam Capparelli --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index b24fd296..93a6604b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ ARG DEBIAN_VERSION=bookworm -ARG POCO_VERSION=poco-tip-v3-tag +ARG POCO_VERSION=poco-tip-v4-tag ARG CPPKAFKA_VERSION=tip-v1 ARG VALIJASON_VERSION=tip-v1.0.2 ARG APP_NAME=owgw From 66d580d04788fb9dacdda848dcace7c8db0e233b Mon Sep 17 00:00:00 2001 From: Carsten Schafer Date: Fri, 22 Aug 2025 13:30:07 -0400 Subject: [PATCH 08/14] Work with new WS behaviour Signed-off-by: Carsten Schafer --- Dockerfile | 2 +- src/AP_WS_Connection.cpp | 153 +++++++++++++-------- src/AP_WS_Connection.h | 2 + src/TelemetryClient.cpp | 20 +-- src/framework/MicroService.cpp | 3 +- src/framework/SubSystemServer.cpp | 2 +- src/framework/UI_WebSocketClientServer.cpp | 19 ++- src/rttys/RTTYS_server.cpp | 45 ++++-- 8 files changed, 165 insertions(+), 81 deletions(-) diff --git a/Dockerfile b/Dockerfile index b24fd296..93a6604b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ ARG DEBIAN_VERSION=bookworm -ARG POCO_VERSION=poco-tip-v3-tag +ARG POCO_VERSION=poco-tip-v4-tag ARG CPPKAFKA_VERSION=tip-v1 ARG VALIJASON_VERSION=tip-v1.0.2 ARG APP_NAME=owgw diff --git a/src/AP_WS_Connection.cpp b/src/AP_WS_Connection.cpp index f6473fff..257c3055 100644 --- a/src/AP_WS_Connection.cpp +++ b/src/AP_WS_Connection.cpp @@ -40,7 +40,7 @@ namespace OpenWifi { Poco::Net::HTTPServerResponse &response, uint64_t session_id, Poco::Logger &L, std::pair, std::shared_ptr> R) - : Logger_(L) { + : Logger_(L), IncomingFrame_(0) { Reactor_ = R.first; DbSession_ = R.second; @@ -55,6 +55,7 @@ namespace OpenWifi { WS_->setNoDelay(false); WS_->setKeepAlive(true); WS_->setBlocking(false); + IncomingFrame_.resize(0); uuid_ = MicroServiceRandom(std::numeric_limits::max()-1); AP_WS_Server()->IncrementConnectionCount(); @@ -601,36 +602,89 @@ namespace OpenWifi { EndConnection(); } + void AP_WS_Connection::ProcessWSFinalPayload() { + auto IncomingSize = IncomingFrame_.size(); + + IncomingFrame_.append(0); + + poco_trace(Logger_, + fmt::format("ProcessWSFrame({}): Final Frame received (len={}, Msg={}", + CId_, IncomingSize, IncomingFrame_.begin())); + + Poco::JSON::Parser parser; + auto ParsedMessage = parser.parse(IncomingFrame_.begin()); + auto IncomingJSON = ParsedMessage.extract(); + + if (IncomingJSON->has(uCentralProtocol::JSONRPC)) { + if (IncomingJSON->has(uCentralProtocol::METHOD) && + IncomingJSON->has(uCentralProtocol::PARAMS)) { + ProcessJSONRPCEvent(IncomingJSON); + } else if (IncomingJSON->has(uCentralProtocol::RESULT) && + IncomingJSON->has(uCentralProtocol::ID)) { + poco_trace(Logger_, fmt::format("RPC-RESULT({}): payload: {}", CId_, + IncomingFrame_.begin())); + ProcessJSONRPCResult(IncomingJSON); + } else { + poco_warning( + Logger_, + fmt::format("INVALID-PAYLOAD({}): Payload is not JSON-RPC 2.0: {}", + CId_, IncomingFrame_.begin())); + } + } else if (IncomingJSON->has(uCentralProtocol::RADIUS)) { + ProcessIncomingRadiusData(IncomingJSON); + } else { + std::ostringstream iS; + IncomingJSON->stringify(iS); + poco_warning( + Logger_, + fmt::format("FRAME({}): illegal transaction header, missing 'jsonrpc': {}", + CId_, iS.str())); + Errors_++; + } + IncomingFrame_.clear(); + IncomingFrame_.resize(0); + } + void AP_WS_Connection::ProcessIncomingFrame() { - Poco::Buffer IncomingFrame(0); + Poco::Buffer CurrentFrame(0); + bool KillConnection = false; + int flags = 0; + int IncomingSize = 0; - bool KillConnection=false; try { - int Op, flags; - auto IncomingSize = WS_->receiveFrame(IncomingFrame, flags); + IncomingSize = WS_->receiveFrame(CurrentFrame, flags); + int Op; Op = flags & Poco::Net::WebSocket::FRAME_OP_BITMASK; - if (IncomingSize == 0 && flags == 0 && Op == 0) { + if (IncomingSize < 0 && flags == 0) { + poco_trace(Logger_, + fmt::format("EMPTY({}): Non-blocking try-again empty frame (len={}, flags={})", + CId_, IncomingSize, flags)); + } else if (IncomingSize == 0 && flags == 0) { poco_information(Logger_, fmt::format("DISCONNECT({}): device has disconnected. Session={}", CId_, State_.sessionId)); return EndConnection(); } - IncomingFrame.append(0); - - State_.RX += IncomingSize; - AP_WS_Server()->AddRX(IncomingSize); + if (IncomingSize > 0) { + State_.RX += IncomingSize; + AP_WS_Server()->AddRX(IncomingSize); + IncomingFrame_.append(CurrentFrame); + } State_.MessageCount++; State_.LastContact = Utils::Now(); + poco_trace(Logger_, + fmt::format("FRAME({}): Frame {} rx (len={}, flags={}, acc.len={})", + CId_, Op, IncomingSize, flags, IncomingFrame_.size())); switch (Op) { case Poco::Net::WebSocket::FRAME_OP_PING: { - poco_trace(Logger_, fmt::format("WS-PING({}): received. PONG sent back.", CId_)); + poco_trace(Logger_, fmt::format("PING({}): received. PONG sent back.", CId_)); WS_->sendFrame("", 0, (int)Poco::Net::WebSocket::FRAME_OP_PONG | - (int)Poco::Net::WebSocket::FRAME_FLAG_FIN); + (int)Poco::Net::WebSocket::FRAME_FLAG_FIN); if (KafkaManager()->Enabled()) { Poco::JSON::Object PingObject; @@ -646,47 +700,28 @@ namespace OpenWifi { poco_trace(Logger_,fmt::format("Sending PING for {}", SerialNumber_)); KafkaManager()->PostMessage(KafkaTopics::CONNECTION, SerialNumber_,PingObject); } + return; } break; case Poco::Net::WebSocket::FRAME_OP_PONG: { poco_trace(Logger_, fmt::format("PONG({}): received and ignored.", CId_)); + return; + } break; + + case Poco::Net::WebSocket::FRAME_OP_CONT: { + poco_trace(Logger_, fmt::format("CONTINUATION({}): registered.", CId_)); + } break; + + case Poco::Net::WebSocket::FRAME_OP_BINARY: { + poco_trace(Logger_, fmt::format("BINARY({}): Invalid frame type.", CId_)); + KillConnection=true; + return; } break; case Poco::Net::WebSocket::FRAME_OP_TEXT: { poco_trace(Logger_, - fmt::format("FRAME({}): Frame received (length={}, flags={}). Msg={}", - CId_, IncomingSize, flags, IncomingFrame.begin())); - - Poco::JSON::Parser parser; - auto ParsedMessage = parser.parse(IncomingFrame.begin()); - auto IncomingJSON = ParsedMessage.extract(); - - if (IncomingJSON->has(uCentralProtocol::JSONRPC)) { - if (IncomingJSON->has(uCentralProtocol::METHOD) && - IncomingJSON->has(uCentralProtocol::PARAMS)) { - ProcessJSONRPCEvent(IncomingJSON); - } else if (IncomingJSON->has(uCentralProtocol::RESULT) && - IncomingJSON->has(uCentralProtocol::ID)) { - poco_trace(Logger_, fmt::format("RPC-RESULT({}): payload: {}", CId_, - IncomingFrame.begin())); - ProcessJSONRPCResult(IncomingJSON); - } else { - poco_warning( - Logger_, - fmt::format("INVALID-PAYLOAD({}): Payload is not JSON-RPC 2.0: {}", - CId_, IncomingFrame.begin())); - } - } else if (IncomingJSON->has(uCentralProtocol::RADIUS)) { - ProcessIncomingRadiusData(IncomingJSON); - } else { - std::ostringstream iS; - IncomingJSON->stringify(iS); - poco_warning( - Logger_, - fmt::format("FRAME({}): illegal transaction header, missing 'jsonrpc': {}", - CId_, iS.str())); - Errors_++; - } + fmt::format("TEXT({}): Frame received (len={}, flags={}). Msg={}", + CId_, IncomingSize, flags, CurrentFrame.begin())); } break; case Poco::Net::WebSocket::FRAME_OP_CLOSE: { @@ -702,25 +737,31 @@ namespace OpenWifi { return; } } + + // Check for final frame and process accumlated payload + if (!KillConnection && (flags & Poco::Net::WebSocket::FRAME_FLAG_FIN) != 0) { + ProcessWSFinalPayload(); + } + } catch (const Poco::Net::ConnectionResetException &E) { poco_warning(Logger_, fmt::format("ConnectionResetException({}): Text:{} Payload:{} Session:{}", CId_, E.displayText(), - IncomingFrame.begin() == nullptr ? "" : IncomingFrame.begin(), + CurrentFrame.begin() == nullptr ? "" : CurrentFrame.begin(), State_.sessionId)); KillConnection=true; } catch (const Poco::JSON::JSONException &E) { poco_warning(Logger_, fmt::format("JSONException({}): Text:{} Payload:{} Session:{}", CId_, E.displayText(), - IncomingFrame.begin() == nullptr ? "" : IncomingFrame.begin(), + CurrentFrame.begin() == nullptr ? "" : CurrentFrame.begin(), State_.sessionId)); KillConnection=true; } catch (const Poco::Net::WebSocketException &E) { poco_warning(Logger_, fmt::format("WebSocketException({}): Text:{} Payload:{} Session:{}", CId_, E.displayText(), - IncomingFrame.begin() == nullptr ? "" : IncomingFrame.begin(), + CurrentFrame.begin() == nullptr ? "" : CurrentFrame.begin(), State_.sessionId)); KillConnection=true; } catch (const Poco::Net::SSLConnectionUnexpectedlyClosedException &E) { @@ -729,42 +770,42 @@ namespace OpenWifi { fmt::format( "SSLConnectionUnexpectedlyClosedException({}): Text:{} Payload:{} Session:{}", CId_, E.displayText(), - IncomingFrame.begin() == nullptr ? "" : IncomingFrame.begin(), + CurrentFrame.begin() == nullptr ? "" : CurrentFrame.begin(), State_.sessionId)); KillConnection=true; } catch (const Poco::Net::SSLException &E) { poco_warning(Logger_, fmt::format("SSLException({}): Text:{} Payload:{} Session:{}", CId_, E.displayText(), - IncomingFrame.begin() == nullptr ? "" : IncomingFrame.begin(), + CurrentFrame.begin() == nullptr ? "" : CurrentFrame.begin(), State_.sessionId)); KillConnection=true; } catch (const Poco::Net::NetException &E) { poco_warning(Logger_, fmt::format("NetException({}): Text:{} Payload:{} Session:{}", CId_, E.displayText(), - IncomingFrame.begin() == nullptr ? "" : IncomingFrame.begin(), + CurrentFrame.begin() == nullptr ? "" : CurrentFrame.begin(), State_.sessionId)); KillConnection=true; } catch (const Poco::IOException &E) { poco_warning(Logger_, fmt::format("IOException({}): Text:{} Payload:{} Session:{}", CId_, E.displayText(), - IncomingFrame.begin() == nullptr ? "" : IncomingFrame.begin(), + CurrentFrame.begin() == nullptr ? "" : CurrentFrame.begin(), State_.sessionId)); KillConnection=true; } catch (const Poco::Exception &E) { poco_warning(Logger_, fmt::format("Exception({}): Text:{} Payload:{} Session:{}", CId_, E.displayText(), - IncomingFrame.begin() == nullptr ? "" : IncomingFrame.begin(), + CurrentFrame.begin() == nullptr ? "" : CurrentFrame.begin(), State_.sessionId)); KillConnection=true; } catch (const std::exception &E) { poco_warning(Logger_, fmt::format("std::exception({}): Text:{} Payload:{} Session:{}", CId_, E.what(), - IncomingFrame.begin() == nullptr ? "" : IncomingFrame.begin(), + CurrentFrame.begin() == nullptr ? "" : CurrentFrame.begin(), State_.sessionId)); KillConnection=true; } catch (...) { @@ -777,7 +818,9 @@ namespace OpenWifi { if (!KillConnection && Errors_ < 10) return; - poco_warning(Logger_, fmt::format("DISCONNECTING({}): ConnectionException: {} Errors: {}", CId_, KillConnection, Errors_ )); + poco_warning(Logger_, + fmt::format("DISCONNECTING({}): ConnectionException: {} Errors: {}", + CId_, KillConnection, Errors_ )); EndConnection(); } diff --git a/src/AP_WS_Connection.h b/src/AP_WS_Connection.h index a60c3e78..f3732242 100644 --- a/src/AP_WS_Connection.h +++ b/src/AP_WS_Connection.h @@ -34,6 +34,7 @@ namespace OpenWifi { void EndConnection(); void ProcessJSONRPCEvent(Poco::JSON::Object::Ptr &Doc); void ProcessJSONRPCResult(Poco::JSON::Object::Ptr Doc); + void ProcessWSFinalPayload(); void ProcessIncomingFrame(); void ProcessIncomingRadiusData(const Poco::JSON::Object::Ptr &Doc); @@ -146,6 +147,7 @@ namespace OpenWifi { std::uint64_t uuid_=0; bool Simulated_=false; std::atomic_uint64_t LastContact_=0; + Poco::Buffer IncomingFrame_; static inline std::atomic_uint64_t ConcurrentStartingDevices_ = 0; diff --git a/src/TelemetryClient.cpp b/src/TelemetryClient.cpp index 3fc92f49..aea4c323 100644 --- a/src/TelemetryClient.cpp +++ b/src/TelemetryClient.cpp @@ -120,14 +120,16 @@ namespace OpenWifi { Poco::Buffer IncomingFrame(0); try { - int Op, flags; - int IncomingSize; + int Op, flags, IncomingSize; + IncomingSize = WS_->receiveFrame(IncomingFrame, flags); Op = flags & Poco::Net::WebSocket::FRAME_OP_BITMASK; - if (IncomingSize == 0 && flags == 0 && Op == 0) { - poco_information( - Logger(), + if (IncomingSize == -1) { + poco_trace(Logger(), + fmt::format("TELEMETRY-EMPTY({}): Empty frame, non-blocking try-again.", CId_)); + } else if (IncomingSize == 0 && flags == 0 && Op == 0) { + poco_information(Logger(), fmt::format("TELEMETRY-DISCONNECT({}): device has disconnected.", CId_)); MustDisconnect = true; } else { @@ -138,10 +140,12 @@ namespace OpenWifi { (int)Poco::Net::WebSocket::FRAME_OP_PONG | (int)Poco::Net::WebSocket::FRAME_FLAG_FIN); } else if (Op == Poco::Net::WebSocket::FRAME_OP_CLOSE) { - poco_information( - Logger(), + poco_information(Logger(), fmt::format("TELEMETRY-DISCONNECT({}): device wants to disconnect.", CId_)); MustDisconnect = true; + } else if (Op == Poco::Net::WebSocket::FRAME_OP_CONT) { + poco_information(Logger(), + fmt::format("TELEMETRY-CONT({}): rx {} bytes.", CId_, IncomingSize)); } } } catch (...) { @@ -154,4 +158,4 @@ namespace OpenWifi { SendTelemetryShutdown(); } -} // namespace OpenWifi \ No newline at end of file +} // namespace OpenWifi diff --git a/src/framework/MicroService.cpp b/src/framework/MicroService.cpp index 71a187ec..05a68995 100644 --- a/src/framework/MicroService.cpp +++ b/src/framework/MicroService.cpp @@ -295,6 +295,7 @@ namespace OpenWifi { auto Level = Poco::Logger::parseLevel( MicroService::instance().ConfigGetString("logging.level", "debug")); + //Level = Poco::Logger::parseLevel("trace"); // TODO: remove this Poco::Logger::root().setLevel(Level); if (!DisableWebSocketLogging) { static const UI_WebSocketClientServer::NotificationTypeIdVec Notifications = { @@ -845,4 +846,4 @@ namespace OpenWifi { } } -} // namespace OpenWifi \ No newline at end of file +} // namespace OpenWifi diff --git a/src/framework/SubSystemServer.cpp b/src/framework/SubSystemServer.cpp index 5be9c9d3..a543d1b4 100644 --- a/src/framework/SubSystemServer.cpp +++ b/src/framework/SubSystemServer.cpp @@ -343,4 +343,4 @@ namespace OpenWifi { } } -} // namespace OpenWifi \ No newline at end of file +} // namespace OpenWifi diff --git a/src/framework/UI_WebSocketClientServer.cpp b/src/framework/UI_WebSocketClientServer.cpp index eb5b0b7d..b7b5211d 100644 --- a/src/framework/UI_WebSocketClientServer.cpp +++ b/src/framework/UI_WebSocketClientServer.cpp @@ -210,10 +210,16 @@ namespace OpenWifi { n = Client->second->WS_->receiveFrame(IncomingFrame, flags); auto Op = flags & Poco::Net::WebSocket::FRAME_OP_BITMASK; + if (n == -1) { + poco_warning(Logger(), + fmt::format("UI-EMPTY({}): {} Empty Frame flags {}.", + Client->second->Id_, Client->second->UserName_, flags)); + return; + } if (n == 0) { poco_debug(Logger(), - fmt::format("CLOSE({}): {} UI Client is closing WS connection.", - Client->second->Id_, Client->second->UserName_)); + fmt::format("CLOSE({}): {} UI Client is closing WS connection.", + Client->second->Id_, Client->second->UserName_)); return EndConnection(Client); } @@ -221,7 +227,7 @@ namespace OpenWifi { case Poco::Net::WebSocket::FRAME_OP_PING: { Client->second->WS_->sendFrame("", 0, (int)Poco::Net::WebSocket::FRAME_OP_PONG | - (int)Poco::Net::WebSocket::FRAME_FLAG_FIN); + (int)Poco::Net::WebSocket::FRAME_FLAG_FIN); } break; case Poco::Net::WebSocket::FRAME_OP_PONG: { } break; @@ -231,6 +237,11 @@ namespace OpenWifi { Client->second->Id_, Client->second->UserName_)); return EndConnection(Client); } break; + case Poco::Net::WebSocket::FRAME_OP_CONT: { + poco_warning(Logger(), + fmt::format("CONT({}): {} Unexpected CONT Frame - Ignoring.", + Client->second->Id_, Client->second->UserName_)); + } break; case Poco::Net::WebSocket::FRAME_OP_TEXT: { constexpr const char *DropMessagesCommand = "drop-notifications"; IncomingFrame.append(0); @@ -319,4 +330,4 @@ namespace OpenWifi { } } -} // namespace OpenWifi \ No newline at end of file +} // namespace OpenWifi diff --git a/src/rttys/RTTYS_server.cpp b/src/rttys/RTTYS_server.cpp index 31f89ba5..87677143 100644 --- a/src/rttys/RTTYS_server.cpp +++ b/src/rttys/RTTYS_server.cpp @@ -580,14 +580,16 @@ namespace OpenWifi { try { Client = Clients_.find(pNf->socket().impl()->sockfd()); if (Client == end(Clients_)) { - poco_warning(Logger(), fmt::format("Cannot find client socket: {}", - pNf->socket().impl()->sockfd())); + poco_warning(Logger(), + fmt::format("Cannot find client socket: {}", + pNf->socket().impl()->sockfd())); return; } Connection = Client->second; if(Connection->WSSocket_==nullptr || Connection->WSSocket_->impl()==nullptr) { - poco_warning(Logger(), fmt::format("WebSocket is no valid: {}", - Connection->SerialNumber_)); + poco_warning(Logger(), + fmt::format("WebSocket is not valid: {}", + Connection->SerialNumber_)); return; } @@ -596,15 +598,25 @@ namespace OpenWifi { auto ReceivedBytes = Connection->WSSocket_->receiveFrame(FrameBuffer, sizeof(FrameBuffer), flags); auto Op = flags & Poco::Net::WebSocket::FRAME_OP_BITMASK; + + if (ReceivedBytes == -1) { + poco_trace(Logger(), + fmt::format("WS-EMPTY{}: Non-blocking try-again empty Frame: flags {}", + Connection->SerialNumber_, flags)); + return; + } + switch (Op) { case Poco::Net::WebSocket::FRAME_OP_PING: { Connection->WSSocket_->sendFrame("", 0, - (int)Poco::Net::WebSocket::FRAME_OP_PONG | - (int)Poco::Net::WebSocket::FRAME_FLAG_FIN); + (int) Poco::Net::WebSocket::FRAME_FLAG_FIN | + (int) Poco::Net::WebSocket::FRAME_OP_BINARY); } break; + case Poco::Net::WebSocket::FRAME_OP_PONG: { } break; + case Poco::Net::WebSocket::FRAME_OP_TEXT: { if (ReceivedBytes == 0) { EndConnection(Connection,__func__,__LINE__); @@ -631,19 +643,29 @@ namespace OpenWifi { } } } break; + case Poco::Net::WebSocket::FRAME_OP_BINARY: { if (ReceivedBytes == 0) { EndConnection(Connection,__func__,__LINE__); return; } else { poco_trace(Logger(), - fmt::format("Sending {} key strokes to device.", ReceivedBytes)); + fmt::format("Sending {} key strokes to device.", ReceivedBytes)); if (!RTTYS_server().KeyStrokes(Connection, FrameBuffer, ReceivedBytes)) { EndConnection(Connection,__func__,__LINE__); return; } } } break; + + case Poco::Net::WebSocket::FRAME_OP_CONT: { + // may have to handle this, but not sure whether it's a continuation for text or + // binary, seems to be a hole in the protocol. + poco_warning(Logger(), + fmt::format("CONT Frame {} received, ignoring for now.", + ReceivedBytes)); + } + case Poco::Net::WebSocket::FRAME_OP_CLOSE: { EndConnection(Connection,__func__,__LINE__); return; @@ -689,8 +711,8 @@ namespace OpenWifi { if (Connection->WSSocket_ != nullptr && Connection->WSSocket_->impl()!= nullptr) { try { Connection->WSSocket_->sendFrame(Buf, len, - Poco::Net::WebSocket::FRAME_FLAG_FIN | - Poco::Net::WebSocket::FRAME_OP_BINARY); + (int) Poco::Net::WebSocket::FRAME_FLAG_FIN | + (int) Poco::Net::WebSocket::FRAME_OP_BINARY); return; } catch (...) { poco_error(Logger(), "SendData shutdown."); @@ -992,8 +1014,9 @@ namespace OpenWifi { } bool RTTYS_server::SendToClient(Poco::Net::WebSocket &WebSocket, const u_char *Buf, int len) { - WebSocket.sendFrame( - Buf, len, Poco::Net::WebSocket::FRAME_FLAG_FIN | Poco::Net::WebSocket::FRAME_OP_BINARY); + WebSocket.sendFrame(Buf, len, + (int) Poco::Net::WebSocket::FRAME_FLAG_FIN | + (int) Poco::Net::WebSocket::FRAME_OP_BINARY); return true; } From 6b64089f557a8eae3dfe74df72272b38fdcd216c Mon Sep 17 00:00:00 2001 From: Carsten Schafer Date: Mon, 25 Aug 2025 10:45:23 -0400 Subject: [PATCH 09/14] Be able to more readily configure some useful settings via docker compose Signed-off-by: Carsten Schafer --- docker-entrypoint.sh | 2 ++ owgw.properties.tmpl | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index e99f49f2..f9d8bdb1 100755 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -32,6 +32,7 @@ if [[ "$TEMPLATE_CONFIG" = 'true' ]]; then FILEUPLOADER_HOST_KEY_PASSWORD=${FILEUPLOADER_HOST_KEY_PASSWORD:-"mypassword"} \ FILEUPLOADER_PATH=${FILEUPLOADER_PATH:-"\${APP_ROOT}/uploads"} \ FILEUPLOADER_URI=${FILEUPLOADER_URI:-"https://localhost:16003"} \ + FILEUPLOADER_MAXSIZE=${FILEUPLOADER_MAXSIZE:-"10000"} \ SERVICE_KEY=${SERVICE_KEY:-"\${APP_ROOT}/certs/restapi-key.pem"} \ SERVICE_KEY_PASSWORD=${SERVICE_KEY_PASSWORD:-"mypassword"} \ SYSTEM_DATA=${SYSTEM_DATA:-"\${APP_ROOT}/data"} \ @@ -76,6 +77,7 @@ if [[ "$TEMPLATE_CONFIG" = 'true' ]]; then CERTIFICATES_ALLOWMISMATCH=${CERTIFICATES_ALLOWMISMATCH:-"false"} \ IPINFO_DEFAULT_COUNTRY=${IPINFO_DEFAULT_COUNTRY:-"US"} \ DEVICE_SESSION_TIMEOUT=${DEVICE_SESSION_TIMEOUT:-"600"} \ + LOGGING_LEVEL=${LOGGING_LEVEL:-"information"} \ envsubst < /"${APP_NAME}".properties.tmpl > "${APP_CONFIG}"/"${APP_NAME}".properties fi diff --git a/owgw.properties.tmpl b/owgw.properties.tmpl index 15d733b8..09c61f6c 100644 --- a/owgw.properties.tmpl +++ b/owgw.properties.tmpl @@ -52,7 +52,8 @@ openwifi.fileuploader.host.0.cert = ${FILEUPLOADER_HOST_CERT} openwifi.fileuploader.host.0.key = ${FILEUPLOADER_HOST_KEY} openwifi.fileuploader.host.0.key.password = ${FILEUPLOADER_HOST_KEY_PASSWORD} openwifi.fileuploader.path = ${FILEUPLOADER_PATH} -openwifi.fileuploader.maxsize = 10000 +# maxsize in KB +openwifi.fileuploader.maxsize = ${FILEUPLOADER_MAXSIZE} openwifi.fileuploader.uri = ${FILEUPLOADER_URI} # @@ -182,4 +183,4 @@ archiver.db.3.keep = 7 ######################################################################## logging.type = console logging.path = $OWGW_ROOT/logs -logging.level = information +logging.level = ${LOGGING_LEVEL} From 98bfb4b24d807a79b19670ce74fe306db88f37ba Mon Sep 17 00:00:00 2001 From: Carsten Schafer Date: Mon, 25 Aug 2025 10:50:34 -0400 Subject: [PATCH 10/14] Fix package manager and resolver warnings Signed-off-by: Carsten Schafer --- src/RESTAPI/RESTAPI_device_commandHandler.cpp | 12 +++++------ src/RESTAPI/RESTAPI_device_commandHandler.h | 11 ++++++---- src/RESTObjects/RESTAPI_GWobjects.cpp | 9 -------- src/framework/ow_constants.h | 3 --- src/framework/utils.cpp | 21 +++++++++++++++++++ src/framework/utils.h | 8 ++++++- 6 files changed, 41 insertions(+), 23 deletions(-) diff --git a/src/RESTAPI/RESTAPI_device_commandHandler.cpp b/src/RESTAPI/RESTAPI_device_commandHandler.cpp index 2a98a073..472e4c77 100644 --- a/src/RESTAPI/RESTAPI_device_commandHandler.cpp +++ b/src/RESTAPI/RESTAPI_device_commandHandler.cpp @@ -112,9 +112,9 @@ namespace OpenWifi { poco_debug( Logger_, fmt::format( - "Command RTTY TID={} can proceed. Identified as {} and RPCID as {}. thr_id={}", + "Command Package TID={} can proceed. Identified as {} and RPCID as {}. thr_id={}", TransactionId_, UUID, RPC, Poco::Thread::current()->id())); - return GetPackages(UUID, RPC, 300000ms, Restrictions, pkg_name); + return GetPackages(UUID, RPC, pkg_name, 300000ms, Restrictions); } default: return BadRequest(RESTAPI::Errors::InvalidCommand); @@ -450,10 +450,10 @@ namespace OpenWifi { } void RESTAPI_device_commandHandler::GetPackages(const std::string &CMD_UUID, uint64_t CMD_RPC, + const std::string pkg_name, [[maybe_unused]] std::chrono::milliseconds timeout, - [[maybe_unused]] const GWObjects::DeviceRestrictions &Restrictions, - const std::string pkg_name) { - poco_debug(Logger_, fmt::format("GET-PACKAGES({},{}): TID={} user={} serial={}. thr_id={}", + [[maybe_unused]] const GWObjects::DeviceRestrictions &Restrictions) { + poco_debug(Logger_, fmt::format("GET-PACKAGES: TID={}, user={} serial={}. thr_id={}", TransactionId_, Requester(), SerialNumber_, Poco::Thread::current()->id())); @@ -493,7 +493,7 @@ namespace OpenWifi { 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("INSTALLPACKAGE", CMD_UUID, CMD_RPC, RESTAPI::Errors::ACCESS_DENIED); diff --git a/src/RESTAPI/RESTAPI_device_commandHandler.h b/src/RESTAPI/RESTAPI_device_commandHandler.h index aff7db0f..04da9e3a 100644 --- a/src/RESTAPI/RESTAPI_device_commandHandler.h +++ b/src/RESTAPI/RESTAPI_device_commandHandler.h @@ -33,10 +33,13 @@ namespace OpenWifi { void GetStatus(); void GetChecks(); void DeleteChecks(); - void GetPackages(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout, - const GWObjects::DeviceRestrictions &R, std::string pkg_name); - void DeletePackages(const std::string &UUID, uint64_t RPC, std::chrono::milliseconds timeout, - const GWObjects::DeviceRestrictions &R); + void GetPackages(const std::string &UUID, uint64_t RPC, + std::string pkg_name, + std::chrono::milliseconds timeout, + const GWObjects::DeviceRestrictions &R); + void DeletePackages(const std::string &UUID, uint64_t RPC, + std::chrono::milliseconds timeout, + const GWObjects::DeviceRestrictions &R); bool IsDeviceSimulated(std::string &Serial); diff --git a/src/RESTObjects/RESTAPI_GWobjects.cpp b/src/RESTObjects/RESTAPI_GWobjects.cpp index 5e8742b8..00119e4d 100644 --- a/src/RESTObjects/RESTAPI_GWobjects.cpp +++ b/src/RESTObjects/RESTAPI_GWobjects.cpp @@ -848,15 +848,6 @@ namespace OpenWifi::GWObjects { field_to_json(Obj, "version", version); } - bool PackageList::from_json(const Poco::JSON::Array::Ptr &Obj) { - try { - - return true; - } catch (const Poco::Exception &E) { - } - return false; - } - void PackageList::to_json(Poco::JSON::Object &Obj) const { Obj.set("serialNumber", serialNumber); diff --git a/src/framework/ow_constants.h b/src/framework/ow_constants.h index 2ee969ec..39334fdd 100644 --- a/src/framework/ow_constants.h +++ b/src/framework/ow_constants.h @@ -748,7 +748,6 @@ namespace OpenWifi::uCentralProtocol::Events { ET_WIFISCAN, ET_ALARM, ET_REBOOTLOG, - ET_PACKAGE }; inline EVENT_MSG EventFromString(const std::string &Method) { @@ -782,8 +781,6 @@ namespace OpenWifi::uCentralProtocol::Events { return ET_ALARM; else if (strcmp(REBOOTLOG, Method.c_str()) == 0) return ET_REBOOTLOG; - else if (strcmp(PACKAGE, Method.c_str()) == 0) - return ET_PACKAGE; return ET_UNKNOWN; }; } // namespace OpenWifi::uCentralProtocol::Events diff --git a/src/framework/utils.cpp b/src/framework/utils.cpp index 4b1cb865..5eda46b5 100644 --- a/src/framework/utils.cpp +++ b/src/framework/utils.cpp @@ -888,6 +888,26 @@ namespace OpenWifi::Utils { return password; } +#if 0 +/* + Note that this function isn't used. It has been removed due to this deprecation warning: + #47 3.825 /owgw/src/framework/utils.cpp: In function 'std::vector OpenWifi::Utils::getNAPTRRecords(const std::string&)': +#47 3.825 /owgw/src/framework/utils.cpp:915:28: warning: 'int ns_sprintrr(const ns_msg*, const ns_rr*, const char*, const char*, char*, size_t)' is deprecated [-Wdeprecated-declarations] +#47 3.825 915 | ns_sprintrr(&handle, &rr, nullptr, nullptr, rdata, sizeof(rdata)); +#47 3.825 | ~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +#47 3.825 In file included from /usr/include/resolv.h:60, +#47 3.825 from /owgw/src/framework/utils.cpp:17: +#47 3.825 /usr/include/arpa/nameser.h:408:17: note: declared here +#47 3.825 408 | int ns_sprintrr (const ns_msg *, const ns_rr *, +#47 3.825 | ^~~~~~~~~~~ +#47 3.833 /owgw/src/framework/utils.cpp: In function 'std::vector OpenWifi::Utils::getSRVRecords(const std::string&)': +#47 3.833 /owgw/src/framework/utils.cpp:952:28: warning: 'int ns_sprintrr(const ns_msg*, const ns_rr*, const char*, const char*, char*, size_t)' is deprecated [-Wdeprecated-declarations] +#47 3.833 952 | ns_sprintrr(&handle, &rr, nullptr, nullptr, rdata, sizeof(rdata)); +#47 3.833 | ~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +#47 3.833 /usr/include/arpa/nameser.h:408:17: note: declared here +#47 3.833 408 | int ns_sprintrr (const ns_msg *, const ns_rr *, +#47 3.833 | ^~~~~~~~~~~ + */ // Function to query NAPTR records for a domain and return them in a vector std::vector getNAPTRRecords(const std::string& domain) { std::vector naptrRecords; @@ -923,6 +943,7 @@ namespace OpenWifi::Utils { return naptrRecords; } +#endif std::vector getSRVRecords(const std::string& domain) { std::vector srvRecords; diff --git a/src/framework/utils.h b/src/framework/utils.h index 9ebe138c..02e58192 100644 --- a/src/framework/utils.h +++ b/src/framework/utils.h @@ -298,8 +298,11 @@ namespace OpenWifi::Utils { std::string replacement; }; -// Function to query NAPTR records for a domain and return them in a vector +#if 0 + // removed due to deprecation: see utils.cpp + // Function to query NAPTR records for a domain and return them in a vector std::vector getNAPTRRecords(const std::string& domain); +#endif struct SrvRecord { std::string name; std::string ttl; @@ -311,7 +314,10 @@ namespace OpenWifi::Utils { std::string srvname; }; +#if 0 + // removed due to deprecation: see utils.cpp std::vector getSRVRecords(const std::string& domain); +#endif struct HostNameServerResult{ std::string Hostname; From 42c421ec1271e48fc62bd841e809c56e1e9ab6cd Mon Sep 17 00:00:00 2001 From: Carsten Schafer Date: Mon, 25 Aug 2025 11:01:08 -0400 Subject: [PATCH 11/14] Handle scenario where 3+ readable events including continuation frames all resulted in a final frame of 0 length Signed-off-by: Carsten Schafer --- src/AP_WS_Connection.cpp | 18 +++++++++++++----- src/FileUploader.cpp | 2 +- src/framework/MicroService.cpp | 1 - src/framework/utils.cpp | 2 +- src/storage/storage_command.cpp | 8 +++++--- 5 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/AP_WS_Connection.cpp b/src/AP_WS_Connection.cpp index 257c3055..b3a2cf86 100644 --- a/src/AP_WS_Connection.cpp +++ b/src/AP_WS_Connection.cpp @@ -605,10 +605,16 @@ namespace OpenWifi { void AP_WS_Connection::ProcessWSFinalPayload() { auto IncomingSize = IncomingFrame_.size(); + if (IncomingSize == 0) { + poco_warning(Logger_, + fmt::format("ProcessWSFrame({}): Final Acc. Frame received but empty", + CId_)); + return; + } IncomingFrame_.append(0); poco_trace(Logger_, - fmt::format("ProcessWSFrame({}): Final Frame received (len={}, Msg={}", + fmt::format("ProcessWSFrame({}): Final Acc. Frame received (len={}, Msg={}", CId_, IncomingSize, IncomingFrame_.begin())); Poco::JSON::Parser parser; @@ -676,7 +682,7 @@ namespace OpenWifi { State_.MessageCount++; State_.LastContact = Utils::Now(); poco_trace(Logger_, - fmt::format("FRAME({}): Frame {} rx (len={}, flags={}, acc.len={})", + fmt::format("FRAME({}): Frame rx (op={} len={}, flags={}, acc.len={})", CId_, Op, IncomingSize, flags, IncomingFrame_.size())); switch (Op) { @@ -698,7 +704,8 @@ namespace OpenWifi { PingDetails.set("locale", State_.locale); PingObject.set(uCentralProtocol::PING, PingDetails); poco_trace(Logger_,fmt::format("Sending PING for {}", SerialNumber_)); - KafkaManager()->PostMessage(KafkaTopics::CONNECTION, SerialNumber_,PingObject); + KafkaManager()->PostMessage(KafkaTopics::CONNECTION, SerialNumber_, + PingObject); } return; } break; @@ -721,7 +728,8 @@ namespace OpenWifi { case Poco::Net::WebSocket::FRAME_OP_TEXT: { poco_trace(Logger_, fmt::format("TEXT({}): Frame received (len={}, flags={}). Msg={}", - CId_, IncomingSize, flags, CurrentFrame.begin())); + CId_, IncomingSize, flags, + CurrentFrame.begin() == nullptr ? "" : CurrentFrame.begin())); } break; case Poco::Net::WebSocket::FRAME_OP_CLOSE: { @@ -738,7 +746,7 @@ namespace OpenWifi { } } - // Check for final frame and process accumlated payload + // Check for final frame and process accumulated payload if (!KillConnection && (flags & Poco::Net::WebSocket::FRAME_FLAG_FIN) != 0) { ProcessWSFinalPayload(); } diff --git a/src/FileUploader.cpp b/src/FileUploader.cpp index bbb0aed7..deb388cb 100644 --- a/src/FileUploader.cpp +++ b/src/FileUploader.cpp @@ -315,4 +315,4 @@ namespace OpenWifi { poco_notice(Logger(), "Stopped..."); } -} // namespace OpenWifi \ No newline at end of file +} // namespace OpenWifi diff --git a/src/framework/MicroService.cpp b/src/framework/MicroService.cpp index 05a68995..d8ce2d55 100644 --- a/src/framework/MicroService.cpp +++ b/src/framework/MicroService.cpp @@ -295,7 +295,6 @@ namespace OpenWifi { auto Level = Poco::Logger::parseLevel( MicroService::instance().ConfigGetString("logging.level", "debug")); - //Level = Poco::Logger::parseLevel("trace"); // TODO: remove this Poco::Logger::root().setLevel(Level); if (!DisableWebSocketLogging) { static const UI_WebSocketClientServer::NotificationTypeIdVec Notifications = { diff --git a/src/framework/utils.cpp b/src/framework/utils.cpp index 5eda46b5..36d3494a 100644 --- a/src/framework/utils.cpp +++ b/src/framework/utils.cpp @@ -943,7 +943,6 @@ namespace OpenWifi::Utils { return naptrRecords; } -#endif std::vector getSRVRecords(const std::string& domain) { std::vector srvRecords; @@ -981,6 +980,7 @@ namespace OpenWifi::Utils { return srvRecords; } +#endif } // namespace OpenWifi::Utils diff --git a/src/storage/storage_command.cpp b/src/storage/storage_command.cpp index 90b16456..d6cb0556 100644 --- a/src/storage/storage_command.cpp +++ b/src/storage/storage_command.cpp @@ -664,12 +664,14 @@ namespace OpenWifi { Insert.execute(); Sess.commit(); } else { - poco_warning(Logger(), fmt::format("File {} is too large.", UUID)); + poco_warning(Logger(), + fmt::format("File {} is too large ({} >= {} max bytes).", + UUID, Size, FileUploader()->MaxSize())); } // update CommandList here to ensure that file us uploaded - Sess.begin(); - Poco::Data::Statement Statement(Sess); + Sess.begin(); + Poco::Data::Statement Statement(Sess); std::string StatementStr; StatementStr = "UPDATE CommandList SET WaitingForFile=?, AttachDate=?, AttachSize=? WHERE UUID=?"; From aeef70a1216822e6892e50f26e95fa32efe67e05 Mon Sep 17 00:00:00 2001 From: Carsten Schafer Date: Tue, 26 Aug 2025 09:09:52 -0400 Subject: [PATCH 12/14] Return PONG in response to PING Signed-off-by: Carsten Schafer --- src/TelemetryClient.cpp | 2 +- src/rttys/RTTYS_server.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/TelemetryClient.cpp b/src/TelemetryClient.cpp index aea4c323..22fa370d 100644 --- a/src/TelemetryClient.cpp +++ b/src/TelemetryClient.cpp @@ -138,7 +138,7 @@ namespace OpenWifi { fmt::format("TELEMETRY-WS-PING({}): received. PONG sent back.", CId_)); WS_->sendFrame("", 0, (int)Poco::Net::WebSocket::FRAME_OP_PONG | - (int)Poco::Net::WebSocket::FRAME_FLAG_FIN); + (int)Poco::Net::WebSocket::FRAME_FLAG_FIN); } else if (Op == Poco::Net::WebSocket::FRAME_OP_CLOSE) { poco_information(Logger(), fmt::format("TELEMETRY-DISCONNECT({}): device wants to disconnect.", CId_)); diff --git a/src/rttys/RTTYS_server.cpp b/src/rttys/RTTYS_server.cpp index 87677143..f128301b 100644 --- a/src/rttys/RTTYS_server.cpp +++ b/src/rttys/RTTYS_server.cpp @@ -610,8 +610,8 @@ namespace OpenWifi { case Poco::Net::WebSocket::FRAME_OP_PING: { Connection->WSSocket_->sendFrame("", 0, - (int) Poco::Net::WebSocket::FRAME_FLAG_FIN | - (int) Poco::Net::WebSocket::FRAME_OP_BINARY); + (int)Poco::Net::WebSocket::FRAME_OP_PONG | + (int)Poco::Net::WebSocket::FRAME_OP_BINARY); } break; case Poco::Net::WebSocket::FRAME_OP_PONG: { From 8b28fa043596d2a7e97da0e00ca60d7a940fc4b2 Mon Sep 17 00:00:00 2001 From: Carsten Schafer Date: Tue, 26 Aug 2025 13:04:30 -0400 Subject: [PATCH 13/14] Some more cleanup - remove code using deprecated functions Signed-off-by: Carsten Schafer --- src/AP_WS_Connection.h | 1 - src/framework/utils.cpp | 98 +++-------------------------------------- src/framework/utils.h | 9 ++-- 3 files changed, 10 insertions(+), 98 deletions(-) diff --git a/src/AP_WS_Connection.h b/src/AP_WS_Connection.h index f6aca4dc..f509072f 100644 --- a/src/AP_WS_Connection.h +++ b/src/AP_WS_Connection.h @@ -30,7 +30,6 @@ namespace OpenWifi { Poco::Logger &L, std::pair, std::shared_ptr> R); ~AP_WS_Connection(); - void LogOpenSslErrors(); void EndConnection(); void ProcessJSONRPCEvent(Poco::JSON::Object::Ptr &Doc); void ProcessJSONRPCResult(Poco::JSON::Object::Ptr Doc); diff --git a/src/framework/utils.cpp b/src/framework/utils.cpp index 36d3494a..8bcced29 100644 --- a/src/framework/utils.cpp +++ b/src/framework/utils.cpp @@ -888,99 +888,15 @@ namespace OpenWifi::Utils { return password; } -#if 0 -/* - Note that this function isn't used. It has been removed due to this deprecation warning: - #47 3.825 /owgw/src/framework/utils.cpp: In function 'std::vector OpenWifi::Utils::getNAPTRRecords(const std::string&)': + /* + Note that these 2 functions aren't used. They have been removed due to this deprecation warning: + // Function to query NAPTR records for a domain and return them in a vector + #47 3.825 /owgw/src/framework/utils.cpp: In function 'std::vector OpenWifi::Utils::getNAPTRRecords(const std::string&)': #47 3.825 /owgw/src/framework/utils.cpp:915:28: warning: 'int ns_sprintrr(const ns_msg*, const ns_rr*, const char*, const char*, char*, size_t)' is deprecated [-Wdeprecated-declarations] -#47 3.825 915 | ns_sprintrr(&handle, &rr, nullptr, nullptr, rdata, sizeof(rdata)); -#47 3.825 | ~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -#47 3.825 In file included from /usr/include/resolv.h:60, -#47 3.825 from /owgw/src/framework/utils.cpp:17: -#47 3.825 /usr/include/arpa/nameser.h:408:17: note: declared here -#47 3.825 408 | int ns_sprintrr (const ns_msg *, const ns_rr *, -#47 3.825 | ^~~~~~~~~~~ -#47 3.833 /owgw/src/framework/utils.cpp: In function 'std::vector OpenWifi::Utils::getSRVRecords(const std::string&)': -#47 3.833 /owgw/src/framework/utils.cpp:952:28: warning: 'int ns_sprintrr(const ns_msg*, const ns_rr*, const char*, const char*, char*, size_t)' is deprecated [-Wdeprecated-declarations] -#47 3.833 952 | ns_sprintrr(&handle, &rr, nullptr, nullptr, rdata, sizeof(rdata)); -#47 3.833 | ~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -#47 3.833 /usr/include/arpa/nameser.h:408:17: note: declared here -#47 3.833 408 | int ns_sprintrr (const ns_msg *, const ns_rr *, -#47 3.833 | ^~~~~~~~~~~ - */ -// Function to query NAPTR records for a domain and return them in a vector - std::vector getNAPTRRecords(const std::string& domain) { - std::vector naptrRecords; - - unsigned char buf[4096]; - ns_msg handle; - ns_initparse(buf, NS_PACKETSZ, &handle); - - // Query NAPTR records for the given domain - int response = res_query(domain.c_str(), ns_c_in, ns_t_naptr, buf, sizeof(buf)); - if (response < 0) { - return naptrRecords; - } - - if(ns_initparse(buf, response, &handle) < 0) { - return naptrRecords; - } - - // Iterate through the DNS response and extract NAPTR records - int count = ns_msg_count(handle, ns_s_an); - for (int i = 0; i < count; ++i) { - ns_rr rr; - if (ns_parserr(&handle, ns_s_an, i, &rr) == 0) { - char rdata[256]; - ns_sprintrr(&handle, &rr, nullptr, nullptr, rdata, sizeof(rdata)); - NAPTRRecord record; - std::istringstream os(rdata); - os >> record.name >> record.ttl >> record.rclass >> record.rtype >> record.order >> record.preference >> record.flags - >> record.service >> record.regexp >> record.replacement; - naptrRecords.push_back(record); - } - } - - return naptrRecords; - } std::vector getSRVRecords(const std::string& domain) { - std::vector srvRecords; - - // Buffer to hold the DNS response - unsigned char buf[4096]; - ns_msg handle; - ns_initparse(buf, NS_PACKETSZ, &handle); - - // Query NAPTR records for the given domain - int response = res_query(domain.c_str(), ns_c_in, ns_t_srv, buf, sizeof(buf)); - if (response < 0) { - std::cerr << "DNS query failed for " << domain << ": " << hstrerror(h_errno) << std::endl; - return srvRecords; - } - - if(ns_initparse(buf, response, &handle) < 0) { - return srvRecords; - } - - // Iterate through the DNS response and extract NAPTR records - int count = ns_msg_count(handle, ns_s_an); - for (int i = 0; i < count; ++i) { - ns_rr rr; - if (ns_parserr(&handle, ns_s_an, i, &rr) == 0) { - char rdata[256]; - ns_sprintrr(&handle, &rr, nullptr, nullptr, rdata, sizeof(rdata)); - SrvRecord record; - std::istringstream os(rdata); - os >> record.name >> record.ttl >> record.rclass >> record.rtype >> record.pref >> record.weight >> - record.port >> record.srvname ; - srvRecords.push_back(record); - } - } - - return srvRecords; - } -#endif - + #47 3.833 /owgw/src/framework/utils.cpp: In function 'std::vector OpenWifi::Utils::getSRVRecords(const std::string&)': + #47 3.833 /owgw/src/framework/utils.cpp:952:28: warning: 'int ns_sprintrr(const ns_msg*, const ns_rr*, const char*, const char*, char*, size_t)' is deprecated [-Wdeprecated-declarations] + */ } // namespace OpenWifi::Utils diff --git a/src/framework/utils.h b/src/framework/utils.h index 02e58192..093ca6a9 100644 --- a/src/framework/utils.h +++ b/src/framework/utils.h @@ -298,11 +298,10 @@ namespace OpenWifi::Utils { std::string replacement; }; -#if 0 // removed due to deprecation: see utils.cpp // Function to query NAPTR records for a domain and return them in a vector - std::vector getNAPTRRecords(const std::string& domain); -#endif + //std::vector getNAPTRRecords(const std::string& domain); + struct SrvRecord { std::string name; std::string ttl; @@ -314,10 +313,8 @@ namespace OpenWifi::Utils { std::string srvname; }; -#if 0 // removed due to deprecation: see utils.cpp - std::vector getSRVRecords(const std::string& domain); -#endif + // std::vector getSRVRecords(const std::string& domain); struct HostNameServerResult{ std::string Hostname; From ee2e9a19c0c9ea836f33394041eec8f0e861c1cc Mon Sep 17 00:00:00 2001 From: Carsten Schafer Date: Tue, 2 Sep 2025 13:28:11 -0400 Subject: [PATCH 14/14] Remove warning and fix RTTY PONG flags Signed-off-by: Carsten Schafer --- src/AP_WS_Connection.cpp | 2 +- src/rttys/RTTYS_server.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/AP_WS_Connection.cpp b/src/AP_WS_Connection.cpp index b3a2cf86..32f63c5f 100644 --- a/src/AP_WS_Connection.cpp +++ b/src/AP_WS_Connection.cpp @@ -606,7 +606,7 @@ namespace OpenWifi { auto IncomingSize = IncomingFrame_.size(); if (IncomingSize == 0) { - poco_warning(Logger_, + poco_debug(Logger_, fmt::format("ProcessWSFrame({}): Final Acc. Frame received but empty", CId_)); return; diff --git a/src/rttys/RTTYS_server.cpp b/src/rttys/RTTYS_server.cpp index f128301b..97e559b3 100644 --- a/src/rttys/RTTYS_server.cpp +++ b/src/rttys/RTTYS_server.cpp @@ -611,7 +611,7 @@ namespace OpenWifi { case Poco::Net::WebSocket::FRAME_OP_PING: { Connection->WSSocket_->sendFrame("", 0, (int)Poco::Net::WebSocket::FRAME_OP_PONG | - (int)Poco::Net::WebSocket::FRAME_OP_BINARY); + (int)Poco::Net::WebSocket::FRAME_FLAG_FIN); } break; case Poco::Net::WebSocket::FRAME_OP_PONG: {