Add option to not send pre v25 init packet 3855/head
authorest31 <MTest31@outlook.com>
Mon, 14 Mar 2016 09:18:29 +0000 (10:18 +0100)
committerest31 <MTest31@outlook.com>
Tue, 15 Mar 2016 16:20:09 +0000 (17:20 +0100)
The legacy init packet (pre v25) sends information about the client's
password that a server could use to log in to other servers if the
username and password are the same. All the other benefits of SRP of
protocol v25 are missed if the legacy init packet is still sent during
connection creation.

This patch adds an option to not send the v25 init packet. Not sending
the v25 packet means breaking compat with pre v25 servers, but as the
option is not enabled by default, no servers are affected unless the
user explicitly flips the switch. More than 90% of the servers on the
serverlist support post v25 protocols.

The patch also fixes a bug with greying out of non compliant servers
being done wrongly, the min and max params were mixed.

builtin/mainmenu/common.lua
builtin/mainmenu/tab_multiplayer.lua
builtin/settingtypes.txt
minetest.conf.example
src/client.cpp
src/defaultsettings.cpp
src/network/networkprotocol.h
src/script/lua_api/l_mainmenu.cpp
src/serverlist.cpp
src/settings_translation_file.cpp

index f40c787a22c477644fd3d6055f3d08afabb7b47e..b9a010e61a65b5fa23fd9cfa9854bf929179e95d 100644 (file)
@@ -22,9 +22,14 @@ menudata = {}
 --------------------------------------------------------------------------------
 -- Local cached values
 --------------------------------------------------------------------------------
-local min_supp_proto = core.get_min_supp_proto()
-local max_supp_proto = core.get_max_supp_proto()
+local min_supp_proto
+local max_supp_proto
 
+function common_update_cached_supp_proto()
+       min_supp_proto = core.get_min_supp_proto()
+       max_supp_proto = core.get_max_supp_proto()
+end
+common_update_cached_supp_proto()
 --------------------------------------------------------------------------------
 -- Menu helper functions
 --------------------------------------------------------------------------------
@@ -105,7 +110,7 @@ function render_favorite(spec,render_details)
        end
 
        local details = ""
-       local grey_out = not is_server_protocol_compat(spec.proto_max, spec.proto_min)
+       local grey_out = not is_server_protocol_compat(spec.proto_min, spec.proto_max)
 
        if spec.clients ~= nil and spec.clients_max ~= nil then
                local clients_color = ''
index 570259718f0db9de752f1fa2ddfe64f1c9c77429..2072f8c38cb9c9505af09c96a6bb8a91b5a9bdd6 100644 (file)
 
 --------------------------------------------------------------------------------
 local function get_formspec(tabview, name, tabdata)
+       -- Update the cached supported proto info,
+       -- it may have changed after a change by the settings menu.
+       common_update_cached_supp_proto()
+
        local render_details = core.is_yes(core.setting_getbool("public_serverlist"))
        
        local retval =
index c1157b163286a959b378aeca5b29380bfce06dc7..99106e00bd45fd2653112248724015db8ab918ab 100644 (file)
@@ -232,6 +232,12 @@ address (Server address) string
 #    Note that the port field in the main menu overrides this setting.
 remote_port (Remote port) int 30000 1 65535
 
+#    Whether to support older servers before protocol version 25.
+#    Enable if you want to connect to 0.4.12 servers and before.
+#    Servers starting with 0.4.13 will work, 0.4.12-dev servers may work.
+#    Disabling this option will protect your password better.
+send_pre_v25_init (Support older servers) bool true
+
 #    Save the map received by the client on disk.
 enable_local_map_saving (Saving map received from server) bool false
 
index cd0be52963d41546cf256f258f8157cfacb3f4b0..6a9dc5ce3a5bd5665beeff411410f82855dadc59 100644 (file)
 #    type: int min: 1 max: 65535
 # remote_port = 30000
 
+#    Whether to support older servers before protocol version 25.
+#    Enable if you want to connect to 0.4.12 servers and before.
+#    Servers starting with 0.4.13 will work, 0.4.12-dev servers may work.
+#    Disabling this option will protect your password better.
+#    type: bool
+# send_pre_v25_init = true
+
 #    Save the map received by the client on disk.
 #    type: bool
 # enable_local_map_saving = false
