Wt examples 3.3.12
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#ifndef _XOPEN_CRYPT
28#include <crypt.h>
29#endif // _XOPEN_CRYPT
30#endif
31
32using namespace Wt;
33namespace dbo = Wt::Dbo;
34
35namespace {
36
37#ifdef HAVE_CRYPT
38class 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
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");
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()) {
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
151std::string Session::userName() const
152{
153 if (login_.loggedIn())
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
173std::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
215
217{
218 return myAuthService;
219}
220
222{
223 return myPasswordService;
224}
225
226const std::vector<const Auth::OAuthService *>& Session::oAuth()
227{
228 return myOAuthServices;
229}
Wt::Auth::Dbo::UserDatabase< AuthInfo > UserDatabase
Definition Session.h:21
static void configureAuth()
Definition Session.C:76
static const Wt::Auth::AbstractPasswordService & passwordAuth()
Definition Session.C:221
Wt::Dbo::backend::Sqlite3 sqlite3_
Definition Session.h:48
static const std::vector< const Wt::Auth::OAuthService * > & oAuth()
Definition Session.C:226
std::vector< User > topUsers(int limit)
Definition Session.C:173
Wt::Auth::Login login_
Definition Session.h:51
UserDatabase * users_
Definition Session.h:50
std::string userName() const
Definition Session.C:151
Wt::Dbo::Session session_
Definition Session.h:49
static const Wt::Auth::AuthService & auth()
Definition Session.C:216
~Session()
Definition Session.C:130
Wt::Dbo::ptr< User > user() const
Definition Session.C:135
int findRanking()
Definition Session.C:195
Session()
Definition Session.C:98
Wt::Auth::AbstractUserDatabase & users()
Definition Session.C:211
void addToScore(int s)
Definition Session.C:159
Definition User.h:23
Wt::Dbo::ptr< DboType > find(const User &user) const
static bool configured()
static const std::string LoginName
const User & user() const
bool loggedIn() const
void addHashFunction(HashFunction *function)
void addIdentity(const std::string &provider, const WString &identity)
WString identity(const std::string &provider) const
Query< ptr< C >, BindStrategy > find(const std::string &condition=std::string())
void mapClass(const char *tableName)
Query< Result, BindStrategy > query(const std::string &sql)
ptr< C > add(ptr< C > &ptr)
void setConnection(SqlConnection &connection)
void setProperty(const std::string &name, const std::string &value)
C * modify() const
static WDateTime currentDateTime()
std::string toUTF8() const

Generated on Fri May 17 2024 for the C++ Web Toolkit (Wt) by doxygen 1.9.8