diff options
author | rubidium42 <rubidium@openttd.org> | 2021-05-24 12:13:54 +0200 |
---|---|---|
committer | rubidium42 <rubidium42@users.noreply.github.com> | 2021-05-29 10:07:30 +0200 |
commit | 4144e949edf3b14c2d478aa0fcba1996942a03fa (patch) | |
tree | b61dcacc1c7ac089d3cdf75b86fe88bb304d467e /src | |
parent | 08308d808c2ab3a6621762127eed6c46f16286c6 (diff) | |
download | openttd-4144e949edf3b14c2d478aa0fcba1996942a03fa.tar.xz |
Fix: [Network] Prevent an empty server name to be set anywhere
Diffstat (limited to 'src')
-rw-r--r-- | src/lang/english.txt | 1 | ||||
-rw-r--r-- | src/network/network.cpp | 25 | ||||
-rw-r--r-- | src/network/network_func.h | 1 | ||||
-rw-r--r-- | src/network/network_gui.cpp | 21 | ||||
-rw-r--r-- | src/table/settings.ini | 1 |
5 files changed, 36 insertions, 13 deletions
diff --git a/src/lang/english.txt b/src/lang/english.txt index db74c230b..4a92eba89 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -2204,6 +2204,7 @@ STR_NETWORK_ERROR_CLIENT_START :{WHITE}Could no STR_NETWORK_ERROR_TIMEOUT :{WHITE}Connection #{NUM} timed out STR_NETWORK_ERROR_SERVER_ERROR :{WHITE}A protocol error was detected and the connection was closed STR_NETWORK_ERROR_BAD_PLAYER_NAME :{WHITE}Your player name has not been set. The name can be set at the top of the Multiplayer window +STR_NETWORK_ERROR_BAD_SERVER_NAME :{WHITE}Your server name has not been set. The name can be set at the top of the Multiplayer window STR_NETWORK_ERROR_WRONG_REVISION :{WHITE}The revision of this client does not match the server's revision STR_NETWORK_ERROR_WRONG_PASSWORD :{WHITE}Wrong password STR_NETWORK_ERROR_SERVER_FULL :{WHITE}The server is full diff --git a/src/network/network.cpp b/src/network/network.cpp index 53ef645d7..94a5539f0 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -835,10 +835,6 @@ void NetworkClientJoinGame() static void NetworkInitGameInfo() { - if (_settings_client.network.server_name.empty()) { - _settings_client.network.server_name = "Unnamed Server"; - } - FillStaticNetworkServerGameInfo(); /* The server is a client too */ _network_game_info.clients_on = _network_dedicated ? 0 : 1; @@ -852,6 +848,25 @@ static void NetworkInitGameInfo() } /** + * Trim the given server name in place, i.e. remove leading and trailing spaces. + * After the trim check whether the server name is not empty. + * When the server name is empty a GUI error message is shown telling the + * user to set the servername and this function returns false. + * + * @param server_name The server name to validate. It will be trimmed of leading + * and trailing spaces. + * @return True iff the server name is valid. + */ +bool NetworkValidateServerName(std::string &server_name) +{ + StrTrimInPlace(server_name); + if (!server_name.empty()) return true; + + ShowErrorMessage(STR_NETWORK_ERROR_BAD_SERVER_NAME, INVALID_STRING_ID, WL_ERROR); + return false; +} + +/** * Check whether the client and server name are set, for a dedicated server and if not set them to some default * value and tell the user to change this as soon as possible. * If the saved name is the default value, then the user is told to override this value too. @@ -860,12 +875,14 @@ static void NetworkInitGameInfo() static void CheckClientAndServerName() { static const std::string fallback_client_name = "Unnamed Client"; + StrTrimInPlace(_settings_client.network.client_name); if (_settings_client.network.client_name.empty() || _settings_client.network.client_name.compare(fallback_client_name) == 0) { DEBUG(net, 1, "No \"client_name\" has been set, using \"%s\" instead. Please set this now using the \"name <new name>\" command", fallback_client_name.c_str()); _settings_client.network.client_name = fallback_client_name; } static const std::string fallback_server_name = "Unnamed Server"; + StrTrimInPlace(_settings_client.network.server_name); if (_settings_client.network.server_name.empty() || _settings_client.network.server_name.compare(fallback_server_name) == 0) { DEBUG(net, 1, "No \"server_name\" has been set, using \"%s\" instead. Please set this now using the \"server_name <new name>\" command", fallback_server_name.c_str()); _settings_client.network.server_name = fallback_server_name; diff --git a/src/network/network_func.h b/src/network/network_func.h index fbae8daf7..d30616fd0 100644 --- a/src/network/network_func.h +++ b/src/network/network_func.h @@ -38,6 +38,7 @@ byte NetworkSpectatorCount(); bool NetworkIsValidClientName(const std::string_view client_name); bool NetworkValidateClientName(); bool NetworkValidateClientName(std::string &client_name); +bool NetworkValidateServerName(std::string &server_name); void NetworkUpdateClientName(const std::string &client_name); bool NetworkCompanyHasClients(CompanyID company); std::string NetworkChangeCompanyPassword(CompanyID company_id, std::string password); diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index 6df77cd08..d06ff27be 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -1095,6 +1095,7 @@ struct NetworkStartServerWindow : public Window { break; case WID_NSS_GENERATE_GAME: // Start game + if (!CheckServerName()) return; _is_network_server = true; if (_ctrl_pressed) { StartNewGameWithoutGUI(GENERATE_NEW_SEED); @@ -1104,16 +1105,19 @@ struct NetworkStartServerWindow : public Window { break; case WID_NSS_LOAD_GAME: + if (!CheckServerName()) return; _is_network_server = true; ShowSaveLoadDialog(FT_SAVEGAME, SLO_LOAD); break; case WID_NSS_PLAY_SCENARIO: + if (!CheckServerName()) return; _is_network_server = true; ShowSaveLoadDialog(FT_SCENARIO, SLO_LOAD); break; case WID_NSS_PLAY_HEIGHTMAP: + if (!CheckServerName()) return; _is_network_server = true; ShowSaveLoadDialog(FT_HEIGHTMAP,SLO_LOAD); break; @@ -1133,11 +1137,13 @@ struct NetworkStartServerWindow : public Window { this->SetDirty(); } - void OnEditboxChanged(int wid) override + bool CheckServerName() { - if (wid == WID_NSS_GAMENAME) { - _settings_client.network.server_name = this->name_editbox.text.buf; - } + std::string str = this->name_editbox.text.buf; + if (!NetworkValidateServerName(str)) return false; + + SetSettingValue(GetSettingFromName("network.server_name")->AsStringSetting(), str); + return true; } void OnTimeout() override @@ -2199,16 +2205,13 @@ public: case WID_CL_SERVER_NAME_EDIT: { if (!_network_server) break; - SetSettingValue(GetSettingFromName("network.server_name")->AsStringSetting(), StrEmpty(str) ? "Unnamed Server" : str); + SetSettingValue(GetSettingFromName("network.server_name")->AsStringSetting(), str); this->InvalidateData(); break; } case WID_CL_CLIENT_NAME_EDIT: { - std::string client_name(str); - if (!NetworkValidateClientName(client_name)) break; - - SetSettingValue(GetSettingFromName("network.client_name")->AsStringSetting(), client_name); + SetSettingValue(GetSettingFromName("network.client_name")->AsStringSetting(), str); this->InvalidateData(); break; } diff --git a/src/table/settings.ini b/src/table/settings.ini index 2b6187087..6a2cb5b14 100644 --- a/src/table/settings.ini +++ b/src/table/settings.ini @@ -3959,6 +3959,7 @@ length = NETWORK_NAME_LENGTH flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC guiflags = SGF_NETWORK_ONLY def = nullptr +pre_cb = NetworkValidateServerName post_cb = [](auto) { UpdateClientConfigValues(); } cat = SC_BASIC |