index 41468f0fd6b1cb6c6adfea52c6854c5e993045d5..2a8e02d6e8b5de0a1914ad1075bb6f5aedf9f280 100644 (file)
@@ -386,25 +386,30 @@ void Client::step(float dtime)
                        Player *myplayer = m_env.getLocalPlayer();
                        FATAL_ERROR_IF(myplayer == NULL, "Local player not found in environment.");
 
-                       // Send TOSERVER_INIT_LEGACY
-                       // [0] u16 TOSERVER_INIT_LEGACY
-                       // [2] u8 SER_FMT_VER_HIGHEST_READ
-                       // [3] u8[20] player_name
-                       // [23] u8[28] password (new in some version)
-                       // [51] u16 minimum supported network protocol version (added sometime)
-                       // [53] u16 maximum supported network protocol version (added later than the previous one)
-
-                       char pName[PLAYERNAME_SIZE];
-                       char pPassword[PASSWORD_SIZE];
-                       memset(pName, 0, PLAYERNAME_SIZE * sizeof(char));
-                       memset(pPassword, 0, PASSWORD_SIZE * sizeof(char));
-
-                       std::string hashed_password = translate_password(myplayer->getName(), m_password);
-                       snprintf(pName, PLAYERNAME_SIZE, "%s", myplayer->getName());
-                       snprintf(pPassword, PASSWORD_SIZE, "%s", hashed_password.c_str());
-
-                       sendLegacyInit(pName, pPassword);
-                       if (LATEST_PROTOCOL_VERSION >= 25)
+                       u16 proto_version_min = g_settings->getFlag("send_pre_v25_init") ?
+                               CLIENT_PROTOCOL_VERSION_MIN_LEGACY : CLIENT_PROTOCOL_VERSION_MIN;
+
+                       if (proto_version_min < 25) {
+                               // Send TOSERVER_INIT_LEGACY
+                               // [0] u16 TOSERVER_INIT_LEGACY
+                               // [2] u8 SER_FMT_VER_HIGHEST_READ
+                               // [3] u8[20] player_name
+                               // [23] u8[28] password (new in some version)
+                               // [51] u16 minimum supported network protocol version (added sometime)
+                               // [53] u16 maximum supported network protocol version (added later than the previous one)
+
+                               char pName[PLAYERNAME_SIZE];
+                               char pPassword[PASSWORD_SIZE];
+                               memset(pName, 0, PLAYERNAME_SIZE * sizeof(char));
+                               memset(pPassword, 0, PASSWORD_SIZE * sizeof(char));
+
+                               std::string hashed_password = translate_password(myplayer->getName(), m_password);
+                               snprintf(pName, PLAYERNAME_SIZE, "%s", myplayer->getName());
+                               snprintf(pPassword, PASSWORD_SIZE, "%s", hashed_password.c_str());
+
+                               sendLegacyInit(pName, pPassword);
+                       }
+                       if (CLIENT_PROTOCOL_VERSION_MAX >= 25)
                                sendInit(myplayer->getName());
                }
 
@@ -1003,10 +1008,13 @@ void Client::sendLegacyInit(const char* playerName, const char* playerPassword)
        NetworkPacket pkt(TOSERVER_INIT_LEGACY,
                        1 + PLAYERNAME_SIZE + PASSWORD_SIZE + 2 + 2);
 
+       u16 proto_version_min = g_settings->getFlag("send_pre_v25_init") ?
+               CLIENT_PROTOCOL_VERSION_MIN_LEGACY : CLIENT_PROTOCOL_VERSION_MIN;
+
        pkt << (u8) SER_FMT_VER_HIGHEST_READ;
        pkt.putRawString(playerName,PLAYERNAME_SIZE);
        pkt.putRawString(playerPassword, PASSWORD_SIZE);
-       pkt << (u16) CLIENT_PROTOCOL_VERSION_MIN << (u16) CLIENT_PROTOCOL_VERSION_MAX;
+       pkt << (u16) proto_version_min << (u16) CLIENT_PROTOCOL_VERSION_MAX;
 
        Send(&pkt);
 }
@@ -1017,8 +1025,12 @@ void Client::sendInit(const std::string &playerName)
 
        // we don't support network compression yet
        u16 supp_comp_modes = NETPROTO_COMPRESSION_NONE;
+
+       u16 proto_version_min = g_settings->getFlag("send_pre_v25_init") ?
+               CLIENT_PROTOCOL_VERSION_MIN_LEGACY : CLIENT_PROTOCOL_VERSION_MIN;
+
        pkt << (u8) SER_FMT_VER_HIGHEST_READ << (u16) supp_comp_modes;
