adding logout/login recording.

This commit is contained in:
stephb9959
2022-01-05 23:34:13 -08:00
parent fce18f6238
commit a80bcd16d8
9 changed files with 132 additions and 2 deletions

View File

@@ -118,7 +118,7 @@ add_executable( owsec
src/storage/orm_actionLinks.cpp src/storage/orm_actionLinks.h
src/storage/orm_avatar.cpp src/storage/orm_avatar.h
src/SpecialUserHelpers.h
src/RESTAPI/RESTAPI_db_helpers.h)
src/RESTAPI/RESTAPI_db_helpers.h src/storage/orm_logins.cpp src/storage/orm_logins.h)
if(NOT SMALL_BUILD)
target_link_libraries(owsec PUBLIC

2
build
View File

@@ -1 +1 @@
179
182

View File

@@ -186,6 +186,7 @@ namespace OpenWifi {
try {
auto tToken{Token};
StorageService()->UserTokenDB().DeleteRecord("token",tToken);
StorageService()->LoginDB().AddLogout(Token);
} catch (const Poco::Exception &E) {
Logger().log(E);
}
@@ -197,6 +198,7 @@ namespace OpenWifi {
try {
auto tToken{Token};
StorageService()->SubTokenDB().DeleteRecord("token",tToken);
StorageService()->SubLoginDB().AddLogout(Token);
} catch (const Poco::Exception &E) {
Logger().log(E);
}
@@ -249,6 +251,7 @@ namespace OpenWifi {
StorageService()->UserTokenDB().AddToken(UInfo.userinfo.id, UInfo.webtoken.access_token_,
UInfo.webtoken.refresh_token_, UInfo.webtoken.token_type_,
UInfo.webtoken.expires_in_, UInfo.webtoken.idle_timeout_);
StorageService()->LoginDB().AddLogin(UInfo.userinfo.id, UInfo.userinfo.email,UInfo.webtoken.access_token_ );
}
void AuthService::CreateSubToken(const std::string & UserName, SecurityObjects::UserInfoAndPolicy &UInfo)
@@ -272,6 +275,7 @@ namespace OpenWifi {
StorageService()->SubTokenDB().AddToken(UInfo.userinfo.id, UInfo.webtoken.access_token_,
UInfo.webtoken.refresh_token_, UInfo.webtoken.token_type_,
UInfo.webtoken.expires_in_, UInfo.webtoken.idle_timeout_);
StorageService()->SubLoginDB().AddLogin(UInfo.userinfo.id, UInfo.userinfo.email,UInfo.webtoken.access_token_ );
}
bool AuthService::SetPassword(const std::string &NewPassword, SecurityObjects::UserInfo & UInfo) {

View File

@@ -585,5 +585,12 @@ namespace OpenWifi::SecurityObjects {
return false;
}
void LoginRecordInfo::to_json(Poco::JSON::Object &Obj) const {
field_to_json(Obj,"sessionId",sessionId);
field_to_json(Obj,"userId",userId);
field_to_json(Obj,"email",email);
field_to_json(Obj,"login",login);
field_to_json(Obj,"logout",logout);
}
}

View File

@@ -292,5 +292,14 @@ namespace OpenWifi {
Poco::Data::LOB<char> avatar;
};
struct LoginRecordInfo {
std::string sessionId;
std::string userId;
std::string email;
uint64_t login=0;
uint64_t logout=0;
void to_json(Poco::JSON::Object &Obj) const;
};
}
}

View File

@@ -31,6 +31,8 @@ namespace OpenWifi {
ActionLinksDB_ = std::make_unique<OpenWifi::ActionLinkDB>("Actions", "act", dbType_,*Pool_, Logger());
AvatarDB_ = std::make_unique<OpenWifi::AvatarDB>("Avatars", "ava", dbType_,*Pool_, Logger());
SubAvatarDB_ = std::make_unique<OpenWifi::AvatarDB>("SubAvatars", "avs", dbType_,*Pool_, Logger());
LoginDB_ = std::make_unique<OpenWifi::LoginDB>("Logins", "lin", dbType_,*Pool_, Logger());
SubLoginDB_ = std::make_unique<OpenWifi::LoginDB>("SubLogins", "lis", dbType_,*Pool_, Logger());
UserDB_->Create();
SubDB_->Create();
@@ -41,6 +43,8 @@ namespace OpenWifi {
SubPreferencesDB_->Create();
AvatarDB_->Create();
SubAvatarDB_->Create();
LoginDB_->Create();
SubLoginDB_->Create();
OpenWifi::SpecialUserHelpers::InitializeDefaultUser();

View File

@@ -20,6 +20,7 @@
#include "storage/orm_preferences.h"
#include "storage/orm_actionLinks.h"
#include "storage/orm_avatar.h"
#include "storage/orm_logins.h"
namespace OpenWifi {
@@ -49,6 +50,8 @@ namespace OpenWifi {
OpenWifi::ActionLinkDB & ActionLinksDB() { return *ActionLinksDB_; }
OpenWifi::AvatarDB & AvatarDB() { return *AvatarDB_; }
OpenWifi::AvatarDB & SubAvatarDB() { return *SubAvatarDB_; }
OpenWifi::LoginDB & LoginDB() { return *LoginDB_; }
OpenWifi::LoginDB & SubLoginDB() { return *SubLoginDB_; }
private:
@@ -61,6 +64,8 @@ namespace OpenWifi {
std::unique_ptr<OpenWifi::ActionLinkDB> ActionLinksDB_;
std::unique_ptr<OpenWifi::AvatarDB> AvatarDB_;
std::unique_ptr<OpenWifi::AvatarDB> SubAvatarDB_;
std::unique_ptr<OpenWifi::LoginDB> LoginDB_;
std::unique_ptr<OpenWifi::LoginDB> SubLoginDB_;
std::unique_ptr<OpenWifi::UserCache> UserCache_;
std::unique_ptr<OpenWifi::UserCache> SubCache_;

View File

@@ -0,0 +1,71 @@
//
// Created by stephane bourque on 2022-01-05.
//
#include "orm_logins.h"
namespace OpenWifi {
static ORM::FieldVec LoginDB_Fields{
ORM::Field{"session", 64, true},
ORM::Field{"userId", ORM::FieldType::FT_TEXT},
ORM::Field{"email", ORM::FieldType::FT_TEXT},
ORM::Field{"login", ORM::FieldType::FT_BIGINT},
ORM::Field{"logout", ORM::FieldType::FT_BIGINT}
};
static ORM::IndexVec MakeIndices(const std::string & shortname) {
return ORM::IndexVec{
{std::string(shortname + "_userid_index"),
ORM::IndexEntryVec{
{std::string("userId"),
ORM::Indextype::ASC}}}
};
}
LoginDB::LoginDB( const std::string &TableName, const std::string &Shortname ,OpenWifi::DBType T,
Poco::Data::SessionPool &P, Poco::Logger &L) :
DB(T, TableName.c_str(), LoginDB_Fields, MakeIndices(Shortname), P, L, Shortname.c_str()) {
}
static std::string MakeSessionId(const std::string & token) {
return MicroService::instance().CreateHash(token);
}
void LoginDB::AddLogin( const std::string & userId, const std::string & email, const std::string &token) {
SecurityObjects::LoginRecordInfo R;
R.sessionId = MakeSessionId(token);
R.userId = userId;
R.email = email;
R.login = std::time(nullptr);
R.logout = 0;
CreateRecord(R);
}
void LoginDB::AddLogout(const std::string &token) {
auto Session = MakeSessionId(token);
SecurityObjects::LoginRecordInfo R;
if(GetRecord("session", Session, R)) {
R.logout = std::time(nullptr);
UpdateRecord("session", Session, R);
}
}
}
template<> void ORM::DB<OpenWifi::LoginInfoRecordTuple, OpenWifi::SecurityObjects::LoginRecordInfo>::Convert(OpenWifi::LoginInfoRecordTuple &R, OpenWifi::SecurityObjects::LoginRecordInfo &P ) {
P.sessionId = R.get<0>();
P.userId = R.get<1>();
P.email = R.get<2>();
P.login = R.get<3>();
P.logout = R.get<4>();
}
template<> void ORM::DB<OpenWifi::LoginInfoRecordTuple, OpenWifi::SecurityObjects::LoginRecordInfo>::Convert(OpenWifi::SecurityObjects::LoginRecordInfo &P, OpenWifi::LoginInfoRecordTuple &R ) {
R.set<0>(P.sessionId);
R.set<1>(P.userId);
R.set<2>(P.email);
R.set<3>(P.login);
R.set<4>(P.logout);
}

30
src/storage/orm_logins.h Normal file
View File

@@ -0,0 +1,30 @@
//
// Created by stephane bourque on 2022-01-05.
//
#pragma once
#include "framework/orm.h"
#include "RESTObjects/RESTAPI_SecurityObjects.h"
namespace OpenWifi {
typedef Poco::Tuple<
std::string, // SessionId
std::string, // UserID
std::string, // UserEMail
uint64_t, // login = 0;
uint64_t // logout = 0;
> LoginInfoRecordTuple;
typedef std::vector <LoginInfoRecordTuple> LoginInfoRecordTupleList;
class LoginDB : public ORM::DB<LoginInfoRecordTuple, SecurityObjects::LoginRecordInfo> {
public:
LoginDB( const std::string &name, const std::string &shortname, OpenWifi::DBType T, Poco::Data::SessionPool & P, Poco::Logger &L);
void AddLogin(const std::string & id, const std::string & email, const std::string &token);
void AddLogout(const std::string &token);
};
}