Mercurial > hg > openttd
changeset 17117:a6550c45bdb2 draft
(svn r21854) -Codechange: refactor the password setting methods to make it possible to change the password of other companies (on the server)
author | rubidium <rubidium@openttd.org> |
---|---|
date | Wed, 19 Jan 2011 16:47:40 +0000 |
parents | 9148abb72809 |
children | fd7c1739ca1a |
files | src/company_cmd.cpp src/console_cmds.cpp src/network/network.cpp src/network/network_client.cpp src/network/network_func.h src/network/network_gui.cpp src/network/network_server.cpp src/network/network_server.h src/openttd.cpp |
diffstat | 9 files changed, 32 insertions(+), 32 deletions(-) [+] |
line wrap: on
line diff
--- a/src/company_cmd.cpp +++ b/src/company_cmd.cpp @@ -835,7 +835,7 @@ assert(_local_company == COMPANY_SPECTATOR); SetLocalCompany(c->index); if (!StrEmpty(_settings_client.network.default_company_pass)) { - NetworkChangeCompanyPassword(_settings_client.network.default_company_pass); + NetworkChangeCompanyPassword(_local_company, _settings_client.network.default_company_pass); } /* Now that we have a new company, broadcast our company settings to
--- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -1530,7 +1530,7 @@ return false; } - const char *password = NetworkChangeCompanyPassword(argv[1]); + const char *password = NetworkChangeCompanyPassword(_local_company, argv[1], false); if (StrEmpty(password)) { IConsolePrintF(CC_WARNING, "Company password cleared");
--- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -151,18 +151,19 @@ } /** - * Sets/resets company password - * @param password new password, "" or "*" resets password - * @return new password + * Change the company password of a given company. + * @param company_id ID of the company the password should be changed for. + * @param password The unhashed password we like to set ('*' or '' resets the password) + * @return The password. */ -const char *NetworkChangeCompanyPassword(const char *password) +const char *NetworkChangeCompanyPassword(CompanyID company_id, const char *password, bool already_hashed) { if (strcmp(password, "*") == 0) password = ""; - if (!_network_server) { + if (_network_server) { + NetworkServerSetCompanyPassword(company_id, password, already_hashed); + } else { NetworkClientSetCompanyPassword(password); - } else { - HashCurrentCompanyPassword(password); } return password;
--- a/src/network/network_client.cpp +++ b/src/network/network_client.cpp @@ -278,9 +278,9 @@ static uint32 last_ack_frame; /** One bit of 'entropy' used to generate a salt for the company passwords. */ -uint32 _password_game_seed; +static uint32 _password_game_seed; /** The other bit of 'entropy' used to generate a salt for the company passwords. */ -char _password_server_id[NETWORK_SERVER_ID_LENGTH]; +static char _password_server_id[NETWORK_SERVER_ID_LENGTH]; /** Maximum number of companies of the currently joined server. */ static uint8 _network_server_max_companies; @@ -1178,6 +1178,10 @@ MyClient::SendChat(action, type, dest, msg, data); } +/** + * Set/Reset company password on the client side. + * @param password Password to be set. + */ void NetworkClientSetCompanyPassword(const char *password) { MyClient::SendSetPassword(password);
--- a/src/network/network_func.h +++ b/src/network/network_func.h @@ -36,7 +36,7 @@ byte NetworkSpectatorCount(); void NetworkUpdateClientName(); bool NetworkCompanyHasClients(CompanyID company); -const char *NetworkChangeCompanyPassword(const char *); +const char *NetworkChangeCompanyPassword(CompanyID company_id, const char *password, bool already_hashed = true); void NetworkReboot(); void NetworkDisconnect(bool blocking = false, bool close_admins = true); void NetworkGameLoop();
--- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -2311,7 +2311,7 @@ snprintf(_settings_client.network.default_company_pass, lengthof(_settings_client.network.default_company_pass), "%s", this->edit_str_buf); } - NetworkChangeCompanyPassword(this->edit_str_buf); + NetworkChangeCompanyPassword(_local_company, this->edit_str_buf); } virtual void OnPaint()
--- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -1287,10 +1287,7 @@ p->Recv_string(password, sizeof(password)); ci = this->GetInfo(); - if (Company::IsValidID(ci->client_playas)) { - strecpy(_network_company_states[ci->client_playas].password, password, lastof(_network_company_states[ci->client_playas].password)); - NetworkServerUpdateCompanyPassworded(ci->client_playas, !StrEmpty(_network_company_states[ci->client_playas].password)); - } + NetworkServerSetCompanyPassword(ci->client_playas, password); return NETWORK_RECV_STATUS_OKAY; } @@ -1630,23 +1627,21 @@ } /** - * Hash the current company password; used when the server 'company' sets his/her password. - * @param password The password to hash. + * Set/Reset a company password on the server end. + * @param company_id ID of the company the password should be changed for. + * @param password The new password. + * @param already_hashed Is the given password already hashed? */ -void HashCurrentCompanyPassword(const char *password) +void NetworkServerSetCompanyPassword(CompanyID company_id, const char *password, bool already_hashed) { - uint32 password_game_seed; - char password_server_id[NETWORK_SERVER_ID_LENGTH]; + if (!Company::IsValidHumanID(company_id)) return; - password_game_seed = _settings_game.game_creation.generation_seed; - strecpy(password_server_id, _settings_client.network.network_id, lastof(password_server_id)); + if (!already_hashed) { + password = GenerateCompanyPasswordHash(password, _settings_client.network.network_id, _settings_game.game_creation.generation_seed); + } - const char *new_pw = GenerateCompanyPasswordHash(password, password_server_id, password_game_seed); - strecpy(_network_company_states[_local_company].password, new_pw, lastof(_network_company_states[_local_company].password)); - - if (_network_server) { - NetworkServerUpdateCompanyPassworded(_local_company, !StrEmpty(_network_company_states[_local_company].password)); - } + strecpy(_network_company_states[company_id].password, password, lastof(_network_company_states[company_id].password)); + NetworkServerUpdateCompanyPassworded(company_id, !StrEmpty(_network_company_states[company_id].password)); } /* Handle the local command-queue */
--- a/src/network/network_server.h +++ b/src/network/network_server.h @@ -118,7 +118,7 @@ }; void NetworkServer_Tick(bool send_frame); -void HashCurrentCompanyPassword(const char *password); +void NetworkServerSetCompanyPassword(CompanyID company_id, const char *password, bool already_hashed = true); #define FOR_ALL_CLIENT_SOCKETS_FROM(var, start) FOR_ALL_ITEMS_FROM(NetworkClientSocket, clientsocket_index, var, start) #define FOR_ALL_CLIENT_SOCKETS(var) FOR_ALL_CLIENT_SOCKETS_FROM(var, 0)
--- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -823,7 +823,7 @@ /* We are the server, we start a new company (not dedicated), * so set the default password *if* needed. */ if (_network_server && !StrEmpty(_settings_client.network.default_company_pass)) { - NetworkChangeCompanyPassword(_settings_client.network.default_company_pass); + NetworkChangeCompanyPassword(_local_company, _settings_client.network.default_company_pass); } #endif /* ENABLE_NETWORK */