Uncomment user actions and fix by finding active DB object instead of converting dead one. Use font-awesome to make icons for buttons. Implement rest of basic logic for login page. Some style fixings. Start adding skip controls.
This commit is contained in:
@@ -19,11 +19,15 @@
|
||||
|
||||
#include "LoginInterface.h"
|
||||
#include "../db/UserAction.h"
|
||||
#include <Wt/WApplication>
|
||||
#include <Wt/WEnvironment>
|
||||
#include <Wt/Dbo/ptr>
|
||||
#include <Wt/Auth/HashFunction>
|
||||
#include <Wt/WRandom>
|
||||
|
||||
LoginInterface::LoginInterface(WebInterface* app)
|
||||
{
|
||||
this->app = app;
|
||||
//TODO: First check if cookie is set and if is a valid user. Skip login if valid.
|
||||
loginContainer = new Wt::WContainerWidget();
|
||||
loginLayout = new Wt::WVBoxLayout();
|
||||
loginMessage = new Wt::WText("Please Login to access.");
|
||||
@@ -52,6 +56,24 @@ LoginInterface::LoginInterface(WebInterface* app)
|
||||
loginContainer->setWidth(Wt::WLength(50, Wt::WLength::Percentage));
|
||||
}
|
||||
|
||||
void LoginInterface::checkSessionValidity()
|
||||
{
|
||||
Wt::Dbo::Session sqlSession;
|
||||
sqlSession.setConnectionPool(*GroovePlayerMgr::getInstance()->connectionPool);
|
||||
sqlSession.mapClass<User>("user");
|
||||
sqlSession.mapClass<AudioTrack>("tracks");
|
||||
sqlSession.mapClass<UserAction>("actions");
|
||||
//First check if cookie is set and if is a valid user. Skip login if valid.
|
||||
try{
|
||||
if(Wt::WApplication::instance()->environment().getCookieValue("arbitrateor_user") != nullptr && getUserForLoginCookie(&sqlSession, *Wt::WApplication::instance()->environment().getCookieValue("arbitrateor_user")).username != User().username)
|
||||
{
|
||||
app->currentUser = getUserForLoginCookie(&sqlSession, *Wt::WApplication::instance()->environment().getCookieValue("arbitrateor_user"));
|
||||
app->loginCompleted();
|
||||
}
|
||||
}
|
||||
catch(std::runtime_error e){}
|
||||
}
|
||||
|
||||
void LoginInterface::loginCheck()
|
||||
{
|
||||
//Reset message in case of success.
|
||||
@@ -78,9 +100,10 @@ void LoginInterface::loginCheck()
|
||||
createUser(&sqlSession, usernameField->text().toUTF8(),passwordField->text().toUTF8(), true);
|
||||
}
|
||||
//Check if the credentials match anything in the DB. If so, store cookie to skip login.
|
||||
if(getUserForLoginAuth(&sqlSession, usernameField->text().toUTF8(),passwordField->text().toUTF8()) != nullptr)
|
||||
if(getUserForLoginAuth(&sqlSession, usernameField->text().toUTF8(),passwordField->text().toUTF8()).username != User().username && !getUserForLoginAuth(&sqlSession, usernameField->text().toUTF8(),passwordField->text().toUTF8()).isDisabled)
|
||||
{
|
||||
app->currentUser = *getUserForLoginAuth(&sqlSession, usernameField->text().toUTF8(),passwordField->text().toUTF8());
|
||||
app->currentUser = getUserForLoginAuth(&sqlSession, usernameField->text().toUTF8(),passwordField->text().toUTF8());
|
||||
Wt::log("info") << "login by "<< app->currentUser.username << " happened.";
|
||||
setLocalCookieForUser(app->currentUser);
|
||||
app->loginCompleted();
|
||||
}
|
||||
@@ -94,25 +117,54 @@ void LoginInterface::loginCheck()
|
||||
|
||||
void LoginInterface::createUser(Wt::Dbo::Session* session, std::string username, std::string rawPassword, bool isAdmin)
|
||||
{
|
||||
//TODO
|
||||
Wt::Dbo::Transaction transaction(*session);
|
||||
Wt::Auth::BCryptHashFunction hasher;
|
||||
User* user = new User();
|
||||
user->isAdmin = isAdmin;
|
||||
user->username = username;
|
||||
user->isDisabled = false;
|
||||
user->passwordSalt = Wt::WRandom::generateId();
|
||||
user->passwordHash = hasher.compute(rawPassword, user->passwordSalt);
|
||||
user->loginCookieToken = Wt::WRandom::generateId();
|
||||
session->add(user);
|
||||
transaction.commit();
|
||||
}
|
||||
|
||||
int LoginInterface::getUserCount(Wt::Dbo::Session* session)
|
||||
{
|
||||
//TODO
|
||||
Wt::Dbo::Transaction transaction(*session);
|
||||
int userCount = session->query<int>("select count(username) from user");
|
||||
transaction.commit();
|
||||
return userCount;
|
||||
}
|
||||
|
||||
User* LoginInterface::getUserForLoginCookie(Wt::Dbo::Session* session, std::string cookie)
|
||||
User LoginInterface::getUserForLoginCookie(Wt::Dbo::Session* session, std::string cookie)
|
||||
{
|
||||
//TODO
|
||||
Wt::Dbo::Transaction transaction(*session);
|
||||
Wt::Dbo::ptr<User> user = session->find<User>().where("cookie = ?").bind(cookie);
|
||||
transaction.commit();
|
||||
if(user.get() != nullptr)
|
||||
{
|
||||
return (*user);
|
||||
}
|
||||
return User();
|
||||
}
|
||||
|
||||
User* LoginInterface::getUserForLoginAuth(Wt::Dbo::Session* session, std::string username, std::string rawPassword)
|
||||
User LoginInterface::getUserForLoginAuth(Wt::Dbo::Session* session, std::string username, std::string rawPassword)
|
||||
{
|
||||
//TODO
|
||||
Wt::Dbo::Transaction transaction(*session);
|
||||
Wt::Auth::BCryptHashFunction hasher;
|
||||
Wt::Dbo::ptr<User> user = session->find<User>().where("username = ?").bind(username);
|
||||
if(user.get() != nullptr && hasher.compute(rawPassword,(*user).passwordSalt) == (*user).passwordHash)
|
||||
{
|
||||
transaction.commit();
|
||||
return (*user);
|
||||
}
|
||||
transaction.commit();
|
||||
return User();
|
||||
}
|
||||
|
||||
void LoginInterface::setLocalCookieForUser(User user)
|
||||
{
|
||||
//TODO
|
||||
this->app->setCookie("arbitrateor_user", user.loginCookieToken,2628000);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user