Framework update

This commit is contained in:
stephb9959
2022-01-05 22:24:55 -08:00
parent d421cf365e
commit a860ec8389
7 changed files with 126 additions and 54 deletions

2
build
View File

@@ -1 +1 @@
90
91

View File

@@ -36,7 +36,7 @@ namespace OpenWifi{
return NotFound();
}
if(UserInfo_.userinfo.Id!=Existing.creator) {
if(UserInfo_.userinfo.id!=Existing.creator) {
return UnAuthorized("You must be the creator of the map to delete it");
}
@@ -66,7 +66,7 @@ namespace OpenWifi{
return BadRequest( RESTAPI::Errors::NameMustBeSet);
}
NewObject.creator = UserInfo_.userinfo.Id;
NewObject.creator = UserInfo_.userinfo.id;
if(DB_.CreateRecord(NewObject)) {
@@ -96,14 +96,14 @@ namespace OpenWifi{
return BadRequest( RESTAPI::Errors::NameMustBeSet);
}
if(Existing.creator != UserInfo_.userinfo.Id) {
if(Existing.creator != UserInfo_.userinfo.id) {
if(Existing.visibility == ProvObjects::PRIVATE) {
return UnAuthorized(RESTAPI::Errors::InsufficientAccessRights, ACCESS_DENIED);
}
if(Existing.visibility == ProvObjects::SELECT) {
for(const auto &i:Existing.access.list) {
for(const auto &j:i.users.list) {
if(j==UserInfo_.userinfo.Id) {
if(j==UserInfo_.userinfo.id) {
}
}
}

View File

@@ -10,7 +10,7 @@
namespace OpenWifi{
void RESTAPI_map_list_handler::DoGet() {
if(GetBoolParameter("myMaps",false)) {
auto where = StorageService()->MapDB().OP("creator",ORM::EQ,UserInfo_.userinfo.Id);
auto where = StorageService()->MapDB().OP("creator",ORM::EQ,UserInfo_.userinfo.id);
std::vector<ProvObjects::Map> Maps;
StorageService()->MapDB().GetRecords(QB_.Offset,QB_.Limit,Maps,where);
return MakeJSONObjectArray("list", Maps, *this);

View File

@@ -224,7 +224,7 @@ namespace OpenWifi::SecurityObjects {
}
void UserInfo::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"Id",Id);
field_to_json(Obj,"id",id);
field_to_json(Obj,"name",name);
field_to_json(Obj,"description", description);
field_to_json(Obj,"avatar", avatar);
@@ -258,7 +258,7 @@ namespace OpenWifi::SecurityObjects {
bool UserInfo::from_json(const Poco::JSON::Object::Ptr &Obj) {
try {
field_from_json(Obj,"Id",Id);
field_from_json(Obj,"id",id);
field_from_json(Obj,"name",name);
field_from_json(Obj,"description",description);
field_from_json(Obj,"avatar",avatar);

View File

@@ -11,10 +11,14 @@
#include <string>
#include "framework/OpenWifiTypes.h"
#include "Poco/JSON/Object.h"
#include "Poco/Data/LOB.h"
#include "Poco/Data/LOBStream.h"
namespace OpenWifi {
namespace SecurityObjects {
typedef std::string USER_ID_TYPE;
struct AclTemplate {
bool Read_ = true;
bool ReadWrite_ = true;
@@ -102,32 +106,32 @@ namespace OpenWifi {
};
struct UserInfo {
std::string Id;
std::string id;
std::string name;
std::string description;
std::string avatar;
std::string email;
bool validated = false;
bool validated = false;
std::string validationEmail;
uint64_t validationDate = 0;
uint64_t creationDate = 0;
uint64_t validationDate = 0;
uint64_t creationDate = 0;
std::string validationURI;
bool changePassword = false;
uint64_t lastLogin = 0;
bool changePassword = false;
uint64_t lastLogin = 0;
std::string currentLoginURI;
uint64_t lastPasswordChange = 0;
uint64_t lastEmailCheck = 0;
bool waitingForEmailCheck = false;
uint64_t lastPasswordChange = 0;
uint64_t lastEmailCheck = 0;
bool waitingForEmailCheck = false;
std::string locale;
NoteInfoVec notes;
std::string location;
std::string owner;
bool suspended = false;
bool blackListed = false;
USER_ROLE userRole;
bool suspended = false;
bool blackListed = false;
USER_ROLE userRole;
UserLoginLoginExtensions userTypeProprietaryInfo;
std::string securityPolicy;
uint64_t securityPolicyChange = 0 ;
uint64_t securityPolicyChange = 0 ;
std::string currentPassword;
OpenWifi::Types::StringVec lastPasswords;
std::string oauthType;
@@ -280,5 +284,13 @@ namespace OpenWifi {
bool from_json(Poco::JSON::Object::Ptr &Obj);
};
struct Avatar {
std::string id;
std::string type;
uint64_t created=0;
std::string name;
Poco::Data::LOB<char> avatar;
};
}
}

View File

@@ -68,6 +68,7 @@ using namespace std::chrono_literals;
#include "Poco/PatternFormatter.h"
#include "Poco/FileChannel.h"
#include "Poco/SimpleFileChannel.h"
#include "Poco/Util/PropertyFileConfiguration.h"
#include "cppkafka/cppkafka.h"
@@ -1035,8 +1036,29 @@ namespace OpenWifi {
static const std::string uSERVICE_SUBCRIBER{ "owsub"};
static const std::string uSERVICE_INSTALLER{ "owinst"};
template <class Record, typename KeyType = std::string, int Size=256, int Expiry=60000> class RecordCache {
public:
explicit RecordCache( KeyType Record::* Q) :
MemberOffset(Q){
};
inline auto update(const Record &R) {
return Cache_.update(R.*MemberOffset, R);
}
inline auto get(const KeyType &K) {
return Cache_.get(K);
}
inline auto remove(const KeyType &K) {
return Cache_.remove(K);
}
inline auto remove(const Record &R) {
return Cache_.remove(R.*MemberOffset);
}
private:
KeyType Record::* MemberOffset;
Poco::ExpireLRUCache<KeyType,Record> Cache_{Size,Expiry};
};
class MyErrorHandler : public Poco::ErrorHandler {
class MyErrorHandler : public Poco::ErrorHandler {
public:
explicit MyErrorHandler(Poco::Util::Application &App) : App_(App) {}
inline void exception(const Poco::Exception & E) {
@@ -1473,7 +1495,7 @@ namespace OpenWifi {
int Count=0;
};
static RESTAPI_RateLimiter *instance() {
static auto instance() {
static auto instance_ = new RESTAPI_RateLimiter;
return instance_;
}
@@ -1520,7 +1542,7 @@ namespace OpenWifi {
};
inline RESTAPI_RateLimiter * RESTAPI_RateLimiter() { return RESTAPI_RateLimiter::instance(); }
inline auto RESTAPI_RateLimiter() { return RESTAPI_RateLimiter::instance(); }
class RESTAPIHandler : public Poco::Net::HTTPRequestHandler {
public:
@@ -2224,7 +2246,7 @@ namespace OpenWifi {
inline void initialize(Poco::Util::Application & self) override;
static KafkaManager *instance() {
static auto instance() {
static auto instance_ = new KafkaManager;
return instance_;
}
@@ -2318,7 +2340,7 @@ namespace OpenWifi {
}
};
inline KafkaManager * KafkaManager() { return KafkaManager::instance(); }
inline auto KafkaManager() { return KafkaManager::instance(); }
class AuthClient : public SubSystemServer {
public:
@@ -2327,7 +2349,7 @@ namespace OpenWifi {
{
}
static AuthClient *instance() {
static auto instance() {
static auto instance_ = new AuthClient;
return instance_;
}
@@ -2337,6 +2359,7 @@ namespace OpenWifi {
}
inline void Stop() override {
std::lock_guard G(Mutex_);
Cache_.clear();
}
@@ -2366,6 +2389,7 @@ namespace OpenWifi {
return false;
}
Expired = false;
std::lock_guard G(Mutex_);
Cache_.update(SessionToken, UInfo);
return true;
}
@@ -2378,6 +2402,7 @@ namespace OpenWifi {
}
inline bool IsAuthorized(const std::string &SessionToken, SecurityObjects::UserInfoAndPolicy & UInfo, bool & Expired, bool Sub = false) {
std::lock_guard G(Mutex_);
auto User = Cache_.get(SessionToken);
if(!User.isNull()) {
if(IsTokenExpired(User->webtoken)) {
@@ -2392,10 +2417,10 @@ namespace OpenWifi {
}
private:
Poco::ExpireLRUCache<std::string,OpenWifi::SecurityObjects::UserInfoAndPolicy> Cache_{1024,1200000 };
Poco::ExpireLRUCache<std::string,OpenWifi::SecurityObjects::UserInfoAndPolicy> Cache_{512,1200000 };
};
inline AuthClient * AuthClient() { return AuthClient::instance(); }
inline auto AuthClient() { return AuthClient::instance(); }
class ALBRequestHandler: public Poco::Net::HTTPRequestHandler
/// Return a HTML document with the current date and time.
@@ -2406,7 +2431,7 @@ namespace OpenWifi {
{
}
void handleRequest(Poco::Net::HTTPServerRequest& Request, Poco::Net::HTTPServerResponse& Response)
void handleRequest(Poco::Net::HTTPServerRequest& Request, Poco::Net::HTTPServerResponse& Response) override
{
Logger_.information(Poco::format("ALB-REQUEST(%s): New ALB request.",Request.clientAddress().toString()));
Response.setChunkedTransferEncoding(true);
@@ -2451,8 +2476,8 @@ namespace OpenWifi {
{
}
static ALBHealthCheckServer *instance() {
static ALBHealthCheckServer * instance = new ALBHealthCheckServer;
static auto instance() {
static auto instance = new ALBHealthCheckServer;
return instance;
}
@@ -2470,7 +2495,7 @@ namespace OpenWifi {
std::atomic_bool Running_=false;
};
inline ALBHealthCheckServer * ALBHealthCheckServer() { return ALBHealthCheckServer::instance(); }
inline auto ALBHealthCheckServer() { return ALBHealthCheckServer::instance(); }
Poco::Net::HTTPRequestHandler * RESTAPI_ExtRouter(const char *Path, RESTAPIHandler::BindingMap &Bindings,
Poco::Logger & L, RESTAPI_GenericServer & S, uint64_t Id);
@@ -2481,7 +2506,7 @@ namespace OpenWifi {
class RESTAPI_ExtServer : public SubSystemServer {
public:
static RESTAPI_ExtServer *instance() {
static auto instance() {
static auto instance_ = new RESTAPI_ExtServer;
return instance_;
}
@@ -2512,7 +2537,7 @@ namespace OpenWifi {
}
};
inline RESTAPI_ExtServer * RESTAPI_ExtServer() { return RESTAPI_ExtServer::instance(); };
inline auto RESTAPI_ExtServer() { return RESTAPI_ExtServer::instance(); };
class ExtRequestHandlerFactory : public Poco::Net::HTTPRequestHandlerFactory {
public:
@@ -2564,7 +2589,7 @@ namespace OpenWifi {
class RESTAPI_IntServer : public SubSystemServer {
public:
static RESTAPI_IntServer *instance() {
static auto instance() {
static auto instance_ = new RESTAPI_IntServer;
return instance_;
}
@@ -2593,7 +2618,7 @@ namespace OpenWifi {
}
};
inline RESTAPI_IntServer * RESTAPI_IntServer() { return RESTAPI_IntServer::instance(); };
inline auto RESTAPI_IntServer() { return RESTAPI_IntServer::instance(); };
class IntRequestHandlerFactory : public Poco::Net::HTTPRequestHandlerFactory {
public:
@@ -2648,8 +2673,6 @@ namespace OpenWifi {
uint64_t LastUpdate=0;
};
class SubSystemServer;
typedef std::map<uint64_t, MicroServiceMeta> MicroServiceMetaMap;
typedef std::vector<MicroServiceMeta> MicroServiceMetaVec;
@@ -2707,7 +2730,7 @@ namespace OpenWifi {
return Poco::Logger::get(Name);
}
inline void Exit(int Reason);
static inline void Exit(int Reason);
inline void BusMessageReceived(const std::string &Key, const std::string & Message);
inline MicroServiceMetaVec GetServices(const std::string & Type);
inline MicroServiceMetaVec GetServices();
@@ -2750,7 +2773,8 @@ namespace OpenWifi {
inline int main(const ArgVec &args) override;
static MicroService & instance() { return *instance_; }
inline void InitializeLoggingSystem();
inline void SaveConfig() { PropConfigurationFile_->save(ConfigFileName_); }
inline auto UpdateConfig() { return PropConfigurationFile_; }
private:
static MicroService * instance_;
bool HelpRequested_ = false;
@@ -2775,7 +2799,7 @@ namespace OpenWifi {
BusEventManager BusEventManager_;
std::mutex InfraMutex_;
std::default_random_engine RandomEngine_;
Poco::Util::PropertyFileConfiguration * PropConfigurationFile_ = nullptr;
std::string DAEMON_PROPERTIES_FILENAME;
std::string DAEMON_ROOT_ENV_VAR;
std::string DAEMON_CONFIG_ENV_VAR;
@@ -2882,9 +2906,8 @@ namespace OpenWifi {
inline void MicroService::LoadConfigurationFile() {
std::string Location = Poco::Environment::get(DAEMON_CONFIG_ENV_VAR,".");
Poco::Path ConfigFile;
ConfigFile = ConfigFileName_.empty() ? Location + "/" + DAEMON_PROPERTIES_FILENAME : ConfigFileName_;
ConfigFileName_ = ConfigFileName_.empty() ? Location + "/" + DAEMON_PROPERTIES_FILENAME : ConfigFileName_;
Poco::Path ConfigFile(ConfigFileName_);
if(!ConfigFile.isFile())
{
@@ -2894,7 +2917,9 @@ namespace OpenWifi {
std::exit(Poco::Util::Application::EXIT_CONFIG);
}
loadConfiguration(ConfigFile.toString());
// loadConfiguration(ConfigFile.toString());
PropConfigurationFile_ = new Poco::Util::PropertyFileConfiguration(ConfigFile.toString());
configPtr()->addWriteable(PropConfigurationFile_, PRIO_DEFAULT);
}
inline void MicroService::Reload() {

View File

@@ -155,6 +155,20 @@ namespace ORM {
return S;
}
template <typename RecordType> class DBCache {
public:
DBCache(unsigned Size, unsigned Timeout)
{
}
virtual void Create(const RecordType &R)=0;
virtual bool GetFromCache(const std::string &FieldName, const std::string &Value, RecordType &R)=0;
virtual void UpdateCache(const RecordType &R)=0;
virtual void Delete(const std::string &FieldName, const std::string &Value)=0;
private:
};
template <typename RecordTuple, typename RecordType> class DB {
public:
DB( OpenWifi::DBType dbtype,
@@ -162,21 +176,22 @@ namespace ORM {
const FieldVec & Fields,
const IndexVec & Indexes,
Poco::Data::SessionPool & Pool,
Poco::Logger &L,
const char *Prefix):
Poco::Logger &L,
const char *Prefix,
DBCache<RecordType> * Cache=nullptr):
Type_(dbtype),
DBName_(TableName),
Pool_(Pool),
Logger_(L),
Prefix_(Prefix)
Prefix_(Prefix),
Cache_(Cache)
{
assert(RecordTuple::length == Fields.size());
bool first = true;
int Place=0;
assert( RecordTuple::length == Fields.size());
for(const auto &i:Fields) {
FieldNames_[i.Name] = Place;
if(!first) {
CreateFields_ += ", ";
@@ -374,7 +389,11 @@ namespace ORM {
Insert << ConvertParams(St) ,
Poco::Data::Keywords::use(RT);
Insert.execute();
if(Cache_)
Cache_->Create(R);
return true;
} catch (const Poco::Exception &E) {
Logger_.log(E);
}
@@ -383,9 +402,13 @@ namespace ORM {
template<typename T> bool GetRecord( const char * FieldName, T Value, RecordType & R) {
try {
assert( FieldNames_.find(FieldName) != FieldNames_.end() );
if(Cache_) {
if(Cache_->GetFromCache(FieldName, Value, R))
return true;
}
Poco::Data::Session Session = Pool_.get();
Poco::Data::Statement Select(Session);
RecordTuple RT;
@@ -397,6 +420,8 @@ namespace ORM {
Poco::Data::Keywords::use(Value);
if(Select.execute()==1) {
Convert(RT,R);
if(Cache_)
Cache_->UpdateCache(R);
return true;
}
return false;
@@ -481,6 +506,8 @@ namespace ORM {
Poco::Data::Keywords::use(RT),
Poco::Data::Keywords::use(Value);
Update.execute();
if(Cache_)
Cache_->UpdateCache(R);
return true;
} catch (const Poco::Exception &E) {
Logger_.log(E);
@@ -536,6 +563,8 @@ namespace ORM {
Delete << ConvertParams(St) ,
Poco::Data::Keywords::use(Value);
Delete.execute();
if(Cache_)
Cache_->Delete(FieldName, Value);
return true;
} catch (const Poco::Exception &E) {
Logger_.log(E);
@@ -785,10 +814,17 @@ namespace ORM {
Poco::Logger & Logger() { return Logger_; }
bool DeleteRecordsFromCache(const char *FieldName, const std::string &Value ) {
if(Cache_)
Cache_->Delete(FieldName, Value);
return true;
}
protected:
Poco::Data::SessionPool &Pool_;
Poco::Logger &Logger_;
std::string DBName_;
DBCache<RecordType> *Cache_= nullptr;
private:
OpenWifi::DBType Type_;
std::string CreateFields_;
@@ -797,7 +833,6 @@ namespace ORM {
std::string UpdateFields_;
std::vector<std::string> IndexCreation_;
std::map<std::string,int> FieldNames_;
// Poco::Data::SessionPool &Pool_;
std::string Prefix_;
};
}