Changeset - r25235:b3850f08e2b1
[Not reviewed]
master
0 5 0
rubidium42 - 3 years ago 2021-04-22 06:17:36
rubidium@openttd.org
Add: [Network] Validate the client name server side, so no clients with invalid names can actually join
5 files changed with 38 insertions and 22 deletions:
0 comments (0 inline, 0 general)
src/lang/english.txt
Show inline comments
 
@@ -2188,6 +2188,7 @@ STR_NETWORK_ERROR_TIMEOUT_PASSWORD      
 
STR_NETWORK_ERROR_TIMEOUT_COMPUTER                              :{WHITE}Your computer is too slow to keep up with the server
 
STR_NETWORK_ERROR_TIMEOUT_MAP                                   :{WHITE}Your computer took too long to download the map
 
STR_NETWORK_ERROR_TIMEOUT_JOIN                                  :{WHITE}Your computer took too long to join the server
 
STR_NETWORK_ERROR_INVALID_CLIENT_NAME                           :{WHITE}Your player name is not valid
 

	
 
############ Leave those lines in this order!!
 
STR_NETWORK_ERROR_CLIENT_GENERAL                                :general error
 
@@ -2210,6 +2211,7 @@ STR_NETWORK_ERROR_CLIENT_TIMEOUT_PASSWOR
 
STR_NETWORK_ERROR_CLIENT_TIMEOUT_COMPUTER                       :general timeout
 
STR_NETWORK_ERROR_CLIENT_TIMEOUT_MAP                            :downloading map took too long
 
STR_NETWORK_ERROR_CLIENT_TIMEOUT_JOIN                           :processing map took too long
 
STR_NETWORK_ERROR_CLIENT_INVALID_CLIENT_NAME                    :invalid client name
 
############ End of leave-in-this-order
 

	
 
STR_NETWORK_ERROR_CLIENT_GUI_LOST_CONNECTION_CAPTION            :{WHITE}Possible connection loss
src/network/network.cpp
Show inline comments
 
@@ -314,6 +314,7 @@ StringID GetNetworkErrorMsg(NetworkError
 
		STR_NETWORK_ERROR_CLIENT_TIMEOUT_COMPUTER,
 
		STR_NETWORK_ERROR_CLIENT_TIMEOUT_MAP,
 
		STR_NETWORK_ERROR_CLIENT_TIMEOUT_JOIN,
 
		STR_NETWORK_ERROR_CLIENT_INVALID_CLIENT_NAME,
 
	};
 
	static_assert(lengthof(network_error_strings) == NETWORK_ERROR_END);
 

	
src/network/network_client.cpp
Show inline comments
 
@@ -668,26 +668,27 @@ NetworkRecvStatus ClientNetworkGameSocke
 
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR(Packet *p)
 
