diff --git a/Dockerfile b/Dockerfile index b1409954..93a6604b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ -ARG DEBIAN_VERSION=11.5-slim -ARG POCO_VERSION=poco-tip-v2 +ARG DEBIAN_VERSION=bookworm +ARG POCO_VERSION=poco-tip-v4-tag ARG CPPKAFKA_VERSION=tip-v1 ARG VALIJASON_VERSION=tip-v1.0.2 ARG APP_NAME=owgw @@ -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/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} diff --git a/src/AP_WS_Connection.cpp b/src/AP_WS_Connection.cpp index 6dba49bb..32f63c5f 100644 --- a/src/AP_WS_Connection.cpp +++ b/src/AP_WS_Connection.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -39,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; @@ -54,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(); @@ -600,36 +602,95 @@ namespace OpenWifi { EndConnection(); } + void AP_WS_Connection::ProcessWSFinalPayload() { + auto IncomingSize = IncomingFrame_.size(); + + if (IncomingSize == 0) { + poco_debug(Logger_, + fmt::format("ProcessWSFrame({}): Final Acc. Frame received but empty", + CId_)); + return; + } + IncomingFrame_.append(0); + + poco_trace(Logger_, + fmt::format("ProcessWSFrame({}): Final Acc. 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 (op={} 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; @@ -643,49 +704,32 @@ 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; 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() == nullptr ? "" : CurrentFrame.begin())); } break; case Poco::Net::WebSocket::FRAME_OP_CLOSE: { @@ -701,25 +745,31 @@ namespace OpenWifi { return; } } + + // Check for final frame and process accumulated 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) { @@ -728,42 +778,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 (...) { @@ -776,7 +826,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(); } @@ -921,4 +973,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 3ec0c357..f509072f 100644 --- a/src/AP_WS_Connection.h +++ b/src/AP_WS_Connection.h @@ -33,6 +33,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); @@ -145,6 +146,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; @@ -175,4 +177,4 @@ namespace OpenWifi { }; -} // namespace OpenWifi \ No newline at end of file +} // namespace OpenWifi 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/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/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/TelemetryClient.cpp b/src/TelemetryClient.cpp index 3fc92f49..22fa370d 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 { @@ -136,12 +138,14 @@ 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(), + 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..d8ce2d55 100644 --- a/src/framework/MicroService.cpp +++ b/src/framework/MicroService.cpp @@ -845,4 +845,4 @@ namespace OpenWifi { } } -} // namespace OpenWifi \ No newline at end of file +} // namespace OpenWifi diff --git a/src/framework/MicroService.h b/src/framework/MicroService.h index a991316f..6fb1da7a 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. @@ -40,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/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/framework/SubSystemServer.cpp b/src/framework/SubSystemServer.cpp index 1061cfd4..a543d1b4 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 = @@ -344,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/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..8bcced29 100644 --- a/src/framework/utils.cpp +++ b/src/framework/utils.cpp @@ -888,78 +888,15 @@ namespace OpenWifi::Utils { return password; } -// 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; - } + /* + 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] 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; - } - + #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 9ebe138c..093ca6a9 100644 --- a/src/framework/utils.h +++ b/src/framework/utils.h @@ -298,8 +298,10 @@ namespace OpenWifi::Utils { std::string replacement; }; -// Function to query NAPTR records for a domain and return them in a vector - std::vector getNAPTRRecords(const std::string& domain); + // 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); + struct SrvRecord { std::string name; std::string ttl; @@ -311,7 +313,8 @@ namespace OpenWifi::Utils { std::string srvname; }; - std::vector getSRVRecords(const std::string& domain); + // removed due to deprecation: see utils.cpp + // std::vector getSRVRecords(const std::string& domain); struct HostNameServerResult{ std::string Hostname; diff --git a/src/rttys/RTTYS_server.cpp b/src/rttys/RTTYS_server.cpp index 31f89ba5..97e559b3 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_OP_PONG | + (int)Poco::Net::WebSocket::FRAME_FLAG_FIN); } 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; } 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=?"; 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();