summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormadmaxoft <github@xoft.cz>2014-01-13 20:32:15 +0100
committermadmaxoft <github@xoft.cz>2014-01-13 20:32:15 +0100
commitada54b79d71fbfc653799b535efd11b466423f75 (patch)
tree73aa5bbd56ac0a0c3c16b64e341c67a702883b62
parentProtoProxy: Fixed login kick packet direction. (diff)
downloadcuberite-ada54b79d71fbfc653799b535efd11b466423f75.tar
cuberite-ada54b79d71fbfc653799b535efd11b466423f75.tar.gz
cuberite-ada54b79d71fbfc653799b535efd11b466423f75.tar.bz2
cuberite-ada54b79d71fbfc653799b535efd11b466423f75.tar.lz
cuberite-ada54b79d71fbfc653799b535efd11b466423f75.tar.xz
cuberite-ada54b79d71fbfc653799b535efd11b466423f75.tar.zst
cuberite-ada54b79d71fbfc653799b535efd11b466423f75.zip
-rw-r--r--src/ClientHandle.h6
-rw-r--r--src/Protocol/Protocol17x.cpp25
2 files changed, 29 insertions, 2 deletions
diff --git a/src/ClientHandle.h b/src/ClientHandle.h
index 297d62d57..da2704b72 100644
--- a/src/ClientHandle.h
+++ b/src/ClientHandle.h
@@ -171,7 +171,13 @@ public:
void HandleCreativeInventory(short a_SlotNum, const cItem & a_HeldItem);
void HandleDisconnect (const AString & a_Reason);
void HandleEntityAction (int a_EntityID, char a_ActionID);
+
+ /** Called when the protocol handshake has been received (for protocol versions that support it;
+ otherwise the first instant when a username is received).
+ Returns true if the player is to be let in, false if they were disconnected
+ */
bool HandleHandshake (const AString & a_Username);
+
void HandleKeepAlive (int a_KeepAliveID);
void HandleLeftClick (int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace, char a_Status);
void HandlePing (void);
diff --git a/src/Protocol/Protocol17x.cpp b/src/Protocol/Protocol17x.cpp
index 9c46c6843..68992155e 100644
--- a/src/Protocol/Protocol17x.cpp
+++ b/src/Protocol/Protocol17x.cpp
@@ -216,8 +216,23 @@ void cProtocol172::SendDestroyEntity(const cEntity & a_Entity)
void cProtocol172::SendDisconnect(const AString & a_Reason)
{
- cPacketizer Pkt(*this, 0x40);
- Pkt.WriteString(Printf("{\"text\":\"%s\"}", EscapeString(a_Reason).c_str()));
+ switch (m_State)
+ {
+ case 2:
+ {
+ // During login:
+ cPacketizer Pkt(*this, 0);
+ Pkt.WriteString(Printf("{\"text\":\"%s\"}", EscapeString(a_Reason).c_str()));
+ break;
+ }
+ case 3:
+ {
+ // In-game:
+ cPacketizer Pkt(*this, 0x40);
+ Pkt.WriteString(Printf("{\"text\":\"%s\"}", EscapeString(a_Reason).c_str()));
+ break;
+ }
+ }
}
@@ -1156,6 +1171,12 @@ void cProtocol172::HandlePacketLoginStart(cByteBuffer & a_ByteBuffer)
// TODO: Protocol encryption should be set up here if not localhost / auth
+ if (!m_Client->HandleHandshake(Username))
+ {
+ // The client is not welcome here, they have been sent a Kick packet already
+ return;
+ }
+
// Send login success:
{
cPacketizer Pkt(*this, 0x02); // Login success packet