diff options
Diffstat (limited to 'src/network/network_server.cpp')
-rw-r--r-- | src/network/network_server.cpp | 100 |
1 files changed, 62 insertions, 38 deletions
diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index 127ac1b90..8fc37bb1b 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -209,22 +209,39 @@ DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_CHECK_NEWGRFS)(NetworkClientSocket * return NETWORK_RECV_STATUS_OKAY; } -DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_NEED_PASSWORD)(NetworkClientSocket *cs, NetworkPasswordType type) +DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_NEED_GAME_PASSWORD)(NetworkClientSocket *cs) { /* - * Packet: SERVER_NEED_PASSWORD - * Function: Indication to the client that the server needs a password + * Packet: PACKET_SERVER_NEED_GAME_PASSWORD + * Function: Indication to the client that the server needs a game password + */ + + /* Invalid packet when status is STATUS_AUTH_GAME or higher */ + if (cs->status >= STATUS_AUTH_GAME) return NetworkCloseClient(cs, NETWORK_RECV_STATUS_MALFORMED_PACKET); + + cs->status = STATUS_AUTH_GAME; + + Packet *p = new Packet(PACKET_SERVER_NEED_GAME_PASSWORD); + cs->Send_Packet(p); + return NETWORK_RECV_STATUS_OKAY; +} + +DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_NEED_COMPANY_PASSWORD)(NetworkClientSocket *cs) +{ + /* + * Packet: PACKET_SERVER_NEED_COMPANY_PASSWORD + * Function: Indication to the client that the server needs a company password * Data: - * uint8: Type of password + * uint32: Generation seed + * string: Network ID of the server */ - /* Invalid packet when status is AUTH or higher */ - if (cs->status >= STATUS_AUTH) return NetworkCloseClient(cs, NETWORK_RECV_STATUS_MALFORMED_PACKET); + /* Invalid packet when status is STATUS_AUTH_COMPANY or higher */ + if (cs->status >= STATUS_AUTH_COMPANY) return NetworkCloseClient(cs, NETWORK_RECV_STATUS_MALFORMED_PACKET); - cs->status = STATUS_AUTHORIZING; + cs->status = STATUS_AUTH_COMPANY; - Packet *p = new Packet(PACKET_SERVER_NEED_PASSWORD); - p->Send_uint8(type); + Packet *p = new Packet(PACKET_SERVER_NEED_COMPANY_PASSWORD); p->Send_uint32(_settings_game.game_creation.generation_seed); p->Send_string(_settings_client.network.network_id); cs->Send_Packet(p); @@ -647,11 +664,11 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_NEWGRFS_CHECKED) /* We now want a password from the client else we do not allow him in! */ if (!StrEmpty(_settings_client.network.server_password)) { - return SEND_COMMAND(PACKET_SERVER_NEED_PASSWORD)(cs, NETWORK_GAME_PASSWORD); + return SEND_COMMAND(PACKET_SERVER_NEED_GAME_PASSWORD)(cs); } if (Company::IsValidID(ci->client_playas) && !StrEmpty(_network_company_states[ci->client_playas].password)) { - return SEND_COMMAND(PACKET_SERVER_NEED_PASSWORD)(cs, NETWORK_COMPANY_PASSWORD); + return SEND_COMMAND(PACKET_SERVER_NEED_COMPANY_PASSWORD)(cs); } return SEND_COMMAND(PACKET_SERVER_WELCOME)(cs); @@ -728,42 +745,47 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_JOIN) return SEND_COMMAND(PACKET_SERVER_CHECK_NEWGRFS)(cs); } -DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_PASSWORD) +DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_GAME_PASSWORD) { - NetworkPasswordType type; - char password[NETWORK_PASSWORD_LENGTH]; - const NetworkClientInfo *ci; + if (cs->status != STATUS_AUTH_GAME) { + return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NOT_EXPECTED); + } - type = (NetworkPasswordType)p->Recv_uint8(); + char password[NETWORK_PASSWORD_LENGTH]; p->Recv_string(password, sizeof(password)); - if (cs->status == STATUS_AUTHORIZING && type == NETWORK_GAME_PASSWORD) { - /* Check game-password */ - if (strcmp(password, _settings_client.network.server_password) != 0) { - /* Password is invalid */ - return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_WRONG_PASSWORD); - } + /* Check game password */ + if (strcmp(password, _settings_client.network.server_password) != 0) { + /* Password is invalid */ + return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_WRONG_PASSWORD); + } - ci = cs->GetInfo(); + const NetworkClientInfo *ci = cs->GetInfo(); + if (Company::IsValidID(ci->client_playas) && !StrEmpty(_network_company_states[ci->client_playas].password)) { + return SEND_COMMAND(PACKET_SERVER_NEED_COMPANY_PASSWORD)(cs); + } - if (Company::IsValidID(ci->client_playas) && !StrEmpty(_network_company_states[ci->client_playas].password)) { - return SEND_COMMAND(PACKET_SERVER_NEED_PASSWORD)(cs, NETWORK_COMPANY_PASSWORD); - } + /* Valid password, allow user */ + return SEND_COMMAND(PACKET_SERVER_WELCOME)(cs); +} - /* Valid password, allow user */ - return SEND_COMMAND(PACKET_SERVER_WELCOME)(cs); - } else if (cs->status == STATUS_AUTHORIZING && type == NETWORK_COMPANY_PASSWORD) { - ci = cs->GetInfo(); +DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_COMPANY_PASSWORD) +{ + if (cs->status != STATUS_AUTH_COMPANY) { + return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NOT_EXPECTED); + } - if (strcmp(password, _network_company_states[ci->client_playas].password) != 0) { - /* Password is invalid */ - return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_WRONG_PASSWORD); - } + char password[NETWORK_PASSWORD_LENGTH]; + p->Recv_string(password, sizeof(password)); - return SEND_COMMAND(PACKET_SERVER_WELCOME)(cs); + /* Check company password */ + const NetworkClientInfo *ci = cs->GetInfo(); + if (strcmp(password, _network_company_states[ci->client_playas].password) != 0) { + /* Password is invalid */ + return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_WRONG_PASSWORD); } - return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NOT_EXPECTED); + return SEND_COMMAND(PACKET_SERVER_WELCOME)(cs); } DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_GETMAP) @@ -1271,8 +1293,10 @@ static NetworkServerPacket * const _network_server_packet[] = { RECEIVE_COMMAND(PACKET_CLIENT_COMPANY_INFO), NULL, // PACKET_SERVER_COMPANY_INFO, NULL, // PACKET_SERVER_CLIENT_INFO, - NULL, // PACKET_SERVER_NEED_PASSWORD, - RECEIVE_COMMAND(PACKET_CLIENT_PASSWORD), + NULL, // PACKET_SERVER_NEED_GAME_PASSWORD, + NULL, // PACKET_SERVER_NEED_COMPANY_PASSWORD, + RECEIVE_COMMAND(PACKET_CLIENT_GAME_PASSWORD), + RECEIVE_COMMAND(PACKET_CLIENT_COMPANY_PASSWORD), NULL, // PACKET_SERVER_WELCOME, RECEIVE_COMMAND(PACKET_CLIENT_GETMAP), NULL, // PACKET_SERVER_WAIT, |