diff --git a/CMakeLists.txt b/CMakeLists.txt index 8943a12..5054f56 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,7 +18,12 @@ include(cmake/Compiler.cmake) include(cmake/FindAllRequirements.cmake) include(cmake/cotire.cmake) -set(CMAKE_INSTALL_RPATH "${HUNTER_INSTALL_PREFIX}/lib") +list(APPEND CMAKE_PREFIX_PATH "${CMAKE_BINARY_DIR}/local/lib") +link_directories(${CMAKE_BINARY_DIR}/local/lib) + +list(APPEND CMAKE_INSTALL_RPATH "${HUNTER_INSTALL_PREFIX}/lib") +list(APPEND CMAKE_INSTALL_RPATH "${CMAKE_BINARY_DIR}/local/lib") + set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) include_directories(${CMAKE_BINARY_DIR}/local/include SYSTEM) diff --git a/cmake/FindAllRequirements.cmake b/cmake/FindAllRequirements.cmake index 1f2d415..6f6477a 100644 --- a/cmake/FindAllRequirements.cmake +++ b/cmake/FindAllRequirements.cmake @@ -32,13 +32,12 @@ execute_process( ${Boost_LIBRARY_DIR_DEBUG} ${CMAKE_BINARY_DIR}/local ${CMAKE_BUILD_TYPE} -# TIMEOUT RESULT_VARIABLE rv OUTPUT_VARIABLE ov ERROR_VARIABLE ev WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/_3rdParty ) -message("rv='${rv}'") -message("ov='${ov}'") -message("ev='${ev}'") +#message("rv='${rv}'") +#message("ov='${ov}'") +#message("ev='${ev}'") diff --git a/src/libs/auth/src/PgUserAuth.cpp b/src/libs/auth/src/PgUserAuth.cpp index 2a919e1..8a3f9fd 100644 --- a/src/libs/auth/src/PgUserAuth.cpp +++ b/src/libs/auth/src/PgUserAuth.cpp @@ -1,6 +1,5 @@ #include -#include #include #include #include @@ -8,6 +7,7 @@ #include #include #include +#include #include @@ -73,8 +73,7 @@ UserDatabase::UserDatabase(std::unique_ptr< eedb::Users > users) spdlog::get("default")->info("constructing userdatabase"); } -UserDatabase::~UserDatabase() -{ +UserDatabase::~UserDatabase() { spdlog::get("default")->info("destructing userdatabase"); } @@ -153,7 +152,7 @@ void UserDatabase::addIdentity(const Wt::Auth::User & user, const std::string & //} // @registration Wt::WString UserDatabase::identity(const Wt::Auth::User & user, const std::string & provider) const { - spdlog::get("default")->trace("user{} identity: '{}'", provider); + spdlog::get("default")->trace("user{} identity: '{}'",user.id(), provider); if(user.id() == registration_id) { return Wt::WString{_priv->_identity.value_or("")}; } else { @@ -225,8 +224,6 @@ bool UserDatabase::setEmail(const Wt::Auth::User & user, const std::string & add if(user.id() == registration_id) { _priv->_email = address; - } else { - assert(false); // email change not implemented } return true; @@ -246,7 +243,8 @@ void UserDatabase::setUnverifiedEmail(const Wt::Auth::User & user, const std::st if(user.id() == registration_id) { _priv->_unverifiedEmail = address; } else { - assert(false); + ///TODO after registration this is set to "" do something about that :) +// assert(false); } } @@ -258,6 +256,11 @@ void UserDatabase::setEmailToken(const Wt::Auth::User & user, const Token & toke _priv->_emailToken = token.hash(); _priv->_emailTokenExpire = exp; _priv->_emailTokenRole = static_cast< int >(role); + } else if(token.empty()) { + // after 'using' token app need to remove it from repo + auto u = _priv->user(user); + auto & tokens = u->authTokens(); + tokens.removeToken(tokens.find(AuthTokenRole::EmailToken)->token()); } else { assert(false); // setting email token on existing user not supported } @@ -269,7 +272,7 @@ std::string UserDatabase::unverifiedEmail(const Wt::Auth::User & user) const { assert(_priv->_unverifiedEmail.has_value()); return _priv->_unverifiedEmail.value(); } else { - assert(false); + return ""; } } @@ -289,7 +292,8 @@ Token UserDatabase::emailToken(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(); + auto u = _priv->user(user); + auto & tokens = u->authTokens(); if(tokens.find(AuthTokenRole::EmailToken)) { return EmailTokenRole::VerifyEmail; } else if(tokens.find(AuthTokenRole::PasswordReset)) { @@ -327,6 +331,8 @@ void UserDatabase::setFailedLoginAttempts(const Wt::Auth::User & user, int count int UserDatabase::failedLoginAttempts(const Wt::Auth::User & user) const { // return _userAuth.failedLoginAttempts({user.id()}); + /// TODO fixme set to true value + return 0; } void UserDatabase::setLastLoginAttempt(const Wt::Auth::User &, const Wt::WDateTime &) {} @@ -346,22 +352,20 @@ void UserDatabase::logout(const Wt::Auth::User & user) { AbstractUserDatabase::Transaction * UserDatabase::startTransaction() { auto commit_create_user = [priv = _priv.get()]() { if(priv->_registration) { - assert(priv->_email.has_value() || priv->_unverifiedEmail.has_value()); - assert(priv->_emailToken.has_value()); - assert(priv->_identity.has_value()); - assert(priv->_password.has_value()); + if((priv->_email.has_value() or priv->_unverifiedEmail.has_value()) and // + priv->_emailToken.has_value() and // + priv->_identity.has_value() and // + priv->_password.has_value() and // + priv->_emailTokenExpire.has_value()) { + auto identity = std::make_unique< eedb::AuthIdentityConst >(priv->_identity.value(), priv->provider.value()); + auto password = eedb::Password{priv->_password->function(), priv->_password->salt(), priv->_password->value()}; + auto email = eedb::Email{priv->_email.value_or(priv->_unverifiedEmail.value())}; - assert(priv->_emailTokenExpire.has_value()); - // assert(priv->_emailTokenRole.has_value()); + auto info = std::make_unique< AuthInfoConst >(std::move(password), std::move(email)); - auto identity = std::make_unique< eedb::AuthIdentityConst >(priv->_identity.value(), priv->provider.value()); - - auto password = eedb::Password{priv->_password->function(), priv->_password->salt(), priv->_password->value()}; - auto email = eedb::Email{priv->_email.value_or(priv->_unverifiedEmail.value())}; - - auto info = std::make_unique< AuthInfoConst >(std::move(password), std::move(email)); - - priv->_users->addUser(std::move(info), std::move(identity)); + auto newUser = priv->_users->addUser(std::move(info), std::move(identity)); + newUser->authTokens().addToken(std::string{*(priv->_emailToken)}, eedb::AuthTokenRole::EmailToken); + } } }; return new TransactionGuard(_priv->_in_transaction, std::move(commit_create_user)); diff --git a/src/libs/db/postgresql_connector/CMakeLists.txt b/src/libs/db/postgresql_connector/CMakeLists.txt index 8095d74..71ed0d9 100644 --- a/src/libs/db/postgresql_connector/CMakeLists.txt +++ b/src/libs/db/postgresql_connector/CMakeLists.txt @@ -6,7 +6,7 @@ file(GLOB ${LIB}_SOURCE src/*) find_package(Sqlpp-connector-postgresql REQUIRED) # create library -add_library(${LIB} ${${LIB}_SOURCE}) +add_library(${LIB} STATIC ${${LIB}_SOURCE}) # link all target_include_directories (${LIB} diff --git a/src/libs/db/postgresql_connector/src/AuthToken.cpp b/src/libs/db/postgresql_connector/src/AuthToken.cpp index 072c971..2137bb0 100644 --- a/src/libs/db/postgresql_connector/src/AuthToken.cpp +++ b/src/libs/db/postgresql_connector/src/AuthToken.cpp @@ -45,9 +45,9 @@ AuthTokenImpl::AuthTokenImpl(Connection & con, std::string hash, std::chrono::time_point< std::chrono::system_clock, std::chrono::microseconds > expirationtime) : _priv{spimpl::make_unique_impl< AuthTokenImplPriv >(con)} { - _priv->id = uid; - _priv->expire = expirationtime; - _priv->hash = std::move(hash); + _priv->id = uid; + _priv->expire = expirationtime; + _priv->hash = std::move(hash); _priv->updated = true; } @@ -56,8 +56,7 @@ std::string_view AuthTokenImpl::token() const { return _priv->hash; } -AuthToken::us_point AuthTokenImpl::expireTimepoint() const -{ +AuthToken::us_point AuthTokenImpl::expireTimepoint() const { _priv->update(); return _priv->expire; } @@ -129,7 +128,7 @@ struct AuthTokensImpl::AuthTokensImplPriv { return iterator->second.get(); } - AuthToken * add(std::string token) { + AuthToken * add(std::string token, AuthTokenRole role) { /// FIXME role using namespace std::chrono; @@ -139,7 +138,7 @@ struct AuthTokensImpl::AuthTokensImplPriv { t_auth_token.value = token, // t_auth_token.auth_info_id = _owner->uid(), // t_auth_token.expires = exp, - t_auth_token.role = 0) // + t_auth_token.role = static_cast< int >(role)) // .returning(t_auth_token.id)) .front() .id; @@ -172,6 +171,6 @@ void AuthTokensImpl::removeToken(std::string_view token) { } AuthToken * AuthTokensImpl::addToken(std::string hash, AuthTokenRole role) { - return _priv->add(std::move(hash)); + return _priv->add(std::move(hash), role); } -} // namespace eedb +} // namespace eedb::pg diff --git a/src/libs/db/postgresql_connector/src/Users.cpp b/src/libs/db/postgresql_connector/src/Users.cpp index 982be5c..9a41d89 100644 --- a/src/libs/db/postgresql_connector/src/Users.cpp +++ b/src/libs/db/postgresql_connector/src/Users.cpp @@ -36,7 +36,7 @@ struct UsersImpl::UsersImplPriv { // where auto tokenNotExpired() const { - return t_auth_token.expires < std::chrono::system_clock::now(); + return t_auth_token.expires > std::chrono::system_clock::now(); } auto tokenRole(AuthTokenRole role) const { diff --git a/src/libs/webapp/CMakeLists.txt b/src/libs/webapp/CMakeLists.txt index b9334c1..5642df4 100644 --- a/src/libs/webapp/CMakeLists.txt +++ b/src/libs/webapp/CMakeLists.txt @@ -6,6 +6,16 @@ file(GLOB_RECURSE ${LIB}_SOURCE src/*) find_package(wt) find_package(nlohmann_json CONFIG REQUIRED) +if (CMAKE_BUILD_TYPE STREQUAL "Debug") + set(Wt_LIBRARY wtd) + set(Wt_HTTP_LIBRARY wthttpd) + set(Wt_TEST_LIBRARY wttestd) +else (CMAKE_BUILD_TYPE STREQUAL "Release") + set(Wt_LIBRARY wt) + set(Wt_HTTP_LIBRARY wthttp) + set(Wt_TEST_LIBRARY wttest) +endif() + # create library add_library(${LIB} ${${LIB}_SOURCE}) @@ -15,8 +25,8 @@ target_include_directories(${LIB} ) target_link_libraries(${LIB} - PRIVATE wthttp # or {Wt_HTTP_DEBUG_LIBRARY} - PRIVATE wt # or {Wt_DEBUG_LIBRARY} + PRIVATE ${Wt_HTTP_LIBRARY} + PRIVATE ${Wt_LIBRARY} PUBLIC auth PUBLIC eedb-api PUBLIC Boost::system diff --git a/src/libs/webapp/include/eedb/WebApplication.hpp b/src/libs/webapp/include/eedb/WebApplication.hpp index d71ebc0..a35a7b3 100644 --- a/src/libs/webapp/include/eedb/WebApplication.hpp +++ b/src/libs/webapp/include/eedb/WebApplication.hpp @@ -14,10 +14,8 @@ class AuthPage; class HomePage; class IWebSession; -class User; - using AuthPageFactory = std::function< std::unique_ptr< AuthPage >() >; -using HomePageFactory = std::function< std::unique_ptr< HomePage >(/*std::shared_ptr< User >*/) >; +using HomePageFactory = std::function< std::unique_ptr< HomePage >() >; class WebApplication : public Wt::WApplication { public: @@ -31,9 +29,6 @@ class WebApplication : public Wt::WApplication { private: // application session std::unique_ptr< eedb::IWebSession > _session; - - AuthPageFactory _authPageFactory; - HomePageFactory _homePageFactory; }; } // namespace eedb diff --git a/src/libs/webapp/include/widget/BootstrapTheme.hpp b/src/libs/webapp/include/widget/BootstrapTheme.hpp index ee3e552..134ef3f 100644 --- a/src/libs/webapp/include/widget/BootstrapTheme.hpp +++ b/src/libs/webapp/include/widget/BootstrapTheme.hpp @@ -7,6 +7,6 @@ class BootstrapTheme final : public Theme { public: ~BootstrapTheme() override; - std::shared_ptr< Wt::WTheme > create() const override; + std::unique_ptr< Wt::WTheme > create() const override; }; } // namespace eedb diff --git a/src/libs/webapp/include/widget/DefaultHomePage.hpp b/src/libs/webapp/include/widget/DefaultHomePage.hpp index 3fd2c17..3f42a1f 100644 --- a/src/libs/webapp/include/widget/DefaultHomePage.hpp +++ b/src/libs/webapp/include/widget/DefaultHomePage.hpp @@ -19,7 +19,7 @@ class DefaultHomePage final : public HomePage { DefaultHomePage(Session & session, std::unique_ptr< NavigationBar > navigationBar); ~DefaultHomePage() override; - void attachTo(Wt::WContainerWidget * parent) override; + void attachTo(Wt::WContainerWidget * parent); Wt::WNavigationBar * createNavigationBar(Wt::WContainerWidget * container); diff --git a/src/libs/webapp/include/widget/HomePage.hpp b/src/libs/webapp/include/widget/HomePage.hpp index e9bddb0..b4ba36f 100644 --- a/src/libs/webapp/include/widget/HomePage.hpp +++ b/src/libs/webapp/include/widget/HomePage.hpp @@ -1,16 +1,12 @@ #pragma once -namespace Wt { -class WContainerWidget; -} +#include namespace eedb { -class HomePage { +class HomePage : public Wt::WContainerWidget { public: virtual ~HomePage() = default; - - virtual void attachTo(Wt::WContainerWidget * parent) = 0; }; } // namespace eedb diff --git a/src/libs/webapp/include/widget/Theme.hpp b/src/libs/webapp/include/widget/Theme.hpp index f7218a3..9a8deae 100644 --- a/src/libs/webapp/include/widget/Theme.hpp +++ b/src/libs/webapp/include/widget/Theme.hpp @@ -14,7 +14,7 @@ class Theme { virtual ~Theme() = default; - virtual std::shared_ptr< Wt::WTheme > create() const = 0; + virtual std::unique_ptr< Wt::WTheme > create() const = 0; }; } // namespace eedb diff --git a/src/libs/webapp/src/BootstrapTheme.cpp b/src/libs/webapp/src/BootstrapTheme.cpp index f9c6198..337ca40 100644 --- a/src/libs/webapp/src/BootstrapTheme.cpp +++ b/src/libs/webapp/src/BootstrapTheme.cpp @@ -6,8 +6,8 @@ namespace eedb { BootstrapTheme::~BootstrapTheme() = default; -std::shared_ptr< Wt::WTheme > BootstrapTheme::create() const { - auto theme = std::make_shared< Wt::WBootstrapTheme >(); +std::unique_ptr< Wt::WTheme > BootstrapTheme::create() const { + auto theme = std::make_unique< Wt::WBootstrapTheme >(); theme->setVersion(Wt::WBootstrapTheme::Version::v3); theme->setResponsive(true); return theme; diff --git a/src/libs/webapp/src/WebApplication.cpp b/src/libs/webapp/src/WebApplication.cpp index 87d383a..ea6a2e2 100644 --- a/src/libs/webapp/src/WebApplication.cpp +++ b/src/libs/webapp/src/WebApplication.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include @@ -30,17 +31,16 @@ using std::move; namespace eedb { -WebApplication::WebApplication(std::unique_ptr session, AuthPageFactory authPageFactory, HomePageFactory homePageFactory) - : Wt::WApplication(session->enviroment()), - _session(move(session)), - _authPageFactory(move(authPageFactory)), - _homePageFactory(move(homePageFactory)) { +WebApplication::WebApplication(std::unique_ptr< eedb::IWebSession > session, + AuthPageFactory authPageFactory, + HomePageFactory homePageFactory) + : Wt::WApplication(session->enviroment()), _session(move(session)), _homePageFactory(move(homePageFactory)) { useStyleSheet("/resources/style.css"); setTheme(eedb::BootstrapTheme{}.create()); root()->addStyleClass("container"); - auto authPage = _authPageFactory(); + auto authPage = authPageFactory(); authPage->registerOnNeedVerification([] {}); authPage->registerOnUserWeakLogin([=] { authEventLogin(LoginState::weak); }); authPage->registerOnUserStrongLogin([=] { authEventLogin(LoginState::strong); }); @@ -50,21 +50,18 @@ WebApplication::WebApplication(std::unique_ptr session, AuthP root()->addWidget(std::move(authPage)); } -void WebApplication::authEventLogin(WebApplication::LoginState state) { - // { - // // auth widget must survive :) - // auto authWidgetPtr = root()->findById("eedb.authWidget"); - // auto authWidget = root()->removeWidget(authWidgetPtr); - // root()->clear(); - // root()->removeStyleClass("container"); - // if(authWidget) - // root()->addWidget(std::move(authWidget)); - // } +void WebApplication::authEventLogin(WebApplication::LoginState) { + { + // auth widget must survive :) + auto authWidget = root()->removeWidget(root()->findById("eedb.authWidget")); + root()->clear(); + root()->removeStyleClass("container"); + if(authWidget) + root()->addWidget(std::move(authWidget)); + } - // _homePage = _homePageFactory(); - // _homePage->attachTo(root()); - - // new eedb::Home(container, &_authWidget->login()); + auto homePage = _homePageFactory(); + root()->addWidget(std::move(homePage)); } void WebApplication::authEventLogout() { diff --git a/src/libs/webapp/test/CMakeLists.txt b/src/libs/webapp/test/CMakeLists.txt index 7b5a997..ea76d77 100644 --- a/src/libs/webapp/test/CMakeLists.txt +++ b/src/libs/webapp/test/CMakeLists.txt @@ -10,7 +10,7 @@ file(GLOB_RECURSE TEST_FILES test_*.cpp ) add_executable( ${TEST_EXECUTABLE_NAME} ${TEST_FILES}) target_link_libraries(${TEST_EXECUTABLE_NAME} - PRIVATE wttest + PRIVATE ${Wt_TEST_LIBRARY} PRIVATE eedb-api PRIVATE webapp PRIVATE webapp-mock