Wt examples  3.7.1
Session.C
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2011 Emweb bv, Herent, Belgium.
3  *
4  * See the LICENSE file for terms of use.
5  */
6 
7 #include "Session.h"
8 
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"
17 
18 #include <Wt/WApplication>
19 #include <Wt/WLogger>
20 
21 #ifndef WT_WIN32
22 #include <unistd.h>
23 #endif
24 
25 #if !defined(WT_WIN32) && !defined(__CYGWIN__) && !defined(ANDROID)
26 #define HAVE_CRYPT
27 #ifndef _XOPEN_CRYPT
28 #include <crypt.h>
29 #endif // _XOPEN_CRYPT
30 #endif
31 
32 using namespace Wt;
33 namespace dbo = Wt::Dbo;
34 
35 namespace {
36 
37 #ifdef HAVE_CRYPT
38 class UnixCryptHashFunction : public Auth::HashFunction
39  {
40  public:
41  virtual std::string compute(const std::string& msg,
42  const std::string& salt) const
43  {
44  std::string md5Salt = "$1$" + salt;
45  return crypt(msg.c_str(), md5Salt.c_str());
46  }
47 
48  virtual bool verify(const std::string& msg,
49  const std::string& salt,
50  const std::string& hash) const
51  {
52  return crypt(msg.c_str(), hash.c_str()) == hash;
53  }
54 
55  virtual std::string name () const {
56  return "crypt";
57  }
58  };
59 #endif // HAVE_CRYPT
60 
61  class MyOAuth : public std::vector<const Auth::OAuthService *>
62  {
63  public:
64  ~MyOAuth()
65  {
66  for (unsigned i = 0; i < size(); ++i)
67  delete (*this)[i];
68  }
69  };
70 
71  Auth::AuthService myAuthService;
72  Auth::PasswordService myPasswordService(myAuthService);
73  MyOAuth myOAuthServices;
74 }
75 
77 {
78  myAuthService.setAuthTokensEnabled(true, "hangmancookie");
79  myAuthService.setEmailVerificationEnabled(true);
80 
82  verifier->addHashFunction(new Auth::BCryptHashFunction(7));
83 
84 #ifdef HAVE_CRYPT
85  // We want to still support users registered in the pre - Wt::Auth
86  // version of the hangman example
87  verifier->addHashFunction(new UnixCryptHashFunction());
88 #endif
89 
90  myPasswordService.setVerifier(verifier);
91  myPasswordService.setStrengthValidator(new Auth::PasswordStrengthValidator());
92  myPasswordService.setAttemptThrottlingEnabled(true);
93 
95  myOAuthServices.push_back(new Auth::GoogleService(myAuthService));
96 }
97 
99  : sqlite3_(WApplication::instance()->appRoot() + "hangman.db")
100 {
102  sqlite3_.setProperty("show-queries", "true");
103 
104  session_.mapClass<User>("user");
105  session_.mapClass<AuthInfo>("auth_info");
106  session_.mapClass<AuthInfo::AuthIdentityType>("auth_identity");
108 
110 
111  dbo::Transaction transaction(session_);
112  try {
114 
115  /*
116  * Add a default guest/guest account
117  */
118  Auth::User guestUser = users_->registerNew();
119  guestUser.addIdentity(Auth::Identity::LoginName, "guest");
120  myPasswordService.updatePassword(guestUser, "guest");
121 
122  Wt::log("info") << "Database created";
123  } catch (...) {
124  Wt::log("info") << "Using existing database";
125  }
126 
127  transaction.commit();
128 }
129 
131 {
132  delete users_;
133 }
134 
136 {
137  if (login_.loggedIn()) {
138  dbo::ptr<AuthInfo> authInfo = users_->find(login_.user());
139  dbo::ptr<User> user = authInfo->user();
140 
141  if (!user) {
142  user = session_.add(new User());
143  authInfo.modify()->setUser(user);
144  }
145 
146  return user;
147  } else
148  return dbo::ptr<User>();
149 }
150 
151 std::string Session::userName() const
152 {
153  if (login_.loggedIn())
154  return login_.user().identity(Auth::Identity::LoginName).toUTF8();
155  else
156  return std::string();
157 }
158 
160 {
161  dbo::Transaction transaction(session_);
162 
163  dbo::ptr<User> u = user();
164  if (u) {
165  u.modify()->score += s;
166  ++u.modify()->gamesPlayed;
167  u.modify()->lastGame = WDateTime::currentDateTime();
168  }
169 
170  transaction.commit();
171 }
172 
173 std::vector<User> Session::topUsers(int limit)
174 {
175  dbo::Transaction transaction(session_);
176 
177  Users top = session_.find<User>().orderBy("score desc").limit(limit);
178 
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);
183 
184  dbo::ptr<AuthInfo> auth = *user->authInfos.begin();
185  std::string name = auth->identity(Auth::Identity::LoginName).toUTF8();
186 
187  result.back().name = name;
188  }
189 
190  transaction.commit();
191 
192  return result;
193 }
194 
196 {
197  dbo::Transaction transaction(session_);
198 
199  dbo::ptr<User> u = user();
200  int ranking = -1;
201 
202  if (u)
203  ranking = session_.query<int>("select distinct count(score) from user")
204  .where("score > ?").bind(u->score);
205 
206  transaction.commit();
207 
208  return ranking + 1;
209 }
210 
212 {
213  return *users_;
214 }
215 
217 {
218  return myAuthService;
219 }
220 
222 {
223  return myPasswordService;
224 }
225 
226 const std::vector<const Auth::OAuthService *>& Session::oAuth()
227 {
228  return myOAuthServices;
229 }
UserDatabase * users_
Definition: Session.h:50
void addHashFunction(std::unique_ptr< HashFunction > function)
C * modify() const
ptr< C > add(ptr< C > &ptr)
Query< ptr< C >, BindStrategy > find(const std::string &condition=std::string())
bool loggedIn() const
WString identity(const std::string &provider) const
Wt::Auth::Dbo::UserDatabase< AuthInfo > UserDatabase
Definition: Session.h:21
Wt::WDateTime lastGame
Definition: User.h:30
std::string userName() const
Definition: Session.C:151
WString identity(const std::string &provider) const
Wt::Auth::AbstractUserDatabase & users()
Definition: Session.C:211
Session()
Definition: Session.C:98
int findRanking()
Definition: Session.C:195
Wt::Auth::Login login_
Definition: Session.h:51
Definition: User.h:22
static const Wt::Auth::AuthService & auth()
Definition: Session.C:216
Wt::Dbo::Session session_
Definition: Session.h:49
Wt::Dbo::ptr< DboType > find(const User &user) const
std::string toUTF8() const
int gamesPlayed
Definition: User.h:28
long long score
Definition: User.h:29
void setUser(Wt::Dbo::ptr< UserType > user)
static const std::vector< const Wt::Auth::OAuthService * > & oAuth()
Definition: Session.C:226
Wt::Dbo::backend::Sqlite3 sqlite3_
Definition: Session.h:48
static void configureAuth()
Definition: Session.C:76
const User & user() const
Wt::Dbo::ptr< UserType > user() const
void addIdentity(const std::string &provider, const WString &identity)
Wt::Dbo::ptr< User > user() const
Definition: Session.C:135
Wt::Dbo::collection< Wt::Dbo::ptr< AuthInfo > > authInfos
Definition: User.h:31
void mapClass(const char *tableName)
std::vector< User > topUsers(int limit)
Definition: Session.C:173
~Session()
Definition: Session.C:130
static const Wt::Auth::AbstractPasswordService & passwordAuth()
Definition: Session.C:221
void addToScore(int s)
Definition: Session.C:159
void setConnection(std::unique_ptr< SqlConnection > connection)
Query< Result, BindStrategy > query(const std::string &sql)
static bool configured()
void setProperty(const std::string &name, const std::string &value)

Generated on Tue Dec 15 2020 for the C++ Web Toolkit (Wt) by doxygen 1.8.13