From 165ec06690d5631e98707654f53df0b5d1e16270 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Tue, 24 May 2016 17:16:02 +0200 Subject: [PATCH] Passwordless login permission --- data/language/en-GB.txt | 1 + src/localisation/string_ids.h | 1 + src/network/network.cpp | 19 ++++++++++++------- src/network/network.h | 4 +++- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index ae01d03731..c9af59a014 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -4004,6 +4004,7 @@ STR_5662 :N/A STR_5663 :Clear Landscape STR_5664 :Cheat STR_5665 :Toggle Scenery Cluster +STR_5666 :Passwordless Login STR_5701 :{WINDOW_COLOUR_2}Last action: {BLACK}{STRINGID} STR_5702 :{SMALLFONT}{BLACK}Locate player's most recent action STR_5703 :Can't kick the host diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 2500a17ab4..e130908af0 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2444,6 +2444,7 @@ enum { STR_ACTION_CLEAR_LANDSCAPE = 5663, STR_ACTION_CHEAT = 5664, STR_ACTION_TOGGLE_SCENERY_CLUSTER = 5665, + STR_ACTION_PASSWORDLESS_LOGIN = 5666, STR_LAST_ACTION_RAN = 5701, STR_LOCATE_PLAYER_TIP = 5702, diff --git a/src/network/network.cpp b/src/network/network.cpp index 95ba2871f4..599c3ce11f 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -2073,19 +2073,24 @@ void Network::Server_Handle_AUTH(NetworkConnection& connection, NetworkPacket& p } } - // TODO: check if key is already known + const NetworkGroup * group = GetGroupByID(GetGroupIDByHash(connection.key.PublicKeyHash())); + size_t actionIndex = gNetworkActions.FindCommandByPermissionName("PERMISSION_PASSWORDLESS_LOGIN"); + bool passwordless = group->CanPerformAction(actionIndex); if (!gameversion || strcmp(gameversion, NETWORK_STREAM_ID) != 0) { connection.authstatus = NETWORK_AUTH_BADVERSION; } else if (!name) { connection.authstatus = NETWORK_AUTH_BADNAME; } else - if ((!password || strlen(password) == 0) && Network::password.size() > 0) { - connection.authstatus = NETWORK_AUTH_REQUIREPASSWORD; - } else - if (password && Network::password != password) { - connection.authstatus = NETWORK_AUTH_BADPASSWORD; - } else + if (!passwordless) { + if ((!password || strlen(password) == 0) && Network::password.size() > 0) { + connection.authstatus = NETWORK_AUTH_REQUIREPASSWORD; + } else + if (password && Network::password != password) { + connection.authstatus = NETWORK_AUTH_BADPASSWORD; + } + } + if (gConfigNetwork.maxplayers <= player_list.size()) { connection.authstatus = NETWORK_AUTH_FULL; } else diff --git a/src/network/network.h b/src/network/network.h index 6740cf08df..506f554626 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -252,7 +252,9 @@ public: {STR_ACTION_CHEAT, "PERMISSION_CHEAT", {GAME_COMMAND_CHEAT}}, {STR_ACTION_TOGGLE_SCENERY_CLUSTER, "PERMISSION_TOGGLE_SCENERY_CLUSTER", - {-2}} + {-2}}, + {STR_ACTION_PASSWORDLESS_LOGIN, "PERMISSION_PASSWORDLESS_LOGIN", + {-3}}, }; };