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;
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

View File

@ -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,

View File

@ -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);
}

View File

@ -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);