From 553e1bdf0f0b99750e8ca03c58968e1f8bcf71c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Sat, 21 May 2016 19:26:53 +0200 Subject: [PATCH] Minor fixes to authorisation system --- data/language/en-GB.txt | 1 + src/localisation/string_ids.h | 2 ++ src/network/network.cpp | 15 +++++++++++---- src/network/network.h | 1 + 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index 256acb579c..ae01d03731 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -4168,6 +4168,7 @@ STR_5857 :{SMALLFONT}{BLACK}Game options STR_5858 :{SMALLFONT}{BLACK}Use GPU for displaying instead of CPU. Improves compatibility with screen capture software. May slightly decrease performance. STR_5859 :{SMALLFONT}{BLACK}Enables frame tweening for visually{NEWLINE}smoother gameplay. When disabled,{NEWLINE}the game will run at 40 FPS. STR_5860 :Toggle original/decompiled track drawing +STR_5861 :Key verification failure. ############# # Scenarios # diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 636b2a822e..2500a17ab4 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2632,6 +2632,8 @@ enum { STR_TRACK_LIST_NAME_FORMAT = 5813, STR_TRACK_PREVIEW_NAME_FORMAT = 5814, + STR_MULTIPLAYER_VERIFICATION_FAILURE = 5861, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/network/network.cpp b/src/network/network.cpp index 42a86b7c1c..39165ae846 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -714,7 +714,7 @@ bool Network::BeginClient(const char* host, unsigned short port) safe_strcat(keyPath, gConfigNetwork.player_name, MAX_PATH); safe_strcat(keyPath, ".privkey", MAX_PATH); if (!platform_file_exists(keyPath)) { - log_warning("generating key… this may take a while"); + log_warning("generating key... this may take a while"); key.Generate(); log_verbose("Key generated, saving private bits as %s", keyPath); SDL_RWops *privkey = SDL_RWFromFile(keyPath, "wb+"); @@ -1909,6 +1909,10 @@ void Network::Client_Handle_AUTH(NetworkConnection& connection, NetworkPacket& p connection.setLastDisconnectReason(STR_MULTIPLAYER_BAD_PASSWORD); shutdown(connection.socket, SHUT_RDWR); break; + case NETWORK_AUTH_VERIFICATIONFAILURE: + connection.setLastDisconnectReason(STR_MULTIPLAYER_VERIFICATION_FAILURE); + shutdown(connection.socket, SHUT_RDWR); + break; case NETWORK_AUTH_FULL: connection.setLastDisconnectReason(STR_MULTIPLAYER_SERVER_FULL); shutdown(connection.socket, SHUT_RDWR); @@ -1953,7 +1957,7 @@ void Network::Server_Handle_AUTH(NetworkConnection& connection, NetworkPacket& p uint32 sigsize; packet >> sigsize; if (pubkey == nullptr) { - connection.authstatus = NETWORK_AUTH_BADPASSWORD; + connection.authstatus = NETWORK_AUTH_VERIFICATIONFAILURE; } else { const char *signature = (const char *)packet.Read(sigsize); SDL_RWops *pubkey_rw = SDL_RWFromConstMem(pubkey, strlen(pubkey)); @@ -1965,6 +1969,7 @@ void Network::Server_Handle_AUTH(NetworkConnection& connection, NetworkPacket& p const std::string hash = connection.key.PublicKeyHash(); log_verbose("Signature verification ok. Hash %s", hash.c_str()); } else { + connection.authstatus = NETWORK_AUTH_VERIFICATIONFAILURE; log_verbose("Signature verification failed!"); } } @@ -2709,14 +2714,16 @@ void network_send_password(const char* password) safe_strcat(keyPath, path, MAX_PATH); safe_strcat(keyPath, gConfigNetwork.player_name, MAX_PATH); safe_strcat(keyPath, ".privkey", MAX_PATH); + if (!platform_file_exists(keyPath)) { + log_error("Private key %s missing! Restart the game to generate it.", keyPath); + return; + } SDL_RWops *privkey = SDL_RWFromFile(keyPath, "rb"); - // TODO: verify file exists gNetwork.key.LoadPrivate(privkey); const std::string pubkey = gNetwork.key.PublicKeyString(); size_t sigsize; char *signature; bool ok = gNetwork.key.Sign(gNetwork.challenge.c_str(), gNetwork.challenge.size(), &signature, &sigsize); - log_warning("sigsize = %u, strlen(signature) = %u, signature = %s", sigsize, strlen(signature), signature); // Don't keep private key in memory. There's no need and it may get leaked // when process dump gets collected at some point in future. gNetwork.key.Unload(); diff --git a/src/network/network.h b/src/network/network.h index d77d880450..60fdf29287 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -34,6 +34,7 @@ enum { NETWORK_AUTH_BADVERSION, NETWORK_AUTH_BADNAME, NETWORK_AUTH_BADPASSWORD, + NETWORK_AUTH_VERIFICATIONFAILURE, NETWORK_AUTH_FULL, NETWORK_AUTH_REQUIREPASSWORD, NETWORK_AUTH_VERIFIED,