The Battle for Wesnoth  1.19.0-dev
user_handler.hpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2008 - 2024
3  by Thomas Baumhauer <thomas.baumhauer@NOSPAMgmail.com>
4  Part of the Battle for Wesnoth Project https://www.wesnoth.org/
5 
6  This program is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2 of the License, or
9  (at your option) any later version.
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY.
12 
13  See the COPYING file for more details.
14 */
15 
16 #pragma once
17 
18 class config;
19 
20 #include "exceptions.hpp"
21 
22 #include <ctime>
23 #include <string>
24 
25 #include <boost/asio/io_service.hpp>
26 
28 
29 namespace wesnothd
30 {
31  class server;
32 }
33 
34 /**
35  * An interface class to handle nick registration
36  * To activate it put a [user_handler] section into the
37  * server configuration file
38  */
40 {
41 // public functions are called by the server
42 //
43 // private functions are for convenience as they
44 // will probably be the same for all user_handler
45 // implementations
46 
47 public:
49  {
50  }
51 
52  virtual ~user_handler()
53  {
54  }
55 
56  /**
57  * Return true if the given password matches the password for the given user.
58  *
59  * Password could also be a hash
60  * Seed is not needed for clear text log ins
61  * Currently the login procedure in the server and client code is hardcoded
62  * for the forum_user_handler implementation
63  */
64  virtual bool login(const std::string& name, const std::string& password) = 0;
65 
66  /** Executed when the user with the given name logged in. */
67  virtual void user_logged_in(const std::string& name) = 0;
68 
69  /**
70  * Returns a string containing info like the last login of this user.
71  *
72  * Formatted for user readable output.
73  */
74  virtual std::string user_info(const std::string& name) = 0;
75 
76  /** Returns true if a user with the given name exists. */
77  virtual bool user_exists(const std::string& name) = 0;
78 
79  /** Returns the forum user id for the given username */
80  virtual long get_forum_id(const std::string& name) = 0;
81 
82  /** Returns the user's email from the forum database */
83  virtual std::string get_user_email(const std::string& user) = 0;
84 
85  /** Returns true if the specified user account is usable for logins. */
86  virtual bool user_is_active(const std::string& name) = 0;
87 
88  /** Returns true if this user is a moderator on this server */
89  virtual bool user_is_moderator(const std::string& name) = 0;
90 
91  /** Mark this user as a moderator */
92  virtual void set_is_moderator(const std::string& name, const bool& is_moderator) = 0;
93 
94  /** Ban type values */
95  enum BAN_TYPE
96  {
97  BAN_NONE = 0, /**< Not a ban */
98  BAN_IP = 1, /**< IP address ban */
99  BAN_USER = 2, /**< User account/name ban */
100  BAN_EMAIL = 3, /**< Account email address ban */
101  };
102 
103  /** Ban status description */
104  struct ban_info
105  {
106  BAN_TYPE type; /**< Ban type */
107  std::time_t duration; /**< Ban duration (0 if permanent) */
108 
110  : type(BAN_NONE)
111  , duration(0)
112  {
113  }
114 
115  ban_info(BAN_TYPE ptype, std::time_t pduration)
116  : type(ptype)
117  , duration(pduration)
118  {
119  }
120  };
121 
122  /**
123  * Returns true if this user account or IP address is banned.
124  *
125  * @note The IP address is only used by the @a forum_user_handler
126  * subclass. Regular IP ban checks are done by @a server_base
127  * instead.
128  */
129  virtual ban_info user_is_banned(const std::string& name, const std::string& addr="") = 0;
130 
131  struct error : public game::error {
132  error(const std::string& message) : game::error(message) {}
133  };
134 
135  /**
136  * Create custom salt.
137  */
138  virtual std::string extract_salt(const std::string& username) = 0;
139 
140  virtual std::string get_uuid() = 0;
141  virtual std::string get_tournaments() = 0;
142  virtual void async_get_and_send_game_history(boost::asio::io_service& io_service, wesnothd::server& s, wesnothd::player_iterator player, int player_id, int offset, std::string& search_game_name, int search_content_type, std::string& search_content) =0;
143  virtual void db_insert_game_info(const std::string& uuid, int game_id, const std::string& version, const std::string& name, int reload, int observers, int is_public, int has_password) = 0;
144  virtual void db_update_game_end(const std::string& uuid, int game_id, const std::string& replay_location) = 0;
145  virtual void db_insert_game_player_info(const std::string& uuid, int game_id, const std::string& username, int side_number, int is_host, const std::string& faction, const std::string& version, const std::string& source, const std::string& current_user, const std::string& leaders) = 0;
146  virtual unsigned long long db_insert_game_content_info(const std::string& uuid, int game_id, const std::string& type, const std::string& name, const std::string& id, const std::string& addon_id, const std::string& addon_version) = 0;
147  virtual void db_set_oos_flag(const std::string& uuid, int game_id) = 0;
148  virtual void async_test_query(boost::asio::io_service& io_service, int limit) = 0;
149  virtual bool db_topic_id_exists(int topic_id) = 0;
150  virtual void db_insert_addon_info(const std::string& instance_version, const std::string& id, const std::string& name, const std::string& type, const std::string& version, bool forum_auth, int topic_id, const std::string uploader) = 0;
151  virtual unsigned long long db_insert_login(const std::string& username, const std::string& ip, const std::string& version) = 0;
152  virtual void db_update_logout(unsigned long long login_id) = 0;
153  virtual void get_users_for_ip(const std::string& ip, std::ostringstream* out) = 0;
154  virtual void get_ips_for_user(const std::string& username, std::ostringstream* out) = 0;
155  virtual void db_update_addon_download_count(const std::string& instance_version, const std::string& id, const std::string& version) = 0;
156  virtual bool db_is_user_primary_author(const std::string& instance_version, const std::string& id, const std::string& username) = 0;
157  virtual bool db_is_user_secondary_author(const std::string& instance_version, const std::string& id, const std::string& username) = 0;
158  virtual void db_delete_addon_authors(const std::string& instance_version, const std::string& id) = 0;
159  virtual void db_insert_addon_authors(const std::string& instance_version, const std::string& id, const std::string& primary_author, const std::vector<std::string>& secondary_authors) = 0;
160  virtual bool db_do_any_authors_exist(const std::string& instance_version, const std::string& id) = 0;
161 };
A config object defines a single node in a WML file, with access to child nodes.
Definition: config.hpp:159
An interface class to handle nick registration To activate it put a [user_handler] section into the s...
virtual void db_delete_addon_authors(const std::string &instance_version, const std::string &id)=0
virtual std::string get_user_email(const std::string &user)=0
Returns the user's email from the forum database.
virtual long get_forum_id(const std::string &name)=0
Returns the forum user id for the given username.
virtual void db_insert_addon_authors(const std::string &instance_version, const std::string &id, const std::string &primary_author, const std::vector< std::string > &secondary_authors)=0
virtual void db_update_addon_download_count(const std::string &instance_version, const std::string &id, const std::string &version)=0
virtual ban_info user_is_banned(const std::string &name, const std::string &addr="")=0
Returns true if this user account or IP address is banned.
virtual void db_update_logout(unsigned long long login_id)=0
virtual bool login(const std::string &name, const std::string &password)=0
Return true if the given password matches the password for the given user.
virtual bool user_is_moderator(const std::string &name)=0
Returns true if this user is a moderator on this server.
BAN_TYPE
Ban type values.
@ BAN_EMAIL
Account email address ban.
@ BAN_IP
IP address ban.
@ BAN_USER
User account/name ban.
@ BAN_NONE
Not a ban.
virtual unsigned long long db_insert_login(const std::string &username, const std::string &ip, const std::string &version)=0
virtual bool user_is_active(const std::string &name)=0
Returns true if the specified user account is usable for logins.
virtual void db_insert_addon_info(const std::string &instance_version, const std::string &id, const std::string &name, const std::string &type, const std::string &version, bool forum_auth, int topic_id, const std::string uploader)=0
virtual ~user_handler()
virtual void db_insert_game_player_info(const std::string &uuid, int game_id, const std::string &username, int side_number, int is_host, const std::string &faction, const std::string &version, const std::string &source, const std::string &current_user, const std::string &leaders)=0
virtual void db_update_game_end(const std::string &uuid, int game_id, const std::string &replay_location)=0
virtual void db_set_oos_flag(const std::string &uuid, int game_id)=0
virtual bool db_is_user_primary_author(const std::string &instance_version, const std::string &id, const std::string &username)=0
virtual bool user_exists(const std::string &name)=0
Returns true if a user with the given name exists.
virtual std::string get_tournaments()=0
virtual unsigned long long db_insert_game_content_info(const std::string &uuid, int game_id, const std::string &type, const std::string &name, const std::string &id, const std::string &addon_id, const std::string &addon_version)=0
virtual bool db_is_user_secondary_author(const std::string &instance_version, const std::string &id, const std::string &username)=0
virtual void get_users_for_ip(const std::string &ip, std::ostringstream *out)=0
virtual bool db_topic_id_exists(int topic_id)=0
virtual std::string extract_salt(const std::string &username)=0
Create custom salt.
virtual void set_is_moderator(const std::string &name, const bool &is_moderator)=0
Mark this user as a moderator.
virtual std::string get_uuid()=0
virtual bool db_do_any_authors_exist(const std::string &instance_version, const std::string &id)=0
virtual void user_logged_in(const std::string &name)=0
Executed when the user with the given name logged in.
virtual void async_test_query(boost::asio::io_service &io_service, int limit)=0
virtual void async_get_and_send_game_history(boost::asio::io_service &io_service, wesnothd::server &s, wesnothd::player_iterator player, int player_id, int offset, std::string &search_game_name, int search_content_type, std::string &search_content)=0
virtual void db_insert_game_info(const std::string &uuid, int game_id, const std::string &version, const std::string &name, int reload, int observers, int is_public, int has_password)=0
virtual std::string user_info(const std::string &name)=0
Returns a string containing info like the last login of this user.
virtual void get_ips_for_user(const std::string &username, std::ostringstream *out)=0
int side_number
Definition: game_info.hpp:40
std::string password(const std::string &server, const std::string &login)
player_connections::const_iterator player_iterator
Base class for all the errors encountered by the engine.
Definition: exceptions.hpp:29
std::string message
Definition: exceptions.hpp:30
Ban status description.
BAN_TYPE type
Ban type.
ban_info(BAN_TYPE ptype, std::time_t pduration)
std::time_t duration
Ban duration (0 if permanent)
error(const std::string &message)
static map_location::DIRECTION s