{
 
	static const StringID network_error_strings[] = {
 
		STR_NETWORK_ERROR_LOSTCONNECTION,    // NETWORK_ERROR_GENERAL
 
		STR_NETWORK_ERROR_LOSTCONNECTION,    // NETWORK_ERROR_DESYNC
 
		STR_NETWORK_ERROR_LOSTCONNECTION,    // NETWORK_ERROR_SAVEGAME_FAILED
 
		STR_NETWORK_ERROR_LOSTCONNECTION,    // NETWORK_ERROR_CONNECTION_LOST
 
		STR_NETWORK_ERROR_LOSTCONNECTION,    // NETWORK_ERROR_ILLEGAL_PACKET
 
		STR_NETWORK_ERROR_LOSTCONNECTION,    // NETWORK_ERROR_NEWGRF_MISMATCH
 
		STR_NETWORK_ERROR_SERVER_ERROR,      // NETWORK_ERROR_NOT_AUTHORIZED
 
		STR_NETWORK_ERROR_SERVER_ERROR,      // NETWORK_ERROR_NOT_EXPECTED
 
		STR_NETWORK_ERROR_WRONG_REVISION,    // NETWORK_ERROR_WRONG_REVISION
 
		STR_NETWORK_ERROR_LOSTCONNECTION,    // NETWORK_ERROR_NAME_IN_USE
 
		STR_NETWORK_ERROR_WRONG_PASSWORD,    // NETWORK_ERROR_WRONG_PASSWORD
 
		STR_NETWORK_ERROR_SERVER_ERROR,      // NETWORK_ERROR_COMPANY_MISMATCH
 
		STR_NETWORK_ERROR_KICKED,            // NETWORK_ERROR_KICKED
 
		STR_NETWORK_ERROR_CHEATER,           // NETWORK_ERROR_CHEATER
 
		STR_NETWORK_ERROR_SERVER_FULL,       // NETWORK_ERROR_FULL
 
		STR_NETWORK_ERROR_TOO_MANY_COMMANDS, // NETWORK_ERROR_TOO_MANY_COMMANDS
 
		STR_NETWORK_ERROR_TIMEOUT_PASSWORD,  // NETWORK_ERROR_TIMEOUT_PASSWORD
 
		STR_NETWORK_ERROR_TIMEOUT_COMPUTER,  // NETWORK_ERROR_TIMEOUT_COMPUTER
 
		STR_NETWORK_ERROR_TIMEOUT_MAP,       // NETWORK_ERROR_TIMEOUT_MAP
 
		STR_NETWORK_ERROR_TIMEOUT_JOIN,      // NETWORK_ERROR_TIMEOUT_JOIN
 
		STR_NETWORK_ERROR_LOSTCONNECTION,      // NETWORK_ERROR_GENERAL
 
		STR_NETWORK_ERROR_LOSTCONNECTION,      // NETWORK_ERROR_DESYNC
 
		STR_NETWORK_ERROR_LOSTCONNECTION,      // NETWORK_ERROR_SAVEGAME_FAILED
 
		STR_NETWORK_ERROR_LOSTCONNECTION,      // NETWORK_ERROR_CONNECTION_LOST
 
		STR_NETWORK_ERROR_LOSTCONNECTION,      // NETWORK_ERROR_ILLEGAL_PACKET
 
		STR_NETWORK_ERROR_LOSTCONNECTION,      // NETWORK_ERROR_NEWGRF_MISMATCH
 
		STR_NETWORK_ERROR_SERVER_ERROR,        // NETWORK_ERROR_NOT_AUTHORIZED
 
		STR_NETWORK_ERROR_SERVER_ERROR,        // NETWORK_ERROR_NOT_EXPECTED
 
		STR_NETWORK_ERROR_WRONG_REVISION,      // NETWORK_ERROR_WRONG_REVISION
 
		STR_NETWORK_ERROR_LOSTCONNECTION,      // NETWORK_ERROR_NAME_IN_USE
 
		STR_NETWORK_ERROR_WRONG_PASSWORD,      // NETWORK_ERROR_WRONG_PASSWORD
 
		STR_NETWORK_ERROR_SERVER_ERROR,        // NETWORK_ERROR_COMPANY_MISMATCH
 
		STR_NETWORK_ERROR_KICKED,              // NETWORK_ERROR_KICKED
 
		STR_NETWORK_ERROR_CHEATER,             // NETWORK_ERROR_CHEATER
 
		STR_NETWORK_ERROR_SERVER_FULL,         // NETWORK_ERROR_FULL
 
		STR_NETWORK_ERROR_TOO_MANY_COMMANDS,   // NETWORK_ERROR_TOO_MANY_COMMANDS
 
		STR_NETWORK_ERROR_TIMEOUT_PASSWORD,    // NETWORK_ERROR_TIMEOUT_PASSWORD
 
		STR_NETWORK_ERROR_TIMEOUT_COMPUTER,    // NETWORK_ERROR_TIMEOUT_COMPUTER
 
		STR_NETWORK_ERROR_TIMEOUT_MAP,         // NETWORK_ERROR_TIMEOUT_MAP
 
		STR_NETWORK_ERROR_TIMEOUT_JOIN,        // NETWORK_ERROR_TIMEOUT_JOIN
 
		STR_NETWORK_ERROR_INVALID_CLIENT_NAME, // NETWORK_ERROR_INVALID_CLIENT_NAME
 
	};
 
	static_assert(lengthof(network_error_strings) == NETWORK_ERROR_END);
 

	
src/network/network_server.cpp
Show inline comments
 
@@ -945,8 +945,12 @@ NetworkRecvStatus ServerNetworkGameSocke
 
			break;
 
	}
 

	
 
	/* We need a valid name.. make it Player */
 
	if (!NetworkIsValidClientName(name)) strecpy(name, "Player", lastof(name));
 
	if (!NetworkIsValidClientName(name)) {
 
		/* An invalid client name was given. However, the client ensures the name
 
		 * is valid before it is sent over the network, so something went horribly
 
		 * wrong. This is probably someone trying to troll us. */
 
		return this->SendError(NETWORK_ERROR_INVALID_CLIENT_NAME);
 
	}
 

	
 
	if (!NetworkFindName(name, lastof(name))) { // Change name if duplicate
 
		/* We could not create a name for this client */
 
@@ -1441,6 +1445,13 @@ NetworkRecvStatus ServerNetworkGameSocke
 
	if (this->HasClientQuit()) return NETWORK_RECV_STATUS_CONN_LOST;
 

	
 
	if (ci != nullptr) {
 
		if (!NetworkIsValidClientName(client_name)) {
 
			/* An invalid client name was given. However, the client ensures the name
 
			 * is valid before it is sent over the network, so something went horribly
 
			 * wrong. This is probably someone trying to troll us. */
 
			return this->SendError(NETWORK_ERROR_INVALID_CLIENT_NAME);
 
		}
 

	
 
		/* Display change */
 
		if (NetworkFindName(client_name, lastof(client_name))) {
 
			NetworkTextMessage(NETWORK_ACTION_NAME_CHANGE, CC_DEFAULT, false, ci->client_name, client_name);
src/network/network_type.h
Show inline comments
 
@@ -132,6 +132,7 @@ enum NetworkErrorCode {
 
	NETWORK_ERROR_TIMEOUT_COMPUTER,
 
	NETWORK_ERROR_TIMEOUT_MAP,
 
	NETWORK_ERROR_TIMEOUT_JOIN,
 
	NETWORK_ERROR_INVALID_CLIENT_NAME,
 

	
 
	NETWORK_ERROR_END,
 
};
0 comments (0 inline, 0 general)