From ba71d3a256451265c7645a9d912ea4bd0df52e00 Mon Sep 17 00:00:00 2001 From: Fabio Bas Date: Sat, 13 Dec 2014 18:43:05 +0100 Subject: [PATCH 1/6] Add db schema and fix sql plugins installation --- servatrice/CMakeLists.txt | 8 ++++---- servatrice/servatrice.sql | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/servatrice/CMakeLists.txt b/servatrice/CMakeLists.txt index 4f407658..b5ca057d 100644 --- a/servatrice/CMakeLists.txt +++ b/servatrice/CMakeLists.txt @@ -145,10 +145,10 @@ if(APPLE) if (CMAKE_BUILD_TYPE STREQUAL "Debug") install(DIRECTORY "${QT_PLUGINS_DIR}/" DESTINATION ${plugin_dest_dir} COMPONENT Runtime - FILES_MATCHING REGEX "(codecs|iconengines|imageformats|mediaservice|phonon_backend|platforms)/.*_debug\\.dylib") + FILES_MATCHING REGEX "(sqldrivers|platforms)/.*_debug\\.dylib") else() install(DIRECTORY "${QT_PLUGINS_DIR}/" DESTINATION ${plugin_dest_dir} COMPONENT Runtime - FILES_MATCHING REGEX "(codecs|iconengines|imageformats|mediaservice|phonon_backend|platforms)/[^_]*\\.dylib") + FILES_MATCHING REGEX "(sqldrivers|platforms)/[^_]*\\.dylib") endif() install(CODE " @@ -177,10 +177,10 @@ if(WIN32) if (CMAKE_BUILD_TYPE STREQUAL "Debug") install(DIRECTORY "${QT_PLUGINS_DIR}/" DESTINATION ${plugin_dest_dir} COMPONENT Runtime - FILES_MATCHING REGEX "(codecs|iconengines|imageformats|mediaservice|phonon_backend|platforms)/.*d\\.dll") + FILES_MATCHING REGEX "(sqldrivers|platforms)/.*d\\.dll") else() install(DIRECTORY "${QT_PLUGINS_DIR}/" DESTINATION ${plugin_dest_dir} COMPONENT Runtime - FILES_MATCHING REGEX "(codecs|iconengines|imageformats|mediaservice|phonon_backend|platforms)/.*[^d]\\.dll") + FILES_MATCHING REGEX "(sqldrivers|platforms)/.*[^d]\\.dll") endif() install(CODE " diff --git a/servatrice/servatrice.sql b/servatrice/servatrice.sql index 22ba4cf5..9d733176 100644 --- a/servatrice/servatrice.sql +++ b/servatrice/servatrice.sql @@ -223,3 +223,18 @@ CREATE TABLE IF NOT EXISTS `cockatrice_rooms_gametypes` ( PRIMARY KEY (`name`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; +CREATE TABLE IF NOT EXISTS `cockatrice_log` ( + `log_time` datetime NOT NULL, + `sender_id` int(7) unsigned NULL, + `sender_name` varchar(35) NOT NULL, + `sender_ip` varchar(255) NOT NULL, + `log_message` text NOT NULL, + `target_type` ENUM('room', 'game', 'chat'), + `target_id` int(7) NULL, + `target_name` varchar(50) NOT NULL, + KEY `sender_name` (`sender_name`), + KEY `sender_ip` (`sender_ip`), + KEY `target_type` (`target_type`), + KEY `target_id` (`target_id`), + KEY `target_name` (`target_name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; From 02978ce4041190ffeed4834b840aa0410f78fc39 Mon Sep 17 00:00:00 2001 From: Fabio Bas Date: Sat, 13 Dec 2014 18:43:31 +0100 Subject: [PATCH 2/6] Implement the logging method --- common/server_database_interface.h | 3 +++ .../src/servatrice_database_interface.cpp | 27 +++++++++++++++++++ .../src/servatrice_database_interface.h | 2 ++ 3 files changed, 32 insertions(+) diff --git a/common/server_database_interface.h b/common/server_database_interface.h index a08e9526..690d09f8 100644 --- a/common/server_database_interface.h +++ b/common/server_database_interface.h @@ -35,6 +35,9 @@ public: virtual bool userSessionExists(const QString & /* userName */) { return false; } virtual bool getRequireRegistration() { return false; } + + enum LogMessage_TargetType { MessageTargetRoom, MessageTargetGame, MessageTargetChat }; + virtual void logMessage(const int senderId, const QString &senderName, const QString &senderIp, const QString &logMessage, LogMessage_TargetType targetType, const int targetId, const QString &targetName) { }; }; #endif diff --git a/servatrice/src/servatrice_database_interface.cpp b/servatrice/src/servatrice_database_interface.cpp index a8c27e09..38ea25b0 100644 --- a/servatrice/src/servatrice_database_interface.cpp +++ b/servatrice/src/servatrice_database_interface.cpp @@ -538,3 +538,30 @@ DeckList *Servatrice_DatabaseInterface::getDeckFromDatabase(int deckId, int user return deck; } + +void Servatrice_DatabaseInterface::logMessage(const int senderId, const QString &senderName, const QString &senderIp, const QString &logMessage, LogMessage_TargetType targetType, const int targetId, const QString &targetName) +{ + QSqlQuery query(sqlDatabase); + QString targetTypeString; + switch(targetType) + { + case MessageTargetRoom: + targetTypeString = "room"; + break; + case MessageTargetGame: + targetTypeString = "game"; + break; + case MessageTargetChat: + targetTypeString = "chat"; + break; + } + query.prepare("insert into " + server->getDbPrefix() + "_log (log_time, sender_id, sender_name, sender_ip, log_message, target_type, target_id, target_name) values (now(), :sender_id, :sender_name, :sender_ip, :log_message, :target_type, :target_id, :target_name)"); + query.bindValue(":sender_id", senderId); + query.bindValue(":sender_name", senderName); + query.bindValue(":sender_ip", senderIp); + query.bindValue(":log_message", logMessage); + query.bindValue(":target_type", targetTypeString); + query.bindValue(":target_id", targetId); + query.bindValue(":target_name", targetName); + execSqlQuery(query); +} diff --git a/servatrice/src/servatrice_database_interface.h b/servatrice/src/servatrice_database_interface.h index 8e8ab5c6..9488ded8 100644 --- a/servatrice/src/servatrice_database_interface.h +++ b/servatrice/src/servatrice_database_interface.h @@ -52,6 +52,8 @@ public: bool userSessionExists(const QString &userName); bool getRequireRegistration(); + + void logMessage(const int senderId, const QString &senderName, const QString &senderIp, const QString &logMessage, LogMessage_TargetType targetType, const int targetId, const QString &targetName); }; #endif From c875054fb51920af6a09f3de0b4d6794d9f7dc50 Mon Sep 17 00:00:00 2001 From: Fabio Bas Date: Sat, 13 Dec 2014 18:43:59 +0100 Subject: [PATCH 3/6] Log messages from rooms, games and chats --- common/server.cpp | 2 ++ common/server_player.cpp | 2 ++ common/server_protocolhandler.cpp | 7 ++++++- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/common/server.cpp b/common/server.cpp index ff49a6dc..432c008e 100644 --- a/common/server.cpp +++ b/common/server.cpp @@ -345,6 +345,8 @@ void Server::externalRoomSay(int roomId, const QString &userName, const QString return; } room->say(userName, message, false); + + getDatabaseInterface()->logMessage(0, userName, "ISL", message, Server_DatabaseInterface::MessageTargetRoom, room->getId(), room->getName()); } void Server::externalRoomGameListChanged(int roomId, const ServerInfo_Game &gameInfo) diff --git a/common/server_player.cpp b/common/server_player.cpp index b9277a2d..ec8c09e2 100644 --- a/common/server_player.cpp +++ b/common/server_player.cpp @@ -767,6 +767,8 @@ Response::ResponseCode Server_Player::cmdGameSay(const Command_GameSay &cmd, Res Event_GameSay event; event.set_message(cmd.message()); ges.enqueueGameEvent(event, playerId); + + game->getRoom()->getServer()->getDatabaseInterface()->logMessage(playerId, QString::fromStdString(userInfo->name()), QString::fromStdString(userInfo->address()), QString::fromStdString(cmd.message()), Server_DatabaseInterface::MessageTargetGame, game->getGameId(), game->getDescription()); return Response::RespOk; } diff --git a/common/server_protocolhandler.cpp b/common/server_protocolhandler.cpp index 2ca3902a..07f3fd0f 100644 --- a/common/server_protocolhandler.cpp +++ b/common/server_protocolhandler.cpp @@ -395,7 +395,9 @@ Response::ResponseCode Server_ProtocolHandler::cmdMessage(const Command_Message SessionEvent *se = prepareSessionEvent(event); userInterface->sendProtocolItem(*se); rc.enqueuePreResponseItem(ServerMessage::SESSION_EVENT, se); - + + databaseInterface->logMessage(userInfo->id(), QString::fromStdString(userInfo->name()), QString::fromStdString(userInfo->address()), QString::fromStdString(cmd.message()), Server_DatabaseInterface::MessageTargetChat, userInterface->getUserInfo()->id(), receiver); + return Response::RespOk; } @@ -543,6 +545,9 @@ Response::ResponseCode Server_ProtocolHandler::cmdRoomSay(const Command_RoomSay msg.replace(QChar('\n'), QChar(' ')); room->say(QString::fromStdString(userInfo->name()), msg); + + databaseInterface->logMessage(userInfo->id(), QString::fromStdString(userInfo->name()), QString::fromStdString(userInfo->address()), msg, Server_DatabaseInterface::MessageTargetRoom, room->getId(), room->getName()); + return Response::RespOk; } From cd69bc8f9d1609f69ddba2aca010e6031ff62c2d Mon Sep 17 00:00:00 2001 From: Fabio Bas Date: Thu, 1 Jan 2015 15:48:53 +0100 Subject: [PATCH 4/6] Add configuration options to enable database logging --- common/server.cpp | 2 +- common/server_database_interface.h | 2 +- servatrice/servatrice.ini.example | 20 ++++++++++++++++++- .../src/servatrice_database_interface.cpp | 14 +++++++++++++ 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/common/server.cpp b/common/server.cpp index 432c008e..4b65739b 100644 --- a/common/server.cpp +++ b/common/server.cpp @@ -346,7 +346,7 @@ void Server::externalRoomSay(int roomId, const QString &userName, const QString } room->say(userName, message, false); - getDatabaseInterface()->logMessage(0, userName, "ISL", message, Server_DatabaseInterface::MessageTargetRoom, room->getId(), room->getName()); + getDatabaseInterface()->logMessage(0, userName, "ISL", message, Server_DatabaseInterface::MessageTargetIslRoom, room->getId(), room->getName()); } void Server::externalRoomGameListChanged(int roomId, const ServerInfo_Game &gameInfo) diff --git a/common/server_database_interface.h b/common/server_database_interface.h index 690d09f8..f3ffed6d 100644 --- a/common/server_database_interface.h +++ b/common/server_database_interface.h @@ -36,7 +36,7 @@ public: virtual bool getRequireRegistration() { return false; } - enum LogMessage_TargetType { MessageTargetRoom, MessageTargetGame, MessageTargetChat }; + enum LogMessage_TargetType { MessageTargetRoom, MessageTargetGame, MessageTargetChat, MessageTargetIslRoom }; virtual void logMessage(const int senderId, const QString &senderName, const QString &senderIp, const QString &logMessage, LogMessage_TargetType targetType, const int targetId, const QString &targetName) { }; }; diff --git a/servatrice/servatrice.ini.example b/servatrice/servatrice.ini.example index b3e431a1..c4454745 100644 --- a/servatrice/servatrice.ini.example +++ b/servatrice/servatrice.ini.example @@ -79,7 +79,7 @@ password=foobar [rooms] -; A servtrice server can expose to the users different "rooms" to chat and create games. Rooms can be defined +; A servatrice server can expose to the users different "rooms" to chat and create games. Rooms can be defined ; with two different methods: ; config: rooms are defined in this configuration (see the following example) ; sql: rooms are defined in the "rooms" table of the database @@ -144,6 +144,24 @@ max_message_count_per_interval=10 max_games_per_user=5 +[logging] + +; Servatrice can log user messages to the database table cockatrice_log. +; These messages can come from different sources; each source can be enabled separately. + +; Log user messages inside chat rooms +log_user_msg_room=false + +; Log user messages inside games +log_user_msg_game=false + +; Log user messages in private chats +log_user_msg_chat=false + +; Log user messages coming from other servers in the network +log_user_msg_isl=false + + ; EXPERIMENTAL - NOT WORKING YET ; The following settings are relative to the server network functionality, that is not yet complete. ; Avoid enabling it unless you are willing to test it and help its development. diff --git a/servatrice/src/servatrice_database_interface.cpp b/servatrice/src/servatrice_database_interface.cpp index 38ea25b0..7ee12cd7 100644 --- a/servatrice/src/servatrice_database_interface.cpp +++ b/servatrice/src/servatrice_database_interface.cpp @@ -546,15 +546,29 @@ void Servatrice_DatabaseInterface::logMessage(const int senderId, const QString switch(targetType) { case MessageTargetRoom: + if(!settingsCache->value("logging/log_user_msg_room", 0).toBool()) + return; targetTypeString = "room"; break; case MessageTargetGame: + if(!settingsCache->value("logging/log_user_msg_game", 0).toBool()) + return; targetTypeString = "game"; break; case MessageTargetChat: + if(!settingsCache->value("logging/log_user_msg_chat", 0).toBool()) + return; targetTypeString = "chat"; break; + case MessageTargetIslRoom: + if(!settingsCache->value("logging/log_user_msg_isl", 0).toBool()) + return; + targetTypeString = "room"; + break; + default: + return; } + query.prepare("insert into " + server->getDbPrefix() + "_log (log_time, sender_id, sender_name, sender_ip, log_message, target_type, target_id, target_name) values (now(), :sender_id, :sender_name, :sender_ip, :log_message, :target_type, :target_id, :target_name)"); query.bindValue(":sender_id", senderId); query.bindValue(":sender_name", senderName); From 925b4a83b004ba168fecc67cc3db042fbbea72e4 Mon Sep 17 00:00:00 2001 From: Fabio Bas Date: Thu, 1 Jan 2015 16:20:57 +0100 Subject: [PATCH 5/6] Fix "sender id" and "ip address" fields in game --- common/server_game.cpp | 2 +- common/server_player.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/common/server_game.cpp b/common/server_game.cpp index 647aa22e..58725742 100644 --- a/common/server_game.cpp +++ b/common/server_game.cpp @@ -436,7 +436,7 @@ void Server_Game::addPlayer(Server_AbstractUserInterface *userInterface, Respons { QMutexLocker locker(&gameMutex); - Server_Player *newPlayer = new Server_Player(this, nextPlayerId++, userInterface->copyUserInfo(true, true), spectator, userInterface); + Server_Player *newPlayer = new Server_Player(this, nextPlayerId++, userInterface->copyUserInfo(true, true, true), spectator, userInterface); newPlayer->moveToThread(thread()); Event_Join joinEvent; diff --git a/common/server_player.cpp b/common/server_player.cpp index ec8c09e2..f6d7ffce 100644 --- a/common/server_player.cpp +++ b/common/server_player.cpp @@ -768,7 +768,7 @@ Response::ResponseCode Server_Player::cmdGameSay(const Command_GameSay &cmd, Res event.set_message(cmd.message()); ges.enqueueGameEvent(event, playerId); - game->getRoom()->getServer()->getDatabaseInterface()->logMessage(playerId, QString::fromStdString(userInfo->name()), QString::fromStdString(userInfo->address()), QString::fromStdString(cmd.message()), Server_DatabaseInterface::MessageTargetGame, game->getGameId(), game->getDescription()); + game->getRoom()->getServer()->getDatabaseInterface()->logMessage(userInfo->id(), QString::fromStdString(userInfo->name()), QString::fromStdString(userInfo->address()), QString::fromStdString(cmd.message()), Server_DatabaseInterface::MessageTargetGame, game->getGameId(), game->getDescription()); return Response::RespOk; } From 51735613e515297e9c9c83980f36d21b15bec496 Mon Sep 17 00:00:00 2001 From: Fabio Bas Date: Thu, 1 Jan 2015 16:42:20 +0100 Subject: [PATCH 6/6] force NULL as unregistered users's id --- servatrice/src/servatrice_database_interface.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/servatrice/src/servatrice_database_interface.cpp b/servatrice/src/servatrice_database_interface.cpp index 7ee12cd7..156c600c 100644 --- a/servatrice/src/servatrice_database_interface.cpp +++ b/servatrice/src/servatrice_database_interface.cpp @@ -570,12 +570,12 @@ void Servatrice_DatabaseInterface::logMessage(const int senderId, const QString } query.prepare("insert into " + server->getDbPrefix() + "_log (log_time, sender_id, sender_name, sender_ip, log_message, target_type, target_id, target_name) values (now(), :sender_id, :sender_name, :sender_ip, :log_message, :target_type, :target_id, :target_name)"); - query.bindValue(":sender_id", senderId); + query.bindValue(":sender_id", senderId < 1 ? QVariant() : senderId); query.bindValue(":sender_name", senderName); query.bindValue(":sender_ip", senderIp); query.bindValue(":log_message", logMessage); query.bindValue(":target_type", targetTypeString); - query.bindValue(":target_id", targetId); + query.bindValue(":target_id", (targetType == MessageTargetChat && targetId < 1) ? QVariant() : targetId); query.bindValue(":target_name", targetName); execSqlQuery(query); }