Client: disable pre v25 init sending by default 4461/head
authorest31 <MTest31@outlook.com>
Mon, 22 Aug 2016 02:27:44 +0000 (04:27 +0200)
committerest31 <MTest31@outlook.com>
Mon, 22 Aug 2016 18:23:28 +0000 (20:23 +0200)
Disable the ability to connect to old servers by default to
improve password security.

If people still want to connect to old (0.4.12 and earlier)
servers, they can flip the send_pre_v25_init setting.

Add the ability to detect if we've tried to connect
to a server which only supports the pre v25 init protocol,
and show an apropriate error message. Most times the error
will already be catched at the serverlist level, the
detection mechanism only acts as last resort, because the
"Connection timed out" error message that would be shown
otherwise would be very confusing.

Automatic "fixing" of this condition is not desired,
as it would allow for downgrade attacks.

As already 161 of the 167 servers on the serverlist
support the new srp based auth protocol (> 96%),
the breakage should be minimal.

Follow up of commit

af30183124d40a969040d7de4b3a487feec466e4 "Add option to not send pre v25 init packet"

Also change the pessimistic assumption of masterlist
server versions to optimistic, in order to avoid buggy
behaviour (favourites not in the serverlist would be
denied to connect to, etc).

builtin/mainmenu/common.lua
builtin/settingtypes.txt
minetest.conf.example
src/client.h
src/defaultsettings.cpp
src/game.cpp

index 1fd89ff7793533abb3225c08edc265d75d6c7bb3..da36678280fc484d3417811130fd908cabbb2306 100644 (file)
@@ -248,14 +248,18 @@ end
 
 --------------------------------------------------------------------------------
 function is_server_protocol_compat(server_proto_min, server_proto_max)
-       return min_supp_proto <= (server_proto_max or 24) and max_supp_proto >= (server_proto_min or 13)
+       if (not server_proto_min) or (not server_proto_max) then
+               -- There is no info. Assume the best and act as if we would be compatible.
+               return true
+       end
+       return min_supp_proto <= server_proto_max and max_supp_proto >= server_proto_min
 end
 --------------------------------------------------------------------------------
 function is_server_protocol_compat_or_error(server_proto_min, server_proto_max)
        if not is_server_protocol_compat(server_proto_min, server_proto_max) then
                local server_prot_ver_info, client_prot_ver_info
-               local s_p_min = server_proto_min or 13
-               local s_p_max = server_proto_max or 24
+               local s_p_min = server_proto_min
+               local s_p_max = server_proto_max
 
                if s_p_min ~= s_p_max then
                        server_prot_ver_info = fgettext_ne("Server supports protocol versions between $1 and $2. ",
index 864485ccef3863d1f8eca50fe4a95e33d0f999c6..4d354a7ef341c645c5236d844b61faf7a337b6b5 100644 (file)
@@ -247,7 +247,7 @@ remote_port (Remote port) int 30000 1 65535
 #    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
+send_pre_v25_init (Support older servers) bool false
 
 #    Save the map received by the client on disk.
 enable_local_map_saving (Saving map received from server) bool false
index 03a917a39fe1888ab34282b2ecf328b7b6ce25fe..48c54c320ef24f1f64ab73146e4b2d2489707537 100644 (file)
 #    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
+# send_pre_v25_init = false
 
 #    Save the map received by the client on disk.
 #    type: bool
 # profiler.default_report_format = txt
 
 #    The file path relative to your worldpath in which profiles will be saved to.
-#    
+#
 #    type: string
 # profiler.report_path = ""
 
index a7eb22ad945160d3cf451bc2afdd157eaca6e3b5..b479062a0cd8870a0268c3b18c5c27fee91a58f4 100644 (file)
@@ -499,6 +499,9 @@ public:
        u8 getProtoVersion()
        { return m_proto_ver; }
 
+       bool connectedToServer()
+       { return m_con.Connected(); }
+
        float mediaReceiveProgress();
 
        void afterContentReceived(IrrlichtDevice *device);
index 42b232afc8f6ac18bb4818352cc2f6ebd25740c2..7c6f7ef3d2bfbaf6b60e46281c494dd5c15c9573 100644 (file)
@@ -190,7 +190,7 @@ 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("send_pre_v25_init", "false");
 
        settings->setDefault("curl_timeout", "5000");
        settings->setDefault("curl_parallel_limit", "8");
index 1a036d03a7a45d15b5d869d1d2ce096d5d40c6da..5a3b108797f2ffd6c26fe224306f1a1ef366c8f6 100644 (file)
@@ -2403,7 +2403,26 @@ bool Game::connectToServer(const std::string &playername,
                        wait_time += dtime;
                        // Only time out if we aren't waiting for the server we started
                        if ((*address != "") && (wait_time > 10)) {
-                               *error_message = "Connection timed out.";
+                               bool sent_old_init = g_settings->getFlag("send_pre_v25_init");
+                               // If no pre v25 init was sent, and no answer was received,
+                               // but the low level connection could be established
+                               // (meaning that we have a peer id), then we probably wanted
+                               // to connect to a legacy server. In this case, tell the user
+                               // to enable the option to be able to connect.
+                               if (!sent_old_init &&
+                                               (client->getProtoVersion() == 0) &&
+                                               client->connectedToServer()) {
+                                       *error_message = "Connection failure: init packet not "
+                                       "recognized by server.\n"
+                                       "Most likely the server uses an old protocol version (<v25).\n"
+                                       "Please ask the server owner to update to 0.4.13 or later.\n"
+                                       "To still connect to the server in the meantime,\n"
+                                       "you can enable the 'send_pre_v25_init' setting by editing minetest.conf,\n"
+                                       "or by enabling the 'Client -> Network -> Support older Servers'\n"
+                                       "entry in the advanced settings menu.";
+                               } else {
+                                       *error_message = "Connection timed out.";
+                               }
                                errorstream << *error_message << std::endl;
                                break;
                        }