|
|
|
|
@@ -27,6 +27,11 @@ namespace OpenWifi {
|
|
|
|
|
inline uint64_t Now() { return std::time(nullptr); };
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
namespace OpenWifi::Utils {
|
|
|
|
|
std::vector<unsigned char> base64decode(const std::string& input);
|
|
|
|
|
std::string base64encode(const unsigned char *input, uint32_t size);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
using namespace std::chrono_literals;
|
|
|
|
|
|
|
|
|
|
#include "Poco/Util/Application.h"
|
|
|
|
|
@@ -238,6 +243,11 @@ namespace OpenWifi::RESTAPI_utils {
|
|
|
|
|
Obj.set(Field,Value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline void field_to_json(Poco::JSON::Object &Obj, const char *Field, const Poco::Data::BLOB &Value) {
|
|
|
|
|
auto Result = Utils::base64encode((const unsigned char *)Value.rawContent(),Value.size());
|
|
|
|
|
Obj.set(Field,Result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline void field_to_json(Poco::JSON::Object &Obj, const char *Field, const Types::StringPairVec & S) {
|
|
|
|
|
Poco::JSON::Array Array;
|
|
|
|
|
for(const auto &i:S) {
|
|
|
|
|
@@ -334,12 +344,12 @@ namespace OpenWifi::RESTAPI_utils {
|
|
|
|
|
|
|
|
|
|
inline void field_from_json(const Poco::JSON::Object::Ptr &Obj, const char *Field, double & Value) {
|
|
|
|
|
if(Obj->has(Field) && !Obj->isNull(Field))
|
|
|
|
|
Value = (double) Obj->get(Field);
|
|
|
|
|
Value = (double)Obj->get(Field);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline void field_from_json(const Poco::JSON::Object::Ptr &Obj, const char *Field, float & Value) {
|
|
|
|
|
if(Obj->has(Field) && !Obj->isNull(Field))
|
|
|
|
|
Value = (float) Obj->get(Field);
|
|
|
|
|
Value = (float)Obj->get(Field);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline void field_from_json(const Poco::JSON::Object::Ptr &Obj, const char *Field, bool &Value) {
|
|
|
|
|
@@ -374,7 +384,14 @@ namespace OpenWifi::RESTAPI_utils {
|
|
|
|
|
|
|
|
|
|
inline void field_from_json(const Poco::JSON::Object::Ptr &Obj, const char *Field, uint64_t &Value) {
|
|
|
|
|
if(Obj->has(Field) && !Obj->isNull(Field))
|
|
|
|
|
Value = (uint64_t ) Obj->get(Field);
|
|
|
|
|
Value = (uint64_t)Obj->get(Field);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline void field_from_json(const Poco::JSON::Object::Ptr &Obj, const char *Field, Poco::Data::BLOB &Value) {
|
|
|
|
|
if(Obj->has(Field) && !Obj->isNull(Field)) {
|
|
|
|
|
auto Result = Utils::base64decode(Obj->get(Field).toString());
|
|
|
|
|
Value.assignRaw((const unsigned char *)&Result[0],Result.size());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline void field_from_json(const Poco::JSON::Object::Ptr &Obj, const char *Field, Types::StringPairVec &Vec) {
|
|
|
|
|
@@ -1382,13 +1399,14 @@ namespace OpenWifi {
|
|
|
|
|
|
|
|
|
|
[[nodiscard]] inline const std::string &Address() const { return address_; };
|
|
|
|
|
[[nodiscard]] inline uint32_t Port() const { return port_; };
|
|
|
|
|
[[nodiscard]] inline const std::string &KeyFile() const { return key_file_; };
|
|
|
|
|
[[nodiscard]] inline const std::string &CertFile() const { return cert_file_; };
|
|
|
|
|
[[nodiscard]] inline const std::string &RootCA() const { return root_ca_; };
|
|
|
|
|
[[nodiscard]] inline const std::string &KeyFilePassword() const { return key_file_password_; };
|
|
|
|
|
[[nodiscard]] inline const std::string &IssuerCertFile() const { return issuer_cert_file_; };
|
|
|
|
|
[[nodiscard]] inline const std::string &Name() const { return name_; };
|
|
|
|
|
[[nodiscard]] inline auto KeyFile() const { return key_file_; };
|
|
|
|
|
[[nodiscard]] inline auto CertFile() const { return cert_file_; };
|
|
|
|
|
[[nodiscard]] inline auto RootCA() const { return root_ca_; };
|
|
|
|
|
[[nodiscard]] inline auto KeyFilePassword() const { return key_file_password_; };
|
|
|
|
|
[[nodiscard]] inline auto IssuerCertFile() const { return issuer_cert_file_; };
|
|
|
|
|
[[nodiscard]] inline auto Name() const { return name_; };
|
|
|
|
|
[[nodiscard]] inline int Backlog() const { return backlog_; }
|
|
|
|
|
[[nodiscard]] inline auto Cas() const { return cas_; }
|
|
|
|
|
|
|
|
|
|
[[nodiscard]] inline Poco::Net::SecureServerSocket CreateSecureSocket(Poco::Logger &L) const {
|
|
|
|
|
Poco::Net::Context::Params P;
|
|
|
|
|
@@ -1868,8 +1886,8 @@ namespace OpenWifi {
|
|
|
|
|
Request = &RequestIn;
|
|
|
|
|
Response = &ResponseIn;
|
|
|
|
|
|
|
|
|
|
std::string th_name = "restsvr_" + std::to_string(TransactionId_);
|
|
|
|
|
Utils::SetThreadName(th_name.c_str());
|
|
|
|
|
// std::string th_name = "restsvr_" + std::to_string(TransactionId_);
|
|
|
|
|
// Utils::SetThreadName(th_name.c_str());
|
|
|
|
|
|
|
|
|
|
if(Request->getContentLength()>0) {
|
|
|
|
|
if(Request->getContentType().find("application/json")!=std::string::npos) {
|
|
|
|
|
@@ -2064,6 +2082,17 @@ namespace OpenWifi {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline bool AssignIfPresent(const Poco::JSON::Object::Ptr &O, const std::string &Field, Poco::Data::BLOB &Value) {
|
|
|
|
|
if(O->has(Field)) {
|
|
|
|
|
std::string Content = O->get(Field).toString();
|
|
|
|
|
auto DecodedBlob = Utils::base64decode(Content);
|
|
|
|
|
Value.assignRaw((const unsigned char *)&DecodedBlob[0],DecodedBlob.size());
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <typename T> bool AssignIfPresent(const Poco::JSON::Object::Ptr &O, const std::string &Field, const T &value, T & assignee) {
|
|
|
|
|
if(O->has(Field)) {
|
|
|
|
|
assignee = value;
|
|
|
|
|
@@ -2684,7 +2713,7 @@ namespace OpenWifi {
|
|
|
|
|
|
|
|
|
|
inline void run() override {
|
|
|
|
|
Poco::AutoPtr<Poco::Notification> Note(Queue_.waitDequeueNotification());
|
|
|
|
|
Utils::SetThreadName("kafka-dispatch");
|
|
|
|
|
Utils::SetThreadName("kafka:dispatch");
|
|
|
|
|
while(Note && Running_) {
|
|
|
|
|
auto Msg = dynamic_cast<KafkaMessage*>(Note.get());
|
|
|
|
|
if(Msg!= nullptr) {
|
|
|
|
|
@@ -3006,18 +3035,17 @@ namespace OpenWifi {
|
|
|
|
|
|
|
|
|
|
inline Poco::Net::HTTPRequestHandler *CallServer(const std::string &Path, uint64_t Id) {
|
|
|
|
|
RESTAPIHandler::BindingMap Bindings;
|
|
|
|
|
Utils::SetThreadName(fmt::format("rest_ext_{}",Id).c_str());
|
|
|
|
|
Utils::SetThreadName(fmt::format("x-rest:{}",Id).c_str());
|
|
|
|
|
return RESTAPI_ExtRouter(Path, Bindings, Logger(), Server_, Id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
std::vector<std::unique_ptr<Poco::Net::HTTPServer>> RESTServers_;
|
|
|
|
|
Poco::ThreadPool Pool_;
|
|
|
|
|
Poco::ThreadPool Pool_{"x-rest",2,32};
|
|
|
|
|
RESTAPI_GenericServer Server_;
|
|
|
|
|
|
|
|
|
|
RESTAPI_ExtServer() noexcept:
|
|
|
|
|
SubSystemServer("RESTAPI_ExtServer", "RESTAPIServer", "openwifi.restapi"),
|
|
|
|
|
Pool_("RESTAPI_ExtServer",4,50,120)
|
|
|
|
|
SubSystemServer("RESTAPI_ExtServer", "REST-XSRV", "openwifi.restapi")
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
@@ -3030,7 +3058,7 @@ namespace OpenWifi {
|
|
|
|
|
inline Poco::Net::HTTPRequestHandler *createRequestHandler(const Poco::Net::HTTPServerRequest &Request) override {
|
|
|
|
|
try {
|
|
|
|
|
Poco::URI uri(Request.getURI());
|
|
|
|
|
Utils::SetThreadName(fmt::format("rest_ext_{}",TransactionId_).c_str());
|
|
|
|
|
Utils::SetThreadName(fmt::format("x-rest:{}",TransactionId_).c_str());
|
|
|
|
|
return RESTAPI_ExtServer()->CallServer(uri.getPath(), TransactionId_++);
|
|
|
|
|
} catch (...) {
|
|
|
|
|
|
|
|
|
|
@@ -3139,17 +3167,16 @@ namespace OpenWifi {
|
|
|
|
|
|
|
|
|
|
inline Poco::Net::HTTPRequestHandler *CallServer(const std::string &Path, uint64_t Id) {
|
|
|
|
|
RESTAPIHandler::BindingMap Bindings;
|
|
|
|
|
Utils::SetThreadName(fmt::format("rest_int_{}",Id).c_str());
|
|
|
|
|
Utils::SetThreadName(fmt::format("i-rest:{}",Id).c_str());
|
|
|
|
|
return RESTAPI_IntRouter(Path, Bindings, Logger(), Server_, Id);
|
|
|
|
|
}
|
|
|
|
|
private:
|
|
|
|
|
std::vector<std::unique_ptr<Poco::Net::HTTPServer>> RESTServers_;
|
|
|
|
|
Poco::ThreadPool Pool_;
|
|
|
|
|
Poco::ThreadPool Pool_{"i-rest",2,16};
|
|
|
|
|
RESTAPI_GenericServer Server_;
|
|
|
|
|
|
|
|
|
|
RESTAPI_IntServer() noexcept:
|
|
|
|
|
SubSystemServer("RESTAPI_IntServer", "REST-ISRV", "openwifi.internal.restapi"),
|
|
|
|
|
Pool_("RESTAPI_IntServer",4,50,120)
|
|
|
|
|
SubSystemServer("RESTAPI_IntServer", "REST-ISRV", "openwifi.internal.restapi")
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
@@ -3160,6 +3187,7 @@ namespace OpenWifi {
|
|
|
|
|
public:
|
|
|
|
|
inline IntRequestHandlerFactory() = default;
|
|
|
|
|
inline Poco::Net::HTTPRequestHandler *createRequestHandler(const Poco::Net::HTTPServerRequest &Request) override {
|
|
|
|
|
Utils::SetThreadName(fmt::format("i-rest:{}",TransactionId_).c_str());
|
|
|
|
|
Poco::URI uri(Request.getURI());
|
|
|
|
|
return RESTAPI_IntServer()->CallServer(uri.getPath(), TransactionId_);
|
|
|
|
|
}
|
|
|
|
|
@@ -3203,7 +3231,6 @@ namespace OpenWifi {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[[nodiscard]] std::string Version() { return Version_; }
|
|
|
|
|
// [[nodiscard]] const Poco::SharedPtr<Poco::Crypto::RSAKey> & Key() { return AppKey_; }
|
|
|
|
|
[[nodiscard]] inline const std::string & DataDir() { return DataDir_; }
|
|
|
|
|
[[nodiscard]] inline const std::string & WWWAssetsDir() { return WWWAssetsDir_; }
|
|
|
|
|
[[nodiscard]] bool Debug() const { return DebugMode_; }
|
|
|
|
|
@@ -3236,7 +3263,12 @@ namespace OpenWifi {
|
|
|
|
|
return Poco::Logger::get(Name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline void Exit(int Reason);
|
|
|
|
|
virtual void GetExtraConfiguration(Poco::JSON::Object & Cfg) {
|
|
|
|
|
Cfg.set("additionalConfiguration",false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static inline void Exit(int Reason);
|
|
|
|
|
inline void BusMessageReceived(const std::string &Key, const std::string & Payload);
|
|
|
|
|
inline MicroServiceMetaVec GetServices(const std::string & Type);
|
|
|
|
|
inline MicroServiceMetaVec GetServices();
|
|
|
|
|
@@ -3302,6 +3334,9 @@ namespace OpenWifi {
|
|
|
|
|
return Signer_.sign(T,Algo);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline Poco::ThreadPool & TimerPool() { return TimerPool_; }
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
static MicroService * instance_;
|
|
|
|
|
bool HelpRequested_ = false;
|
|
|
|
|
@@ -3336,6 +3371,7 @@ namespace OpenWifi {
|
|
|
|
|
bool NoBuiltInCrypto_=false;
|
|
|
|
|
Poco::JWT::Signer Signer_;
|
|
|
|
|
Poco::Logger &Logger_;
|
|
|
|
|
Poco::ThreadPool TimerPool_{"timer:pool",2,16};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
inline void MicroService::Exit(int Reason) {
|
|
|
|
|
@@ -3548,8 +3584,6 @@ namespace OpenWifi {
|
|
|
|
|
void DaemonPostInitialization(Poco::Util::Application &self);
|
|
|
|
|
|
|
|
|
|
inline void MicroService::initialize(Poco::Util::Application &self) {
|
|
|
|
|
// Utils::SetThreadName("microservice");
|
|
|
|
|
|
|
|
|
|
// add the default services
|
|
|
|
|
LoadConfigurationFile();
|
|
|
|
|
InitializeLoggingSystem();
|
|
|
|
|
@@ -3891,6 +3925,7 @@ namespace OpenWifi {
|
|
|
|
|
Params->setMaxThreads(50);
|
|
|
|
|
Params->setMaxQueued(200);
|
|
|
|
|
Params->setKeepAlive(true);
|
|
|
|
|
Params->setName("ws:xrest");
|
|
|
|
|
|
|
|
|
|
std::unique_ptr<Poco::Net::HTTPServer> NewServer;
|
|
|
|
|
if(MicroService::instance().NoAPISecurity()) {
|
|
|
|
|
@@ -3927,6 +3962,7 @@ namespace OpenWifi {
|
|
|
|
|
Params->setMaxThreads(50);
|
|
|
|
|
Params->setMaxQueued(200);
|
|
|
|
|
Params->setKeepAlive(true);
|
|
|
|
|
Params->setName("ws:irest");
|
|
|
|
|
|
|
|
|
|
std::unique_ptr<Poco::Net::HTTPServer> NewServer;
|
|
|
|
|
if(MicroService::instance().NoAPISecurity()) {
|
|
|
|
|
@@ -3944,8 +3980,6 @@ namespace OpenWifi {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline int MicroService::main([[maybe_unused]] const ArgVec &args) {
|
|
|
|
|
|
|
|
|
|
// Utils::SetThreadName("main");
|
|
|
|
|
MyErrorHandler ErrorHandler(*this);
|
|
|
|
|
Poco::ErrorHandler::set(&ErrorHandler);
|
|
|
|
|
|
|
|
|
|
@@ -4052,6 +4086,7 @@ namespace OpenWifi {
|
|
|
|
|
Port_ = (int)MicroService::instance().ConfigGetInt("alb.port",15015);
|
|
|
|
|
Socket_ = std::make_unique<Poco::Net::ServerSocket>(Port_);
|
|
|
|
|
auto Params = new Poco::Net::HTTPServerParams;
|
|
|
|
|
Params->setName("ws:alb");
|
|
|
|
|
Server_ = std::make_unique<Poco::Net::HTTPServer>(new ALBRequestHandlerFactory(Logger()), *Socket_, Params);
|
|
|
|
|
Server_->start();
|
|
|
|
|
}
|
|
|
|
|
@@ -4061,7 +4096,7 @@ namespace OpenWifi {
|
|
|
|
|
|
|
|
|
|
inline void BusEventManager::run() {
|
|
|
|
|
Running_ = true;
|
|
|
|
|
Utils::SetThreadName("BusEventManager");
|
|
|
|
|
Utils::SetThreadName("fmwk:EventMgr");
|
|
|
|
|
auto Msg = MicroService::instance().MakeSystemEventMessage(KafkaTopics::ServiceEvents::EVENT_JOIN);
|
|
|
|
|
KafkaManager()->PostMessage(KafkaTopics::SERVICE_EVENTS,MicroService::instance().PrivateEndPoint(),Msg, false);
|
|
|
|
|
while(Running_) {
|
|
|
|
|
@@ -4148,7 +4183,7 @@ namespace OpenWifi {
|
|
|
|
|
|
|
|
|
|
inline void KafkaProducer::run() {
|
|
|
|
|
|
|
|
|
|
Utils::SetThreadName("KafkaProducer");
|
|
|
|
|
Utils::SetThreadName("Kafka:Prod");
|
|
|
|
|
cppkafka::Configuration Config({
|
|
|
|
|
{ "client.id", MicroService::instance().ConfigGetString("openwifi.kafka.client.id") },
|
|
|
|
|
{ "metadata.broker.list", MicroService::instance().ConfigGetString("openwifi.kafka.brokerlist") }
|
|
|
|
|
@@ -4187,7 +4222,7 @@ namespace OpenWifi {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline void KafkaConsumer::run() {
|
|
|
|
|
Utils::SetThreadName("KafkaConsumer");
|
|
|
|
|
Utils::SetThreadName("Kafka:Cons");
|
|
|
|
|
|
|
|
|
|
cppkafka::Configuration Config({
|
|
|
|
|
{ "client.id", MicroService::instance().ConfigGetString("openwifi.kafka.client.id") },
|
|
|
|
|
@@ -4327,6 +4362,11 @@ namespace OpenWifi {
|
|
|
|
|
Answer.set("certificates", Certificates);
|
|
|
|
|
return ReturnObject(Answer);
|
|
|
|
|
}
|
|
|
|
|
if(GetBoolParameter("extraConfiguration")) {
|
|
|
|
|
Poco::JSON::Object Answer;
|
|
|
|
|
MicroService::instance().GetExtraConfiguration(Answer);
|
|
|
|
|
return ReturnObject(Answer);
|
|
|
|
|
}
|
|
|
|
|
BadRequest(RESTAPI::Errors::InvalidCommand);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -4848,7 +4888,7 @@ namespace OpenWifi {
|
|
|
|
|
void SendToAll(const std::string &Payload);
|
|
|
|
|
private:
|
|
|
|
|
mutable std::atomic_bool Running_ = false;
|
|
|
|
|
Poco::Thread Thr_;
|
|
|
|
|
Poco::Thread Thr_;
|
|
|
|
|
// std::unique_ptr<MyParallelSocketReactor> ReactorPool_;
|
|
|
|
|
Poco::Net::SocketReactor Reactor_;
|
|
|
|
|
Poco::Thread ReactorThread_;
|
|
|
|
|
@@ -4938,13 +4978,13 @@ namespace OpenWifi {
|
|
|
|
|
|
|
|
|
|
[[nodiscard]] inline bool SendToUser(const std::string &userName, const std::string &Payload);
|
|
|
|
|
inline WebSocketClientServer::WebSocketClientServer() noexcept:
|
|
|
|
|
SubSystemServer("WebSocketClientServer", "WSCLNT-SVR", "websocketclients")
|
|
|
|
|
SubSystemServer("WebSocketClientServer", "UI-WSCLNT-SVR", "websocketclients")
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline void WebSocketClientServer::run() {
|
|
|
|
|
Running_ = true ;
|
|
|
|
|
Utils::SetThreadName("ws:clnt-svr");
|
|
|
|
|
Utils::SetThreadName("ws:uiclnt-svr");
|
|
|
|
|
while(Running_) {
|
|
|
|
|
Poco::Thread::trySleep(2000);
|
|
|
|
|
|
|
|
|
|
@@ -4992,8 +5032,12 @@ namespace OpenWifi {
|
|
|
|
|
|
|
|
|
|
for(const auto &client:Clients_) {
|
|
|
|
|
if(client.second.second == UserName) {
|
|
|
|
|
if(client.second.first->Send(Payload))
|
|
|
|
|
Sent++;
|
|
|
|
|
try {
|
|
|
|
|
if (client.second.first->Send(Payload))
|
|
|
|
|
Sent++;
|
|
|
|
|
} catch (...) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return Sent>0;
|
|
|
|
|
@@ -5015,70 +5059,70 @@ namespace OpenWifi {
|
|
|
|
|
int flags;
|
|
|
|
|
int n;
|
|
|
|
|
bool Done=false;
|
|
|
|
|
Poco::Buffer<char> IncomingFrame(0);
|
|
|
|
|
n = WS_->receiveFrame(IncomingFrame, flags);
|
|
|
|
|
auto Op = flags & Poco::Net::WebSocket::FRAME_OP_BITMASK;
|
|
|
|
|
try {
|
|
|
|
|
Poco::Buffer<char> IncomingFrame(0);
|
|
|
|
|
n = WS_->receiveFrame(IncomingFrame, flags);
|
|
|
|
|
auto Op = flags & Poco::Net::WebSocket::FRAME_OP_BITMASK;
|
|
|
|
|
|
|
|
|
|
if(n==0) {
|
|
|
|
|
return delete this;
|
|
|
|
|
}
|
|
|
|
|
if (n == 0) {
|
|
|
|
|
return delete this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
switch(Op) {
|
|
|
|
|
case Poco::Net::WebSocket::FRAME_OP_PING: {
|
|
|
|
|
WS_->sendFrame("", 0,
|
|
|
|
|
(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_CLOSE: {
|
|
|
|
|
Logger().warning(Poco::format("CLOSE(%s): Client is closing its connection.",Id_));
|
|
|
|
|
Done=true;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case Poco::Net::WebSocket::FRAME_OP_TEXT: {
|
|
|
|
|
IncomingFrame.append(0);
|
|
|
|
|
if(!Authenticated_) {
|
|
|
|
|
std::string Frame{IncomingFrame.begin()};
|
|
|
|
|
auto Tokens = Utils::Split(Frame,':');
|
|
|
|
|
bool Expired = false, Contacted = false;
|
|
|
|
|
if(Tokens.size()==2 && AuthClient()->IsAuthorized(Tokens[1], UserInfo_, Expired, Contacted)) {
|
|
|
|
|
Authenticated_=true;
|
|
|
|
|
std::string S{"Welcome! Bienvenue! Bienvenidos!"};
|
|
|
|
|
WS_->sendFrame(S.c_str(),S.size());
|
|
|
|
|
WebSocketClientServer()->SetUser(Id_,UserInfo_.userinfo.email);
|
|
|
|
|
} else {
|
|
|
|
|
std::string S{"Invalid token. Closing connection."};
|
|
|
|
|
WS_->sendFrame(S.c_str(),S.size());
|
|
|
|
|
Done=true;
|
|
|
|
|
}
|
|
|
|
|
switch (Op) {
|
|
|
|
|
case Poco::Net::WebSocket::FRAME_OP_PING: {
|
|
|
|
|
WS_->sendFrame("", 0,
|
|
|
|
|
(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_CLOSE: {
|
|
|
|
|
Logger().warning(Poco::format("CLOSE(%s): UI Client is closing its connection.", Id_));
|
|
|
|
|
Done = true;
|
|
|
|
|
} break;
|
|
|
|
|
case Poco::Net::WebSocket::FRAME_OP_TEXT: {
|
|
|
|
|
IncomingFrame.append(0);
|
|
|
|
|
if (!Authenticated_) {
|
|
|
|
|
std::string Frame{IncomingFrame.begin()};
|
|
|
|
|
auto Tokens = Utils::Split(Frame, ':');
|
|
|
|
|
bool Expired = false, Contacted = false;
|
|
|
|
|
if (Tokens.size() == 2 &&
|
|
|
|
|
AuthClient()->IsAuthorized(Tokens[1], UserInfo_, Expired, Contacted)) {
|
|
|
|
|
Authenticated_ = true;
|
|
|
|
|
std::string S{"Welcome! Bienvenue! Bienvenidos!"};
|
|
|
|
|
WS_->sendFrame(S.c_str(), S.size());
|
|
|
|
|
WebSocketClientServer()->SetUser(Id_, UserInfo_.userinfo.email);
|
|
|
|
|
} else {
|
|
|
|
|
std::string S{"Invalid token. Closing connection."};
|
|
|
|
|
WS_->sendFrame(S.c_str(), S.size());
|
|
|
|
|
Done = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
try {
|
|
|
|
|
Poco::JSON::Parser P;
|
|
|
|
|
auto Obj = P.parse(IncomingFrame.begin())
|
|
|
|
|
.extract<Poco::JSON::Object::Ptr>();
|
|
|
|
|
std::string Answer;
|
|
|
|
|
if(Processor_!= nullptr)
|
|
|
|
|
Processor_->Processor(Obj, Answer, Done);
|
|
|
|
|
if (!Answer.empty())
|
|
|
|
|
WS_->sendFrame(Answer.c_str(), (int) Answer.size());
|
|
|
|
|
else {
|
|
|
|
|
WS_->sendFrame("{}", 2);
|
|
|
|
|
}
|
|
|
|
|
} catch (const Poco::JSON::JSONException & E) {
|
|
|
|
|
Logger().log(E);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
try {
|
|
|
|
|
Poco::JSON::Parser P;
|
|
|
|
|
auto Obj =
|
|
|
|
|
P.parse(IncomingFrame.begin()).extract<Poco::JSON::Object::Ptr>();
|
|
|
|
|
std::string Answer;
|
|
|
|
|
if (Processor_ != nullptr)
|
|
|
|
|
Processor_->Processor(Obj, Answer, Done);
|
|
|
|
|
if (!Answer.empty())
|
|
|
|
|
WS_->sendFrame(Answer.c_str(), (int)Answer.size());
|
|
|
|
|
else {
|
|
|
|
|
WS_->sendFrame("{}", 2);
|
|
|
|
|
}
|
|
|
|
|
} catch (const Poco::JSON::JSONException &E) {
|
|
|
|
|
Logger().log(E);
|
|
|
|
|
Done=true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} break;
|
|
|
|
|
default: {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} catch (...) {
|
|
|
|
|
Done=true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(Done) {
|
|
|
|
|
delete this;
|
|
|
|
|
@@ -5172,7 +5216,7 @@ namespace OpenWifi {
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
Poco::Net::WebSocket WS(*Request, *Response);
|
|
|
|
|
Logger().information("WebSocket connection established.");
|
|
|
|
|
Logger().information("UI-WebSocket connection established.");
|
|
|
|
|
auto Id = MicroService::CreateUUID();
|
|
|
|
|
WebSocketClientServer()->NewClient(WS,Id);
|
|
|
|
|
}
|
|
|
|
|
|