Cockatrice 2026-10-19-Development-3.1.2-beta.2
A virtual tabletop for multiplayer card games
Loading...
Searching...
No Matches
servatrice_database_interface.h
Go to the documentation of this file.
1#ifndef SERVATRICE_DATABASE_INTERFACE_H
2#define SERVATRICE_DATABASE_INTERFACE_H
3
4#include "libcockatrice/protocol/pb/serverinfo_user.pb.h"
5
6#include <QHash>
7#include <QList>
8#include <QSqlDatabase>
9#include <QString>
10#include <QStringList>
11#include <QtGlobal>
12#include <libcockatrice/protocol/pb/serverinfo_ban.pb.h>
13#include <libcockatrice/protocol/pb/serverinfo_chat_message.pb.h>
14#include <libcockatrice/protocol/pb/serverinfo_moderator_login.pb.h>
15#include <libcockatrice/protocol/pb/serverinfo_user_alt.pb.h>
16#include <libcockatrice/protocol/pb/serverinfo_user_session.pb.h>
17#include <libcockatrice/protocol/pb/serverinfo_warning.pb.h>
18#include <qtmetamacros.h>
19#include <server.h>
21
22class QSqlQuery;
23
24#define DATABASE_SCHEMA_VERSION 40
25
26class Servatrice;
27
30{
31 int id = -1;
32 QString name;
33 QStringList tags;
34 QString bannerCard;
35 QString gameFormat;
36 QString colorIdentity;
37 QString content;
38};
39
42{
43 int id = -1;
44 QString name;
45 qint64 creationTime = 0;
46 qint64 expiresAt = 0;
47 int itemCount = 0;
48};
49
51{
52 Q_OBJECT
53private:
55 QSqlDatabase sqlDatabase;
58 ServerInfo_User evalUserQueryResult(const QSqlQuery *query, bool complete, bool withId = false);
60 bool checkUserIsIdBanned(const QString &clientId, QString &banReason, int &banSecondsRemaining);
62 bool checkUserIsIpBanned(const QString &ipAddress, QString &banReason, int &banSecondsRemaining);
64 bool checkUserIsNameBanned(QString const &userName, QString &banReason, int &banSecondsRemaining);
65 bool isStrictModeEnabled(bool &ok) const;
66
67protected:
69 const QString &user,
70 const QString &password,
71 const QString &clientId,
72 QString &reasonStr,
73 int &banSecondsLeft,
74 bool passwordNeedsHash) override;
75
76public slots:
77 void initDatabase(const QSqlDatabase &_sqlDatabase);
78
79public:
80 explicit Servatrice_DatabaseInterface(int _instanceId, Servatrice *_server);
82 bool initDatabase(const QString &type,
83 const QString &hostName,
84 const QString &databaseName,
85 const QString &userName,
86 const QString &password);
87 bool openDatabase();
88 bool checkSql();
89 QSqlQuery *prepareQuery(const QString &queryText);
90 bool execSqlQuery(QSqlQuery *query);
91 const QSqlDatabase &getDatabase()
92 {
93 return sqlDatabase;
94 }
95
96 bool activeUserExists(const QString &user) override;
97 bool userExists(const QString &user) override;
98 QString getUserSalt(const QString &user) override;
99 QString getUserPasswordData(const QString &user) override;
100 bool submitPasswordVerifier(const QString &user, const QString &passwordVerifier) override;
104 QString getUsableLegacyBackup(const QString &user);
106 void touchLegacyBackup(const QString &user);
108 void clearLegacyBackup(const QString &user);
111 int getUserIdInDB(const QString &name);
112 QMap<QString, ServerInfo_User> getBuddyList(const QString &name) override;
113 QMap<QString, ServerInfo_User> getIgnoreList(const QString &name) override;
114 bool isInBuddyList(const QString &whoseList, const QString &who) override;
115 bool isInIgnoreList(const QString &whoseList, const QString &who) override;
116 ServerInfo_User getUserData(const QString &name, bool withId = false) override;
117 void storeGameInformation(const QString &roomName,
118 const QStringList &roomGameTypes,
119 const ServerInfo_Game &gameInfo,
120 const QSet<QString> &allPlayersEver,
121 const QSet<QString> &allSpectatorsEver,
122 const QList<GameReplay *> &replayList) override;
123 DeckList *getDeckFromDatabase(int deckId, int userId) override;
124
130 bool createDeckShare(const QString &token,
131 const QString &name,
132 int userId,
133 const QList<DeckShareItemRecord> &items,
134 int expiryDays,
135 qint64 &expiresAt);
137 bool getDeckSharesForUser(int userId, QList<DeckShareSummaryRecord> &shares);
142 bool deleteDeckShare(int shareId, int userId);
147 bool getDeckShareList(const QString &token, QString &name, qint64 &expiresAt, QList<DeckShareItemRecord> &items);
152 bool getDeckShareItem(const QString &token, int itemId, QString &content);
155
156 int getNextGameId() override;
157 int getNextReplayId() override;
158 int getActiveUserCount(QString connectionType = QString()) override;
159
160 qint64 startSession(const QString &userName,
161 const QString &address,
162 const QString &clientId,
163 const QString &connectionType) override;
164 void endSession(qint64 sessionId) override;
165 void clearSessionTables() override;
166 void lockSessionTables() override;
167 void unlockSessionTables() override;
168 bool userSessionExists(const QString &userName) override;
169 bool usernameIsValid(const QString &user, QString &error) override;
170 bool checkUserIsBanned(const QString &ipAddress,
171 const QString &userName,
172 const QString &clientId,
173 QString &banReason,
174 int &banSecondsRemaining) override;
175 int checkNumberOfUserAccounts(const QString &email) override;
176 bool registerUser(const QString &userName,
177 const QString &realName,
178 const QString &password,
179 bool passwordNeedsHash,
180 const QString &emailAddress,
181 const QString &country,
182 bool active = false) override;
183 bool activateUser(const QString &userName, const QString &token) override;
184 void updateUsersClientID(const QString &userName, const QString &userClientID) override;
185 void updateUsersLastLoginData(const QString &userName, const QString &clientVersion) override;
186 void logMessage(const int senderId,
187 const QString &senderName,
188 const QString &senderIp,
189 const QString &logMessage,
190 LogMessage_TargetType targetType,
191 const int targetId,
192 const QString &targetName,
193 const QString &channel = QString()) override;
194 bool changeUserPassword(const QString &user, const QString &password, bool passwordNeedsHash) override;
195 bool changeUserPassword(const QString &user,
196 const QString &oldPassword,
197 bool oldPasswordNeedsHash,
198 const QString &newPassword,
199 bool newPasswordNeedsHash) override;
200 void setForcePasswordChange(const QString &user, bool force) override;
201 QList<ServerInfo_Ban> getUserBanHistory(const QString userName);
202 bool
203 addWarning(const QString userName, const QString adminName, const QString warningReason, const QString clientID);
204 QList<ServerInfo_Warning> getUserWarnHistory(const QString userName);
206 const QString &ipaddress,
207 const QString &gamename,
208 const QString &gameid,
209 const QString &message,
210 bool &chat,
211 bool &game,
212 bool &room,
213 int &range,
214 int &maxresults);
215 QList<ServerInfo_UserSession> getUserSessions(const QString &userName, int limit);
216 QList<ServerInfo_UserAlt> getUserAlts(const QString &userName);
218
219 // Uptime snapshot as recorded by Servatrice::statusUpdate() into the
220 // {prefix}_uptime table. valid is false when no snapshot exists yet.
222 {
223 bool valid = false;
224 quint64 usersCount = 0;
225 quint64 modsCount = 0;
226 quint64 gamesCount = 0;
227 quint64 txBytes = 0;
228 quint64 rxBytes = 0;
229 quint64 uptimeSecs = 0;
230 quint64 timest = 0;
231 };
233 bool removeUserAvatar(const QString &userName);
234 bool isCardArtAllowed(const QString &cardName, const QString &cardProviderId) override;
235 bool addForgotPassword(const QString &user);
236 bool removeForgotPassword(const QString &user) override;
237 bool doesForgotPasswordExist(const QString &user);
238 bool updateUserToken(const QString &token, const QString &user);
239 bool validateTableColumnStringData(const QString &table,
240 const QString &column,
241 const QString &_user,
242 const QString &_datatocheck);
243 void addAuditRecord(const QString &user,
244 const QString &ipaddress,
245 const QString &clientid,
246 const QString &action,
247 const QString &details,
248 const bool &results);
249};
250
251#endif
Represents a complete deck, including metadata, zones, cards, and sideboard plans.
Definition deck_list.h:67
Definition mana_curve_category_widget.h:11
Definition remote_connection_controller.h:20
Definition game.h:18
Definition dlg_manage_sets.h:29
bool activateUser(const QString &userName, const QString &token) override
Definition servatrice_database_interface.cpp:359
bool addWarning(const QString userName, const QString adminName, const QString warningReason, const QString clientID)
Definition servatrice_database_interface.cpp:1826
bool changeUserPassword(const QString &user, const QString &password, bool passwordNeedsHash) override
Definition servatrice_database_interface.cpp:1625
QString getUserPasswordData(const QString &user) override
Definition servatrice_database_interface.cpp:737
void clearLegacyBackup(const QString &user)
Drop the account's legacy password backup.
Definition servatrice_database_interface.cpp:879
AuthenticationResult checkUserPassword(Server_ProtocolHandler *handler, const QString &user, const QString &password, const QString &clientId, QString &reasonStr, int &banSecondsLeft, bool passwordNeedsHash) override
Definition servatrice_database_interface.cpp:396
QList< ServerInfo_ChatMessage > getMessageLogHistory(const QString &user, const QString &ipaddress, const QString &gamename, const QString &gameid, const QString &message, bool &chat, bool &game, bool &room, int &range, int &maxresults)
Definition servatrice_database_interface.cpp:2080
bool openDatabase()
Definition servatrice_database_interface.cpp:96
QMap< QString, ServerInfo_User > getIgnoreList(const QString &name) override
Definition servatrice_database_interface.cpp:1214
void cleanupExpiredDeckShares()
Deletes all expired share bundles (cascades to their items).
Definition servatrice_database_interface.cpp:1517
bool usernameIsValid(const QString &user, QString &error) override
Definition servatrice_database_interface.cpp:241
qint64 startSession(const QString &userName, const QString &address, const QString &clientId, const QString &connectionType) override
Definition servatrice_database_interface.cpp:1148
void lockSessionTables() override
Definition servatrice_database_interface.cpp:1122
bool removeForgotPassword(const QString &user) override
Definition servatrice_database_interface.cpp:2244
bool isInIgnoreList(const QString &whoseList, const QString &who) override
Definition servatrice_database_interface.cpp:955
bool checkUserIsIdBanned(const QString &clientId, QString &banReason, int &banSecondsRemaining)
Definition servatrice_database_interface.cpp:581
QMap< QString, ServerInfo_User > getBuddyList(const QString &name) override
Definition servatrice_database_interface.cpp:1190
bool deleteDeckShare(int shareId, int userId)
Deletes one of a user's own share bundles (cascades to its items).
Definition servatrice_database_interface.cpp:1552
void storeGameInformation(const QString &roomName, const QStringList &roomGameTypes, const ServerInfo_Game &gameInfo, const QSet< QString > &allPlayersEver, const QSet< QString > &allSpectatorsEver, const QList< GameReplay * > &replayList) override
Definition servatrice_database_interface.cpp:1272
QList< ServerInfo_Ban > getUserBanHistory(const QString userName)
Definition servatrice_database_interface.cpp:1794
DeckList * getDeckFromDatabase(int deckId, int userId) override
Definition servatrice_database_interface.cpp:1369
void logMessage(const int senderId, const QString &senderName, const QString &senderIp, const QString &logMessage, LogMessage_TargetType targetType, const int targetId, const QString &targetName, const QString &channel=QString()) override
Definition servatrice_database_interface.cpp:1565
bool doesForgotPasswordExist(const QString &user)
Definition servatrice_database_interface.cpp:2259
bool userSessionExists(const QString &userName) override
Definition servatrice_database_interface.cpp:1134
Servatrice_DatabaseInterface(int _instanceId, Servatrice *_server)
Definition servatrice_database_interface.cpp:59
QSqlDatabase sqlDatabase
Definition servatrice_database_interface.h:55
void endSession(qint64 sessionId) override
Definition servatrice_database_interface.cpp:1175
QString getUserSalt(const QString &user) override
Definition servatrice_database_interface.cpp:715
int getNextGameId() override
Definition servatrice_database_interface.cpp:1238
QSqlQuery * prepareQuery(const QString &queryText)
Definition servatrice_database_interface.cpp:214
bool checkUserIsBanned(const QString &ipAddress, const QString &userName, const QString &clientId, QString &banReason, int &banSecondsRemaining) override
Definition servatrice_database_interface.cpp:561
UptimeSnapshot getLatestUptimeSnapshot(int serverId)
Definition servatrice_database_interface.cpp:2034
QList< ServerInfo_ModeratorLogin > getModeratorLastLogins()
Definition servatrice_database_interface.cpp:1988
void setForcePasswordChange(const QString &user, bool force) override
Definition servatrice_database_interface.cpp:1647
bool getDeckShareList(const QString &token, QString &name, qint64 &expiresAt, QList< DeckShareItemRecord > &items)
Looks up a valid (non-expired) share bundle by token.
Definition servatrice_database_interface.cpp:1460
ServerInfo_User evalUserQueryResult(const QSqlQuery *query, bool complete, bool withId=false)
Definition servatrice_database_interface.cpp:978
int checkNumberOfUserAccounts(const QString &email) override
Definition servatrice_database_interface.cpp:2203
bool isCardArtAllowed(const QString &cardName, const QString &cardProviderId) override
Whether the given card art may be shown (card art rules).
Definition servatrice_database_interface.cpp:2367
bool execSqlQuery(QSqlQuery *query)
Definition servatrice_database_interface.cpp:229
const QSqlDatabase & getDatabase()
Definition servatrice_database_interface.h:91
bool isInBuddyList(const QString &whoseList, const QString &who) override
Definition servatrice_database_interface.cpp:932
void touchLegacyBackup(const QString &user)
Refresh the age window of the account's legacy password backup.
Definition servatrice_database_interface.cpp:867
bool updateUserToken(const QString &token, const QString &user)
Definition servatrice_database_interface.cpp:2283
void unlockSessionTables() override
Definition servatrice_database_interface.cpp:1128
int getActiveUserCount(QString connectionType=QString()) override
Definition servatrice_database_interface.cpp:1703
bool activeUserExists(const QString &user) override
Definition servatrice_database_interface.cpp:685
int getNextReplayId() override
Definition servatrice_database_interface.cpp:1257
QHash< QString, QSqlQuery * > preparedStatements
Definition servatrice_database_interface.h:56
QString getUsableLegacyBackup(const QString &user)
Decrypt the account's legacy password backup when it exists, is decryptable with the configured key a...
Definition servatrice_database_interface.cpp:818
int instanceId
Definition servatrice_database_interface.h:54
bool validateTableColumnStringData(const QString &table, const QString &column, const QString &_user, const QString &_datatocheck)
Definition servatrice_database_interface.cpp:2304
bool checkUserIsIpBanned(const QString &ipAddress, QString &banReason, int &banSecondsRemaining)
Definition servatrice_database_interface.cpp:649
Servatrice * server
Definition servatrice_database_interface.h:57
bool getDeckShareItem(const QString &token, int itemId, QString &content)
Fetches the content of one item of a valid share bundle.
Definition servatrice_database_interface.cpp:1500
bool isStrictModeEnabled(bool &ok) const
Definition servatrice_database_interface.cpp:173
bool userExists(const QString &user) override
Definition servatrice_database_interface.cpp:700
bool addForgotPassword(const QString &user)
Definition servatrice_database_interface.cpp:2225
bool registerUser(const QString &userName, const QString &realName, const QString &password, bool passwordNeedsHash, const QString &emailAddress, const QString &country, bool active=false) override
Definition servatrice_database_interface.cpp:315
QList< ServerInfo_UserAlt > getUserAlts(const QString &userName)
Definition servatrice_database_interface.cpp:1918
ServerInfo_User getUserData(const QString &name, bool withId=false) override
Definition servatrice_database_interface.cpp:1082
void updateUsersClientID(const QString &userName, const QString &userClientID) override
Definition servatrice_database_interface.cpp:1733
void updateUsersLastLoginData(const QString &userName, const QString &clientVersion) override
Definition servatrice_database_interface.cpp:1746
void addAuditRecord(const QString &user, const QString &ipaddress, const QString &clientid, const QString &action, const QString &details, const bool &results)
Definition servatrice_database_interface.cpp:2334
bool getDeckSharesForUser(int userId, QList< DeckShareSummaryRecord > &shares)
Lists the share bundles created by a user, newest first.
Definition servatrice_database_interface.cpp:1525
QList< ServerInfo_UserSession > getUserSessions(const QString &userName, int limit)
Definition servatrice_database_interface.cpp:1882
void purgeExpiredLegacyBackups()
Drop every legacy password backup that has not been used within the TTL.
Definition servatrice_database_interface.cpp:891
int getUserIdInDB(const QString &name)
Definition servatrice_database_interface.cpp:916
bool checkUserIsNameBanned(QString const &userName, QString &banReason, int &banSecondsRemaining)
Definition servatrice_database_interface.cpp:621
bool submitPasswordVerifier(const QString &user, const QString &passwordVerifier) override
Definition servatrice_database_interface.cpp:758
void clearSessionTables() override
Definition servatrice_database_interface.cpp:1112
bool removeUserAvatar(const QString &userName)
Definition servatrice_database_interface.cpp:2066
bool createDeckShare(const QString &token, const QString &name, int userId, const QList< DeckShareItemRecord > &items, int expiryDays, qint64 &expiresAt)
Creates a new temporary deck share bundle.
Definition servatrice_database_interface.cpp:1388
void initDatabase(const QSqlDatabase &_sqlDatabase)
Definition servatrice_database_interface.cpp:73
bool checkSql()
Definition servatrice_database_interface.cpp:192
QList< ServerInfo_Warning > getUserWarnHistory(const QString userName)
Definition servatrice_database_interface.cpp:1852
Definition servatrice.h:149
LogMessage_TargetType
Definition server_database_interface.h:158
Server_DatabaseInterface(QObject *parent=nullptr)
Definition server_database_interface.h:25
Definition server_protocolhandler.h:40
AuthenticationResult
Definition server.h:34
EmailType const QString & token
Definition smtpclient.cpp:31
EmailType type
Definition smtpclient.cpp:30
Metadata of a single deck inside a temporary deck share bundle.
Definition servatrice_database_interface.h:30
QString colorIdentity
Color identity, e.g. "WUBRG".
Definition servatrice_database_interface.h:36
QString bannerCard
Banner card name (deck image).
Definition servatrice_database_interface.h:34
QString name
Deck name.
Definition servatrice_database_interface.h:32
QString content
Deck content (native format); empty in list queries.
Definition servatrice_database_interface.h:37
QStringList tags
Deck tags.
Definition servatrice_database_interface.h:33
QString gameFormat
Game format the deck was built for.
Definition servatrice_database_interface.h:35
Summary of a share bundle owned by a user.
Definition servatrice_database_interface.h:42
QString name
Share name.
Definition servatrice_database_interface.h:44
int itemCount
Number of decks in the bundle.
Definition servatrice_database_interface.h:47
qint64 creationTime
Unix timestamp at which the share was created.
Definition servatrice_database_interface.h:45
qint64 expiresAt
Unix timestamp at which the share expires.
Definition servatrice_database_interface.h:46
Definition servatrice_database_interface.h:222
quint64 modsCount
Definition servatrice_database_interface.h:225
quint64 gamesCount
Definition servatrice_database_interface.h:226
quint64 rxBytes
Definition servatrice_database_interface.h:228
quint64 txBytes
Definition servatrice_database_interface.h:227
bool valid
Definition servatrice_database_interface.h:223
quint64 usersCount
Definition servatrice_database_interface.h:224
quint64 timest
Definition servatrice_database_interface.h:230
quint64 uptimeSecs
Definition servatrice_database_interface.h:229
Definition serverinfo_game.proto:5
Definition serverinfo_user.proto:2