From 24a662705cb73f8a5630114654c38a0e1328b9ec Mon Sep 17 00:00:00 2001
From: Perttu Ahola <celeron55@gmail.com>
Date: Sat, 30 Jul 2011 20:02:17 +0300
Subject: [PATCH] Added network protocol version number in protocol

---
 src/client.cpp     |  8 ++++++--
 src/clientserver.h |  3 ++-
 src/server.cpp     | 19 ++++++++++++++++++-
 3 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/src/client.cpp b/src/client.cpp
index 7ebb30fba..5f299890a 100644
--- a/src/client.cpp
+++ b/src/client.cpp
@@ -415,8 +415,9 @@ void Client::step(float dtime)
 			// [0] u16 TOSERVER_INIT
 			// [2] u8 SER_FMT_VER_HIGHEST
 			// [3] u8[20] player_name
-			// [23] u8[28] password
-			SharedBuffer<u8> data(2+1+PLAYERNAME_SIZE+PASSWORD_SIZE);
+			// [23] u8[28] password (new in some version)
+			// [51] u16 client network protocol version (new in some version)
+			SharedBuffer<u8> data(2+1+PLAYERNAME_SIZE+PASSWORD_SIZE+2);
 			writeU16(&data[0], TOSERVER_INIT);
 			writeU8(&data[2], SER_FMT_VER_HIGHEST);
 
@@ -428,6 +429,9 @@ void Client::step(float dtime)
 
 			memset((char*)&data[23], 0, PASSWORD_SIZE);
 			snprintf((char*)&data[23], PASSWORD_SIZE, "%s", m_password.c_str());
+			
+			// This should be incremented in each version
+			writeU16(&data[51], 1);
 
 			// Send as unreliable
 			Send(0, data, false);
diff --git a/src/clientserver.h b/src/clientserver.h
index 35484fe76..4981b7ea8 100644
--- a/src/clientserver.h
+++ b/src/clientserver.h
@@ -171,7 +171,8 @@ enum ToServerCommand
 		[0] u16 TOSERVER_INIT
 		[2] u8 SER_FMT_VER_HIGHEST
 		[3] u8[20] player_name
-		[23] u8[28] password
+		[23] u8[28] password (new in some version)
+		[51] u16 client network protocol version (new in some version)
 	*/
 
 	TOSERVER_INIT2 = 0x11,
diff --git a/src/server.cpp b/src/server.cpp
index 96e64b314..ca166eaef 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -1966,6 +1966,23 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
 			derr_server<<DTIME<<"Server: Cannot negotiate "
 					"serialization version with peer "
 					<<peer_id<<std::endl;
+			SendAccessDenied(m_con, peer_id,
+					L"Your client is too old (map format)");
+			return;
+		}
+		
+		/*
+			Check network protocol version
+		*/
+		u16 net_proto_version = 0;
+		if(datasize >= 2+1+PLAYERNAME_SIZE+PASSWORD_SIZE+2)
+		{
+			net_proto_version = readU16(&data[2+1+PLAYERNAME_SIZE+PASSWORD_SIZE]);
+		}
+		if(net_proto_version == 0)
+		{
+			SendAccessDenied(m_con, peer_id,
+					L"Your client is too old (network protocol)");
 			return;
 		}
 
@@ -1999,7 +2016,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
 
 		// Get password
 		char password[PASSWORD_SIZE];
-		if(datasize == 2+1+PLAYERNAME_SIZE)
+		if(datasize >= 2+1+PLAYERNAME_SIZE)
 		{
 			// old version - assume blank password
 			password[0] = 0;
-- 
GitLab