diff options
author | rubidium <rubidium@openttd.org> | 2011-01-19 16:47:40 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2011-01-19 16:47:40 +0000 |
commit | 795a5283289473185afdedb3133155101e84b0fe (patch) | |
tree | 00845d6c66a5a9289173acc4b7e1cb78eeb36c0d | |
parent | e54a1f67213218f52d8e27bce3aeda5d7dc16ad9 (diff) | |
download | openttd-795a5283289473185afdedb3133155101e84b0fe.tar.xz |
(svn r21854) -Codechange: refactor the password setting methods to make it possible to change the password of other companies (on the server)
-rw-r--r-- | src/company_cmd.cpp | 2 | ||||
-rw-r--r-- | src/console_cmds.cpp | 2 | ||||
-rw-r--r-- | src/network/network.cpp | 15 | ||||
-rw-r--r-- | src/network/network_client.cpp | 8 | ||||
-rw-r--r-- | src/network/network_func.h | 2 | ||||
-rw-r--r-- | src/network/network_gui.cpp | 2 | ||||
-rw-r--r-- | src/network/network_server.cpp | 29 | ||||
-rw-r--r-- | src/network/network_server.h | 2 | ||||
-rw-r--r-- | src/openttd.cpp | 2 |
9 files changed, 32 insertions, 32 deletions
diff --git a/src/company_cmd.cpp b/src/company_cmd.cpp index 9ae1b1dbb..a37ff677b 100644 --- a/src/company_cmd.cpp +++ b/src/company_cmd.cpp @@ -835,7 +835,7 @@ CommandCost CmdCompanyCtrl(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3 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 --git a/src/console_cmds.cpp b/src/console_cmds.cpp index e78ca1294..e13e9df20 100644 --- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -1530,7 +1530,7 @@ DEF_CONSOLE_CMD(ConCompanyPassword) 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"); diff --git a/src/network/network.cpp b/src/network/network.cpp index d29ac023c..0902fcdb0 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -151,18 +151,19 @@ byte NetworkSpectatorCount() } /** - * 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) { - NetworkClientSetCompanyPassword(password); + if (_network_server) { + NetworkServerSetCompanyPassword(company_id, password, already_hashed); } else { - HashCurrentCompanyPassword(password); + NetworkClientSetCompanyPassword(password); } return password; diff --git a/src/network/network_client.cpp b/src/network/network_client.cpp index 0f6606352..15ad3c6d9 100644 --- a/src/network/network_client.cpp +++ b/src/network/network_client.cpp @@ -278,9 +278,9 @@ ClientNetworkGameSocketHandler * ClientNetworkGameSocketHandler::my_client = NUL 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 @@ void NetworkClientSendChat(NetworkAction action, DestType type, int dest, const 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 --git a/src/network/network_func.h b/src/network/network_func.h index 29d924ae4..f50406140 100644 --- a/src/network/network_func.h +++ b/src/network/network_func.h @@ -36,7 +36,7 @@ extern StringList _network_ban_list; 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 --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index 6ec2f7b38..ccaf3661f 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -2311,7 +2311,7 @@ struct NetworkCompanyPasswordWindow : public QueryStringBaseWindow { 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 --git a/src/network/network_server.cpp b/src/network/network_server.cpp index 83352f702..fcfd89dde 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -1287,10 +1287,7 @@ DEF_GAME_RECEIVE_COMMAND(Server, PACKET_CLIENT_SET_PASSWORD) 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 @@ bool NetworkServerChangeClientName(ClientID client_id, const char *new_name) } /** - * 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]; - - password_game_seed = _settings_game.game_creation.generation_seed; - strecpy(password_server_id, _settings_client.network.network_id, lastof(password_server_id)); + if (!Company::IsValidHumanID(company_id)) return; - 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)); + if (!already_hashed) { + password = GenerateCompanyPasswordHash(password, _settings_client.network.network_id, _settings_game.game_creation.generation_seed); } + + 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 --git a/src/network/network_server.h b/src/network/network_server.h index cd087478b..1ea273ffa 100644 --- a/src/network/network_server.h +++ b/src/network/network_server.h @@ -118,7 +118,7 @@ public: }; 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 --git a/src/openttd.cpp b/src/openttd.cpp index 2d9a581d6..0b4cf20db 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -823,7 +823,7 @@ static void MakeNewGameDone() /* 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 */ |