Cockatrice 2026-09-01-Development-3.1.0-beta.10
A virtual tabletop for multiplayer card games
Loading...
Searching...
No Matches
servatrice.h
Go to the documentation of this file.
1/***************************************************************************
2 * Copyright (C) 2008 by Max-Wilhelm Bruker *
3 * brukie@laptop *
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19 ***************************************************************************/
20#ifndef SERVATRICE_H
21#define SERVATRICE_H
22
23#include <QDateTime>
24#include <QHostAddress>
25#include <QMetaType>
26#include <QMutex>
27#include <QReadWriteLock>
28#include <QSqlDatabase>
29#include <QSslCertificate>
30#include <QSslKey>
31#include <QTcpServer>
32#include <QWebSocketServer>
33#include <libcockatrice/protocol/pb/response_report_stats.pb.h>
34#include <memory>
35#include <server.h>
36#include <utility>
37
38Q_DECLARE_METATYPE(QSqlDatabase)
39
40class QSqlQuery;
41class QTimer;
42
43class GameReplay;
44class Servatrice;
48class IslInterface;
49class FeatureSet;
50
51class Servatrice_GameServer : public QTcpServer
52{
53 Q_OBJECT
54private:
56 QList<Servatrice_ConnectionPool *> connectionPools;
57
58public:
60 int _numberPools,
61 const QSqlDatabase &_sqlDatabase,
62 QObject *parent = nullptr);
63 ~Servatrice_GameServer() override;
64
65protected:
66 void incomingConnection(qintptr socketDescriptor) override;
68};
69
70class Servatrice_WebsocketGameServer : public QWebSocketServer
71{
72 Q_OBJECT
73private:
75 QList<Servatrice_ConnectionPool *> connectionPools;
76
77public:
79 int _numberPools,
80 const QSqlDatabase &_sqlDatabase,
81 QObject *parent = nullptr);
83
84protected:
86protected slots:
87 void onNewConnection();
88};
89
90class Servatrice_IslServer : public QTcpServer
91{
92 Q_OBJECT
93private:
95 QSslCertificate cert;
96 QSslKey privateKey;
97
98public:
100 const QSslCertificate &_cert,
101 QSslKey _privateKey,
102 QObject *parent = nullptr)
103 : QTcpServer(parent), server(_server), cert(_cert), privateKey(std::move(_privateKey))
104 {
105 }
106
107protected:
108 void incomingConnection(qintptr socketDescriptor) override;
109};
110
112{
113public:
114 int id;
115 QSslCertificate cert;
116 QString hostname;
117 QHostAddress address;
120
122 const QSslCertificate &_cert,
123 QString _hostname,
124 const QHostAddress &_address,
125 int _gamePort,
126 int _controlPort)
127 : id(_id), cert(_cert), hostname(std::move(_hostname)), address(_address), gamePort(_gamePort),
128 controlPort(_controlPort)
129 {
130 }
131};
132
133class Servatrice : public Server
134{
135 Q_OBJECT
136public:
143private slots:
144 void statusUpdate();
145 void shutdownTimeout();
146
147protected:
148 void doSendIslMessage(const IslMessage &msg, int _serverId) override;
149
150private:
162 mutable QMutex loginMessageMutex;
164 mutable QMutex shutdownStateMutex;
165 QString dbPrefix;
166 QMap<QString, bool> serverRequiredFeatureList;
172 quint64 txBytes, rxBytes;
173
178
179 mutable QMutex reportStatsMutex;
181 std::shared_ptr<const Response_ReportStats> reportStatsCache;
182 static constexpr int reportStatsCacheTtlSeconds = 60;
183
184 mutable QMutex serverListMutex;
185 QList<ServerProperties> serverList;
186 void updateServerList();
187
188 QMap<int, IslInterface *> islInterfaces;
189
190 QString getDBPrefixString() const;
191 QString getDBHostNameString() const;
192 QString getDBDatabaseNameString() const;
193 QString getDBUserNameString() const;
194 QString getDBPasswordString() const;
195 QString getRoomsMethodString() const;
196 QString getISLNetworkSSLCertFile() const;
197 QString getISLNetworkSSLKeyFile() const;
198 int getServerStatusUpdateTime() const;
199 int getNumberOfTCPPools() const;
200 int getServerTCPPort() const;
201 int getNumberOfWebSocketPools() const;
202 int getServerWebSocketPort() const;
203 int getISLNetworkPort() const;
204 bool getISLNetworkEnabled() const;
205 bool getEnableInternalSMTPClient() const;
206 QHostAddress getServerTCPHost() const;
207 QHostAddress getServerWebSocketHost() const;
208
209public slots:
210 void scheduleShutdown(const QString &reason, int minutes);
211 void updateLoginMessage();
212 void setRequiredFeatures(const QString &featureList);
213
214public:
215 explicit Servatrice(QObject *parent = nullptr);
216 ~Servatrice() override;
217 bool initServer();
218 QMap<QString, bool> getServerRequiredFeatureList() const override
219 {
221 }
222 QString getServerName() const;
223 QString getLoginMessage() const override
224 {
225 QMutexLocker locker(&loginMessageMutex);
226 return loginMessage;
227 }
228 SessionEvent *getLoginSessionEvent() const override;
230 QString getRequiredFeatures() const override;
231 QString getAuthenticationMethodString() const;
232 QString getDBTypeString() const;
233 QString getDbPrefix() const
234 {
235 return dbPrefix;
236 }
237 QString getEmailBlackList() const;
238 QString getEmailWhiteList() const;
243 bool permitUnregisteredUsers() const override
244 {
246 }
247 bool getGameShouldPing() const override
248 {
249 return true;
250 }
251 bool getClientIDRequiredEnabled() const override;
252 bool getRegOnlyServerEnabled() const override;
253 bool getMaxUserLimitEnabled() const override;
254 bool getStoreReplaysEnabled() const override;
255 bool getRegistrationEnabled() const;
258 bool getEnableLogQuery() const override;
259 bool getEnableForgotPassword() const;
261 bool getEnableAudit() const;
262 bool getEnableRegistrationAudit() const;
263 bool getEnableForgotPasswordAudit() const;
264 int getMinPasswordLength() const;
265 int getIdleClientTimeout() const override;
266 int getServerID() const override;
267 int getMaxGameInactivityTime() const override;
268 int getMaxPlayerInactivityTime() const override;
269 int getClientKeepAlive() const override;
270 int getMaxUsersPerAddress() const;
271 int getMessageCountingInterval() const override;
272 int getMaxMessageCountPerInterval() const override;
273 int getMaxMessageSizePerInterval() const override;
274 int getMaxGamesPerUser() const override;
275 int getCommandCountingInterval() const override;
276 int getMaxCommandCountPerInterval() const override;
277 int getMaxUserTotal() const override;
278 bool permitCreateGameAsJudge() const override;
279 int getMaxTcpUserLimit() const;
280 int getMaxWebSocketUserLimit() const;
281 int getUsersWithAddress(const QHostAddress &address) const;
282 int getMaxAccountsPerEmail() const;
283 int getForgotPasswordTokenLife() const;
284 QList<AbstractServerSocketInterface *> getUsersWithAddressAsList(const QHostAddress &address) const;
285 void incTxBytes(quint64 num);
286 void incRxBytes(quint64 num);
287 void addDatabaseInterface(QThread *thread, Servatrice_DatabaseInterface *databaseInterface);
288
289 bool islConnectionExists(int _serverId) const;
290 void addIslInterface(int _serverId, IslInterface *interface);
291 void removeIslInterface(int _serverId);
292 QReadWriteLock islLock;
293
294 // The moderation queue statistics are shared between all connected moderators and
295 // cached briefly to avoid re-running several full-table queries on every refresh.
296 std::shared_ptr<const Response_ReportStats> getCachedReportStats() const;
297 void cacheReportStats(const Response_ReportStats &stats);
298
299 QList<ServerProperties> getServerList() const;
300};
301
302#endif
Definition serversocketinterface.h:70
Definition featureset.h:9
Definition isl_interface.h:29
Definition servatrice_connection_pool.h:11
Definition servatrice_database_interface.h:21
Definition servatrice.h:52
Servatrice_ConnectionPool * findLeastUsedConnectionPool()
Definition servatrice.cpp:97
~Servatrice_GameServer() override
Definition servatrice.cpp:73
void incomingConnection(qintptr socketDescriptor) override
Definition servatrice.cpp:84
Servatrice * server
Definition servatrice.h:55
Servatrice_GameServer(Servatrice *_server, int _numberPools, const QSqlDatabase &_sqlDatabase, QObject *parent=nullptr)
Definition servatrice.cpp:49
QList< Servatrice_ConnectionPool * > connectionPools
Definition servatrice.h:56
Definition servatrice.h:91
QSslCertificate cert
Definition servatrice.h:95
Servatrice * server
Definition servatrice.h:94
void incomingConnection(qintptr socketDescriptor) override
Definition servatrice.cpp:188
QSslKey privateKey
Definition servatrice.h:96
Servatrice_IslServer(Servatrice *_server, const QSslCertificate &_cert, QSslKey _privateKey, QObject *parent=nullptr)
Definition servatrice.h:99
Definition servatrice.h:71
Servatrice_WebsocketGameServer(Servatrice *_server, int _numberPools, const QSqlDatabase &_sqlDatabase, QObject *parent=nullptr)
Definition servatrice.cpp:116
QList< Servatrice_ConnectionPool * > connectionPools
Definition servatrice.h:75
Servatrice * server
Definition servatrice.h:74
Servatrice_ConnectionPool * findLeastUsedConnectionPool()
Definition servatrice.cpp:171
void onNewConnection()
Definition servatrice.cpp:154
~Servatrice_WebsocketGameServer() override
Definition servatrice.cpp:143
Definition servatrice.h:134
QString getISLNetworkSSLKeyFile() const
Definition servatrice.cpp:1073
int getMessageCountingInterval() const override
Definition servatrice.cpp:980
bool initServer()
Definition servatrice.cpp:225
int getNumberOfTCPPools() const
Definition servatrice.cpp:1015
int getServerWebSocketPort() const
Definition servatrice.cpp:1055
int getUsersWithAddress(const QHostAddress &address) const
Definition servatrice.cpp:534
QString getAuthenticationMethodString() const
Definition servatrice.cpp:860
quint64 rxBytes
Definition servatrice.h:172
QString getDBHostNameString() const
Definition servatrice.cpp:919
QHostAddress getServerWebSocketHost() const
Definition servatrice.cpp:1045
QString getDBTypeString() const
Definition servatrice.cpp:903
int getMaxCommandCountPerInterval() const override
Definition servatrice.cpp:1005
bool getISLNetworkEnabled() const
Definition servatrice.cpp:1063
QList< ServerProperties > serverList
Definition servatrice.h:185
int nextShutdownMessageMinutes
Definition servatrice.h:176
QList< AbstractServerSocketInterface * > getUsersWithAddressAsList(const QHostAddress &address) const
Definition servatrice.cpp:547
int getMaxUsersPerAddress() const
Definition servatrice.cpp:975
bool getEnableAudit() const
Definition servatrice.cpp:1128
Servatrice(QObject *parent=nullptr)
Definition servatrice.cpp:201
std::shared_ptr< const Response_ReportStats > reportStatsCache
Definition servatrice.h:181
bool getRequireEmailActivationEnabled() const
Definition servatrice.cpp:893
bool getRegOnlyServerEnabled() const override
Definition servatrice.cpp:855
QTimer * shutdownTimer
Definition servatrice.h:177
void shutdownTimeout()
Definition servatrice.cpp:740
int getMaxMessageCountPerInterval() const override
Definition servatrice.cpp:985
int getMaxGameInactivityTime() const override
Definition servatrice.cpp:960
void addDatabaseInterface(QThread *thread, Servatrice_DatabaseInterface *databaseInterface)
Definition servatrice.cpp:476
int getForgotPasswordTokenLife() const
Definition servatrice.cpp:1108
void doSendIslMessage(const IslMessage &msg, int _serverId) override
Definition servatrice.cpp:811
QString getServerName() const
Definition servatrice.cpp:840
bool getEnableLogQuery() const override
Definition servatrice.cpp:1088
bool getRegistrationEnabled() const
Definition servatrice.cpp:883
bool getClientIDRequiredEnabled() const override
Definition servatrice.cpp:850
int getMaxPlayerInactivityTime() const override
Definition servatrice.cpp:965
int getMaxAccountsPerEmail() const
Definition servatrice.cpp:1093
QString getLoginMessage() const override
Definition servatrice.h:223
std::shared_ptr< const Response_ReportStats > getCachedReportStats() const
Definition servatrice.cpp:517
QString loginMessage
Definition servatrice.h:163
~Servatrice() override
Definition servatrice.cpp:208
DatabaseType
Definition servatrice.h:152
@ DatabaseMySql
Definition servatrice.h:154
@ DatabaseNone
Definition servatrice.h:153
QTimer * pingClock
Definition servatrice.h:158
Servatrice_DatabaseInterface * servatriceDatabaseInterface
Definition servatrice.h:168
int getCommandCountingInterval() const override
Definition servatrice.cpp:1000
DatabaseType databaseType
Definition servatrice.h:157
AuthenticationMethod authenticationMethod
Definition servatrice.h:156
bool getMaxUserLimitEnabled() const override
Definition servatrice.cpp:835
QMutex serverListMutex
Definition servatrice.h:184
int getServerID() const override
Definition servatrice.cpp:845
QString getRequiredFeatures() const override
Definition servatrice.cpp:898
void updateServerList()
Definition servatrice.cpp:481
void scheduleShutdown(const QString &reason, int minutes)
Definition servatrice.cpp:711
void statusUpdate()
Definition servatrice.cpp:603
bool getEnableForgotPasswordAudit() const
Definition servatrice.cpp:1138
int getMaxTcpUserLimit() const
Definition servatrice.cpp:873
AuthenticationMethod
Definition servatrice.h:138
@ AuthenticationPassword
Definition servatrice.h:141
@ AuthenticationNone
Definition servatrice.h:139
@ AuthenticationSql
Definition servatrice.h:140
QReadWriteLock islLock
Definition servatrice.h:292
QString getRoomsMethodString() const
Definition servatrice.cpp:952
QHostAddress getServerTCPHost() const
Definition servatrice.cpp:1025
int getServerStatusUpdateTime() const
Definition servatrice.cpp:1010
AuthenticationMethod getAuthenticationMethod() const
Definition servatrice.h:239
QString getEmailWhiteList() const
Definition servatrice.cpp:1123
SessionEvent * getLoginSessionEvent() const override
Definition servatrice.cpp:701
QMutex reportStatsMutex
Definition servatrice.h:179
void updateLoginMessage()
Definition servatrice.cpp:559
void setRequiredFeatures(const QString &featureList)
Definition servatrice.cpp:588
void incRxBytes(quint64 num)
Definition servatrice.cpp:733
SessionEvent * makeShutdownEvent() const
Definition servatrice.cpp:693
QString getISLNetworkSSLCertFile() const
Definition servatrice.cpp:1068
bool getStoreReplaysEnabled() const override
Definition servatrice.cpp:868
QString officialWarnings
Definition servatrice.h:167
int getNumberOfWebSocketPools() const
Definition servatrice.cpp:1040
bool getEnableInternalSMTPClient() const
Definition servatrice.cpp:1098
int getMaxGamesPerUser() const override
Definition servatrice.cpp:995
bool getEnableForgotPassword() const
Definition servatrice.cpp:1103
void removeIslInterface(int _serverId)
Definition servatrice.cpp:803
bool islConnectionExists(int _serverId) const
Definition servatrice.cpp:772
bool getEnableForgotPasswordChallenge() const
Definition servatrice.cpp:1113
QString getDBPrefixString() const
Definition servatrice.cpp:911
static constexpr int reportStatsCacheTtlSeconds
Definition servatrice.h:182
QString getDbPrefix() const
Definition servatrice.h:233
int getMaxMessageSizePerInterval() const override
Definition servatrice.cpp:990
int getMaxUserTotal() const override
Definition servatrice.cpp:830
QMutex txBytesMutex
Definition servatrice.h:171
QMutex shutdownStateMutex
Definition servatrice.h:164
QString getDBDatabaseNameString() const
Definition servatrice.cpp:927
bool permitCreateGameAsJudge() const override
Definition servatrice.cpp:1020
QList< ServerProperties > getServerList() const
Definition servatrice.cpp:508
QMap< int, IslInterface * > islInterfaces
Definition servatrice.h:188
Servatrice_IslServer * islServer
Definition servatrice.h:161
bool getRequireEmailForRegistrationEnabled() const
Definition servatrice.cpp:888
int getIdleClientTimeout() const override
Definition servatrice.cpp:1083
bool getEnableRegistrationAudit() const
Definition servatrice.cpp:1133
int getMinPasswordLength() const
Definition servatrice.cpp:1143
QMap< QString, bool > serverRequiredFeatureList
Definition servatrice.h:166
Servatrice_WebsocketGameServer * websocketGameServer
Definition servatrice.h:160
QString dbPrefix
Definition servatrice.h:165
quint64 txBytes
Definition servatrice.h:172
int getServerTCPPort() const
Definition servatrice.cpp:1035
int getISLNetworkPort() const
Definition servatrice.cpp:1078
QTimer * statusUpdateClock
Definition servatrice.h:158
void incTxBytes(quint64 num)
Definition servatrice.cpp:726
int getClientKeepAlive() const override
Definition servatrice.cpp:970
bool getGameShouldPing() const override
Definition servatrice.h:247
int uptime
Definition servatrice.h:170
QString getDBUserNameString() const
Definition servatrice.cpp:936
int serverId
Definition servatrice.h:169
QMutex loginMessageMutex
Definition servatrice.h:162
QString shutdownReason
Definition servatrice.h:174
QString getEmailBlackList() const
Definition servatrice.cpp:1118
Servatrice_GameServer * gameServer
Definition servatrice.h:159
QString getDBPasswordString() const
Definition servatrice.cpp:944
int shutdownMinutes
Definition servatrice.h:175
void cacheReportStats(const Response_ReportStats &stats)
Definition servatrice.cpp:527
int getMaxWebSocketUserLimit() const
Definition servatrice.cpp:878
QMap< QString, bool > getServerRequiredFeatureList() const override
Definition servatrice.h:218
bool permitUnregisteredUsers() const override
Definition servatrice.h:243
void addIslInterface(int _serverId, IslInterface *interface)
Definition servatrice.cpp:778
QMutex rxBytesMutex
Definition servatrice.h:171
QDateTime reportStatsTimestamp
Definition servatrice.h:180
int controlPort
Definition servatrice.h:119
int id
Definition servatrice.h:114
QSslCertificate cert
Definition servatrice.h:115
QString hostname
Definition servatrice.h:116
int gamePort
Definition servatrice.h:118
ServerProperties(int _id, const QSslCertificate &_cert, QString _hostname, const QHostAddress &_address, int _gamePort, int _controlPort)
Definition servatrice.h:121
QHostAddress address
Definition servatrice.h:117
Server(QObject *parent=nullptr)
Definition server.cpp:40
Definition game_replay.proto:4
Definition isl_message.proto:7
Definition response_report_stats.proto:3
Definition session_event.proto:2