diff --git a/pokerth.proto b/pokerth.proto index 41f45a0e..c4e4339b 100644 --- a/pokerth.proto +++ b/pokerth.proto @@ -713,9 +713,10 @@ message AdminBanPlayerAckMessage { required uint32 banPlayerId = 1; enum AdminBanPlayerResult { banPlayerAccepted = 0; - banPlayerInvalid = 1; + banPlayerPending = 1; banPlayerNoDB = 2; banPlayerDBError = 3; + banPlayerInvalid = 4; } required AdminBanPlayerResult banPlayerResult = 2; } diff --git a/src/db/common/serverdbgeneric.cpp b/src/db/common/serverdbgeneric.cpp index c2dccd7e..86483a71 100644 --- a/src/db/common/serverdbgeneric.cpp +++ b/src/db/common/serverdbgeneric.cpp @@ -116,7 +116,7 @@ ServerDBGeneric::AsyncQueryAdminPlayers(unsigned /*requestId*/) } void -ServerDBGeneric::AsyncBlockPlayer(unsigned /*requestId*/, DB_id /*playerId*/, int /*valid*/, int /*active*/) +ServerDBGeneric::AsyncBlockPlayer(unsigned /*requestId*/, unsigned /*replyId*/, DB_id /*playerId*/, int /*valid*/, int /*active*/) { } diff --git a/src/db/serverdbcallback.h b/src/db/serverdbcallback.h index a8484234..f7e2b13c 100644 --- a/src/db/serverdbcallback.h +++ b/src/db/serverdbcallback.h @@ -67,6 +67,9 @@ public: virtual void ReportGameFailed(unsigned requestId, unsigned replyId) = 0; virtual void PlayerAdminList(unsigned requestId, std::list adminList) = 0; + + virtual void BlockPlayerSuccess(unsigned requestId, unsigned replyId) = 0; + virtual void BlockPlayerFailed(unsigned requestId, unsigned replyId) = 0; }; #endif diff --git a/src/db/serverdbgeneric.h b/src/db/serverdbgeneric.h index 15547dd8..1a111cc1 100644 --- a/src/db/serverdbgeneric.h +++ b/src/db/serverdbgeneric.h @@ -63,7 +63,7 @@ public: virtual void AsyncReportGame(unsigned requestId, unsigned replyId, DB_id *creatorPlayerId, unsigned gameId, const std::string &gameName, DB_id *byPlayerId); virtual void AsyncQueryAdminPlayers(unsigned requestId); - virtual void AsyncBlockPlayer(unsigned requestId, DB_id playerId, int valid, int active); + virtual void AsyncBlockPlayer(unsigned requestId, unsigned replyId, DB_id playerId, int valid, int active); private: boost::shared_ptr m_ioService; diff --git a/src/db/serverdbinterface.h b/src/db/serverdbinterface.h index 00d0237f..622f5aaa 100644 --- a/src/db/serverdbinterface.h +++ b/src/db/serverdbinterface.h @@ -63,7 +63,7 @@ public: virtual void AsyncReportGame(unsigned requestId, unsigned replyId, DB_id *creatorPlayerId, unsigned gameId, const std::string &gameName, DB_id *byPlayerId) = 0; virtual void AsyncQueryAdminPlayers(unsigned requestId) = 0; - virtual void AsyncBlockPlayer(unsigned requestId, DB_id playerId, int valid, int active) = 0; + virtual void AsyncBlockPlayer(unsigned requestId, unsigned replyId, DB_id playerId, int valid, int active) = 0; }; #endif diff --git a/src/db/serverdbnoaction.h b/src/db/serverdbnoaction.h index 59392f64..d3f2f4da 100644 --- a/src/db/serverdbnoaction.h +++ b/src/db/serverdbnoaction.h @@ -61,7 +61,7 @@ public: virtual void AsyncReportGame(unsigned /*requestId*/, unsigned /*replyId*/, DB_id * /*creatorPlayerId*/, unsigned /*gameId*/, const std::string &/*gameName*/, DB_id * /*byPlayerId*/) {} virtual void AsyncQueryAdminPlayers(unsigned /*requestId*/) {} - virtual void AsyncBlockPlayer(unsigned /*requestId*/, DB_id /*playerId*/, int /*valid*/, int /*active*/) {} + virtual void AsyncBlockPlayer(unsigned /*requestId*/, unsigned /*replyId*/, DB_id /*playerId*/, int /*valid*/, int /*active*/) {} }; #endif // _SERVERDBNOACTION_H_ diff --git a/src/net/common/clientstate.cpp b/src/net/common/clientstate.cpp index 46cbd49b..425c8bd4 100644 --- a/src/net/common/clientstate.cpp +++ b/src/net/common/clientstate.cpp @@ -789,6 +789,39 @@ AbstractClientStateReceiving::HandlePacket(boost::shared_ptr clien break; } client->GetCallback().SignalNetClientMsgBox(msgCode); + } else if (tmpPacket->GetMsg()->messagetype() == PokerTHMessage::Type_AdminRemoveGameAckMessage) { + const AdminRemoveGameAckMessage &netRemoveAck = tmpPacket->GetMsg()->adminremovegameackmessage(); + unsigned msgCode; + switch (netRemoveAck.removegameresult()) { + case AdminRemoveGameAckMessage::gameRemoveAccepted: + msgCode = MSG_NET_ADMIN_REMOVE_GAME_ACCEPTED; + break; + default: + msgCode = MSG_NET_ADMIN_REMOVE_GAME_REJECTED; + break; + } + client->GetCallback().SignalNetClientMsgBox(msgCode); + } else if (tmpPacket->GetMsg()->messagetype() == PokerTHMessage::Type_AdminBanPlayerAckMessage) { + const AdminBanPlayerAckMessage &netBanAck = tmpPacket->GetMsg()->adminbanplayerackmessage(); + unsigned msgCode; + switch (netBanAck.banplayerresult()) { + case AdminBanPlayerAckMessage::banPlayerAccepted: + msgCode = MSG_NET_ADMIN_BAN_PLAYER_ACCEPTED; + break; + case AdminBanPlayerAckMessage::banPlayerPending: + msgCode = MSG_NET_ADMIN_BAN_PLAYER_PENDING; + break; + case AdminBanPlayerAckMessage::banPlayerNoDB: + msgCode = MSG_NET_ADMIN_BAN_PLAYER_NODB; + break; + case AdminBanPlayerAckMessage::banPlayerDBError: + msgCode = MSG_NET_ADMIN_BAN_PLAYER_DBERROR; + break; + default: + msgCode = MSG_NET_ADMIN_BAN_PLAYER_REJECTED; + break; + } + client->GetCallback().SignalNetClientMsgBox(msgCode); } else if (tmpPacket->GetMsg()->messagetype() == PokerTHMessage::Type_StatisticsMessage) { const StatisticsMessage &netStatistics = tmpPacket->GetMsg()->statisticsmessage(); diff --git a/src/net/common/serverlobbythread.cpp b/src/net/common/serverlobbythread.cpp index 310d62bf..392f18f0 100644 --- a/src/net/common/serverlobbythread.cpp +++ b/src/net/common/serverlobbythread.cpp @@ -199,10 +199,18 @@ public: m_server.SendReportGameResult(requestId, replyId, false); } - virtual void PlayerAdminList(unsigned requestId, std::list adminList) { + virtual void PlayerAdminList(unsigned /*requestId*/, std::list adminList) { m_server.GetBanManager().SetAdminPlayerIds(adminList); } + virtual void BlockPlayerSuccess(unsigned requestId, unsigned replyId) { + m_server.SendAdminBanPlayerResult(requestId, replyId, true); + } + + virtual void BlockPlayerFailed(unsigned requestId, unsigned replyId) { + m_server.SendAdminBanPlayerResult(requestId, replyId, false); + } + private: ServerLobbyThread &m_server; }; @@ -1511,6 +1519,41 @@ ServerLobbyThread::HandleNetPacketAdminRemoveGame(boost::shared_ptr void ServerLobbyThread::HandleNetPacketAdminBanPlayer(boost::shared_ptr session, const AdminBanPlayerMessage &banPlayer) { + // Create Ack-Packet. + boost::shared_ptr packet(new NetPacket); + packet->GetMsg()->set_messagetype(PokerTHMessage::Type_AdminBanPlayerAckMessage); + AdminBanPlayerAckMessage *netBanAck = packet->GetMsg()->mutable_adminbanplayerackmessage(); + netBanAck->set_banplayerid(banPlayer.banplayerid()); + + if (session && session->GetPlayerData() && GetBanManager().IsAdminPlayer(session->GetPlayerData()->GetDBId())) { + + boost::shared_ptr tmpSession = m_sessionManager.GetSessionByUniquePlayerId(banPlayer.banplayerid()); + if (!tmpSession) { + tmpSession = m_gameSessionManager.GetSessionByUniquePlayerId(banPlayer.banplayerid()); + } + boost::shared_ptr tmpPlayer; + if (tmpSession) { + tmpPlayer = tmpSession->GetPlayerData(); + } + if (tmpPlayer && !GetBanManager().IsAdminPlayer(tmpPlayer->GetDBId())) { + // Ban the player's IP address for 24 hours. + GetBanManager().BanIPAddress(tmpSession->GetClientAddr(), 24); + // Kick the player. + RemovePlayer(tmpPlayer->GetUniqueId(), ERR_NET_PLAYER_KICKED); + // Permanently ban the player in the database. + if (tmpPlayer->GetDBId() != DB_ID_INVALID) { + GetDatabase()->AsyncBlockPlayer(session->GetPlayerData()->GetUniqueId(), tmpPlayer->GetUniqueId(), tmpPlayer->GetDBId(), 0, 4); + netBanAck->set_banplayerresult(AdminBanPlayerAckMessage::banPlayerPending); + } else { + netBanAck->set_banplayerresult(AdminBanPlayerAckMessage::banPlayerNoDB); + } + } else { + netBanAck->set_banplayerresult(AdminBanPlayerAckMessage::banPlayerInvalid); + } + } else { + netBanAck->set_banplayerresult(AdminBanPlayerAckMessage::banPlayerInvalid); + } + GetSender().Send(session, packet); } void @@ -1702,6 +1745,22 @@ ServerLobbyThread::SendReportGameResult(unsigned byPlayerId, unsigned reportedGa } } +void +ServerLobbyThread::SendAdminBanPlayerResult(unsigned byPlayerId, unsigned reportedPlayerId, bool success) +{ + boost::shared_ptr session = m_sessionManager.GetSessionByUniquePlayerId(byPlayerId); + if (!session) + session = m_gameSessionManager.GetSessionByUniquePlayerId(byPlayerId); + if (session) { + boost::shared_ptr packet(new NetPacket); + packet->GetMsg()->set_messagetype(PokerTHMessage::Type_AdminBanPlayerAckMessage); + AdminBanPlayerAckMessage *netBanAck = packet->GetMsg()->mutable_adminbanplayerackmessage(); + netBanAck->set_banplayerid(reportedPlayerId); + netBanAck->set_banplayerresult(success ? AdminBanPlayerAckMessage::banPlayerAccepted : AdminBanPlayerAckMessage::banPlayerDBError); + GetSender().Send(session, packet); + } +} + void ServerLobbyThread::UserBlocked(unsigned playerId) { diff --git a/src/net/serverlobbythread.h b/src/net/serverlobbythread.h index df7706c9..fd93a4aa 100644 --- a/src/net/serverlobbythread.h +++ b/src/net/serverlobbythread.h @@ -174,6 +174,7 @@ protected: void SendReportAvatarResult(unsigned byPlayerId, unsigned reportedPlayerId, bool success); void SendReportGameResult(unsigned byPlayerId, unsigned reportedGameId, bool success); + void SendAdminBanPlayerResult(unsigned byPlayerId, unsigned reportedPlayerId, bool success); void RequestPlayerAvatar(boost::shared_ptr session); void TimerRemoveGame(const boost::system::error_code &ec); void TimerRemovePlayer(const boost::system::error_code &ec); diff --git a/src/net/socket_msg.h b/src/net/socket_msg.h index fe16da79..7242a992 100644 --- a/src/net/socket_msg.h +++ b/src/net/socket_msg.h @@ -167,12 +167,19 @@ #define MSG_NET_LIMIT_GAME MSG_NET_GAME_SERVER_END // Some messages which are displayed in the GUI -#define MSG_NET_AVATAR_REPORT_ACCEPTED MSG_NET_LIMIT_GAME + 1 -#define MSG_NET_AVATAR_REPORT_DUP MSG_NET_LIMIT_GAME + 2 -#define MSG_NET_AVATAR_REPORT_REJECTED MSG_NET_LIMIT_GAME + 3 +#define MSG_NET_AVATAR_REPORT_ACCEPTED MSG_NET_LIMIT_GAME + 1 +#define MSG_NET_AVATAR_REPORT_DUP MSG_NET_LIMIT_GAME + 2 +#define MSG_NET_AVATAR_REPORT_REJECTED MSG_NET_LIMIT_GAME + 3 #define MSG_NET_GAMENAME_REPORT_ACCEPTED MSG_NET_LIMIT_GAME + 4 -#define MSG_NET_GAMENAME_REPORT_DUP MSG_NET_LIMIT_GAME + 5 +#define MSG_NET_GAMENAME_REPORT_DUP MSG_NET_LIMIT_GAME + 5 #define MSG_NET_GAMENAME_REPORT_REJECTED MSG_NET_LIMIT_GAME + 6 +#define MSG_NET_ADMIN_REMOVE_GAME_ACCEPTED MSG_NET_LIMIT_GAME + 7 +#define MSG_NET_ADMIN_REMOVE_GAME_REJECTED MSG_NET_LIMIT_GAME + 8 +#define MSG_NET_ADMIN_BAN_PLAYER_ACCEPTED MSG_NET_LIMIT_GAME + 9 +#define MSG_NET_ADMIN_BAN_PLAYER_PENDING MSG_NET_LIMIT_GAME + 10 +#define MSG_NET_ADMIN_BAN_PLAYER_NODB MSG_NET_LIMIT_GAME + 11 +#define MSG_NET_ADMIN_BAN_PLAYER_DBERROR MSG_NET_LIMIT_GAME + 12 +#define MSG_NET_ADMIN_BAN_PLAYER_REJECTED MSG_NET_LIMIT_GAME + 13 #endif diff --git a/src/third_party/protobuf/pokerth.pb.cc b/src/third_party/protobuf/pokerth.pb.cc index 9db897a3..42296dfa 100644 --- a/src/third_party/protobuf/pokerth.pb.cc +++ b/src/third_party/protobuf/pokerth.pb.cc @@ -19933,6 +19933,7 @@ bool AdminBanPlayerAckMessage_AdminBanPlayerResult_IsValid(int value) { case 1: case 2: case 3: + case 4: return true; default: return false; @@ -19941,9 +19942,10 @@ bool AdminBanPlayerAckMessage_AdminBanPlayerResult_IsValid(int value) { #ifndef _MSC_VER const AdminBanPlayerAckMessage_AdminBanPlayerResult AdminBanPlayerAckMessage::banPlayerAccepted; -const AdminBanPlayerAckMessage_AdminBanPlayerResult AdminBanPlayerAckMessage::banPlayerInvalid; +const AdminBanPlayerAckMessage_AdminBanPlayerResult AdminBanPlayerAckMessage::banPlayerPending; const AdminBanPlayerAckMessage_AdminBanPlayerResult AdminBanPlayerAckMessage::banPlayerNoDB; const AdminBanPlayerAckMessage_AdminBanPlayerResult AdminBanPlayerAckMessage::banPlayerDBError; +const AdminBanPlayerAckMessage_AdminBanPlayerResult AdminBanPlayerAckMessage::banPlayerInvalid; const AdminBanPlayerAckMessage_AdminBanPlayerResult AdminBanPlayerAckMessage::AdminBanPlayerResult_MIN; const AdminBanPlayerAckMessage_AdminBanPlayerResult AdminBanPlayerAckMessage::AdminBanPlayerResult_MAX; const int AdminBanPlayerAckMessage::AdminBanPlayerResult_ARRAYSIZE; diff --git a/src/third_party/protobuf/pokerth.pb.h b/src/third_party/protobuf/pokerth.pb.h index f74de861..1907f63d 100644 --- a/src/third_party/protobuf/pokerth.pb.h +++ b/src/third_party/protobuf/pokerth.pb.h @@ -370,13 +370,14 @@ const int AdminRemoveGameAckMessage_AdminRemoveGameResult_AdminRemoveGameResult_ enum AdminBanPlayerAckMessage_AdminBanPlayerResult { AdminBanPlayerAckMessage_AdminBanPlayerResult_banPlayerAccepted = 0, - AdminBanPlayerAckMessage_AdminBanPlayerResult_banPlayerInvalid = 1, + AdminBanPlayerAckMessage_AdminBanPlayerResult_banPlayerPending = 1, AdminBanPlayerAckMessage_AdminBanPlayerResult_banPlayerNoDB = 2, - AdminBanPlayerAckMessage_AdminBanPlayerResult_banPlayerDBError = 3 + AdminBanPlayerAckMessage_AdminBanPlayerResult_banPlayerDBError = 3, + AdminBanPlayerAckMessage_AdminBanPlayerResult_banPlayerInvalid = 4 }; bool AdminBanPlayerAckMessage_AdminBanPlayerResult_IsValid(int value); const AdminBanPlayerAckMessage_AdminBanPlayerResult AdminBanPlayerAckMessage_AdminBanPlayerResult_AdminBanPlayerResult_MIN = AdminBanPlayerAckMessage_AdminBanPlayerResult_banPlayerAccepted; -const AdminBanPlayerAckMessage_AdminBanPlayerResult AdminBanPlayerAckMessage_AdminBanPlayerResult_AdminBanPlayerResult_MAX = AdminBanPlayerAckMessage_AdminBanPlayerResult_banPlayerDBError; +const AdminBanPlayerAckMessage_AdminBanPlayerResult AdminBanPlayerAckMessage_AdminBanPlayerResult_AdminBanPlayerResult_MAX = AdminBanPlayerAckMessage_AdminBanPlayerResult_banPlayerInvalid; const int AdminBanPlayerAckMessage_AdminBanPlayerResult_AdminBanPlayerResult_ARRAYSIZE = AdminBanPlayerAckMessage_AdminBanPlayerResult_AdminBanPlayerResult_MAX + 1; enum PokerTHMessage_PokerTHMessageType { @@ -8426,9 +8427,10 @@ class AdminBanPlayerAckMessage : public ::google::protobuf::MessageLite { typedef AdminBanPlayerAckMessage_AdminBanPlayerResult AdminBanPlayerResult; static const AdminBanPlayerResult banPlayerAccepted = AdminBanPlayerAckMessage_AdminBanPlayerResult_banPlayerAccepted; - static const AdminBanPlayerResult banPlayerInvalid = AdminBanPlayerAckMessage_AdminBanPlayerResult_banPlayerInvalid; + static const AdminBanPlayerResult banPlayerPending = AdminBanPlayerAckMessage_AdminBanPlayerResult_banPlayerPending; static const AdminBanPlayerResult banPlayerNoDB = AdminBanPlayerAckMessage_AdminBanPlayerResult_banPlayerNoDB; static const AdminBanPlayerResult banPlayerDBError = AdminBanPlayerAckMessage_AdminBanPlayerResult_banPlayerDBError; + static const AdminBanPlayerResult banPlayerInvalid = AdminBanPlayerAckMessage_AdminBanPlayerResult_banPlayerInvalid; static inline bool AdminBanPlayerResult_IsValid(int value) { return AdminBanPlayerAckMessage_AdminBanPlayerResult_IsValid(value); } diff --git a/tests/src/de/pokerth/protocol/ProtoBuf.java b/tests/src/de/pokerth/protocol/ProtoBuf.java index 1f43c828..1fff64b3 100644 --- a/tests/src/de/pokerth/protocol/ProtoBuf.java +++ b/tests/src/de/pokerth/protocol/ProtoBuf.java @@ -37342,15 +37342,17 @@ public final class ProtoBuf { public enum AdminBanPlayerResult implements com.google.protobuf.Internal.EnumLite { banPlayerAccepted(0, 0), - banPlayerInvalid(1, 1), + banPlayerPending(1, 1), banPlayerNoDB(2, 2), banPlayerDBError(3, 3), + banPlayerInvalid(4, 4), ; public static final int banPlayerAccepted_VALUE = 0; - public static final int banPlayerInvalid_VALUE = 1; + public static final int banPlayerPending_VALUE = 1; public static final int banPlayerNoDB_VALUE = 2; public static final int banPlayerDBError_VALUE = 3; + public static final int banPlayerInvalid_VALUE = 4; public final int getNumber() { return value; } @@ -37358,9 +37360,10 @@ public final class ProtoBuf { public static AdminBanPlayerResult valueOf(int value) { switch (value) { case 0: return banPlayerAccepted; - case 1: return banPlayerInvalid; + case 1: return banPlayerPending; case 2: return banPlayerNoDB; case 3: return banPlayerDBError; + case 4: return banPlayerInvalid; default: return null; } }