1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-07 07:04:36 +01:00

Minor fixes to authorisation system

This commit is contained in:
Michał Janiszewski
2016-05-21 19:26:53 +02:00
parent caa74acb1b
commit 553e1bdf0f
4 changed files with 15 additions and 4 deletions

View File

@@ -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 #

View File

@@ -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
};

View File

@@ -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();

View File

@@ -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,