From 8dbf68331386f5f6a40ff0f0a77f5390bdca60b9 Mon Sep 17 00:00:00 2001
From: est31 <MTest31@outlook.com>
Date: Sat, 16 May 2015 01:19:43 +0200
Subject: [PATCH] Finalize init packets and enable protocol v25

This enables srp.
---
 src/client.cpp                      |  5 +++--
 src/clientiface.h                   |  4 ++--
 src/network/clientpackethandler.cpp | 19 ++++++++++++-------
 src/network/networkprotocol.h       | 18 ++++++++++--------
 src/network/serveropcodes.cpp       |  2 +-
 src/network/serverpackethandler.cpp | 18 ++++++++++--------
 6 files changed, 38 insertions(+), 28 deletions(-)

diff --git a/src/client.cpp b/src/client.cpp
index 8cfcc85a7..780b07872 100644
--- a/src/client.cpp
+++ b/src/client.cpp
@@ -1000,8 +1000,9 @@ void Client::sendInit(const std::string &playerName)
 {
 	NetworkPacket pkt(TOSERVER_INIT, 1 + 2 + 2 + (1 + playerName.size()));
 
-	// TODO (later) actually send supported compression modes
-	pkt << (u8) SER_FMT_VER_HIGHEST_READ << (u8) 42;
+	// we don't support network compression yet
+	u16 supp_comp_modes = NETPROTO_COMPRESSION_NONE;
+	pkt << (u8) SER_FMT_VER_HIGHEST_READ << (u16) supp_comp_modes;
 	pkt << (u16) CLIENT_PROTOCOL_VERSION_MIN << (u16) CLIENT_PROTOCOL_VERSION_MAX;
 	pkt << playerName;
 
diff --git a/src/clientiface.h b/src/clientiface.h
index 070559c3a..4707f4d9a 100644
--- a/src/clientiface.h
+++ b/src/clientiface.h
@@ -337,7 +337,7 @@ class RemoteClient
 	void setPendingSerializationVersion(u8 version)
 		{ m_pending_serialization_version = version; }
 
-	void setSupportedCompressionModes(u8 byteFlag)
+	void setSupportedCompressionModes(u16 byteFlag)
 		{ m_supported_compressions = byteFlag; }
 
 	void confirmSerializationVersion()
@@ -416,7 +416,7 @@ class RemoteClient
 
 	std::string m_full_version;
 
-	u8 m_supported_compressions;
+	u16 m_supported_compressions;
 
 	/*
 		time this client was created
diff --git a/src/network/clientpackethandler.cpp b/src/network/clientpackethandler.cpp
index 2106e4368..1f13c62f9 100644
--- a/src/network/clientpackethandler.cpp
+++ b/src/network/clientpackethandler.cpp
@@ -44,26 +44,31 @@ void Client::handleCommand_Hello(NetworkPacket* pkt)
 	if (pkt->getSize() < 1)
 		return;
 
-	u8 deployed;
+	u8 serialization_ver;
+	u16 proto_ver;
+	u16 compression_mode;
 	u32 auth_mechs;
 	std::string username_legacy; // for case insensitivity
-	*pkt >> deployed >> auth_mechs >> username_legacy;
+	*pkt >> serialization_ver >> compression_mode >> proto_ver
+		>> auth_mechs >> username_legacy;
 
 	// Chose an auth method we support
 	AuthMechanism chosen_auth_mechanism = choseAuthMech(auth_mechs);
 
 	infostream << "Client: TOCLIENT_HELLO received with "
-			"deployed=" << ((int)deployed & 0xff) << ", auth_mechs="
-			<< auth_mechs << ", chosen=" << chosen_auth_mechanism << std::endl;
+			<< "serialization_ver=" << serialization_ver
+			<< ", auth_mechs=" << auth_mechs
+			<< ", compression_mode=" << compression_mode
+			<< ". Doing auth with mech " << chosen_auth_mechanism << std::endl;
 
-	if (!ser_ver_supported(deployed)) {
+	if (!ser_ver_supported(serialization_ver)) {
 		infostream << "Client: TOCLIENT_HELLO: Server sent "
 				<< "unsupported ser_fmt_ver"<< std::endl;
 		return;
 	}
 
-	m_server_ser_ver = deployed;
-	m_proto_ver = deployed;
+	m_server_ser_ver = serialization_ver;
+	m_proto_ver = proto_ver;
 
 	//TODO verify that username_legacy matches sent username, only
 	// differs in casing (make both uppercase and compare)
diff --git a/src/network/networkprotocol.h b/src/network/networkprotocol.h
index ba12a206e..09617c9d9 100644
--- a/src/network/networkprotocol.h
+++ b/src/network/networkprotocol.h
@@ -131,7 +131,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 		Add TOCLIENT_AUTH_ACCEPT to accept connection from client
 */
 
-#define LATEST_PROTOCOL_VERSION 24
+#define LATEST_PROTOCOL_VERSION 25
 
 // Server's supported network protocol range
 #define SERVER_PROTOCOL_VERSION_MIN 13
@@ -158,7 +158,9 @@ enum ToClientCommand
 	/*
 		Sent after TOSERVER_INIT.
 
-		u8 deployed version
+		u8 deployed serialisation version
+		u16 deployed network compression mode
+		u16 deployed protocol version
 		u32 supported auth methods
 		std::string username that should be used for legacy hash (for proper casing)
 	*/
@@ -632,11 +634,11 @@ enum ToServerCommand
 	/*
 		Sent first after connected.
 
-		[2] u8 SER_FMT_VER_HIGHEST_READ
-		[3] u8 compression_modes
-		[4] u16 minimum supported network protocol version
-		[6] u16 maximum supported network protocol version
-		[8] std::string player name
+		u8 serialisation version (=SER_FMT_VER_HIGHEST_READ)
+		u16 supported network compression modes
+		u16 minimum supported network protocol version
+		u16 maximum supported network protocol version
+		std::string player name
 	*/
 
 	TOSERVER_INIT_LEGACY = 0x10,
@@ -936,7 +938,7 @@ enum AccessDeniedCode {
 };
 
 enum NetProtoCompressionMode {
-	NETPROTO_COMPRESSION_ZLIB = 0,
+	NETPROTO_COMPRESSION_NONE = 0,
 };
 
 const static std::string accessDeniedStrings[SERVER_ACCESSDENIED_MAX] = {
diff --git a/src/network/serveropcodes.cpp b/src/network/serveropcodes.cpp
index 92d24fe40..9b14a1be3 100644
--- a/src/network/serveropcodes.cpp
+++ b/src/network/serveropcodes.cpp
@@ -115,7 +115,7 @@ const ClientCommandFactory clientCommandFactoryTable[TOCLIENT_NUM_MSG_TYPES] =
 {
 	null_command_factory, // 0x00
 	null_command_factory, // 0x01
-	null_command_factory, // 0x02
+	{ "TOCLIENT_HELLO",             0, true }, // 0x02
 	{ "TOCLIENT_AUTH_ACCEPT",       0, true }, // 0x03
 	{ "TOCLIENT_ACCEPT_SUDO_MODE",  0, true }, // 0x04
 	{ "TOCLIENT_DENY_SUDO_MODE",    0, true }, // 0x05
diff --git a/src/network/serverpackethandler.cpp b/src/network/serverpackethandler.cpp
index a6f5ffca1..38b8b3cff 100644
--- a/src/network/serverpackethandler.cpp
+++ b/src/network/serverpackethandler.cpp
@@ -91,22 +91,22 @@ void Server::handleCommand_Init(NetworkPacket* pkt)
 	// First byte after command is maximum supported
 	// serialization version
 	u8 client_max;
-	u8 compression_modes;
+	u16 supp_compr_modes;
 	u16 min_net_proto_version = 0;
 	u16 max_net_proto_version;
 	std::string playerName;
 
-	*pkt >> client_max >> compression_modes >> min_net_proto_version
+	*pkt >> client_max >> supp_compr_modes >> min_net_proto_version
 			>> max_net_proto_version >> playerName;
 
 	u8 our_max = SER_FMT_VER_HIGHEST_READ;
 	// Use the highest version supported by both
-	u8 deployed = std::min(client_max, our_max);
+	u8 depl_serial_v = std::min(client_max, our_max);
 	// If it's lower than the lowest supported, give up.
-	if (deployed < SER_FMT_VER_LOWEST)
-		deployed = SER_FMT_VER_INVALID;
+	if (depl_serial_v < SER_FMT_VER_LOWEST)
+		depl_serial_v = SER_FMT_VER_INVALID;
 
-	if (deployed == SER_FMT_VER_INVALID) {
+	if (depl_serial_v == SER_FMT_VER_INVALID) {
 		actionstream << "Server: A mismatched client tried to connect from "
 				<< addr_s << std::endl;
 		infostream<<"Server: Cannot negotiate serialization version with "
@@ -115,7 +115,7 @@ void Server::handleCommand_Init(NetworkPacket* pkt)
 		return;
 	}
 
-	client->setPendingSerializationVersion(deployed);
+	client->setPendingSerializationVersion(depl_serial_v);
 
 	/*
 		Read and check network protocol version
@@ -274,7 +274,9 @@ void Server::handleCommand_Init(NetworkPacket* pkt)
 	NetworkPacket resp_pkt(TOCLIENT_HELLO, 1 + 4
 		+ legacyPlayerNameCasing.size(), pkt->getPeerId());
 
-	resp_pkt << deployed << auth_mechs << legacyPlayerNameCasing;
+	u16 depl_compress_mode = NETPROTO_COMPRESSION_NONE;
+	resp_pkt << depl_serial_v << depl_compress_mode << net_proto_version
+		<< auth_mechs << legacyPlayerNameCasing;
 
 	Send(&resp_pkt);
 
-- 
GitLab