From b14f4121170cb75aba785efc9e73a364c232301b Mon Sep 17 00:00:00 2001 From: rubidium42 Date: Thu, 22 Apr 2021 07:01:46 +0200 Subject: Codechange: [Network] Introduce function to validate the client name --- src/network/network_client.cpp | 14 ++++++++++++++ src/network/network_func.h | 1 + src/network/network_gui.cpp | 3 +-- src/network/network_server.cpp | 2 +- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/network/network_client.cpp b/src/network/network_client.cpp index 5858859cb..a12215bbc 100644 --- a/src/network/network_client.cpp +++ b/src/network/network_client.cpp @@ -1250,6 +1250,20 @@ void NetworkClientsToSpectators(CompanyID cid) cur_company.Restore(); } +/** + * Check whether the given client name is deemed valid for use in network games. + * An empty name (null or '') is not valid as that is essentially no name at all. + * A name starting with white space is not valid for tab completion purposes. + * @param client_name The client name to check for validity. + * @return True iff the name is valid. + */ +bool NetworkIsValidClientName(const char *client_name) +{ + if (StrEmpty(client_name)) return false; + if (*client_name == ' ') return false; + return true; +} + /** * Send the server our name. */ diff --git a/src/network/network_func.h b/src/network/network_func.h index d14dd290f..a7f2e7cb5 100644 --- a/src/network/network_func.h +++ b/src/network/network_func.h @@ -36,6 +36,7 @@ extern StringList _network_host_list; extern StringList _network_ban_list; byte NetworkSpectatorCount(); +bool NetworkIsValidClientName(const char *client_name); void NetworkUpdateClientName(); bool NetworkCompanyHasClients(CompanyID company); const char *NetworkChangeCompanyPassword(CompanyID company_id, const char *password); diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index 1c80f7f3c..15cf24f49 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -808,8 +808,7 @@ public: } case WID_NG_CLIENT: - /* Make sure the name does not start with a space, so TAB completion works */ - if (!StrEmpty(this->name_editbox.text.buf) && this->name_editbox.text.buf[0] != ' ') { + if (NetworkIsValidClientName(this->name_editbox.text.buf)) { strecpy(_settings_client.network.client_name, this->name_editbox.text.buf, lastof(_settings_client.network.client_name)); } else { strecpy(_settings_client.network.client_name, "Player", lastof(_settings_client.network.client_name)); diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index 552171027..321c8aa09 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -946,7 +946,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet *p) } /* We need a valid name.. make it Player */ - if (StrEmpty(name)) strecpy(name, "Player", lastof(name)); + if (!NetworkIsValidClientName(name)) strecpy(name, "Player", lastof(name)); if (!NetworkFindName(name, lastof(name))) { // Change name if duplicate /* We could not create a name for this client */ -- cgit v1.2.3-70-g09d2