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.
This commit is contained in:
est31 2015-07-17 06:52:46 +02:00
parent bf7174f3f9
commit a9213fd12c
4 changed files with 21 additions and 10 deletions

View File

@ -217,9 +217,11 @@ void Client::handleCommand_AccessDenied(NetworkPacket* pkt)
*pkt >> denyCode; *pkt >> denyCode;
if (denyCode == SERVER_ACCESSDENIED_CUSTOM_STRING) { if (denyCode == SERVER_ACCESSDENIED_CUSTOM_STRING) {
*pkt >> m_access_denied_reason; *pkt >> m_access_denied_reason;
} } else if (denyCode < SERVER_ACCESSDENIED_MAX) {
else if (denyCode < SERVER_ACCESSDENIED_MAX) {
m_access_denied_reason = accessDeniedStrings[denyCode]; 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 // 13/03/15 Legacy code from 0.4.12 and lesser. must stay 1 year

View File

@ -202,7 +202,8 @@ enum ToClientCommand
TOCLIENT_ACCESS_DENIED = 0x0A, TOCLIENT_ACCESS_DENIED = 0x0A,
/* /*
u8 reason 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_BLOCKDATA = 0x20, //TODO: Multiple blocks
TOCLIENT_ADDNODE = 0x21, TOCLIENT_ADDNODE = 0x21,

View File

@ -1523,16 +1523,17 @@ void Server::SendBreath(u16 peer_id, u16 breath)
Send(&pkt); 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); DSTACK(__FUNCTION_NAME);
NetworkPacket pkt(TOCLIENT_ACCESS_DENIED, 1, peer_id); NetworkPacket pkt(TOCLIENT_ACCESS_DENIED, 1, peer_id);
pkt << (u8) reason; pkt << (u8) reason;
if (reason == SERVER_ACCESSDENIED_CUSTOM_STRING) { // Custom or fallback reason
pkt << custom_reason; pkt << str_reason;
}
Send(&pkt); Send(&pkt);
} }
@ -2575,11 +2576,18 @@ void Server::DenySudoAccess(u16 peer_id)
Send(&pkt); 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); 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_clients.event(peer_id, CSE_SetDenied);
m_con.DisconnectPeer(peer_id); m_con.DisconnectPeer(peer_id);
} }

View File

@ -390,7 +390,7 @@ private:
void SendMovement(u16 peer_id); void SendMovement(u16 peer_id);
void SendHP(u16 peer_id, u8 hp); void SendHP(u16 peer_id, u8 hp);
void SendBreath(u16 peer_id, u16 breath); 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 SendAccessDenied_Legacy(u16 peer_id, const std::wstring &reason);
void SendDeathscreen(u16 peer_id,bool set_camera_point_target, v3f camera_point_target); void SendDeathscreen(u16 peer_id,bool set_camera_point_target, v3f camera_point_target);
void SendItemDef(u16 peer_id,IItemDefManager *itemdef, u16 protocol_version); void SendItemDef(u16 peer_id,IItemDefManager *itemdef, u16 protocol_version);