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) 35 class UnixCryptHashFunction :
public Auth::HashFunction
38 virtual std::string compute(
const std::string& msg,
39 const std::string& salt)
const 41 std::string md5Salt =
"$1$" + salt;
42 return crypt(msg.c_str(), md5Salt.c_str());
45 virtual bool verify(
const std::string& msg,
46 const std::string& salt,
47 const std::string& hash)
const 49 return crypt(msg.c_str(), hash.c_str()) == hash;
52 virtual std::string name ()
const {
58 class MyOAuth :
public std::vector<const Auth::OAuthService *>
63 for (
unsigned i = 0; i < size(); ++i)
68 Auth::AuthService myAuthService;
69 Auth::PasswordService myPasswordService(myAuthService);
70 MyOAuth myOAuthServices;
75 myAuthService.setAuthTokensEnabled(
true,
"hangmancookie");
76 myAuthService.setEmailVerificationEnabled(
true);
78 std::unique_ptr<Auth::PasswordVerifier> verifier
79 = cpp14::make_unique<Auth::PasswordVerifier>();
80 verifier->addHashFunction(cpp14::make_unique<Auth::BCryptHashFunction>(7));
85 verifier->addHashFunction(cpp14::make_unique<UnixCryptHashFunction>());
88 myPasswordService.setVerifier(std::move(verifier));
89 myPasswordService.setStrengthValidator(cpp14::make_unique<Auth::PasswordStrengthValidator>());
90 myPasswordService.setAttemptThrottlingEnabled(
true);
92 if (Auth::GoogleService::configured())
93 myOAuthServices.push_back(
new Auth::GoogleService(myAuthService));
98 auto sqlite3 = cpp14::make_unique<Dbo::backend::Sqlite3>(WApplication::instance()->appRoot() +
"hangman.db");
99 sqlite3->setProperty(
"show-queries",
"true");
100 session_.setConnection(std::move(sqlite3));
104 session_.mapClass<AuthInfo::AuthIdentityType>(
"auth_identity");
105 session_.mapClass<AuthInfo::AuthTokenType>(
"auth_token");
109 dbo::Transaction transaction(
session_);
116 Auth::User guestUser =
users_->registerNew();
117 guestUser.addIdentity(Auth::Identity::LoginName,
"guest");
118 myPasswordService.updatePassword(guestUser,
"guest");
120 log(
"info") <<
"Database created";
122 log(
"info") <<
"Using existing database";
125 transaction.commit();
135 dbo::ptr<AuthInfo> authInfo =
users_->find(
login_.user());
136 dbo::ptr<User>
user = authInfo->user();
140 authInfo.modify()->setUser(
user);
145 return dbo::ptr<User>();
151 return login_.user().identity(Auth::Identity::LoginName).toUTF8();
153 return std::string();
158 dbo::Transaction transaction(
session_);
160 dbo::ptr<User> u =
user();
162 u.modify()->score += s;
163 ++u.modify()->gamesPlayed;
164 u.modify()->lastGame = WDateTime::currentDateTime();
167 transaction.commit();
172 dbo::Transaction transaction(
session_);
176 std::vector<User> result;
177 for (Users::const_iterator i = top.begin(); i != top.end(); ++i) {
178 dbo::ptr<User>
user = *i;
179 result.push_back(*
user);
181 dbo::ptr<AuthInfo>
auth = *
user->authInfos.begin();
182 std::string name =
auth->identity(Auth::Identity::LoginName).toUTF8();
184 result.back().name = name;
187 transaction.commit();
194 dbo::Transaction transaction(
session_);
196 dbo::ptr<User> u =
user();
200 ranking =
session_.query<
int>(
"select distinct count(score) from user")
201 .where(
"score > ?").bind(u->score);
203 transaction.commit();
215 return myAuthService;
220 return myPasswordService;
225 return myOAuthServices;
Auth::Dbo::AuthInfo< User > AuthInfo
dbo::collection< dbo::ptr< User > > Users
std::string userName() const
Auth::AbstractUserDatabase & users()
static const Auth::AuthService & auth()
static const std::vector< const Auth::OAuthService * > & oAuth()
static void configureAuth()
Dbo::ptr< User > user() const
std::unique_ptr< UserDatabase > users_
std::vector< User > topUsers(int limit)
static const Auth::AbstractPasswordService & passwordAuth()