From a6f1f4c01def10c11801229766649ee8d20ea086 Mon Sep 17 00:00:00 2001 From: woogerboy21 Date: Tue, 6 Dec 2016 15:37:36 -0500 Subject: [PATCH] Add enable/disable log query functionality (#2294) * Add enable/disable log query functionality This change adds the ability for server owners to allow log querying from inside the client. In the event the functionality is not allowed a result is returned indicating the functionality is disabled. * Added translation Added the ability for the disabled messages to be translated. --- common/server.h | 1 + servatrice/servatrice.ini.example | 4 ++ servatrice/src/servatrice.cpp | 4 ++ servatrice/src/servatrice.h | 1 + servatrice/src/serversocketinterface.cpp | 49 ++++++++++++++++++++++-- 5 files changed, 56 insertions(+), 3 deletions(-) diff --git a/common/server.h b/common/server.h index 296569a3..3cb7cbf3 100644 --- a/common/server.h +++ b/common/server.h @@ -64,6 +64,7 @@ public: virtual bool getClientIDRequiredEnabled() const { return false; } virtual bool getRegOnlyServerEnabled() const { return false; } virtual bool getMaxUserLimitEnabled() const { return false; } + virtual bool getEnableLogQuery() const { return false; } virtual int getIdleClientTimeout() const { return 0; } virtual int getClientKeepAlive() const { return 0; } virtual int getMaxGameInactivityTime() const { return 9999999; } diff --git a/servatrice/servatrice.ini.example b/servatrice/servatrice.ini.example index df133a2a..0759afa7 100644 --- a/servatrice/servatrice.ini.example +++ b/servatrice/servatrice.ini.example @@ -288,6 +288,10 @@ command_counting_interval=10 max_command_count_per_interval=20 [logging] +; Admin/Moderators can query the stored logs for information when looking up reports by various players. This +; option can allow or disallow them from doing so. +; !!NOTE!! Enabling this feature puts a very high CPU and DISK load on the server, enable with caution. +enablelogquery=false ; Servatrice can log user messages to the database table cockatrice_log. ; These messages can come from different sources; each source can be enabled separately. diff --git a/servatrice/src/servatrice.cpp b/servatrice/src/servatrice.cpp index 27c9a148..83e1f36f 100644 --- a/servatrice/src/servatrice.cpp +++ b/servatrice/src/servatrice.cpp @@ -825,4 +825,8 @@ int Servatrice::getISLNetworkPort() const { int Servatrice::getIdleClientTimeout() const { return settingsCache->value("server/idleclienttimeout", 3600).toInt(); +} + +bool Servatrice::getEnableLogQuery() const { + return settingsCache->value("logging/enablelogquery", false).toBool(); } \ No newline at end of file diff --git a/servatrice/src/servatrice.h b/servatrice/src/servatrice.h index 49c83520..1abbcee0 100644 --- a/servatrice/src/servatrice.h +++ b/servatrice/src/servatrice.h @@ -189,6 +189,7 @@ public: bool getRegistrationEnabled() const; bool getRequireEmailForRegistrationEnabled() const; bool getRequireEmailActivationEnabled() const; + bool getEnableLogQuery() const; int getIdleClientTimeout() const; int getServerID() const; int getMaxGameInactivityTime() const; diff --git a/servatrice/src/serversocketinterface.cpp b/servatrice/src/serversocketinterface.cpp index 19341e04..a886f207 100644 --- a/servatrice/src/serversocketinterface.cpp +++ b/servatrice/src/serversocketinterface.cpp @@ -653,9 +653,52 @@ Response::ResponseCode AbstractServerSocketInterface::cmdGetLogHistory(const Com int maximumResults = cmd.maximum_results(); Response_ViewLogHistory *re = new Response_ViewLogHistory; - QListIterator messageIterator(sqlInterface->getMessageLogHistory(userName,ipAddress,gameName,gameID,message,chatType,gameType,roomType,dateRange,maximumResults)); - while (messageIterator.hasNext()) - re->add_log_message()->CopyFrom(messageIterator.next()); + + if (servatrice->getEnableLogQuery()) { + QListIterator messageIterator(sqlInterface->getMessageLogHistory(userName, ipAddress, gameName, gameID, message, chatType, gameType, roomType, dateRange, maximumResults)); + while (messageIterator.hasNext()) + re->add_log_message()->CopyFrom(messageIterator.next()); + } else { + ServerInfo_ChatMessage chatMessage; + + //create dummy chat message for room tab in the event the query is for room messages (and possibly not others) + chatMessage.set_time(QString(tr("Log query disabled, please contact server owner for details.")).toStdString()); + chatMessage.set_sender_id(QString("").toStdString()); + chatMessage.set_sender_name(QString("").toStdString()); + chatMessage.set_sender_ip(QString("").toStdString()); + chatMessage.set_message(QString("").toStdString()); + chatMessage.set_target_type(QString("room").toStdString()); + chatMessage.set_target_id(QString("").toStdString()); + chatMessage.set_target_name(QString("").toStdString()); + messageList << chatMessage; + + //create dummy chat message for room tab in the event the query is for game messages (and possibly not others) + chatMessage.set_time(QString(tr("Log query disabled, please contact server owner for details.")).toStdString()); + chatMessage.set_sender_id(QString("").toStdString()); + chatMessage.set_sender_name(QString("").toStdString()); + chatMessage.set_sender_ip(QString("").toStdString()); + chatMessage.set_message(QString("").toStdString()); + chatMessage.set_target_type(QString("game").toStdString()); + chatMessage.set_target_id(QString("").toStdString()); + chatMessage.set_target_name(QString("").toStdString()); + messageList << chatMessage; + + //create dummy chat message for room tab in the event the query is for chat messages (and possibly not others) + chatMessage.set_time(QString(tr("Log query disabled, please contact server owner for details.")).toStdString()); + chatMessage.set_sender_id(QString("").toStdString()); + chatMessage.set_sender_name(QString("").toStdString()); + chatMessage.set_sender_ip(QString("").toStdString()); + chatMessage.set_message(QString("").toStdString()); + chatMessage.set_target_type(QString("chat").toStdString()); + chatMessage.set_target_id(QString("").toStdString()); + chatMessage.set_target_name(QString("").toStdString()); + messageList << chatMessage; + + QListIterator messageIterator(messageList); + while (messageIterator.hasNext()) + re->add_log_message()->CopyFrom(messageIterator.next()); + } + rc.setResponseExtension(re); return Response::RespOk; }