Signed-off-by: stephb9959 <stephane.bourque@gmail.com>
This commit is contained in:
stephb9959
2022-07-07 21:04:13 -07:00
parent 898806f232
commit eda73038f6
5 changed files with 71 additions and 109 deletions

2
build
View File

@@ -1 +1 @@
134 135

View File

@@ -54,7 +54,5 @@ namespace OpenWifi {
} }
} }
} }
} }
} }

View File

@@ -60,9 +60,7 @@ namespace OpenWifi {
void AddJob( Job* newJob ) { void AddJob( Job* newJob ) {
std::lock_guard G(Mutex_); std::lock_guard G(Mutex_);
jobs_.push_back(newJob); jobs_.push_back(newJob);
} }
private: private:

View File

@@ -231,11 +231,7 @@ namespace OpenWifi{
auto JobId = MicroService::instance().CreateUUID(); auto JobId = MicroService::instance().CreateUUID();
Types::StringVec Parameters{UUID};; Types::StringVec Parameters{UUID};;
auto NewJob = new VenueConfigUpdater(JobId,"VenueConfigurationUpdater", Parameters, 0, UserInfo_.userinfo, Logger()); auto NewJob = new VenueConfigUpdater(JobId,"VenueConfigurationUpdater", Parameters, 0, UserInfo_.userinfo, Logger());
std::cout << "Adding new job" << std::endl;
JobController()->AddJob(dynamic_cast<Job*>(NewJob)); JobController()->AddJob(dynamic_cast<Job*>(NewJob));
std::cout << "Job added" << std::endl;
SNL.to_json(Answer); SNL.to_json(Answer);
Answer.set("jobId",JobId); Answer.set("jobId",JobId);
return ReturnObject(Answer); return ReturnObject(Answer);
@@ -249,10 +245,7 @@ namespace OpenWifi{
auto JobId = MicroService::instance().CreateUUID(); auto JobId = MicroService::instance().CreateUUID();
Types::StringVec Parameters{UUID};; Types::StringVec Parameters{UUID};;
auto NewJob = new VenueUpgrade(JobId,"VenueFirmwareUpgrade", Parameters, 0, UserInfo_.userinfo, Logger()); auto NewJob = new VenueUpgrade(JobId,"VenueFirmwareUpgrade", Parameters, 0, UserInfo_.userinfo, Logger());
std::cout << "Adding new job" << std::endl;
JobController()->AddJob(dynamic_cast<Job*>(NewJob)); JobController()->AddJob(dynamic_cast<Job*>(NewJob));
std::cout << "Job added" << std::endl;
SNL.to_json(Answer); SNL.to_json(Answer);
Answer.set("jobId",JobId); Answer.set("jobId",JobId);
return ReturnObject(Answer); return ReturnObject(Answer);
@@ -266,10 +259,7 @@ namespace OpenWifi{
auto JobId = MicroService::instance().CreateUUID(); auto JobId = MicroService::instance().CreateUUID();
Types::StringVec Parameters{UUID};; Types::StringVec Parameters{UUID};;
auto NewJob = new VenueRebooter(JobId,"VenueRebooter", Parameters, 0, UserInfo_.userinfo, Logger()); auto NewJob = new VenueRebooter(JobId,"VenueRebooter", Parameters, 0, UserInfo_.userinfo, Logger());
std::cout << "Adding new job" << std::endl;
JobController()->AddJob(dynamic_cast<Job*>(NewJob)); JobController()->AddJob(dynamic_cast<Job*>(NewJob));
std::cout << "Job added" << std::endl;
SNL.to_json(Answer); SNL.to_json(Answer);
Answer.set("jobId",JobId); Answer.set("jobId",JobId);
return ReturnObject(Answer); return ReturnObject(Answer);

View File

@@ -27,11 +27,6 @@ namespace OpenWifi {
inline uint64_t Now() { return std::time(nullptr); }; 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; using namespace std::chrono_literals;
#include "Poco/Util/Application.h" #include "Poco/Util/Application.h"
@@ -243,11 +238,6 @@ namespace OpenWifi::RESTAPI_utils {
Obj.set(Field,Value); 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) { inline void field_to_json(Poco::JSON::Object &Obj, const char *Field, const Types::StringPairVec & S) {
Poco::JSON::Array Array; Poco::JSON::Array Array;
for(const auto &i:S) { for(const auto &i:S) {
@@ -344,12 +334,12 @@ namespace OpenWifi::RESTAPI_utils {
inline void field_from_json(const Poco::JSON::Object::Ptr &Obj, const char *Field, double & Value) { inline void field_from_json(const Poco::JSON::Object::Ptr &Obj, const char *Field, double & Value) {
if(Obj->has(Field) && !Obj->isNull(Field)) 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) { inline void field_from_json(const Poco::JSON::Object::Ptr &Obj, const char *Field, float & Value) {
if(Obj->has(Field) && !Obj->isNull(Field)) 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) { inline void field_from_json(const Poco::JSON::Object::Ptr &Obj, const char *Field, bool &Value) {
@@ -384,14 +374,7 @@ namespace OpenWifi::RESTAPI_utils {
inline void field_from_json(const Poco::JSON::Object::Ptr &Obj, const char *Field, uint64_t &Value) { inline void field_from_json(const Poco::JSON::Object::Ptr &Obj, const char *Field, uint64_t &Value) {
if(Obj->has(Field) && !Obj->isNull(Field)) 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) { inline void field_from_json(const Poco::JSON::Object::Ptr &Obj, const char *Field, Types::StringPairVec &Vec) {
@@ -2081,17 +2064,6 @@ namespace OpenWifi {
return false; 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) { template <typename T> bool AssignIfPresent(const Poco::JSON::Object::Ptr &O, const std::string &Field, const T &value, T & assignee) {
if(O->has(Field)) { if(O->has(Field)) {
assignee = value; assignee = value;
@@ -5020,8 +4992,12 @@ namespace OpenWifi {
for(const auto &client:Clients_) { for(const auto &client:Clients_) {
if(client.second.second == UserName) { if(client.second.second == UserName) {
if(client.second.first->Send(Payload)) try {
Sent++; if (client.second.first->Send(Payload))
Sent++;
} catch (...) {
return false;
}
} }
} }
return Sent>0; return Sent>0;
@@ -5043,70 +5019,70 @@ namespace OpenWifi {
int flags; int flags;
int n; int n;
bool Done=false; bool Done=false;
Poco::Buffer<char> IncomingFrame(0); try {
n = WS_->receiveFrame(IncomingFrame, flags); Poco::Buffer<char> IncomingFrame(0);
auto Op = flags & Poco::Net::WebSocket::FRAME_OP_BITMASK; n = WS_->receiveFrame(IncomingFrame, flags);
auto Op = flags & Poco::Net::WebSocket::FRAME_OP_BITMASK;
if(n==0) { if (n == 0) {
return delete this; return delete this;
} }
switch(Op) { switch (Op) {
case Poco::Net::WebSocket::FRAME_OP_PING: { case Poco::Net::WebSocket::FRAME_OP_PING: {
WS_->sendFrame("", 0, WS_->sendFrame("", 0,
(int)Poco::Net::WebSocket::FRAME_OP_PONG | (int)Poco::Net::WebSocket::FRAME_OP_PONG |
(int)Poco::Net::WebSocket::FRAME_FLAG_FIN); (int)Poco::Net::WebSocket::FRAME_FLAG_FIN);
} } break;
break; case Poco::Net::WebSocket::FRAME_OP_PONG: {
case Poco::Net::WebSocket::FRAME_OP_PONG: { } break;
} case Poco::Net::WebSocket::FRAME_OP_CLOSE: {
break; Logger().warning(Poco::format("CLOSE(%s): Client is closing its connection.", Id_));
case Poco::Net::WebSocket::FRAME_OP_CLOSE: { Done = true;
Logger().warning(Poco::format("CLOSE(%s): Client is closing its connection.",Id_)); } break;
Done=true; case Poco::Net::WebSocket::FRAME_OP_TEXT: {
} IncomingFrame.append(0);
break; if (!Authenticated_) {
case Poco::Net::WebSocket::FRAME_OP_TEXT: { std::string Frame{IncomingFrame.begin()};
IncomingFrame.append(0); auto Tokens = Utils::Split(Frame, ':');
if(!Authenticated_) { bool Expired = false, Contacted = false;
std::string Frame{IncomingFrame.begin()}; if (Tokens.size() == 2 &&
auto Tokens = Utils::Split(Frame,':'); AuthClient()->IsAuthorized(Tokens[1], UserInfo_, Expired, Contacted)) {
bool Expired = false, Contacted = false; Authenticated_ = true;
if(Tokens.size()==2 && AuthClient()->IsAuthorized(Tokens[1], UserInfo_, Expired, Contacted)) { std::string S{"Welcome! Bienvenue! Bienvenidos!"};
Authenticated_=true; WS_->sendFrame(S.c_str(), S.size());
std::string S{"Welcome! Bienvenue! Bienvenidos!"}; WebSocketClientServer()->SetUser(Id_, UserInfo_.userinfo.email);
WS_->sendFrame(S.c_str(),S.size()); } else {
WebSocketClientServer()->SetUser(Id_,UserInfo_.userinfo.email); std::string S{"Invalid token. Closing connection."};
} else { WS_->sendFrame(S.c_str(), S.size());
std::string S{"Invalid token. Closing connection."}; Done = true;
WS_->sendFrame(S.c_str(),S.size()); }
Done=true;
}
} else { } else {
try { try {
Poco::JSON::Parser P; Poco::JSON::Parser P;
auto Obj = P.parse(IncomingFrame.begin()) auto Obj =
.extract<Poco::JSON::Object::Ptr>(); P.parse(IncomingFrame.begin()).extract<Poco::JSON::Object::Ptr>();
std::string Answer; std::string Answer;
if(Processor_!= nullptr) if (Processor_ != nullptr)
Processor_->Processor(Obj, Answer, Done); Processor_->Processor(Obj, Answer, Done);
if (!Answer.empty()) if (!Answer.empty())
WS_->sendFrame(Answer.c_str(), (int) Answer.size()); WS_->sendFrame(Answer.c_str(), (int)Answer.size());
else { else {
WS_->sendFrame("{}", 2); WS_->sendFrame("{}", 2);
} }
} catch (const Poco::JSON::JSONException & E) { } catch (const Poco::JSON::JSONException &E) {
Logger().log(E); Logger().log(E);
} Done=true;
} }
} }
break; } break;
default: default: {
{ }
}
} } catch (...) {
} Done=true;
}
if(Done) { if(Done) {
delete this; delete this;