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

Generated on Mon Sep 4 2017 for the C++ Web Toolkit (Wt) by doxygen 1.8.11