|
|
|
|
@ -11,7 +11,6 @@
|
|
|
|
|
#include <eedb/db/Users.hpp>
|
|
|
|
|
|
|
|
|
|
#include <Wt/Auth/AuthService.h>
|
|
|
|
|
#include <Wt/Auth/Dbo/AuthInfo.h>
|
|
|
|
|
#include <Wt/WEnvironment.h>
|
|
|
|
|
|
|
|
|
|
#include <nlohmann/json.hpp>
|
|
|
|
|
@ -43,7 +42,7 @@ struct TransactionGuard : public Wt::Auth::AbstractUserDatabase::Transaction {
|
|
|
|
|
static const std::string registration_id = "registration";
|
|
|
|
|
namespace eedb::auth {
|
|
|
|
|
|
|
|
|
|
struct PgUserAuth::UserAuthPriv {
|
|
|
|
|
struct UserDatabase::UserAuthPriv {
|
|
|
|
|
UserAuthPriv(std::unique_ptr< eedb::Users > users, const Wt::WEnvironment & env) : _users{std::move(users)}, _env{env} {
|
|
|
|
|
this->setAuthService(eedb::auth::Services::authService());
|
|
|
|
|
}
|
|
|
|
|
@ -72,10 +71,10 @@ struct PgUserAuth::UserAuthPriv {
|
|
|
|
|
int _in_transaction{0};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
PgUserAuth::PgUserAuth(std::unique_ptr< eedb::Users > users, const Wt::WEnvironment & env)
|
|
|
|
|
: _priv{spimpl::make_unique_impl< PgUserAuth::UserAuthPriv >(std::move(users), env)} {}
|
|
|
|
|
UserDatabase::UserDatabase(std::unique_ptr< eedb::Users > users, const Wt::WEnvironment & env)
|
|
|
|
|
: _priv{spimpl::make_unique_impl< UserDatabase::UserAuthPriv >(std::move(users), env)} {}
|
|
|
|
|
|
|
|
|
|
Wt::Auth::User PgUserAuth::findWithId(const std::string & id) const {
|
|
|
|
|
Wt::Auth::User UserDatabase::findWithId(const std::string & id) const {
|
|
|
|
|
spdlog::get("default")->debug("searching user by id: '{}'...", id);
|
|
|
|
|
auto duser = _priv->_users->findWith(std::atoi(id.c_str()));
|
|
|
|
|
|
|
|
|
|
@ -87,7 +86,7 @@ Wt::Auth::User PgUserAuth::findWithId(const std::string & id) const {
|
|
|
|
|
return {};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Wt::Auth::User PgUserAuth::findWithIdentity(const std::string & provider, const Wt::WString & identity) const {
|
|
|
|
|
Wt::Auth::User UserDatabase::findWithIdentity(const std::string & provider, const Wt::WString & identity) const {
|
|
|
|
|
spdlog::get("default")->debug("searching user by identity/provider: '{}'/'{}'...", identity.toUTF8(), provider);
|
|
|
|
|
auto _identity = identity.toUTF8();
|
|
|
|
|
if(_priv->_authService && _priv->_authService->identityPolicy() == Wt::Auth::IdentityPolicy::EmailAddress) {
|
|
|
|
|
@ -103,7 +102,7 @@ Wt::Auth::User PgUserAuth::findWithIdentity(const std::string & provider, const
|
|
|
|
|
return {};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Wt::Auth::User PgUserAuth::findWithEmailToken(const std::string & hash) const {
|
|
|
|
|
Wt::Auth::User UserDatabase::findWithEmailToken(const std::string & hash) const {
|
|
|
|
|
spdlog::get("default")->debug("searching user by email token: '{}'...", hash);
|
|
|
|
|
|
|
|
|
|
auto duser = _priv->_users->findWith(eedb::EmailToken{hash});
|
|
|
|
|
@ -115,7 +114,7 @@ Wt::Auth::User PgUserAuth::findWithEmailToken(const std::string & hash) const {
|
|
|
|
|
return {};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Wt::Auth::User PgUserAuth::findWithEmail(const std::string & address) const {
|
|
|
|
|
Wt::Auth::User UserDatabase::findWithEmail(const std::string & address) const {
|
|
|
|
|
spdlog::get("default")->debug("searching user by email: '{}'...", address);
|
|
|
|
|
|
|
|
|
|
auto duser = _priv->_users->findWith(eedb::Email{address});
|
|
|
|
|
@ -128,7 +127,7 @@ Wt::Auth::User PgUserAuth::findWithEmail(const std::string & address) const {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// @registration
|
|
|
|
|
void PgUserAuth::addIdentity(const Wt::Auth::User & user, const std::string & provider, const Wt::WString & identity) {
|
|
|
|
|
void UserDatabase::addIdentity(const Wt::Auth::User & user, const std::string & provider, const Wt::WString & identity) {
|
|
|
|
|
spdlog::get("default")->debug("addind identity/provider: '{}'/'{}' for user_id'{}'...", identity.toUTF8(), provider, user.id());
|
|
|
|
|
|
|
|
|
|
if(user.id() == registration_id) {
|
|
|
|
|
@ -149,7 +148,7 @@ void PgUserAuth::addIdentity(const Wt::Auth::User & user, const std::string & pr
|
|
|
|
|
//// _userAuth.setIdentity({user.id()}, provider, identity.toUTF8());
|
|
|
|
|
//}
|
|
|
|
|
// @registration
|
|
|
|
|
Wt::WString PgUserAuth::identity(const Wt::Auth::User & user, const std::string & provider) const {
|
|
|
|
|
Wt::WString UserDatabase::identity(const Wt::Auth::User & user, const std::string & provider) const {
|
|
|
|
|
spdlog::get("default")->trace("user{} identity: '{}'", provider);
|
|
|
|
|
if(user.id() == registration_id) {
|
|
|
|
|
return Wt::WString{_priv->_identity.value_or("")};
|
|
|
|
|
@ -165,18 +164,18 @@ Wt::WString PgUserAuth::identity(const Wt::Auth::User & user, const std::string
|
|
|
|
|
return Wt::WString::Empty;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PgUserAuth::removeIdentity(const Wt::Auth::User & user, const std::string & provider) {
|
|
|
|
|
void UserDatabase::removeIdentity(const Wt::Auth::User & user, const std::string & provider) {
|
|
|
|
|
spdlog::get("default")->trace("user{} remove provider: '{}'", user.id(), provider);
|
|
|
|
|
_priv->user(user)->authIdentities().removeProvider(provider);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Wt::Auth::User PgUserAuth::registerNew() {
|
|
|
|
|
Wt::Auth::User UserDatabase::registerNew() {
|
|
|
|
|
spdlog::get("default")->debug("registering new user");
|
|
|
|
|
_priv->_registration = true;
|
|
|
|
|
return Wt::Auth::User(registration_id, *this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PgUserAuth::deleteUser(const Wt::Auth::User & user) {
|
|
|
|
|
void UserDatabase::deleteUser(const Wt::Auth::User & user) {
|
|
|
|
|
spdlog::get("default")->debug("delete user {}", user.id());
|
|
|
|
|
throw std::runtime_error("not implemented void PgUserAuth::deleteUser(const Wt::Auth::User & user)");
|
|
|
|
|
// _priv->_users->removeUser(eedb::ConstAuthIdentity);
|
|
|
|
|
@ -200,7 +199,7 @@ void PgUserAuth::deleteUser(const Wt::Auth::User & user) {
|
|
|
|
|
// .where(auth_info.id == std::atoi(user.id().c_str())));
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
void PgUserAuth::setPassword(const Wt::Auth::User & user, const PasswordHash & password) {
|
|
|
|
|
void UserDatabase::setPassword(const Wt::Auth::User & user, const PasswordHash & password) {
|
|
|
|
|
spdlog::get("default")->trace("user{} set password", user.id());
|
|
|
|
|
if(user.id() == registration_id) {
|
|
|
|
|
_priv->_password = password;
|
|
|
|
|
@ -209,13 +208,13 @@ void PgUserAuth::setPassword(const Wt::Auth::User & user, const PasswordHash & p
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PasswordHash PgUserAuth::password(const Wt::Auth::User & user) const {
|
|
|
|
|
PasswordHash UserDatabase::password(const Wt::Auth::User & user) const {
|
|
|
|
|
spdlog::get("default")->trace("user{} get password", user.id());
|
|
|
|
|
auto password = _priv->user(user)->authInfo().password();
|
|
|
|
|
return {password.function(), password.salt(), password.value()};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool PgUserAuth::setEmail(const Wt::Auth::User & user, const std::string & address) {
|
|
|
|
|
bool UserDatabase::setEmail(const Wt::Auth::User & user, const std::string & address) {
|
|
|
|
|
spdlog::get("default")->trace("user{} set email {}", user.id(), address);
|
|
|
|
|
if(_priv->_users->findWith(eedb::Email{address}))
|
|
|
|
|
return false; // user with given email exists
|
|
|
|
|
@ -229,7 +228,7 @@ bool PgUserAuth::setEmail(const Wt::Auth::User & user, const std::string & addre
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::string PgUserAuth::email(const Wt::Auth::User & user) const {
|
|
|
|
|
std::string UserDatabase::email(const Wt::Auth::User & user) const {
|
|
|
|
|
spdlog::get("default")->trace("user{} get email", user.id());
|
|
|
|
|
if(user.id() == registration_id) {
|
|
|
|
|
return _priv->_email.value_or("");
|
|
|
|
|
@ -238,7 +237,7 @@ std::string PgUserAuth::email(const Wt::Auth::User & user) const {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PgUserAuth::setUnverifiedEmail(const Wt::Auth::User & user, const std::string & address) {
|
|
|
|
|
void UserDatabase::setUnverifiedEmail(const Wt::Auth::User & user, const std::string & address) {
|
|
|
|
|
spdlog::get("default")->trace("user{} set unverified email {}", user.id(), address);
|
|
|
|
|
if(user.id() == registration_id) {
|
|
|
|
|
_priv->_unverifiedEmail = address;
|
|
|
|
|
@ -247,7 +246,7 @@ void PgUserAuth::setUnverifiedEmail(const Wt::Auth::User & user, const std::stri
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PgUserAuth::setEmailToken(const Wt::Auth::User & user, const Token & token, EmailTokenRole role) {
|
|
|
|
|
void UserDatabase::setEmailToken(const Wt::Auth::User & user, const Token & token, EmailTokenRole role) {
|
|
|
|
|
using namespace std::chrono;
|
|
|
|
|
spdlog::get("default")->trace("user{} set email token {}", user.id(), token.hash());
|
|
|
|
|
if(user.id() == registration_id) {
|
|
|
|
|
@ -260,7 +259,7 @@ void PgUserAuth::setEmailToken(const Wt::Auth::User & user, const Token & token,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::string PgUserAuth::unverifiedEmail(const Wt::Auth::User & user) const {
|
|
|
|
|
std::string UserDatabase::unverifiedEmail(const Wt::Auth::User & user) const {
|
|
|
|
|
spdlog::get("default")->trace("user{} get unverified email", user.id());
|
|
|
|
|
if(user.id() == registration_id) {
|
|
|
|
|
assert(_priv->_unverifiedEmail.has_value());
|
|
|
|
|
@ -270,7 +269,7 @@ std::string PgUserAuth::unverifiedEmail(const Wt::Auth::User & user) const {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Token PgUserAuth::emailToken(const Wt::Auth::User & user) const {
|
|
|
|
|
Token UserDatabase::emailToken(const Wt::Auth::User & user) const {
|
|
|
|
|
spdlog::get("default")->trace("user{} get email token", user.id());
|
|
|
|
|
if(user.id() == registration_id) {
|
|
|
|
|
assert(false);
|
|
|
|
|
@ -284,7 +283,7 @@ Token PgUserAuth::emailToken(const Wt::Auth::User & user) const {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
EmailTokenRole PgUserAuth::emailTokenRole(const Wt::Auth::User & user) const {
|
|
|
|
|
EmailTokenRole UserDatabase::emailTokenRole(const Wt::Auth::User & user) const {
|
|
|
|
|
spdlog::get("default")->trace("user{} get email token role", user.id());
|
|
|
|
|
auto & tokens = _priv->_users->findWith(std::atoi(user.id().c_str()))->authTokens();
|
|
|
|
|
if(tokens.find(AuthTokenRole::EmailToken)) {
|
|
|
|
|
@ -295,17 +294,17 @@ EmailTokenRole PgUserAuth::emailTokenRole(const Wt::Auth::User & user) const {
|
|
|
|
|
assert(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PgUserAuth::addAuthToken(const Wt::Auth::User & user, const Token & token) {
|
|
|
|
|
void UserDatabase::addAuthToken(const Wt::Auth::User & user, const Token & token) {
|
|
|
|
|
spdlog::get("default")->trace("user{} adding auth token", user.id());
|
|
|
|
|
_priv->user(user)->authTokens().addToken(token.hash(), AuthTokenRole::Auth);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PgUserAuth::removeAuthToken(const Wt::Auth::User & user, const std::string & hash) {
|
|
|
|
|
void UserDatabase::removeAuthToken(const Wt::Auth::User & user, const std::string & hash) {
|
|
|
|
|
spdlog::get("default")->trace("user{} removing auth token", user.id());
|
|
|
|
|
_priv->user(user)->authTokens().removeToken(hash);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Wt::Auth::User PgUserAuth::findWithAuthToken(const std::string & hash) const {
|
|
|
|
|
Wt::Auth::User UserDatabase::findWithAuthToken(const std::string & hash) const {
|
|
|
|
|
spdlog::get("default")->debug("searching user by auth token: '{}'...", hash);
|
|
|
|
|
auto u = _priv->_users->findWith(eedb::AuthTokenConst(hash));
|
|
|
|
|
if(!u)
|
|
|
|
|
@ -313,22 +312,22 @@ Wt::Auth::User PgUserAuth::findWithAuthToken(const std::string & hash) const {
|
|
|
|
|
return {std::to_string(u->uid()), *this};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int PgUserAuth::updateAuthToken(const Wt::Auth::User & user, const std::string & oldhash, const std::string & newhash) {
|
|
|
|
|
int UserDatabase::updateAuthToken(const Wt::Auth::User & user, const std::string & oldhash, const std::string & newhash) {
|
|
|
|
|
spdlog::get("default")->trace("user{} updating auth token", user.id());
|
|
|
|
|
_priv->user(user)->authTokens().find(oldhash)->update(newhash);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PgUserAuth::setFailedLoginAttempts(const Wt::Auth::User & user, int count) {
|
|
|
|
|
void UserDatabase::setFailedLoginAttempts(const Wt::Auth::User & user, int count) {
|
|
|
|
|
// _userAuth.setFailedLoginAttempts({user.id()}, count);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int PgUserAuth::failedLoginAttempts(const Wt::Auth::User & user) const {
|
|
|
|
|
int UserDatabase::failedLoginAttempts(const Wt::Auth::User & user) const {
|
|
|
|
|
// return _userAuth.failedLoginAttempts({user.id()});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PgUserAuth::setLastLoginAttempt(const Wt::Auth::User &, const Wt::WDateTime &) {}
|
|
|
|
|
void UserDatabase::setLastLoginAttempt(const Wt::Auth::User &, const Wt::WDateTime &) {}
|
|
|
|
|
|
|
|
|
|
Wt::WDateTime PgUserAuth::lastLoginAttempt(const Wt::Auth::User & user) const {
|
|
|
|
|
Wt::WDateTime UserDatabase::lastLoginAttempt(const Wt::Auth::User & user) const {
|
|
|
|
|
// const auto time = _userAuth.lastLoginAttempt({user.id()});
|
|
|
|
|
// const auto systime = std::chrono::system_clock::to_time_t(time);
|
|
|
|
|
// auto lastLogin = Wt::WDateTime();
|
|
|
|
|
@ -336,11 +335,11 @@ Wt::WDateTime PgUserAuth::lastLoginAttempt(const Wt::Auth::User & user) const {
|
|
|
|
|
// return lastLogin;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PgUserAuth::logout(const Wt::Auth::User & user) {
|
|
|
|
|
void UserDatabase::logout(const Wt::Auth::User & user) {
|
|
|
|
|
// _userAuth.logout({user.id()});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
AbstractUserDatabase::Transaction * PgUserAuth::startTransaction() {
|
|
|
|
|
AbstractUserDatabase::Transaction * UserDatabase::startTransaction() {
|
|
|
|
|
auto commit_create_user = [priv = _priv.get()]() {
|
|
|
|
|
if(priv->_registration) {
|
|
|
|
|
assert(priv->_email.has_value() || priv->_unverifiedEmail.has_value());
|
|
|
|
|
|