diff -r bfd5ac99ffcf -r 23ae16737f75 src/company_cmd.cpp --- a/src/company_cmd.cpp Wed Jan 19 00:47:42 2011 +0100 +++ b/src/company_cmd.cpp Wed Jan 19 00:50:56 2011 +0100 @@ -830,7 +830,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 diff -r bfd5ac99ffcf -r 23ae16737f75 src/network/network.cpp --- a/src/network/network.cpp Wed Jan 19 00:47:42 2011 +0100 +++ b/src/network/network.cpp Wed Jan 19 00:50:56 2011 +0100 @@ -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; diff -r bfd5ac99ffcf -r 23ae16737f75 src/network/network_client.cpp --- a/src/network/network_client.cpp Wed Jan 19 00:47:42 2011 +0100 +++ b/src/network/network_client.cpp Wed Jan 19 00:50:56 2011 +0100 @@ -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); diff -r bfd5ac99ffcf -r 23ae16737f75 src/network/network_func.h --- a/src/network/network_func.h Wed Jan 19 00:47:42 2011 +0100 +++ b/src/network/network_func.h Wed Jan 19 00:50:56 2011 +0100 @@ -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(); diff -r bfd5ac99ffcf -r 23ae16737f75 src/network/network_gui.cpp --- a/src/network/network_gui.cpp Wed Jan 19 00:47:42 2011 +0100 +++ b/src/network/network_gui.cpp Wed Jan 19 00:50:56 2011 +0100 @@ -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() diff -r bfd5ac99ffcf -r 23ae16737f75 src/network/network_server.cpp --- a/src/network/network_server.cpp Wed Jan 19 00:47:42 2011 +0100 +++ b/src/network/network_server.cpp Wed Jan 19 00:50:56 2011 +0100 @@ -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 */ diff -r bfd5ac99ffcf -r 23ae16737f75 src/network/network_server.h --- a/src/network/network_server.h Wed Jan 19 00:47:42 2011 +0100 +++ b/src/network/network_server.h Wed Jan 19 00:50:56 2011 +0100 @@ -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) diff -r bfd5ac99ffcf -r 23ae16737f75 src/openttd.cpp --- a/src/openttd.cpp Wed Jan 19 00:47:42 2011 +0100 +++ b/src/openttd.cpp Wed Jan 19 00:50:56 2011 +0100 @@ -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 */