Added network protocol version number in protocol
authorPerttu Ahola <celeron55@gmail.com>
Sat, 30 Jul 2011 17:02:17 +0000 (20:02 +0300)
committerPerttu Ahola <celeron55@gmail.com>
Sat, 30 Jul 2011 17:02:17 +0000 (20:02 +0300)
src/client.cpp
src/clientserver.h
src/server.cpp

index 7ebb30fbacd952495fe10f9948713c54e80c16c5..5f299890a34f72deec3729e0566248a7198cbe44 100644 (file)
@@ -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);
index 35484fe76c47b970d6d81ecf3d6d4310ba47ad40..4981b7ea8c845f7ff4fe75c54fa78aa89787e9ce 100644 (file)
@@ -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,
index 96e64b3142aa8a5cbcb7c3f7e41fc732712d783d..ca166eaef677ca62b2cf54729c3186533b82804c 100644 (file)
@@ -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;