From 8ccdd3bdb43b313d729279dbbb267528fc191615 Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Mon, 26 Nov 2012 23:58:27 +0200 Subject: Ranged support of protocol version on server side --- src/server.cpp | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) (limited to 'src/server.cpp') diff --git a/src/server.cpp b/src/server.cpp index f29155ba0..41765ed19 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2042,14 +2042,26 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) if(datasize >= 2+1+PLAYERNAME_SIZE+PASSWORD_SIZE+2) min_net_proto_version = readU16(&data[2+1+PLAYERNAME_SIZE+PASSWORD_SIZE]); - // Use min if version field doesn't exist (backwards compatibility) + // Use same version as minimum and maximum if maximum version field + // doesn't exist (backwards compatibility) u16 max_net_proto_version = min_net_proto_version; if(datasize >= 2+1+PLAYERNAME_SIZE+PASSWORD_SIZE+2+2) max_net_proto_version = readU16(&data[2+1+PLAYERNAME_SIZE+PASSWORD_SIZE+2]); + // Start with client's maximum version u16 net_proto_version = max_net_proto_version; - if(max_net_proto_version != SERVER_PROTOCOL_VERSION && min_net_proto_version <= SERVER_PROTOCOL_VERSION) - net_proto_version = SERVER_PROTOCOL_VERSION; + + // Figure out a working version if it is possible at all + if(max_net_proto_version >= SERVER_PROTOCOL_VERSION_MIN || + min_net_proto_version <= SERVER_PROTOCOL_VERSION_MAX) + { + // If maximum is larger than our maximum, go with our maximum + if(max_net_proto_version > SERVER_PROTOCOL_VERSION_MAX) + net_proto_version = SERVER_PROTOCOL_VERSION_MAX; + // Else go with client's maximum + else + net_proto_version = max_net_proto_version; + } verbosestream<<"Server: "<getBool("strict_protocol_version_checking")) { - if(net_proto_version != SERVER_PROTOCOL_VERSION) + if(net_proto_version < SERVER_PROTOCOL_VERSION_MIN || + net_proto_version > SERVER_PROTOCOL_VERSION_MAX) { actionstream<<"Server: A mismatched client tried to connect" <<" from "<net_proto_version < SERVER_PROTOCOL_VERSION) + if(getClient(peer_id)->net_proto_version < LATEST_PROTOCOL_VERSION) { - SendChatMessage(peer_id, L"# Server: WARNING: YOUR CLIENT IS OLD AND MAY WORK PROPERLY WITH THIS SERVER!"); + SendChatMessage(peer_id, L"# Server: WARNING: YOUR CLIENT IS OLD " + L"AND MAY NOT FULLY WORK WITH THIS SERVER!"); } /* -- cgit v1.2.3