From a9213fd12c3325f86ac46b2e94a5da701407edf3 Mon Sep 17 00:00:00 2001 From: est31 Date: Fri, 17 Jul 2015 06:52:46 +0200 Subject: [PATCH] Protocol 25: Repurpose string field for access denial Send it always, and make client use it as fallback for unknown reason strings. This gives us future-proof-ness. --- src/network/clientpackethandler.cpp | 6 ++++-- src/network/networkprotocol.h | 3 ++- src/server.cpp | 20 ++++++++++++++------ src/server.h | 2 +- 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/network/clientpackethandler.cpp b/src/network/clientpackethandler.cpp index 15d5456fa..1c50a1dc6 100644 --- a/src/network/clientpackethandler.cpp +++ b/src/network/clientpackethandler.cpp @@ -217,9 +217,11 @@ void Client::handleCommand_AccessDenied(NetworkPacket* pkt) *pkt >> denyCode; if (denyCode == SERVER_ACCESSDENIED_CUSTOM_STRING) { *pkt >> m_access_denied_reason; - } - else if (denyCode < SERVER_ACCESSDENIED_MAX) { + } else if (denyCode < SERVER_ACCESSDENIED_MAX) { m_access_denied_reason = accessDeniedStrings[denyCode]; + } else { + // Use the fallback string sent by the server + *pkt >> m_access_denied_reason; } } // 13/03/15 Legacy code from 0.4.12 and lesser. must stay 1 year diff --git a/src/network/networkprotocol.h b/src/network/networkprotocol.h index e4b566740..6c51eabf6 100644 --- a/src/network/networkprotocol.h +++ b/src/network/networkprotocol.h @@ -202,7 +202,8 @@ enum ToClientCommand TOCLIENT_ACCESS_DENIED = 0x0A, /* u8 reason - std::string custom reason (if reason == SERVER_ACCESSDENIED_CUSTOM_STRING) + std::string custom reason (if reason == SERVER_ACCESSDENIED_CUSTOM_STRING), + also used as string fallback for new reasons beyond the initial 10. */ TOCLIENT_BLOCKDATA = 0x20, //TODO: Multiple blocks TOCLIENT_ADDNODE = 0x21, diff --git a/src/server.cpp b/src/server.cpp index 2d6de1c9d..6a3226d03 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -1523,16 +1523,17 @@ void Server::SendBreath(u16 peer_id, u16 breath) Send(&pkt); } -void Server::SendAccessDenied(u16 peer_id, AccessDeniedCode reason, const std::string &custom_reason) +void Server::SendAccessDenied(u16 peer_id, AccessDeniedCode reason, + const std::string &str_reason) { DSTACK(__FUNCTION_NAME); NetworkPacket pkt(TOCLIENT_ACCESS_DENIED, 1, peer_id); pkt << (u8) reason; - if (reason == SERVER_ACCESSDENIED_CUSTOM_STRING) { - pkt << custom_reason; - } + // Custom or fallback reason + pkt << str_reason; + Send(&pkt); } @@ -2575,11 +2576,18 @@ void Server::DenySudoAccess(u16 peer_id) Send(&pkt); } -void Server::DenyAccess(u16 peer_id, AccessDeniedCode reason, const std::string &custom_reason) +void Server::DenyAccess(u16 peer_id, AccessDeniedCode reason, + const std::string &custom_reason) { DSTACK(__FUNCTION_NAME); - SendAccessDenied(peer_id, reason, custom_reason); + if((u8) reason > 10) { + // Send fallback + SendAccessDenied(peer_id, reason, accessDeniedStrings[(u8) reason]); + } else { + SendAccessDenied(peer_id, reason, custom_reason); + } + m_clients.event(peer_id, CSE_SetDenied); m_con.DisconnectPeer(peer_id); } diff --git a/src/server.h b/src/server.h index fbca05f26..19975b768 100644 --- a/src/server.h +++ b/src/server.h @@ -390,7 +390,7 @@ private: void SendMovement(u16 peer_id); void SendHP(u16 peer_id, u8 hp); void SendBreath(u16 peer_id, u16 breath); - void SendAccessDenied(u16 peer_id, AccessDeniedCode reason, const std::string &custom_reason); + void SendAccessDenied(u16 peer_id, AccessDeniedCode reason, const std::string &str_reason); void SendAccessDenied_Legacy(u16 peer_id, const std::wstring &reason); void SendDeathscreen(u16 peer_id,bool set_camera_point_target, v3f camera_point_target); void SendItemDef(u16 peer_id,IItemDefManager *itemdef, u16 protocol_version);