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) 37 virtual std::string compute(
const std::string& msg,
38 const std::string& salt)
const 40 std::string md5Salt =
"$1$" + salt;
41 return crypt(msg.c_str(), md5Salt.c_str());
44 virtual bool verify(
const std::string& msg,
45 const std::string& salt,
46 const std::string& hash)
const 48 return crypt(msg.c_str(), hash.c_str()) == hash;
51 virtual std::string name ()
const {
57 class MyOAuth :
public std::vector<const Auth::OAuthService *>
62 for (
unsigned i = 0; i < size(); ++i)
69 MyOAuth myOAuthServices;
74 myAuthService.setAuthTokensEnabled(
true,
"hangmancookie");
75 myAuthService.setEmailVerificationEnabled(
true);
77 std::unique_ptr<Auth::PasswordVerifier> verifier
78 = cpp14::make_unique<Auth::PasswordVerifier>();
79 verifier->addHashFunction(cpp14::make_unique<Auth::BCryptHashFunction>(7));
84 verifier->addHashFunction(cpp14::make_unique<UnixCryptHashFunction>());
87 myPasswordService.setVerifier(std::move(verifier));
88 myPasswordService.setStrengthValidator(cpp14::make_unique<Auth::PasswordStrengthValidator>());
89 myPasswordService.setAttemptThrottlingEnabled(
true);
91 if (Auth::GoogleService::configured())
97 auto sqlite3 = cpp14::make_unique<Dbo::backend::Sqlite3>(WApplication::instance()->appRoot() +
"hangman.db");
98 sqlite3->setProperty(
"show-queries",
"true");
99 session_.setConnection(std::move(sqlite3));
101 session_.mapClass<
User>(
"user");
102 session_.mapClass<
AuthInfo>(
"auth_info");
106 users_ = cpp14::make_unique<UserDatabase>(session_);
110 session_.createTables();
116 guestUser.
addIdentity(Auth::Identity::LoginName,
"guest");
117 myPasswordService.updatePassword(guestUser,
"guest");
119 log(
"info") <<
"Database created";
121 log(
"info") <<
"Using existing database";
124 transaction.commit();
133 if (login_.loggedIn()) {
138 user = session_.add(Wt::cpp14::make_unique<User>());
149 if (login_.loggedIn())
150 return login_.user().identity(Auth::Identity::LoginName).toUTF8();
152 return std::string();
173 Users top = session_.
find<
User>().orderBy(
"score desc").limit(limit);
175 std::vector<User> result;
178 result.push_back(*user);
181 std::string name = auth->
identity(Auth::Identity::LoginName).
toUTF8();
183 result.back().name = name;
199 ranking = session_.query<
int>(
"select distinct count(score) from user")
200 .where(
"score > ?").bind(u->
score);
214 return myAuthService;
219 return myPasswordService;
224 return myOAuthServices;
Dbo::ptr< User > user() const
Wt::Dbo::ptr< UserType > user() const
Auth::AbstractUserDatabase & users()
static const Auth::AuthService & auth()
std::string toUTF8() const
WString identity(const std::string &provider) const
dbo::collection< dbo::ptr< AuthInfo > > authInfos
void setUser(Wt::Dbo::ptr< UserType > user)
static const std::vector< const Auth::OAuthService * > & oAuth()
Query< C, DynamicBinding > find() const
static void configureAuth()
void addIdentity(const std::string &provider, const WString &identity)
std::vector< User > topUsers(int limit)
static const Auth::AbstractPasswordService & passwordAuth()
std::string userName() const