mirror of
				https://github.com/Telecominfraproject/wlan-cloud-ucentralgw.git
				synced 2025-11-04 04:37:46 +00:00 
			
		
		
		
	Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
This commit is contained in:
		@@ -1,5 +1,5 @@
 | 
			
		||||
cmake_minimum_required(VERSION 3.13)
 | 
			
		||||
project(owgw VERSION 2.6.0)
 | 
			
		||||
project(owgw VERSION 2.7.0)
 | 
			
		||||
 | 
			
		||||
set(CMAKE_CXX_STANDARD 17)
 | 
			
		||||
 | 
			
		||||
@@ -105,7 +105,7 @@ add_executable( owgw
 | 
			
		||||
        src/storage/storage_tables.cpp
 | 
			
		||||
        src/RESTAPI/RESTAPI_routers.cpp
 | 
			
		||||
        src/Daemon.cpp src/Daemon.h
 | 
			
		||||
        src/WS_Server.cpp src/WS_Server.h
 | 
			
		||||
        src/AP_WS_Server.cpp src/AP_WS_Server.h
 | 
			
		||||
        src/StorageService.cpp src/StorageService.h
 | 
			
		||||
        src/DeviceRegistry.cpp src/DeviceRegistry.h
 | 
			
		||||
        src/CommandManager.cpp src/CommandManager.h
 | 
			
		||||
@@ -118,7 +118,7 @@ add_executable( owgw
 | 
			
		||||
        src/TelemetryStream.cpp src/TelemetryStream.h
 | 
			
		||||
        src/framework/ConfigurationValidator.cpp src/framework/ConfigurationValidator.h
 | 
			
		||||
        src/ConfigurationCache.h
 | 
			
		||||
        src/CapabilitiesCache.h src/FindCountry.h src/rttys/RTTYS_server.cpp src/rttys/RTTYS_server.h src/rttys/RTTYS_device.cpp src/rttys/RTTYS_device.h src/rttys/RTTYS_ClientConnection.cpp src/rttys/RTTYS_ClientConnection.h src/rttys/RTTYS_WebServer.cpp src/rttys/RTTYS_WebServer.h src/RESTAPI/RESTAPI_device_helper.h src/SDKcalls.cpp src/SDKcalls.h src/StateUtils.cpp src/StateUtils.h src/WS_ReactorPool.h src/WS_Connection.h src/WS_Connection.cpp src/TelemetryClient.h src/TelemetryClient.cpp src/RESTAPI/RESTAPI_iptocountry_handler.cpp src/RESTAPI/RESTAPI_iptocountry_handler.h src/framework/ow_constants.h src/GwWebSocketClient.cpp src/GwWebSocketClient.h src/framework/WebSocketClientNotifications.h src/RADIUS_proxy_server.cpp src/RADIUS_proxy_server.h src/RESTAPI/RESTAPI_radiusProxyConfig_handler.cpp src/RESTAPI/RESTAPI_radiusProxyConfig_handler.h src/ParseWifiScan.h src/RADIUS_helpers.h src/VenueBroadcaster.h src/sdks/sdk_prov.h)
 | 
			
		||||
        src/CapabilitiesCache.h src/FindCountry.h src/rttys/RTTYS_server.cpp src/rttys/RTTYS_server.h src/rttys/RTTYS_device.cpp src/rttys/RTTYS_device.h src/rttys/RTTYS_ClientConnection.cpp src/rttys/RTTYS_ClientConnection.h src/rttys/RTTYS_WebServer.cpp src/rttys/RTTYS_WebServer.h src/RESTAPI/RESTAPI_device_helper.h src/SDKcalls.cpp src/SDKcalls.h src/StateUtils.cpp src/StateUtils.h src/WS_ReactorPool.h src/AP_WS_Connection.h src/AP_WS_Connection.cpp src/TelemetryClient.h src/TelemetryClient.cpp src/RESTAPI/RESTAPI_iptocountry_handler.cpp src/RESTAPI/RESTAPI_iptocountry_handler.h src/framework/ow_constants.h src/GwWebSocketClient.cpp src/GwWebSocketClient.h src/framework/WebSocketClientNotifications.h src/RADIUS_proxy_server.cpp src/RADIUS_proxy_server.h src/RESTAPI/RESTAPI_radiusProxyConfig_handler.cpp src/RESTAPI/RESTAPI_radiusProxyConfig_handler.h src/ParseWifiScan.h src/RADIUS_helpers.h src/VenueBroadcaster.h src/sdks/sdk_prov.h)
 | 
			
		||||
 | 
			
		||||
if(NOT SMALL_BUILD)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
// Created by stephane bourque on 2022-02-03.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include "WS_Connection.h"
 | 
			
		||||
#include "AP_WS_Connection.h"
 | 
			
		||||
 | 
			
		||||
#include "Poco/Net/SecureStreamSocketImpl.h"
 | 
			
		||||
#include "Poco/Net/SecureServerSocketImpl.h"
 | 
			
		||||
@@ -17,30 +17,34 @@
 | 
			
		||||
 | 
			
		||||
#include "Poco/zlib.h"
 | 
			
		||||
 | 
			
		||||
#include "WS_Server.h"
 | 
			
		||||
#include "StorageService.h"
 | 
			
		||||
#include "AP_WS_Server.h"
 | 
			
		||||
#include "CentralConfig.h"
 | 
			
		||||
#include "CommandManager.h"
 | 
			
		||||
#include "StateUtils.h"
 | 
			
		||||
#include "ConfigurationCache.h"
 | 
			
		||||
#include "Daemon.h"
 | 
			
		||||
#include "TelemetryStream.h"
 | 
			
		||||
#include "CentralConfig.h"
 | 
			
		||||
#include "FindCountry.h"
 | 
			
		||||
#include "StateUtils.h"
 | 
			
		||||
#include "StorageService.h"
 | 
			
		||||
#include "TelemetryStream.h"
 | 
			
		||||
#include "VenueBroadcaster.h"
 | 
			
		||||
#include "framework/WebSocketClientNotifications.h"
 | 
			
		||||
#include "Poco/Net/WebSocketImpl.h"
 | 
			
		||||
 | 
			
		||||
#include "RADIUS_proxy_server.h"
 | 
			
		||||
 | 
			
		||||
namespace OpenWifi {
 | 
			
		||||
 | 
			
