9 #include "Wt/Auth/AuthService"
10 #include "Wt/Auth/HashFunction"
11 #include "Wt/Auth/PasswordService"
12 #include "Wt/Auth/PasswordStrengthValidator"
13 #include "Wt/Auth/PasswordVerifier"
14 #include "Wt/Auth/GoogleService"
15 #include "Wt/Auth/Dbo/AuthInfo"
16 #include "Wt/Auth/Dbo/UserDatabase"
18 #include <Wt/WApplication>
25 #if !defined(WT_WIN32) && !defined(__CYGWIN__) && !defined(ANDROID)
33 namespace dbo = Wt::Dbo;
38 class UnixCryptHashFunction :
public Auth::HashFunction
41 virtual std::string compute(
const std::string& msg,
42 const std::string& salt)
const
44 std::string md5Salt =
"$1$" + salt;
45 return crypt(msg.c_str(), md5Salt.c_str());
48 virtual bool verify(
const std::string& msg,
49 const std::string& salt,
50 const std::string& hash)
const
52 return crypt(msg.c_str(), hash.c_str()) == hash;
55 virtual std::string name ()
const {
61 class MyOAuth :
public std::vector<const Auth::OAuthService *>
66 for (
unsigned i = 0; i < size(); ++i)
71 Auth::AuthService myAuthService;
72 Auth::PasswordService myPasswordService(myAuthService);
73 MyOAuth myOAuthServices;
78 myAuthService.setAuthTokensEnabled(
true,
"hangmancookie");
79 myAuthService.setEmailVerificationEnabled(
true);
81 Auth::PasswordVerifier *verifier =
new Auth::PasswordVerifier();
82 verifier->addHashFunction(
new Auth::BCryptHashFunction(7));
87 verifier->addHashFunction(
new UnixCryptHashFunction());
90 myPasswordService.setVerifier(verifier);
91 myPasswordService.setStrengthValidator(
new Auth::PasswordStrengthValidator());
92 myPasswordService.setAttemptThrottlingEnabled(
true);
94 if (Auth::GoogleService::configured())
95 myOAuthServices.push_back(
new Auth::GoogleService(myAuthService));
99 : sqlite3_(WApplication::instance()->appRoot() +
"hangman.db")
102 sqlite3_.setProperty(
"show-queries",
"true");
106 session_.mapClass<AuthInfo::AuthIdentityType>(
"auth_identity");
107 session_.mapClass<AuthInfo::AuthTokenType>(
"auth_token");
111 dbo::Transaction transaction(
session_);
118 Auth::User guestUser =
users_->registerNew();
119 guestUser.addIdentity(Auth::Identity::LoginName,
"guest");
120 myPasswordService.updatePassword(guestUser,
"guest");
122 Wt::log(
"info") <<
"Database created";
124 Wt::log(
"info") <<
"Using existing database";
127 transaction.commit();
138 dbo::ptr<AuthInfo> authInfo =
users_->find(
login_.user());
139 dbo::ptr<User>
user = authInfo->user();
143 authInfo.modify()->setUser(
user);
148 return dbo::ptr<User>();
154 return login_.user().identity(Auth::Identity::LoginName).toUTF8();
156 return std::string();
161 dbo::Transaction transaction(
session_);
163 dbo::ptr<User> u =
user();
165 u.modify()->score += s;
166 ++u.modify()->gamesPlayed;
167 u.modify()->lastGame = WDateTime::currentDateTime();
170 transaction.commit();
175 dbo::Transaction transaction(
session_);
179 std::vector<User> result;
180 for (Users::const_iterator i = top.begin(); i != top.end(); ++i) {
181 dbo::ptr<User>
user = *i;
182 result.push_back(*
user);
184 dbo::ptr<AuthInfo>
auth = *
user->authInfos.begin();
185 std::string name =
auth->identity(Auth::Identity::LoginName).toUTF8();
187 result.back().name = name;
190 transaction.commit();
197 dbo::Transaction transaction(
session_);
199 dbo::ptr<User> u =
user();
203 ranking =
session_.query<
int>(
"select distinct count(score) from user")
204 .where(
"score > ?").bind(u->score);
206 transaction.commit();
218 return myAuthService;
223 return myPasswordService;
228 return myOAuthServices;
Wt::Auth::Dbo::UserDatabase< AuthInfo > UserDatabase
Wt::Auth::Dbo::AuthInfo< User > AuthInfo
Wt::Dbo::collection< Wt::Dbo::ptr< User > > Users
static void configureAuth()
static const Wt::Auth::AbstractPasswordService & passwordAuth()
Wt::Dbo::backend::Sqlite3 sqlite3_
static const std::vector< const Wt::Auth::OAuthService * > & oAuth()
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
Wt::Auth::AbstractUserDatabase & users()