Make sql connection public to share same connection pool. Layout calls for user info from DB. Implement login path.

This commit is contained in:
Kevin Whitaker
2017-02-18 00:27:24 -05:00
parent 1279143931
commit c5e979e948
3 changed files with 80 additions and 4 deletions

View File

@@ -66,11 +66,11 @@ public:
};
std::list<AudioTrack> requestQueue;
std::list<PlayerEvent> lastInternalEvents;
Wt::Dbo::backend::Sqlite3* sqliteConnection;
Wt::Dbo::FixedSqlConnectionPool* connectionPool;
private:
GroovePlayerMgr (std::string dbFile);
~GroovePlayerMgr();
Wt::Dbo::backend::Sqlite3* sqliteConnection;
Wt::Dbo::FixedSqlConnectionPool* connectionPool;
bool continueEventLoop = true;
std::thread* grooveEvents;

View File

@@ -18,12 +18,15 @@
*/
#include "LoginInterface.h"
#include "../db/UserAction.h"
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.");
loginContainer->setLayout(loginLayout);
usernameArea = new Wt::WHBoxLayout();
passwordArea = new Wt::WHBoxLayout();
@@ -38,13 +41,78 @@ LoginInterface::LoginInterface(WebInterface* app)
usernameArea->addWidget(usernameField);
passwordArea->addWidget(new Wt::WText("Password:"));
passwordArea->addWidget(passwordField);
loginLayout->addWidget(new Wt::WText("Please Login to access."));
loginLayout->addWidget(loginMessage);
loginLayout->addWidget(usernameContainer);
loginLayout->addWidget(passwordContainer);
loginButton = new Wt::WPushButton("Login");
loginButton->clicked().connect(app, &WebInterface::loginCompleted);
loginButton->clicked().connect(this, &LoginInterface::loginCheck);
setContentAlignment(Wt::AlignmentFlag::AlignCenter);
loginLayout->addWidget(loginButton);
addChild(loginContainer);
loginContainer->setWidth(Wt::WLength(50, Wt::WLength::Percentage));
}
void LoginInterface::loginCheck()
{
//Reset message in case of success.
loginMessage->setText("Please Login to access.");
loginMessage->decorationStyle().setForegroundColor(Wt::WColor("black"));
//First, check if username and password are filled.
if(usernameField->text().empty() || passwordField->text().empty())
{
loginMessage->setText("Please fill out username and password.");
loginMessage->decorationStyle().setForegroundColor(Wt::WColor("red"));
return;
}
Wt::Dbo::Session sqlSession;
sqlSession.setConnectionPool(*GroovePlayerMgr::getInstance()->connectionPool);
sqlSession.mapClass<User>("user");
sqlSession.mapClass<AudioTrack>("tracks");
sqlSession.mapClass<UserAction>("actions");
//Check if there are any users. If not, use the username/password as new admin user.
if(getUserCount(&sqlSession) < 1)
{
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)
{
app->currentUser = *getUserForLoginAuth(&sqlSession, usernameField->text().toUTF8(),passwordField->text().toUTF8());
setLocalCookieForUser(app->currentUser);
app->loginCompleted();
}
//If credentials don't match, reject user with message saying crednetials are wrong and they can ask an admin to make them an account.
else
{
loginMessage->setText("Username or password is incorrect. Do you have an account?");
loginMessage->decorationStyle().setForegroundColor(Wt::WColor("red"));
}
}
void LoginInterface::createUser(Wt::Dbo::Session* session, std::string username, std::string rawPassword, bool isAdmin)
{
//TODO
}
int LoginInterface::getUserCount(Wt::Dbo::Session* session)
{
//TODO
}
User* LoginInterface::getUserForLoginCookie(Wt::Dbo::Session* session, std::string cookie)
{
//TODO
}
User* LoginInterface::getUserForLoginAuth(Wt::Dbo::Session* session, std::string username, std::string rawPassword)
{
//TODO
}
void LoginInterface::setLocalCookieForUser(User user)
{
//TODO
}

View File

@@ -27,6 +27,7 @@
#include <Wt/WLineEdit>
#include <Wt/WText>
#include "../WebInterface.h"
#include <Wt/Dbo/Session>
class LoginInterface : public Wt::WContainerWidget
{
@@ -42,7 +43,14 @@ private:
Wt::WContainerWidget* passwordContainer;
Wt::WLineEdit* usernameField;
Wt::WLineEdit* passwordField;
Wt::WText* loginMessage;
WebInterface* app;
void loginCheck();
void createUser(Wt::Dbo::Session* session, std::string username, std::string rawPassword, bool isAdmin);
int getUserCount(Wt::Dbo::Session* session);
User* getUserForLoginCookie(Wt::Dbo::Session* session, std::string cookie);
User* getUserForLoginAuth(Wt::Dbo::Session* session, std::string username, std::string rawPassword);
void setLocalCookieForUser(User user);
};
#endif // LOGININTERFACE_H