Wt examples  3.3.8
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"
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 #endif
28 
29 using namespace Wt;
30 namespace dbo = Wt::Dbo;
31 
32 namespace {
33 
34 #ifdef HAVE_CRYPT
35 class UnixCryptHashFunction : public Auth::HashFunction
36  {
37  public:
38  virtual std::string compute(const std::string& msg,
39  const std::string& salt) const
40  {
41  std::string md5Salt = "$1$" + salt;
42  return crypt(msg.c_str(), md5Salt.c_str());
43  }
44 
45  virtual bool verify(const std::string& msg,
46  const std::string& salt,
47  const std::string& hash) const
48  {
49  return crypt(msg.c_str(), hash.c_str()) == hash;
50  }
51 
52  virtual std::string name () const {
53  return "crypt";
54  }
55  };
56 #endif // HAVE_CRYPT
57 
58  class MyOAuth : public std::vector<const Auth::OAuthService *>
59  {
60  public:
61  ~MyOAuth()
62  {
63  for (unsigned i = 0; i < size(); ++i)
64  delete (*this)[i];
65  }
66  };
67 
68  Auth::AuthService myAuthService;
69  Auth::PasswordService myPasswordService(myAuthService);
70  MyOAuth myOAuthServices;
71 }
72 
74 {
75  myAuthService.setAuthTokensEnabled(true, "hangmancookie");
76  myAuthService.setEmailVerificationEnabled(true);
77 
79  verifier->addHashFunction(new 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(new UnixCryptHashFunction());
85 #endif
86 
87  myPasswordService.setVerifier(verifier);
88  myPasswordService.setStrengthValidator(new Auth::PasswordStrengthValidator());
89  myPasswordService.setAttemptThrottlingEnabled(true);
90 
92  myOAuthServices.push_back(new Auth::GoogleService(myAuthService));
93 }
94 
96  : sqlite3_(WApplication::instance()->appRoot() + "hangman.db")
97 {
99  sqlite3_.setProperty("show-queries", "true");
100 
101  session_.mapClass<User>("user");
102  session_.mapClass<AuthInfo>("auth_info");
103  session_.mapClass<AuthInfo::AuthIdentityType>("auth_identity");
105 
107 
108  dbo::Transaction transaction(session_);
109  try {
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  Wt::log("info") << "Database created";
120  } catch (...) {
121  Wt::log("info") << "Using existing database";
122  }
123 
124  transaction.commit();
125 }
126 
128 {
129  delete users_;
130 }
131 
133 {
134  if (login_.loggedIn()) {
135  dbo::ptr<AuthInfo> authInfo = users_->find(login_.user());
136  dbo::ptr<User> user = authInfo->user();
137 
138  if (!user) {
139  user = session_.add(new User());
140  authInfo.modify()->setUser(user);
141  }
142 
143  return user;
144  } else
145  return dbo::ptr<User>();
146 }
147 
148 std::string Session::userName() const
149 {
150  if (login_.loggedIn())
151  return login_.user().identity(Auth::Identity::LoginName).toUTF8();
152  else
153  return std::string();
154 }
155 
157 {
158  dbo::Transaction transaction(session_);
159 
160  dbo::ptr<User> u = user();
161  if (u) {
162  u.modify()->score += s;
163  ++u.modify()->gamesPlayed;
164  u.modify()->lastGame = WDateTime::currentDateTime();
165  }
166 
167  transaction.commit();
168 }
169 
170 std::vector<User> Session::topUsers(int limit)
171 {
172  dbo::Transaction transaction(session_);
173 
174  Users top = session_.find<User>().orderBy("score desc").limit(limit);
175 
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);
180 
181  dbo::ptr<AuthInfo> auth = *user->authInfos.begin();
182  std::string name = auth->identity(Auth::Identity::LoginName).toUTF8();
183 
184  result.back().name = name;
185  }
186 
187  transaction.commit();
188 
189  return result;
190 }
191 
193 {
194  dbo::Transaction transaction(session_);
195 
196  dbo::ptr<User> u = user();
197  int ranking = -1;
198 
199  if (u)
200  ranking = session_.query<int>("select distinct count(score) from user")
201  .where("score > ?").bind(u->score);
202 
203  transaction.commit();
204 
205  return ranking + 1;
206 }
207 
209 {
210  return *users_;
211 }
212 
214 {
215  return myAuthService;
216 }
217 
219 {
220  return myPasswordService;
221 }
222 
223 const std::vector<const Auth::OAuthService *>& Session::oAuth()
224 {
225  return myOAuthServices;
226 }
Wt::Dbo::ptr< DboType > find(const User &user) const
UserDatabase * users_
Definition: Session.h:50
Wt::Dbo::ptr< User > user() const
Definition: Session.C:132
ptr< C > add(ptr< C > &ptr)
C * modify() const
Query< ptr< C >, BindStrategy > find(const std::string &condition=std::string())
Wt::Auth::Dbo::UserDatabase< AuthInfo > UserDatabase
Definition: Session.h:21
WString identity(const std::string &provider) const
Wt::WDateTime lastGame
Definition: User.h:30
Wt::Dbo::ptr< UserType > user() const
Wt::Auth::AbstractUserDatabase & users()
Definition: Session.C:208
bool loggedIn() const
Session()
Definition: Session.C:95
int findRanking()
Definition: Session.C:192
Wt::Auth::Login login_
Definition: Session.h:51
Definition: User.h:22
static const Wt::Auth::AuthService & auth()
Definition: Session.C:213
Wt::Dbo::Session session_
Definition: Session.h:49
std::string toUTF8() const
int gamesPlayed
Definition: User.h:28
WString identity(const std::string &provider) const
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:223
Wt::Dbo::backend::Sqlite3 sqlite3_
Definition: Session.h:48
const User & user() const
void addHashFunction(HashFunction *function)
void setConnection(SqlConnection &connection)
static void configureAuth()
Definition: Session.C:73
void addIdentity(const std::string &provider, const WString &identity)
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:170
~Session()
Definition: Session.C:127
static const Wt::Auth::AbstractPasswordService & passwordAuth()
Definition: Session.C:218
void addToScore(int s)
Definition: Session.C:156
Query< Result, BindStrategy > query(const std::string &sql)
static bool configured()
std::string userName() const
Definition: Session.C:148
void setProperty(const std::string &name, const std::string &value)

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