summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--builtin/mainmenu/common.lua11
-rw-r--r--builtin/mainmenu/tab_multiplayer.lua4
-rw-r--r--builtin/settingtypes.txt6
-rw-r--r--minetest.conf.example7
-rw-r--r--src/client.cpp54
-rw-r--r--src/defaultsettings.cpp2
-rw-r--r--src/network/networkprotocol.h5
-rw-r--r--src/script/lua_api/l_mainmenu.cpp4
-rw-r--r--src/serverlist.cpp6
-rw-r--r--src/settings_translation_file.cpp2
10 files changed, 74 insertions, 27 deletions
diff --git a/builtin/mainmenu/common.lua b/builtin/mainmenu/common.lua
index f40c787a2..b9a010e61 100644
--- a/builtin/mainmenu/common.lua
+++ b/builtin/mainmenu/common.lua
@@ -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 = ''
diff --git a/builtin/mainmenu/tab_multiplayer.lua b/builtin/mainmenu/tab_multiplayer.lua
index 570259718..2072f8c38 100644
--- a/builtin/mainmenu/tab_multiplayer.lua
+++ b/builtin/mainmenu/tab_multiplayer.lua
@@ -17,6 +17,10 @@
--------------------------------------------------------------------------------
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 =
diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt
index c1157b163..99106e00b 100644
--- a/builtin/settingtypes.txt
+++ b/builtin/settingtypes.txt
@@ -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
diff --git a/minetest.conf.example b/minetest.conf.example
index cd0be5296..6a9dc5ce3 100644
--- a/minetest.conf.example
+++ b/minetest.conf.example
@@ -242,6 +242,13 @@
# 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
diff --git a/src/client.cpp b/src/client.cpp
index 41468f0fd..2a8e02d6e 100644
--- a/src/client.cpp
+++ b/src/client.cpp
@@ -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);
diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp
index 53059e8ad..84098e3d5 100644
--- a/src/defaultsettings.cpp
+++ b/src/defaultsettings.cpp
@@ -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");
diff --git a/src/network/networkprotocol.h b/src/network/networkprotocol.h
index 7cde6d764..177b97680 100644
--- a/src/network/networkprotocol.h
+++ b/src/network/networkprotocol.h
@@ -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
diff --git a/src/script/lua_api/l_mainmenu.cpp b/src/script/lua_api/l_mainmenu.cpp
index c924a5d9c..7b29db159 100644
--- a/src/script/lua_api/l_mainmenu.cpp
+++ b/src/script/lua_api/l_mainmenu.cpp
@@ -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;
}
diff --git a/src/serverlist.cpp b/src/serverlist.cpp
index 6e79b55a4..de7962a68 100644
--- a/src/serverlist.cpp
+++ b/src/serverlist.cpp
@@ -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);
diff --git a/src/settings_translation_file.cpp b/src/settings_translation_file.cpp
index f115bc011..0e0c3acc0 100644
--- a/src/settings_translation_file.cpp
+++ b/src/settings_translation_file.cpp
@@ -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");