9#include <Wt/Auth/AuthService.h>
10#include <Wt/Auth/HashFunction.h>
11#include <Wt/Auth/PasswordService.h>
12#include <Wt/Auth/PasswordStrengthValidator.h>
13#include <Wt/Auth/PasswordVerifier.h>
14#include <Wt/Auth/GoogleService.h>
15#include <Wt/Auth/Dbo/AuthInfo.h>
16#include <Wt/Auth/Dbo/UserDatabase.h>
18#include <Wt/WApplication.h>
19#include <Wt/WLogger.h>
25#if !defined(WT_WIN32) && !defined(__CYGWIN__) && !defined(ANDROID)
37class UnixCryptHashFunction :
public Auth::HashFunction
40 virtual std::string compute(
const std::string& msg,
41 const std::string& salt)
const
43 std::string md5Salt =
"$1$" + salt;
44 return crypt(msg.c_str(), md5Salt.c_str());
47 virtual bool verify(
const std::string& msg,
48 const std::string& salt,
49 const std::string& hash)
const
51 return crypt(msg.c_str(), hash.c_str()) == hash;
54 virtual std::string name ()
const {
60 Auth::AuthService myAuthService;
61 Auth::PasswordService myPasswordService(myAuthService);
62 std::vector<std::unique_ptr<const Auth::OAuthService>> myOAuthServices;
67 myAuthService.setAuthTokensEnabled(
true,
"hangmancookie");
68 myAuthService.setEmailVerificationEnabled(
true);
70 auto verifier = std::make_unique<Auth::PasswordVerifier>();
71 verifier->addHashFunction(std::make_unique<Auth::BCryptHashFunction>(7));
76 verifier->addHashFunction(std::make_unique<UnixCryptHashFunction>());
79 myPasswordService.setVerifier(std::move(verifier));
80 myPasswordService.setStrengthValidator(std::make_unique<Auth::PasswordStrengthValidator>());
81 myPasswordService.setAttemptThrottlingEnabled(
true);
83 if (Auth::GoogleService::configured()) {
84 myOAuthServices.push_back(std::make_unique<Auth::GoogleService>(myAuthService));
90 auto sqlite3 = std::make_unique<Dbo::backend::Sqlite3>(WApplication::instance()->appRoot() +
"hangman.db");
91 sqlite3->setProperty(
"show-queries",
"true");
92 session_.setConnection(std::move(sqlite3));
96 session_.mapClass<AuthInfo::AuthIdentityType>(
"auth_identity");
97 session_.mapClass<AuthInfo::AuthTokenType>(
"auth_token");
101 dbo::Transaction transaction(
session_);
108 Auth::User guestUser =
users_->registerNew();
109 guestUser.addIdentity(Auth::Identity::LoginName,
"guest");
110 myPasswordService.updatePassword(guestUser,
"guest");
112 log(
"info") <<
"Database created";
114 log(
"info") <<
"Using existing database";
117 transaction.commit();
123 dbo::ptr<AuthInfo> authInfo =
users_->find(
login_.user());
124 dbo::ptr<User>
user = authInfo->user();
128 authInfo.modify()->setUser(
user);
133 return dbo::ptr<User>();
139 return login_.user().identity(Auth::Identity::LoginName).toUTF8();
141 return std::string();
146 dbo::Transaction transaction(
session_);
148 dbo::ptr<User> u =
user();
150 u.modify()->score += s;
151 ++u.modify()->gamesPlayed;
152 u.modify()->lastGame = WDateTime::currentDateTime();
155 transaction.commit();
160 dbo::Transaction transaction(
session_);
164 std::vector<User> result;
165 for (Users::const_iterator i = top.begin(); i != top.end(); ++i) {
166 dbo::ptr<User>
user = *i;
167 result.push_back(*
user);
169 dbo::ptr<AuthInfo>
auth =
user->authInfo;
170 std::string name =
auth->identity(Auth::Identity::LoginName).toUTF8();
172 result.back().name = name;
175 transaction.commit();
182 dbo::Transaction transaction(
session_);
184 dbo::ptr<User> u =
user();
188 ranking =
session_.query<
int>(
"select distinct count(score) from user")
189 .where(
"score > ?").bind(u->score);
191 transaction.commit();
203 return myAuthService;
208 return myPasswordService;
213 std::vector<const Auth::OAuthService *> result;
214 result.reserve(myOAuthServices.size());
215 for (
const auto& service : myOAuthServices) {
216 result.push_back(service.get());
dbo::collection< dbo::ptr< User > > Users
Wt::Auth::Dbo::AuthInfo< User > AuthInfo
static void configureAuth()
static const Wt::Auth::AbstractPasswordService & passwordAuth()
std::unique_ptr< UserDatabase > users_
std::vector< User > topUsers(int limit)
std::string userName() const
Wt::Dbo::Session session_
static const Wt::Auth::AuthService & auth()
Wt::Dbo::ptr< User > user() const
static std::vector< const Wt::Auth::OAuthService * > oAuth()
Wt::Auth::AbstractUserDatabase & users()