aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/client.cpp8
-rw-r--r--src/clientserver.h3
-rw-r--r--src/server.cpp19
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;