		||||
	void WSConnection::LogException(const Poco::Exception &E) {
 | 
			
		||||
	void AP_WS_Connection::LogException(const Poco::Exception &E) {
 | 
			
		||||
		Logger().information(fmt::format("EXCEPTION({}): {}", CId_, E.displayText()));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void WSConnection::CompleteStartup() {
 | 
			
		||||
	void AP_WS_Connection::CompleteStartup() {
 | 
			
		||||
 | 
			
		||||
		std::lock_guard Guard(Mutex_);
 | 
			
		||||
		try {
 | 
			
		||||
			auto SS = dynamic_cast<Poco::Net::SecureStreamSocketImpl *>(Socket_.impl());
 | 
			
		||||
			auto SockImpl = dynamic_cast<Poco::Net::WebSocketImpl *>(WS_->impl());
 | 
			
		||||
			auto SS = dynamic_cast<Poco::Net::SecureStreamSocketImpl*>(SockImpl->streamSocketImpl());
 | 
			
		||||
 | 
			
		||||
			while (true) {
 | 
			
		||||
				auto V = SS->completeHandshake();
 | 
			
		||||
				if (V == 1)
 | 
			
		||||
@@ -60,7 +64,7 @@ namespace OpenWifi {
 | 
			
		||||
				try {
 | 
			
		||||
					Poco::Crypto::X509Certificate PeerCert(SS->peerCertificate());
 | 
			
		||||
 | 
			
		||||
					if (WebSocketServer()->ValidateCertificate(CId_, PeerCert)) {
 | 
			
		||||
					if (AP_WS_Server()->ValidateCertificate(CId_, PeerCert)) {
 | 
			
		||||
						CN_ = Poco::trim(Poco::toLower(PeerCert.commonName()));
 | 
			
		||||
						CertValidation_ = GWObjects::MISMATCH_SERIAL;
 | 
			
		||||
						poco_trace(Logger(),fmt::format("{}: Valid certificate: CN={}", CId_, CN_));
 | 
			
		||||
@@ -74,7 +78,7 @@ namespace OpenWifi {
 | 
			
		||||
				poco_error(Logger(),fmt::format("{}: No certificates available..", CId_));
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if (WebSocketServer::IsSim(CN_) && !WebSocketServer()->IsSimEnabled()) {
 | 
			
		||||
			if (AP_WS_Server::IsSim(CN_) && !AP_WS_Server()->IsSimEnabled()) {
 | 
			
		||||
				Logger().debug(fmt::format(
 | 
			
		||||
					"CONNECTION({}): Sim Device {} is not allowed. Disconnecting.", CId_, CN_));
 | 
			
		||||
				delete this;
 | 
			
		||||
@@ -89,32 +93,20 @@ namespace OpenWifi {
 | 
			
		||||
											CId_, CN_));
 | 
			
		||||
				return delete this;
 | 
			
		||||
			}
 | 
			
		||||
			auto Params = Poco::AutoPtr<Poco::Net::HTTPServerParams>(new Poco::Net::HTTPServerParams);
 | 
			
		||||
			Poco::Net::HTTPServerSession Session(Socket_, Params);
 | 
			
		||||
			Poco::Net::HTTPServerResponseImpl Response(Session);
 | 
			
		||||
			Poco::Net::HTTPServerRequestImpl Request(Response, Session, Params);
 | 
			
		||||
 | 
			
		||||
			auto now = OpenWifi::Now();
 | 
			
		||||
			Response.setDate(now);
 | 
			
		||||
			Response.setVersion(Request.getVersion());
 | 
			
		||||
			Response.setKeepAlive(Params->getKeepAlive() && Request.getKeepAlive() &&
 | 
			
		||||
								  Session.canKeepAlive());
 | 
			
		||||
			WS_ = std::make_unique<Poco::Net::WebSocket>(Request, Response);
 | 
			
		||||
			WS_->setMaxPayloadSize(BufSize);
 | 
			
		||||
			auto TS = Poco::Timespan(360, 0);
 | 
			
		||||
 | 
			
		||||
			WS_->setReceiveTimeout(TS);
 | 
			
		||||
			WS_->setNoDelay(true);
 | 
			
		||||
			WS_->setKeepAlive(true);
 | 
			
		||||
 | 
			
		||||
			Reactor_.addEventHandler(*WS_,
 | 
			
		||||
									 Poco::NObserver<WSConnection, Poco::Net::ReadableNotification>(
 | 
			
		||||
										 *this, &WSConnection::OnSocketReadable));
 | 
			
		||||
									 Poco::NObserver<AP_WS_Connection, Poco::Net::ReadableNotification>(
 | 
			
		||||
										 *this, &AP_WS_Connection::OnSocketReadable));
 | 
			
		||||
			Reactor_.addEventHandler(*WS_,
 | 
			
		||||
									 Poco::NObserver<WSConnection, Poco::Net::ShutdownNotification>(
 | 
			
		||||
										 *this, &WSConnection::OnSocketShutdown));
 | 
			
		||||
			Reactor_.addEventHandler(*WS_, Poco::NObserver<WSConnection, Poco::Net::ErrorNotification>(
 | 
			
		||||
											   *this, &WSConnection::OnSocketError));
 | 
			
		||||
									 Poco::NObserver<AP_WS_Connection, Poco::Net::ShutdownNotification>(
 | 
			
		||||
										 *this, &AP_WS_Connection::OnSocketShutdown));
 | 
			
		||||
			Reactor_.addEventHandler(*WS_, Poco::NObserver<AP_WS_Connection, Poco::Net::ErrorNotification>(
 | 
			
		||||
											   *this, &AP_WS_Connection::OnSocketError));
 | 
			
		||||
			Registered_ = true;
 | 
			
		||||
			poco_debug(Logger(),fmt::format("CONNECTION({}): completed.", CId_));
 | 
			
		||||
			return;
 | 
			
		||||
@@ -154,13 +146,13 @@ namespace OpenWifi {
 | 
			
		||||
		return delete this;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	WSConnection::WSConnection(Poco::Net::StreamSocket &socket, [[maybe_unused]] Poco::Net::SocketReactor &reactor)
 | 
			
		||||
		: Logger_(WebSocketServer()->Logger()) ,
 | 
			
		||||
		  Socket_(socket),
 | 
			
		||||
		  Reactor_(ReactorThreadPool()->NextReactor())
 | 
			
		||||
	AP_WS_Connection::AP_WS_Connection(Poco::Net::HTTPServerRequest &request,
 | 
			
		||||
									   Poco::Net::HTTPServerResponse &response)
 | 
			
		||||
		: Logger_(AP_WS_Server()->Logger()) ,
 | 
			
		||||
		  Reactor_(AP_WS_Server()->NextReactor())
 | 
			
		||||
  	{
 | 
			
		||||
		std::thread T([=]() { CompleteStartup(); });
 | 
			
		||||
		T.detach();
 | 
			
		||||
		WS_ = std::make_unique<Poco::Net::WebSocket>(request,response);
 | 
			
		||||
		CompleteStartup();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	static void NotifyKafkaDisconnect(const std::string & SerialNumber) {
 | 
			
		||||
@@ -178,7 +170,7 @@ namespace OpenWifi {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	WSConnection::~WSConnection() {
 | 
			
		||||
	AP_WS_Connection::~AP_WS_Connection() {
 | 
			
		||||
 | 
			
		||||
		poco_debug(Logger(),fmt::format("{}: Removing connection for {}.", CId_, SerialNumber_));
 | 
			
		||||
		if (ConnectionId_)
 | 
			
		||||
@@ -186,19 +178,17 @@ namespace OpenWifi {
 | 
			
		||||
 | 
			
		||||
		if (Registered_ && WS_) {
 | 
			
		||||
			Reactor_.removeEventHandler(*WS_,
 | 
			
		||||
										Poco::NObserver<WSConnection, Poco::Net::ReadableNotification>(
 | 
			
		||||
											*this, &WSConnection::OnSocketReadable));
 | 
			
		||||
										Poco::NObserver<AP_WS_Connection, Poco::Net::ReadableNotification>(
 | 
			
		||||
											*this, &AP_WS_Connection::OnSocketReadable));
 | 
			
		||||
			Reactor_.removeEventHandler(*WS_,
 | 
			
		||||
										Poco::NObserver<WSConnection, Poco::Net::ShutdownNotification>(
 | 
			
		||||
											*this, &WSConnection::OnSocketShutdown));
 | 
			
		||||
										Poco::NObserver<AP_WS_Connection, Poco::Net::ShutdownNotification>(
 | 
			
		||||
											*this, &AP_WS_Connection::OnSocketShutdown));
 | 
			
		||||
			Reactor_.removeEventHandler(*WS_,
 | 
			
		||||
										Poco::NObserver<WSConnection, Poco::Net::ErrorNotification>(
 | 
			
		||||
											*this, &WSConnection::OnSocketError));
 | 
			
		||||
										Poco::NObserver<AP_WS_Connection, Poco::Net::ErrorNotification>(
 | 
			
		||||
											*this, &AP_WS_Connection::OnSocketError));
 | 
			
		||||
			(*WS_).close();
 | 
			
		||||
			Socket_.shutdown();
 | 
			
		||||
		} else if (WS_) {
 | 
			
		||||
			(*WS_).close();
 | 
			
		||||
			Socket_.shutdown();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (KafkaManager()->Enabled() && !SerialNumber_.empty()) {
 | 
			
		||||
@@ -210,7 +200,7 @@ namespace OpenWifi {
 | 
			
		||||
		WebSocketClientNotificationDeviceDisconnected(SerialNumber_);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bool WSConnection::LookForUpgrade(const uint64_t UUID, uint64_t & UpgradedUUID) {
 | 
			
		||||
	bool AP_WS_Connection::LookForUpgrade(const uint64_t UUID, uint64_t & UpgradedUUID) {
 | 
			
		||||
 | 
			
		||||
		//	A UUID of zero means ignore updates for that connection.
 | 
			
		||||
		if (UUID == 0)
 | 
			
		||||
@@ -276,11 +266,11 @@ namespace OpenWifi {
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void WSConnection::ProcessJSONRPCResult(Poco::JSON::Object::Ptr Doc) {
 | 
			
		||||
	void AP_WS_Connection::ProcessJSONRPCResult(Poco::JSON::Object::Ptr Doc) {
 | 
			
		||||
		CommandManager()->PostCommandResult(SerialNumber_, *Doc);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void WSConnection::ProcessJSONRPCEvent(Poco::JSON::Object::Ptr &Doc) {
 | 
			
		||||
	void AP_WS_Connection::ProcessJSONRPCEvent(Poco::JSON::Object::Ptr &Doc) {
 | 
			
		||||
 | 
			
		||||
		auto Method = Doc->get(uCentralProtocol::METHOD).toString();
 | 
			
		||||
		auto EventType = uCentralProtocol::Events::EventFromString(Method);
 | 
			
		||||
@@ -373,7 +363,7 @@ namespace OpenWifi {
 | 
			
		||||
				CId_ = SerialNumber_ + "@" + CId_;
 | 
			
		||||
				//	We need to verify the certificate if we have one
 | 
			
		||||
				if ((!CN_.empty() && Utils::SerialNumberMatch(CN_, SerialNumber_)) ||
 | 
			
		||||
					WebSocketServer()->IsSimSerialNumber(CN_)) {
 | 
			
		||||
					AP_WS_Server()->IsSimSerialNumber(CN_)) {
 | 
			
		||||
					CertValidation_ = GWObjects::VERIFIED;
 | 
			
		||||
					poco_information(Logger(), fmt::format("CONNECT({}): Fully validated and authenticated device.", CId_));
 | 
			
		||||
				} else {
 | 
			
		||||
@@ -774,7 +764,7 @@ namespace OpenWifi {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bool WSConnection::StartTelemetry() {
 | 
			
		||||
	bool AP_WS_Connection::StartTelemetry() {
 | 
			
		||||
		// std::cout << "Start telemetry for " << SerialNumber_ << std::endl;
 | 
			
		||||
		poco_information(Logger(), fmt::format("TELEMETRY({}): Starting.", CId_));
 | 
			
		||||
		Poco::JSON::Object StartMessage;
 | 
			
		||||
@@ -797,7 +787,7 @@ namespace OpenWifi {
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bool WSConnection::StopTelemetry() {
 | 
			
		||||
	bool AP_WS_Connection::StopTelemetry() {
 | 
			
		||||
		// std::cout << "Stop telemetry for " << SerialNumber_ << std::endl;
 | 
			
		||||
		poco_information(Logger(), fmt::format("TELEMETRY({}): Stopping.", CId_));
 | 
			
		||||
		Poco::JSON::Object StopMessage;
 | 
			
		||||
@@ -817,14 +807,14 @@ namespace OpenWifi {
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void WSConnection::UpdateCounts() {
 | 
			
		||||
	void AP_WS_Connection::UpdateCounts() {
 | 
			
		||||
		if (Conn_) {
 | 
			
		||||
			Conn_->Conn_.kafkaClients = TelemetryKafkaRefCount_;
 | 
			
		||||
			Conn_->Conn_.webSocketClients = TelemetryWebSocketRefCount_;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bool WSConnection::SetWebSocketTelemetryReporting(uint64_t Interval,
 | 
			
		||||
	bool AP_WS_Connection::SetWebSocketTelemetryReporting(uint64_t Interval,
 | 
			
		||||
													  uint64_t LifeTime) {
 | 
			
		||||
		std::lock_guard G(Mutex_);
 | 
			
		||||
		TelemetryWebSocketRefCount_++;
 | 
			
		||||
@@ -839,7 +829,7 @@ namespace OpenWifi {
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bool WSConnection::SetKafkaTelemetryReporting(uint64_t Interval, uint64_t LifeTime) {
 | 
			
		||||
	bool AP_WS_Connection::SetKafkaTelemetryReporting(uint64_t Interval, uint64_t LifeTime) {
 | 
			
		||||
		std::lock_guard G(Mutex_);
 | 
			
		||||
		TelemetryKafkaRefCount_++;
 | 
			
		||||
		TelemetryInterval_ = TelemetryInterval_ ? std::min(Interval, TelemetryInterval_) : Interval;
 | 
			
		||||
@@ -853,7 +843,7 @@ namespace OpenWifi {
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bool WSConnection::StopWebSocketTelemetry() {
 | 
			
		||||
	bool AP_WS_Connection::StopWebSocketTelemetry() {
 | 
			
		||||
		std::lock_guard G(Mutex_);
 | 
			
		||||
		if (TelemetryWebSocketRefCount_)
 | 
			
		||||
			TelemetryWebSocketRefCount_--;
 | 
			
		||||
@@ -865,7 +855,7 @@ namespace OpenWifi {
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bool WSConnection::StopKafkaTelemetry() {
 | 
			
		||||
	bool AP_WS_Connection::StopKafkaTelemetry() {
 | 
			
		||||
		std::lock_guard G(Mutex_);
 | 
			
		||||
		if (TelemetryKafkaRefCount_)
 | 
			
		||||
			TelemetryKafkaRefCount_--;
 | 
			
		||||
@@ -877,19 +867,19 @@ namespace OpenWifi {
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void WSConnection::OnSocketShutdown([[maybe_unused]] const Poco::AutoPtr<Poco::Net::ShutdownNotification> &pNf) {
 | 
			
		||||
	void AP_WS_Connection::OnSocketShutdown([[maybe_unused]] const Poco::AutoPtr<Poco::Net::ShutdownNotification> &pNf) {
 | 
			
		||||
		std::lock_guard Guard(Mutex_);
 | 
			
		||||
		poco_trace(Logger(), fmt::format("SOCKET-SHUTDOWN({}): Closing.", CId_));
 | 
			
		||||
		delete this;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void WSConnection::OnSocketError([[maybe_unused]] const Poco::AutoPtr<Poco::Net::ErrorNotification> &pNf) {
 | 
			
		||||
	void AP_WS_Connection::OnSocketError([[maybe_unused]] const Poco::AutoPtr<Poco::Net::ErrorNotification> &pNf) {
 | 
			
		||||
		std::lock_guard Guard(Mutex_);
 | 
			
		||||
		poco_trace(Logger(), fmt::format("SOCKET-ERROR({}): Closing.", CId_));
 | 
			
		||||
		delete this;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void WSConnection::OnSocketReadable([[maybe_unused]] const Poco::AutoPtr<Poco::Net::ReadableNotification> &pNf) {
 | 
			
		||||
	void AP_WS_Connection::OnSocketReadable([[maybe_unused]] const Poco::AutoPtr<Poco::Net::ReadableNotification> &pNf) {
 | 
			
		||||
		std::lock_guard Guard(Mutex_);
 | 
			
		||||
		try {
 | 
			
		||||
			ProcessIncomingFrame();
 | 
			
		||||
@@ -914,7 +904,7 @@ namespace OpenWifi {
 | 
			
		||||
		return "";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void WSConnection::ProcessIncomingFrame() {
 | 
			
		||||
	void AP_WS_Connection::ProcessIncomingFrame() {
 | 
			
		||||
 | 
			
		||||
		// bool MustDisconnect=false;
 | 
			
		||||
		Poco::Buffer<char> IncomingFrame(0);
 | 
			
		||||
@@ -1082,7 +1072,7 @@ namespace OpenWifi {
 | 
			
		||||
		delete this;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bool WSConnection::Send(const std::string &Payload) {
 | 
			
		||||
	bool AP_WS_Connection::Send(const std::string &Payload) {
 | 
			
		||||
		std::lock_guard Guard(Mutex_);
 | 
			
		||||
 | 
			
		||||
		size_t BytesSent = WS_->sendFrame(Payload.c_str(), (int)Payload.size());
 | 
			
		||||
@@ -1103,7 +1093,7 @@ namespace OpenWifi {
 | 
			
		||||
		return ofs.str();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bool WSConnection::SendRadiusAuthenticationData(const unsigned char * buffer, std::size_t size) {
 | 
			
		||||
	bool AP_WS_Connection::SendRadiusAuthenticationData(const unsigned char * buffer, std::size_t size) {
 | 
			
		||||
		Poco::JSON::Object	Answer;
 | 
			
		||||
		Answer.set(uCentralProtocol::RADIUS,uCentralProtocol::RADIUSAUTH);
 | 
			
		||||
		Answer.set(uCentralProtocol::RADIUSDATA, Base64Encode(buffer,size));
 | 
			
		||||
@@ -1113,7 +1103,7 @@ namespace OpenWifi {
 | 
			
		||||
		return Send(Payload.str());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bool WSConnection::SendRadiusAccountingData(const unsigned char * buffer, std::size_t size) {
 | 
			
		||||
	bool AP_WS_Connection::SendRadiusAccountingData(const unsigned char * buffer, std::size_t size) {
 | 
			
		||||
		Poco::JSON::Object	Answer;
 | 
			
		||||
		Answer.set(uCentralProtocol::RADIUS,uCentralProtocol::RADIUSACCT);
 | 
			
		||||
		Answer.set(uCentralProtocol::RADIUSDATA, Base64Encode(buffer,size));
 | 
			
		||||
@@ -1123,7 +1113,7 @@ namespace OpenWifi {
 | 
			
		||||
		return Send(Payload.str());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bool WSConnection::SendRadiusCoAData(const unsigned char * buffer, std::size_t size) {
 | 
			
		||||
	bool AP_WS_Connection::SendRadiusCoAData(const unsigned char * buffer, std::size_t size) {
 | 
			
		||||
		Poco::JSON::Object	Answer;
 | 
			
		||||
		Answer.set(uCentralProtocol::RADIUS,uCentralProtocol::RADIUSCOA);
 | 
			
		||||
		Answer.set(uCentralProtocol::RADIUSDATA, Base64Encode(buffer,size));
 | 
			
		||||
@@ -1133,7 +1123,7 @@ namespace OpenWifi {
 | 
			
		||||
		return Send(Payload.str());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void WSConnection::ProcessIncomingRadiusData(const Poco::JSON::Object::Ptr &Doc) {
 | 
			
		||||
	void AP_WS_Connection::ProcessIncomingRadiusData(const Poco::JSON::Object::Ptr &Doc) {
 | 
			
		||||
		if( Doc->has(uCentralProtocol::RADIUSDATA)) {
 | 
			
		||||
			auto Type = Doc->get(uCentralProtocol::RADIUS).toString();
 | 
			
		||||
			if(Type==uCentralProtocol::RADIUSACCT) {
 | 
			
		||||
@@ -17,11 +17,12 @@
 | 
			
		||||
 | 
			
		||||
namespace OpenWifi {
 | 
			
		||||
 | 
			
		||||
class WSConnection {
 | 
			
		||||
class AP_WS_Connection {
 | 
			
		||||
	static constexpr int BufSize = 128000;
 | 
			
		||||
  public:
 | 
			
		||||
	WSConnection(Poco::Net::StreamSocket& Socket, Poco::Net::SocketReactor& Reactor);
 | 
			
		||||
	~WSConnection();
 | 
			
		||||
	AP_WS_Connection(Poco::Net::HTTPServerRequest &request,
 | 
			
		||||
		Poco::Net::HTTPServerResponse &response);
 | 
			
		||||
	~AP_WS_Connection();
 | 
			
		||||
 | 
			
		||||
	void ProcessJSONRPCEvent(Poco::JSON::Object::Ptr & Doc);
 | 
			
		||||
	void ProcessJSONRPCResult(Poco::JSON::Object::Ptr Doc);
 | 
			
		||||
@@ -64,7 +65,6 @@ class WSConnection {
 | 
			
		||||
  private:
 | 
			
		||||
	std::recursive_mutex                Mutex_;
 | 
			
		||||
	Poco::Logger                    	&Logger_;
 | 
			
		||||
	Poco::Net::StreamSocket       		Socket_;
 | 
			
		||||
	Poco::Net::SocketReactor			& Reactor_;
 | 
			
		||||
	std::unique_ptr<Poco::Net::WebSocket> WS_;
 | 
			
		||||
	std::string                         SerialNumber_;
 | 
			
		||||
							
								
								
									
										102
									
								
								src/AP_WS_Server.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								src/AP_WS_Server.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,102 @@
 | 
			
		||||
//
 | 
			
		||||
//	License type: BSD 3-Clause License
 | 
			
		||||
//	License copy: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE
 | 
			
		||||
//
 | 
			
		||||
//	Created by Stephane Bourque on 2021-03-04.
 | 
			
		||||
//	Arilia Wireless Inc.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include "Poco/Net/HTTPHeaderStream.h"
 | 
			
		||||
#include "Poco/JSON/Array.h"
 | 
			
		||||
#include "Poco/Net/Context.h"
 | 
			
		||||
 | 
			
		||||
#include "AP_WS_Server.h"
 | 
			
		||||
#include "ConfigurationCache.h"
 | 
			
		||||
#include "TelemetryStream.h"
 | 
			
		||||
#include <openssl/ssl.h>
 | 
			
		||||
 | 
			
		||||
namespace OpenWifi {
 | 
			
		||||
 | 
			
		||||
	void AP_WS_RequestHandler::handleRequest(Poco::Net::HTTPServerRequest &request,
 | 
			
		||||
											 Poco::Net::HTTPServerResponse &response)  {
 | 
			
		||||
		try {
 | 
			
		||||
			new AP_WS_Connection(request,response);
 | 
			
		||||
		} catch (...) {
 | 
			
		||||
			Logger_.warning("Exception during WS creation");
 | 
			
		||||
		}
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	bool AP_WS_Server::ValidateCertificate(const std::string & ConnectionId, const Poco::Crypto::X509Certificate & Certificate) {
 | 
			
		||||
		if(IsCertOk()) {
 | 
			
		||||
			Logger().debug(fmt::format("CERTIFICATE({}): issuer='{}' cn='{}'", ConnectionId, Certificate.issuerName(),Certificate.commonName()));
 | 
			
		||||
			if(!Certificate.issuedBy(*IssuerCert_)) {
 | 
			
		||||
				Logger().debug(fmt::format("CERTIFICATE({}): issuer mismatch. Local='{}' Incoming='{}'", ConnectionId, IssuerCert_->issuerName(), Certificate.issuerName()));
 | 
			
		||||
				return false;
 | 
			
		||||
			}
 | 
			
		||||
			return true;
 | 
			
		||||
		}
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	int AP_WS_Server::Start() {
 | 
			
		||||
 | 
			
		||||
		for(const auto & Svr : ConfigServersList_ ) {
 | 
			
		||||
			Logger().notice(fmt::format("Starting: {}:{} Keyfile:{} CertFile: {}", Svr.Address(),
 | 
			
		||||
										Svr.Port(), Svr.KeyFile(), Svr.CertFile()));
 | 
			
		||||
 | 
			
		||||
			Svr.LogCert(Logger());
 | 
			
		||||
			if (!Svr.RootCA().empty())
 | 
			
		||||
				Svr.LogCas(Logger());
 | 
			
		||||
 | 
			
		||||
			auto Sock{Svr.CreateSecureSocket(Logger())};
 | 
			
		||||
 | 
			
		||||
			if (!IsCertOk()) {
 | 
			
		||||
				IssuerCert_ = std::make_unique<Poco::Crypto::X509Certificate>(Svr.IssuerCertFile());
 | 
			
		||||
				Logger().information(
 | 
			
		||||
					fmt::format("Certificate Issuer Name:{}", IssuerCert_->issuerName()));
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			auto WebServerHttpParams = new Poco::Net::HTTPServerParams;
 | 
			
		||||
			WebServerHttpParams->setMaxThreads(50);
 | 
			
		||||
			WebServerHttpParams->setMaxQueued(200);
 | 
			
		||||
			WebServerHttpParams->setKeepAlive(true);
 | 
			
		||||
 | 
			
		||||
			auto NewWebServer = std::make_unique<Poco::Net::HTTPServer>(
 | 
			
		||||
				new AP_WS_RequestHandlerFactory(Logger()), Sock, WebServerHttpParams);
 | 
			
		||||
			WebServers_.push_back(std::move(NewWebServer));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for(auto &server:WebServers_)
 | 
			
		||||
			server->start();
 | 
			
		||||
 | 
			
		||||
		ReactorThread_.start(Reactor_);
 | 
			
		||||
 | 
			
		||||
		auto ProvString = MicroService::instance().ConfigGetString("autoprovisioning.process","default");
 | 
			
		||||
		if(ProvString!="default") {
 | 
			
		||||
			auto Tokens = Poco::StringTokenizer(ProvString, ",");
 | 
			
		||||
			for (const auto &i : Tokens) {
 | 
			
		||||
				if (i == "prov")
 | 
			
		||||
					LookAtProvisioning_ = true;
 | 
			
		||||
				else
 | 
			
		||||
					UseDefaultConfig_ = true;
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			UseDefaultConfig_ = true;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		SimulatorId_ = MicroService::instance().ConfigGetString("simulatorid","");
 | 
			
		||||
		SimulatorEnabled_ = !SimulatorId_.empty();
 | 
			
		||||
 | 
			
		||||
		Utils::SetThreadName(ReactorThread_,"device-reactor");
 | 
			
		||||
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void AP_WS_Server::Stop() {
 | 
			
		||||
		Logger().notice("Stopping reactors...");
 | 
			
		||||
		// ReactorPool_.Stop();
 | 
			
		||||
		Reactor_.stop();
 | 
			
		||||
		ReactorThread_.join();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}      //namespace
 | 
			
		||||
							
								
								
									
										107
									
								
								src/AP_WS_Server.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								src/AP_WS_Server.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,107 @@
 | 
			
		||||
//
 | 
			
		||||
//	License type: BSD 3-Clause License
 | 
			
		||||
//	License copy: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE
 | 
			
		||||
//
 | 
			
		||||
//	Created by Stephane Bourque on 2021-03-04.
 | 
			
		||||
//	Arilia Wireless Inc.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <mutex>
 | 
			
		||||
#include <thread>
 | 
			
		||||
#include <array>
 | 
			
		||||
#include <ctime>
 | 
			
		||||
 | 
			
		||||
#include "framework/MicroService.h"
 | 
			
		||||
 | 
			
		||||
#include "Poco/AutoPtr.h"
 | 
			
		||||
#include "Poco/Net/SocketReactor.h"
 | 
			
		||||
#include "Poco/Net/ParallelSocketAcceptor.h"
 | 
			
		||||
#include "Poco/Net/SocketAcceptor.h"
 | 
			
		||||
 | 
			
		||||
#include "AP_WS_Connection.h"
 | 
			
		||||
#include "WS_ReactorPool.h"
 | 
			
		||||
 | 
			
		||||
namespace OpenWifi {
 | 
			
		||||
 | 
			
		||||
	class AP_WS_RequestHandler : public Poco::Net::HTTPRequestHandler {
 | 
			
		||||
	  public:
 | 
			
		||||
		explicit AP_WS_RequestHandler(Poco::Logger &L)
 | 
			
		||||
			: Logger_(L) {
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
		void handleRequest(Poco::Net::HTTPServerRequest &request,
 | 
			
		||||
						   Poco::Net::HTTPServerResponse &response) override;
 | 
			
		||||
	  private:
 | 
			
		||||
		Poco::Logger 				&Logger_;
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	class AP_WS_RequestHandlerFactory : public Poco::Net::HTTPRequestHandlerFactory {
 | 
			
		||||
	  public:
 | 
			
		||||
		inline explicit AP_WS_RequestHandlerFactory(Poco::Logger &L)
 | 
			
		||||
		: Logger_(L) {
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		inline Poco::Net::HTTPRequestHandler *
 | 
			
		||||
		createRequestHandler(const Poco::Net::HTTPServerRequest &request) override {
 | 
			
		||||
			if (request.find("Upgrade") != request.end() &&
 | 
			
		||||
				Poco::icompare(request["Upgrade"], "websocket") == 0) {
 | 
			
		||||
				Poco::Thread::current()->setName("AP_CONN_INIT");
 | 
			
		||||
				return new AP_WS_RequestHandler(Logger_);
 | 
			
		||||
			} else {
 | 
			
		||||
				return nullptr;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	  private:
 | 
			
		||||
		Poco::Logger 				&Logger_;
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	class AP_WS_Server : public SubSystemServer {
 | 
			
		||||
	  public:
 | 
			
		||||
		static auto instance() {
 | 
			
		||||
			static auto instance_ = new AP_WS_Server;
 | 
			
		||||
			return instance_;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		int Start() override;
 | 
			
		||||
		void Stop() override;
 | 
			
		||||
		bool IsCertOk() { return IssuerCert_!= nullptr; }
 | 
			
		||||
		bool ValidateCertificate(const std::string & ConnectionId, const Poco::Crypto::X509Certificate & Certificate);
 | 
			
		||||
		// Poco::Net::SocketReactor & GetNextReactor() { return ReactorPool_.NextReactor(); }
 | 
			
		||||
 | 
			
		||||
		inline bool IsSimSerialNumber(const std::string & SerialNumber) const {
 | 
			
		||||
			return IsSim(SerialNumber) && SerialNumber == SimulatorId_;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		inline static bool IsSim(const std::string & SerialNumber) {
 | 
			
		||||
			return SerialNumber.substr(0,6) == "53494d";
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		inline bool IsSimEnabled() const {
 | 
			
		||||
			return SimulatorEnabled_;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		inline bool UseProvisioning() const { return LookAtProvisioning_; }
 | 
			
		||||
		inline bool UseDefaults() const { return UseDefaultConfig_; }
 | 
			
		||||
 | 
			
		||||
		[[nodiscard]] inline Poco::Net::SocketReactor & NextReactor() { return Reactor_; }
 | 
			
		||||
 | 
			
		||||
	  private:
 | 
			
		||||
		std::unique_ptr<Poco::Crypto::X509Certificate>		IssuerCert_;
 | 
			
		||||
		std::list<std::unique_ptr<Poco::Net::HTTPServer>>	WebServers_;
 | 
			
		||||
		Poco::Net::SocketReactor						Reactor_;
 | 
			
		||||
		Poco::Thread									ReactorThread_;
 | 
			
		||||
		std::string 									SimulatorId_;
 | 
			
		||||
		bool 											LookAtProvisioning_ = false;
 | 
			
		||||
		bool 											UseDefaultConfig_ = true;
 | 
			
		||||
		bool 											SimulatorEnabled_=false;
 | 
			
		||||
 | 
			
		||||
		AP_WS_Server() noexcept:
 | 
			
		||||
			SubSystemServer("WebSocketServer", "WS-SVR", "ucentral.websocket") {
 | 
			
		||||
		}
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	inline auto AP_WS_Server() { return AP_WS_Server::instance(); }
 | 
			
		||||
 | 
			
		||||
} //namespace
 | 
			
		||||
@@ -10,22 +10,22 @@
 | 
			
		||||
#include "Poco/Util/Option.h"
 | 
			
		||||
#include "Poco/Environment.h"
 | 
			
		||||
 | 
			
		||||
#include "AP_WS_Server.h"
 | 
			
		||||
#include "CommandManager.h"
 | 
			
		||||
#include "Daemon.h"
 | 
			
		||||
#include "DeviceRegistry.h"
 | 
			
		||||
#include "FileUploader.h"
 | 
			
		||||
#include "FindCountry.h"
 | 
			
		||||
#include "OUIServer.h"
 | 
			
		||||
#include "RADIUS_proxy_server.h"
 | 
			
		||||
#include "SerialNumberCache.h"
 | 
			
		||||
#include "StorageArchiver.h"
 | 
			
		||||
#include "StorageService.h"
 | 
			
		||||
#include "TelemetryStream.h"
 | 
			
		||||
#include "WS_Server.h"
 | 
			
		||||
#include "VenueBroadcaster.h"
 | 
			
		||||
#include "framework/ConfigurationValidator.h"
 | 
			
		||||
#include "framework/MicroService.h"
 | 
			
		||||
#include "FindCountry.h"
 | 
			
		||||
#include "rttys/RTTYS_server.h"
 | 
			
		||||
#include "RADIUS_proxy_server.h"
 | 
			
		||||
#include "VenueBroadcaster.h"
 | 
			
		||||
 | 
			
		||||
namespace OpenWifi {
 | 
			
		||||
	class Daemon *Daemon::instance() {
 | 
			
		||||
@@ -47,7 +47,7 @@ namespace OpenWifi {
 | 
			
		||||
										StorageArchiver(),
 | 
			
		||||
										TelemetryStream(),
 | 
			
		||||
										RTTYS_server(),
 | 
			
		||||
										WebSocketServer(),
 | 
			
		||||
								   		AP_WS_Server(),
 | 
			
		||||
								   		RADIUS_proxy_server(),
 | 
			
		||||
								   		VenueBroadcaster()
 | 
			
		||||
							   });
 | 
			
		||||
 
 | 
			
		||||
@@ -9,8 +9,8 @@
 | 
			
		||||
#include "Poco/JSON/Object.h"
 | 
			
		||||
#include "Poco/JSON/Parser.h"
 | 
			
		||||
 | 
			
		||||
#include "AP_WS_Server.h"
 | 
			
		||||
#include "DeviceRegistry.h"
 | 
			
		||||
#include "WS_Server.h"
 | 
			
		||||
#include "OUIServer.h"
 | 
			
		||||
 | 
			
		||||
namespace OpenWifi {
 | 
			
		||||
@@ -87,7 +87,7 @@ namespace OpenWifi {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	std::shared_ptr<DeviceRegistry::ConnectionEntry> DeviceRegistry::Register(uint64_t SerialNumber, WSConnection *Ptr, uint64_t & ConnectionId )
 | 
			
		||||
	std::shared_ptr<DeviceRegistry::ConnectionEntry> DeviceRegistry::Register(uint64_t SerialNumber, AP_WS_Connection *Ptr, uint64_t & ConnectionId )
 | 
			
		||||
    {
 | 
			
		||||
		std::lock_guard		Guard(Mutex_);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -17,11 +17,11 @@
 | 
			
		||||
 | 
			
		||||
namespace OpenWifi {
 | 
			
		||||
 | 
			
		||||
	class WSConnection;
 | 
			
		||||
	class AP_WS_Connection;
 | 
			
		||||
    class DeviceRegistry : public SubSystemServer {
 | 
			
		||||
    public:
 | 
			
		||||
		struct ConnectionEntry {
 | 
			
		||||
			WSConnection 				* WSConn_ = nullptr;
 | 
			
		||||
			AP_WS_Connection 				* WSConn_ = nullptr;
 | 
			
		||||
			GWObjects::ConnectionState 	Conn_;
 | 
			
		||||
			std::string        			LastStats;
 | 
			
		||||
			GWObjects::HealthCheck		LastHealthcheck;
 | 
			
		||||
@@ -66,7 +66,7 @@ namespace OpenWifi {
 | 
			
		||||
		}
 | 
			
		||||
		void SetHealthcheck(uint64_t SerialNumber, const GWObjects::HealthCheck &H);
 | 
			
		||||
 | 
			
		||||
		std::shared_ptr<ConnectionEntry> Register(uint64_t SerialNumber, WSConnection *Conn, uint64_t & ConnectionId);
 | 
			
		||||
		std::shared_ptr<ConnectionEntry> Register(uint64_t SerialNumber, AP_WS_Connection *Conn, uint64_t & ConnectionId);
 | 
			
		||||
 | 
			
		||||
		inline void UnRegister(const std::string & SerialNumber, uint64_t ConnectionId) {
 | 
			
		||||
			return UnRegister(Utils::SerialNumberToInt(SerialNumber),ConnectionId);
 | 
			
		||||
 
 | 
			
		||||
@@ -1737,6 +1737,7 @@ namespace OpenWifi {
 | 
			
		||||
		std::ostringstream	ofs;
 | 
			
		||||
		Obj->stringify(ofs);
 | 
			
		||||
 | 
			
		||||
		try {
 | 
			
		||||
			nlohmann::json D = nlohmann::json::parse(ofs.str());
 | 
			
		||||
			std::cout << "Start of parsing wifi" << std::endl;
 | 
			
		||||
			if (D.contains("status")) {
 | 
			
		||||
@@ -1767,29 +1768,42 @@ namespace OpenWifi {
 | 
			
		||||
											new_ies.push_back(WFS_WLAN_EID_TIM(data));
 | 
			
		||||
										} else if (ie_type == ieee80211_eid::WLAN_EID_QBSS_LOAD) {
 | 
			
		||||
											new_ies.push_back(WFS_WLAN_EID_QBSS_LOAD(data));
 | 
			
		||||
									} else if (ie_type == ieee80211_eid::WLAN_EID_PWR_CONSTRAINT) {
 | 
			
		||||
										} else if (ie_type ==
 | 
			
		||||
												   ieee80211_eid::WLAN_EID_PWR_CONSTRAINT) {
 | 
			
		||||
											new_ies.push_back(WFS_WLAN_EID_PWR_CONSTRAINT(data));
 | 
			
		||||
										} else if (ie_type == ieee80211_eid::WLAN_EID_ERP_INFO) {
 | 
			
		||||
											new_ies.push_back(WFS_WLAN_EID_ERP_INFO(data));
 | 
			
		||||
									} else if (ie_type == ieee80211_eid::WLAN_EID_SUPPORTED_REGULATORY_CLASSES) {
 | 
			
		||||
										new_ies.push_back(WFS_WLAN_EID_SUPPORTED_REGULATORY_CLASSES(data));
 | 
			
		||||
									} else if (ie_type == ieee80211_eid::WLAN_EID_HT_CAPABILITY) {
 | 
			
		||||
										} else if (ie_type ==
 | 
			
		||||
												   ieee80211_eid::
 | 
			
		||||
													   WLAN_EID_SUPPORTED_REGULATORY_CLASSES) {
 | 
			
		||||
											new_ies.push_back(
 | 
			
		||||
												WFS_WLAN_EID_SUPPORTED_REGULATORY_CLASSES(data));
 | 
			
		||||
										} else if (ie_type ==
 | 
			
		||||
												   ieee80211_eid::WLAN_EID_HT_CAPABILITY) {
 | 
			
		||||
											new_ies.push_back(WFS_WLAN_EID_HT_CAPABILITY(data));
 | 
			
		||||
									} else if (ie_type == ieee80211_eid::WLAN_EID_EXT_SUPP_RATES) {
 | 
			
		||||
										} else if (ie_type ==
 | 
			
		||||
												   ieee80211_eid::WLAN_EID_EXT_SUPP_RATES) {
 | 
			
		||||
											new_ies.push_back(WFS_WLAN_EID_EXT_SUPP_RATES(data));
 | 
			
		||||
									} else if (ie_type == ieee80211_eid::WLAN_EID_TX_POWER_ENVELOPE) {
 | 
			
		||||
										} else if (ie_type ==
 | 
			
		||||
												   ieee80211_eid::WLAN_EID_TX_POWER_ENVELOPE) {
 | 
			
		||||
											new_ies.push_back(WFS_WLAN_EID_TX_POWER_ENVELOPE(data));
 | 
			
		||||
									} else if (ie_type == ieee80211_eid::WLAN_EID_VHT_CAPABILITY) {
 | 
			
		||||
										} else if (ie_type ==
 | 
			
		||||
												   ieee80211_eid::WLAN_EID_VHT_CAPABILITY) {
 | 
			
		||||
											new_ies.push_back(WFS_WLAN_EID_VHT_CAPABILITY(data));
 | 
			
		||||
									} else if (ie_type == ieee80211_eid::WLAN_EID_RRM_ENABLED_CAPABILITIES) {
 | 
			
		||||
										new_ies.push_back(WFS_WLAN_EID_RRM_ENABLED_CAPABILITIES(data));
 | 
			
		||||
									} else if (ie_type == ieee80211_eid::WLAN_EID_EXT_CAPABILITY) {
 | 
			
		||||
										} else if (ie_type ==
 | 
			
		||||
												   ieee80211_eid::
 | 
			
		||||
													   WLAN_EID_RRM_ENABLED_CAPABILITIES) {
 | 
			
		||||
											new_ies.push_back(
 | 
			
		||||
												WFS_WLAN_EID_RRM_ENABLED_CAPABILITIES(data));
 | 
			
		||||
										} else if (ie_type ==
 | 
			
		||||
												   ieee80211_eid::WLAN_EID_EXT_CAPABILITY) {
 | 
			
		||||
											new_ies.push_back(WFS_WLAN_EID_EXT_CAPABILITY(data));
 | 
			
		||||
										} else if (ie_type == ieee80211_eid::WLAN_EID_TPC_REPORT) {
 | 
			
		||||
											new_ies.push_back(WFS_WLAN_EID_TPC_REPORT(data));
 | 
			
		||||
										} else if (ie_type == ieee80211_eid::WLAN_EID_RSN) {
 | 
			
		||||
											new_ies.push_back(WFS_WLAN_EID_RSN(data));
 | 
			
		||||
									} else if (ie_type == ieee80211_eid::WLAN_EID_VENDOR_SPECIFIC) {
 | 
			
		||||
										} else if (ie_type ==
 | 
			
		||||
												   ieee80211_eid::WLAN_EID_VENDOR_SPECIFIC) {
 | 
			
		||||
											new_ies.push_back(WFS_WLAN_EID_VENDOR_SPECIFIC(data));
 | 
			
		||||
										} else if (ie_type == ieee80211_eid::WLAN_EID_EXTENSION) {
 | 
			
		||||
											new_ies.push_back(WFS_WLAN_EID_EXTENSION(data));
 | 
			
		||||
@@ -1822,6 +1836,13 @@ namespace OpenWifi {
 | 
			
		||||
			}
 | 
			
		||||
			Result << to_string(D);
 | 
			
		||||
			std::cout << "End of parsing wifi" << std::endl;
 | 
			
		||||
			return true;
 | 
			
		||||
		} catch (const Poco::Exception &E) {
 | 
			
		||||
			Logger.log(E);
 | 
			
		||||
			Logger.error(fmt::format("Failure to parse WifiScan."));
 | 
			
		||||
		} catch (...) {
 | 
			
		||||
			Logger.error(fmt::format("Failure to parse WifiScan."));
 | 
			
		||||
		}
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -11,19 +11,19 @@
 | 
			
		||||
 | 
			
		||||
#include "Poco/JSON/Parser.h"
 | 
			
		||||
 | 
			
		||||
#include "AP_WS_Server.h"
 | 
			
		||||
#include "CentralConfig.h"
 | 
			
		||||
#include "DeviceRegistry.h"
 | 
			
		||||
#include "FileUploader.h"
 | 
			
		||||
#include "RESTObjects/RESTAPI_GWobjects.h"
 | 
			
		||||
#include "RESTAPI_device_commandHandler.h"
 | 
			
		||||
#include "StorageService.h"
 | 
			
		||||
#include "RESTAPI_RPC.h"
 | 
			
		||||
#include "RESTAPI_device_commandHandler.h"
 | 
			
		||||
#include "RESTObjects/RESTAPI_GWobjects.h"
 | 
			
		||||
#include "StorageService.h"
 | 
			
		||||
#include "TelemetryStream.h"
 | 
			
		||||
#include "framework/ow_constants.h"
 | 
			
		||||
#include "framework/KafkaTopics.h"
 | 
			
		||||
#include "framework/ConfigurationValidator.h"
 | 
			
		||||
#include "framework/KafkaTopics.h"
 | 
			
		||||
#include "framework/ow_constants.h"
 | 
			
		||||
#include "rttys/RTTYS_server.h"
 | 
			
		||||
#include "WS_Server.h"
 | 
			
		||||
 | 
			
		||||
namespace OpenWifi {
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -6,10 +6,10 @@
 | 
			
		||||
 | 
			
		||||
#include "Poco/Net/SSLException.h"
 | 
			
		||||
 | 
			
		||||
#include "AP_WS_Connection.h"
 | 
			
		||||
#include "DeviceRegistry.h"
 | 
			
		||||
#include "TelemetryClient.h"
 | 
			
		||||
#include "TelemetryStream.h"
 | 
			
		||||
#include "DeviceRegistry.h"
 | 
			
		||||
#include "WS_Connection.h"
 | 
			
		||||
 | 
			
		||||
namespace OpenWifi {
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,84 +0,0 @@
 | 
			
		||||
//
 | 
			
		||||
//	License type: BSD 3-Clause License
 | 
			
		||||
//	License copy: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE
 | 
			
		||||
//
 | 
			
		||||
//	Created by Stephane Bourque on 2021-03-04.
 | 
			
		||||
//	Arilia Wireless Inc.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include "Poco/Net/HTTPHeaderStream.h"
 | 
			
		||||
#include "Poco/JSON/Array.h"
 | 
			
		||||
#include "Poco/Net/Context.h"
 | 
			
		||||
 | 
			
		||||
#include "ConfigurationCache.h"
 | 
			
		||||
#include "TelemetryStream.h"
 | 
			
		||||
#include "WS_Server.h"
 | 
			
		||||
#include <openssl/ssl.h>
 | 
			
		||||
 | 
			
		||||
namespace OpenWifi {
 | 
			
		||||
 | 
			
		||||
bool WebSocketServer::ValidateCertificate(const std::string & ConnectionId, const Poco::Crypto::X509Certificate & Certificate) {
 | 
			
		||||
	if(IsCertOk()) {
 | 
			
		||||
		Logger().debug(fmt::format("CERTIFICATE({}): issuer='{}' cn='{}'", ConnectionId, Certificate.issuerName(),Certificate.commonName()));
 | 
			
		||||
		if(!Certificate.issuedBy(*IssuerCert_)) {
 | 
			
		||||
			Logger().debug(fmt::format("CERTIFICATE({}): issuer mismatch. Local='{}' Incoming='{}'", ConnectionId, IssuerCert_->issuerName(), Certificate.issuerName()));
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
	return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int WebSocketServer::Start() {
 | 
			
		||||
	// ReactorPool_.Start("DeviceReactorPool_");
 | 
			
		||||
	for(const auto & Svr : ConfigServersList_ ) {
 | 
			
		||||
		Logger().notice( fmt::format("Starting: {}:{} Keyfile:{} CertFile: {}",
 | 
			
		||||
									Svr.Address(),
 | 
			
		||||
									Svr.Port(),
 | 
			
		||||
									Svr.KeyFile(),Svr.CertFile()));
 | 
			
		||||
 | 
			
		||||
		Svr.LogCert(Logger());
 | 
			
		||||
		if(!Svr.RootCA().empty())
 | 
			
		||||
			Svr.LogCas(Logger());
 | 
			
		||||
 | 
			
		||||
		auto Sock{Svr.CreateSecureSocket(Logger())};
 | 
			
		||||
 | 
			
		||||
		if(!IsCertOk()) {
 | 
			
		||||
			IssuerCert_ = std::make_unique<Poco::Crypto::X509Certificate>(Svr.IssuerCertFile());
 | 
			
		||||
			Logger().information( fmt::format("Certificate Issuer Name:{}",IssuerCert_->issuerName()));
 | 
			
		||||
		}
 | 
			
		||||
		auto NewSocketAcceptor = std::make_unique<ws_server_reactor_type_t>(Sock, Reactor_); // ,   2 /*Poco::Environment::processorCount()*2) */ );
 | 
			
		||||
		Acceptors_.push_back(std::move(NewSocketAcceptor));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	auto ProvString = MicroService::instance().ConfigGetString("autoprovisioning.process","default");
 | 
			
		||||
	if(ProvString!="default") {
 | 
			
		||||
		auto Tokens = Poco::StringTokenizer(ProvString, ",");
 | 
			
		||||
		for (const auto &i : Tokens) {
 | 
			
		||||
			if (i == "prov")
 | 
			
		||||
				LookAtProvisioning_ = true;
 | 
			
		||||
			else
 | 
			
		||||
				UseDefaultConfig_ = true;
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		UseDefaultConfig_ = true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	SimulatorId_ = MicroService::instance().ConfigGetString("simulatorid","");
 | 
			
		||||
	SimulatorEnabled_ = !SimulatorId_.empty();
 | 
			
		||||
 | 
			
		||||
	ReactorThread_.setStackSize(3000000);
 | 
			
		||||
	ReactorThread_.start(Reactor_);
 | 
			
		||||
	Utils::SetThreadName(ReactorThread_,"device-reactor");
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void WebSocketServer::Stop() {
 | 
			
		||||
	Logger().notice("Stopping reactors...");
 | 
			
		||||
	// ReactorPool_.Stop();
 | 
			
		||||
	Reactor_.stop();
 | 
			
		||||
	ReactorThread_.join();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}      //namespace
 | 
			
		||||
@@ -1,76 +0,0 @@
 | 
			
		||||
//
 | 
			
		||||
//	License type: BSD 3-Clause License
 | 
			
		||||
//	License copy: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE
 | 
			
		||||
//
 | 
			
		||||
//	Created by Stephane Bourque on 2021-03-04.
 | 
			
		||||
//	Arilia Wireless Inc.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <mutex>
 | 
			
		||||
#include <thread>
 | 
			
		||||
#include <array>
 | 
			
		||||
#include <ctime>
 | 
			
		||||
 | 
			
		||||
#include "framework/MicroService.h"
 | 
			
		||||
 | 
			
		||||
#include "Poco/AutoPtr.h"
 | 
			
		||||
#include "Poco/Net/SocketReactor.h"
 | 
			
		||||
#include "Poco/Net/ParallelSocketAcceptor.h"
 | 
			
		||||
#include "Poco/Net/SocketAcceptor.h"
 | 
			
		||||
 | 
			
		||||
#include "WS_Connection.h"
 | 
			
		||||
#include "WS_ReactorPool.h"
 | 
			
		||||
 | 
			
		||||
namespace OpenWifi {
 | 
			
		||||
 | 
			
		||||
class WebSocketServer : public SubSystemServer {
 | 
			
		||||
  public:
 | 
			
		||||
	static auto instance() {
 | 
			
		||||
		static auto instance_ = new WebSocketServer;
 | 
			
		||||
		return instance_;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	int Start() override;
 | 
			
		||||
	void Stop() override;
 | 
			
		||||
	bool IsCertOk() { return IssuerCert_!= nullptr; }
 | 
			
		||||
	bool ValidateCertificate(const std::string & ConnectionId, const Poco::Crypto::X509Certificate & Certificate);
 | 
			
		||||
	// Poco::Net::SocketReactor & GetNextReactor() { return ReactorPool_.NextReactor(); }
 | 
			
		||||
 | 
			
		||||
	inline bool IsSimSerialNumber(const std::string & SerialNumber) const {
 | 
			
		||||
		return IsSim(SerialNumber) && SerialNumber == SimulatorId_;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	inline static bool IsSim(const std::string & SerialNumber) {
 | 
			
		||||
		return SerialNumber.substr(0,6) == "53494d";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	inline bool IsSimEnabled() const {
 | 
			
		||||
		return SimulatorEnabled_;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	inline bool UseProvisioning() const { return LookAtProvisioning_; }
 | 
			
		||||
	inline bool UseDefaults() const { return UseDefaultConfig_; }
 | 
			
		||||
 | 
			
		||||
  private:
 | 
			
		||||
	std::unique_ptr<Poco::Crypto::X509Certificate>	IssuerCert_;
 | 
			
		||||
	// typedef std::unique_ptr<Poco::Net::ParallelSocketAcceptor<WSConnection, Poco::Net::SocketReactor>> ws_server_reactor_type_t;
 | 
			
		||||
	typedef Poco::Net::SocketAcceptor<WSConnection> ws_server_reactor_type_t;
 | 
			
		||||
	std::vector<std::unique_ptr<ws_server_reactor_type_t>>	Acceptors_;
 | 
			
		||||
	Poco::Net::SocketReactor		Reactor_;
 | 
			
		||||
	Poco::Thread					ReactorThread_;
 | 
			
		||||
	std::string 					SimulatorId_;
 | 
			
		||||
	bool 							LookAtProvisioning_ = false;
 | 
			
		||||
	bool 							UseDefaultConfig_ = true;
 | 
			
		||||
	bool 							SimulatorEnabled_=false;
 | 
			
		||||
 | 
			
		||||
	WebSocketServer() noexcept:
 | 
			
		||||
								 SubSystemServer("WebSocketServer", "WS-SVR", "ucentral.websocket") {
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
inline auto WebSocketServer() { return WebSocketServer::instance(); }
 | 
			
		||||
 | 
			
		||||
} //namespace
 | 
			
		||||
@@ -6,21 +6,21 @@
 | 
			
		||||
//	Arilia Wireless Inc.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include "AP_WS_Server.h"
 | 
			
		||||
#include "CapabilitiesCache.h"
 | 
			
		||||
#include "CentralConfig.h"
 | 
			
		||||
#include "ConfigurationCache.h"
 | 
			
		||||
#include "Daemon.h"
 | 
			
		||||
#include "DeviceRegistry.h"
 | 
			
		||||
#include "FindCountry.h"
 | 
			
		||||
#include "OUIServer.h"
 | 
			
		||||
#include "Poco/Data/RecordSet.h"
 | 
			
		||||
#include "Poco/Net/IPAddress.h"
 | 
			
		||||
#include "SDKcalls.h"
 | 
			
		||||
#include "SerialNumberCache.h"
 | 
			
		||||
#include "StateUtils.h"
 | 
			
		||||
#include "StorageService.h"
 | 
			
		||||
#include "framework/MicroService.h"
 | 
			
		||||
#include "CapabilitiesCache.h"
 | 
			
		||||
#include "FindCountry.h"
 | 
			
		||||
#include "WS_Server.h"
 | 
			
		||||
#include "SDKcalls.h"
 | 
			
		||||
#include "StateUtils.h"
 | 
			
		||||
 | 
			
		||||
namespace OpenWifi {
 | 
			
		||||
 | 
			
		||||
@@ -326,7 +326,7 @@ namespace OpenWifi {
 | 
			
		||||
 | 
			
		||||
		bool 			Found = false;
 | 
			
		||||
		std::string 	FoundConfig;
 | 
			
		||||
		if(WebSocketServer()->UseProvisioning()) {
 | 
			
		||||
		if(AP_WS_Server()->UseProvisioning()) {
 | 
			
		||||
			if(SDKCalls::GetProvisioningConfiguration(SerialNumber, FoundConfig)) {
 | 
			
		||||
				if(FoundConfig != "none") {
 | 
			
		||||
					Found = true;
 | 
			
		||||
@@ -337,7 +337,7 @@ namespace OpenWifi {
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (!Found && WebSocketServer()->UseDefaults() && FindDefaultConfigurationForModel(Compat, DefConfig)) {
 | 
			
		||||
		if (!Found && AP_WS_Server()->UseDefaults() && FindDefaultConfigurationForModel(Compat, DefConfig)) {
 | 
			
		||||
			Config::Config NewConfig(DefConfig.Configuration);
 | 
			
		||||
			NewConfig.SetUUID(Now);
 | 
			
		||||
			D.Configuration = NewConfig.get();
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user