Skip to content

Commit

Permalink
Client: disable pre v25 init sending by default
Browse files Browse the repository at this point in the history
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

af30183 "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).
  • Loading branch information
est31 committed Aug 22, 2016
1 parent 0b0075e commit d767f02
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 8 deletions.
10 changes: 7 additions & 3 deletions builtin/mainmenu/common.lua
Expand Up @@ -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. ",
Expand Down
2 changes: 1 addition & 1 deletion builtin/settingtypes.txt
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions minetest.conf.example
Expand Up @@ -261,7 +261,7 @@
# 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
Expand Down Expand Up @@ -1485,7 +1485,7 @@
# profiler.default_report_format = txt

# The file path relative to your worldpath in which profiles will be saved to.
#
#
# type: string
# profiler.report_path = ""

Expand Down
3 changes: 3 additions & 0 deletions src/client.h
Expand Up @@ -499,6 +499,9 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
u8 getProtoVersion()
{ return m_proto_ver; }

bool connectedToServer()
{ return m_con.Connected(); }

float mediaReceiveProgress();

void afterContentReceived(IrrlichtDevice *device);
Expand Down
2 changes: 1 addition & 1 deletion src/defaultsettings.cpp
Expand Up @@ -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");
Expand Down
21 changes: 20 additions & 1 deletion src/game.cpp
Expand Up @@ -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;
}
Expand Down

0 comments on commit d767f02

Please sign in to comment.