-       pkt << (u16) CLIENT_PROTOCOL_VERSION_MIN << (u16) CLIENT_PROTOCOL_VERSION_MAX;
+       pkt << (u16) proto_version_min << (u16) CLIENT_PROTOCOL_VERSION_MAX;
        pkt << playerName;
 
        Send(&pkt);
index 53059e8ada94608f88f39e8c6113d0b6ed6bc077..84098e3d5595b39d9349de3dd322ce3ffa21b1ee 100644 (file)
@@ -184,6 +184,8 @@ void set_default_settings(Settings *settings)
        settings->setDefault("minimap_shape_round", "true");
        settings->setDefault("minimap_double_scan_height", "true");
 
+       settings->setDefault("send_pre_v25_init", "true");
+
        settings->setDefault("curl_timeout", "5000");
        settings->setDefault("curl_parallel_limit", "8");
        settings->setDefault("curl_file_download_timeout", "300000");
index 7cde6d764b29989c45a06d4861f6436a5bce4bc7..177b97680e46b5f2641c1e82349b8e3d7c095b6c 100644 (file)
@@ -145,7 +145,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #define SERVER_PROTOCOL_VERSION_MAX LATEST_PROTOCOL_VERSION
 
 // Client's supported network protocol range
-#define CLIENT_PROTOCOL_VERSION_MIN 13
+// The minimal version depends on whether
+// send_pre_v25_init is enabled or not
+#define CLIENT_PROTOCOL_VERSION_MIN 25
+#define CLIENT_PROTOCOL_VERSION_MIN_LEGACY 13
 #define CLIENT_PROTOCOL_VERSION_MAX LATEST_PROTOCOL_VERSION
 
 // Constant that differentiates the protocol from random data and other protocols
index c924a5d9cca91bee4ab6c78f75a521aa0ee3e89d..7b29db159acf59b231f94b5dcfb01c96b8a2f6f5 100644 (file)
@@ -1095,7 +1095,9 @@ int ModApiMainMenu::l_get_screen_info(lua_State *L)
 /******************************************************************************/
 int ModApiMainMenu::l_get_min_supp_proto(lua_State *L)
 {
-       lua_pushinteger(L, CLIENT_PROTOCOL_VERSION_MIN);
+       u16 proto_version_min = g_settings->getFlag("send_pre_v25_init") ?
+               CLIENT_PROTOCOL_VERSION_MIN_LEGACY : CLIENT_PROTOCOL_VERSION_MIN;
+       lua_pushinteger(L, proto_version_min);
        return 1;
 }
 
index 6e79b55a4daa3d043a646134f9b650a14266b45d..de7962a6890af8ed8fd84f7ed4b9065b7cb7b31d 100644 (file)
@@ -69,8 +69,12 @@ std::vector<ServerListSpec> getLocal()
 std::vector<ServerListSpec> getOnline()
 {
        std::ostringstream geturl;
+
+       u16 proto_version_min = g_settings->getFlag("send_pre_v25_init") ?
+               CLIENT_PROTOCOL_VERSION_MIN_LEGACY : CLIENT_PROTOCOL_VERSION_MIN;
+
        geturl << g_settings->get("serverlist_url") <<
-               "/list?proto_version_min=" << CLIENT_PROTOCOL_VERSION_MIN <<
+               "/list?proto_version_min=" << proto_version_min <<
                "&proto_version_max=" << CLIENT_PROTOCOL_VERSION_MAX;
        Json::Value root = fetchJsonValue(geturl.str(), NULL);
 
index f115bc0110a4cff248225fcb9ec3c11d9f5d9148..0e0c3acc0e1ceb8458ff0457f6268989e685184c 100644 (file)
@@ -98,6 +98,8 @@ fake_function() {
        gettext("Address to connect to.\nLeave this blank to start a local server.\nNote that the address field in the main menu overrides this setting.");
        gettext("Remote port");
        gettext("Port to connect to (UDP).\nNote that the port field in the main menu overrides this setting.");
+       gettext("Support older servers");
+       gettext("Whether to support older servers before protocol version 25.\nEnable if you want to connect to 0.4.12 servers and before.\nServers starting with 0.4.13 will work, 0.4.12-dev servers may work.\nDisabling this option will protect your password better.");
        gettext("Saving map received from server");
        gettext("Save the map received by the client on disk.");
        gettext("Connect to external media server");