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 */