From 9cd6ad75dc1ca8f1e410828f63aa6acb07e2bee2 Mon Sep 17 00:00:00 2001 From: david072 Date: Fri, 18 Feb 2022 16:20:20 +0100 Subject: [PATCH 1/7] feat: basic whitelist This adds a basic whitelist, that can be populated and toggled via the cli. --- GhostServer/main_cli.cpp | 58 ++++++++++++++++++++++++++++++++++ GhostServer/networkmanager.cpp | 8 +++++ GhostServer/networkmanager.h | 4 +++ 3 files changed, 70 insertions(+) diff --git a/GhostServer/main_cli.cpp b/GhostServer/main_cli.cpp index 5fe1ef6..18efa4b 100644 --- a/GhostServer/main_cli.cpp +++ b/GhostServer/main_cli.cpp @@ -16,6 +16,8 @@ static enum { CMD_BAN, CMD_BAN_ID, CMD_SERVER_MSG, + CMD_WHITELIST_ADD, + CMD_WHITELIST_REMOVE, } g_current_cmd = CMD_NONE; static char *g_entered_pre; @@ -59,6 +61,11 @@ static void handle_cmd(char *line) { puts(" accept_spectators start accepting connections from spectators"); puts(" refuse_spectators stop accepting connections from spectators"); puts(" server_msg send all clients a message from the server"); + puts(" whitelist_enable enable whitelist"); + puts(" whitelist_disable disable whitelist"); + puts(" whitelist_add add player to whitelist"); + puts(" whitelist_remove remove player from whitelist"); + puts(" whitelist print out all players on whitelist"); return; } @@ -169,6 +176,45 @@ static void handle_cmd(char *line) { return; } + if (!strcmp(line, "whitelist_enable")) { + g_network->whitelistEnabled = true; + puts("Whitelist now enabled"); + return; + } + + if (!strcmp(line, "whitelist_disable")) { + g_network->whitelistEnabled = false; + puts("Whitelist now disabled"); + return; + } + + if (!strcmp(line, "whitelist_add")) { + g_current_cmd = CMD_WHITELIST_ADD; + fputs("Player to add: ", stdout); + fflush(stdout); + return; + } + + if (!strcmp(line, "whitelist_remove")) { + g_current_cmd = CMD_WHITELIST_REMOVE; + fputs("Player to remove: ", stdout); + fflush(stdout); + return; + } + + if (!strcmp(line, "whitelist")) { + if (g_network->whitelist.size() == 0) { + puts("No players on whitelist"); + return; + } + + puts("Players on whitelist:"); + for (auto& entry : g_network->whitelist) { + printf(" %s\n", entry.c_str()); + } + return; + } + printf("Unknown command: '%s'\n", line); return; @@ -255,6 +301,18 @@ static void handle_cmd(char *line) { g_current_cmd = CMD_NONE; g_network->ServerMessage(line); return; + + case CMD_WHITELIST_ADD: + g_current_cmd = CMD_NONE; + g_network->whitelist.insert(line); + printf("Added player %s to whitelist\n", line); + return; + + case CMD_WHITELIST_REMOVE: + g_current_cmd = CMD_NONE; + g_network->whitelist.erase(line); + printf("Removed player %s from whitelist\n", line); + return; } } diff --git a/GhostServer/networkmanager.cpp b/GhostServer/networkmanager.cpp index 0c8ba52..9279e8c 100644 --- a/GhostServer/networkmanager.cpp +++ b/GhostServer/networkmanager.cpp @@ -255,6 +255,14 @@ void NetworkManager::CheckConnection() return; } + if (whitelistEnabled) { + auto index = whitelist.find(name); + if (index == whitelist.end()) { + // Refuse connection, since the name was not found in the whitelist + return; + } + } + client.ID = this->lastID++; client.IP = client.tcpSocket->getRemoteAddress(); client.port = port; diff --git a/GhostServer/networkmanager.h b/GhostServer/networkmanager.h index a0db36f..0e2c081 100644 --- a/GhostServer/networkmanager.h +++ b/GhostServer/networkmanager.h @@ -4,6 +4,7 @@ #include #include +#include #include #include #include @@ -100,6 +101,9 @@ class NetworkManager bool acceptingPlayers = true; bool acceptingSpectators = true; + bool whitelistEnabled = true; // false + std::set whitelist; + void ScheduleServerThread(std::function func); Client* GetClientByID(sf::Uint32 ID); From e08b7e81272551358473cd7036b799a7febe2c1a Mon Sep 17 00:00:00 2001 From: David Ganz Date: Fri, 18 Feb 2022 16:36:31 +0100 Subject: [PATCH 2/7] feat: option to disconnect players not on whitelist when enabling --- GhostServer/main_cli.cpp | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/GhostServer/main_cli.cpp b/GhostServer/main_cli.cpp index 18efa4b..cf8c362 100644 --- a/GhostServer/main_cli.cpp +++ b/GhostServer/main_cli.cpp @@ -16,6 +16,7 @@ static enum { CMD_BAN, CMD_BAN_ID, CMD_SERVER_MSG, + CMD_WHITELIST_ENABLE, CMD_WHITELIST_ADD, CMD_WHITELIST_REMOVE, } g_current_cmd = CMD_NONE; @@ -177,8 +178,9 @@ static void handle_cmd(char *line) { } if (!strcmp(line, "whitelist_enable")) { - g_network->whitelistEnabled = true; - puts("Whitelist now enabled"); + g_current_cmd = CMD_WHITELIST_ENABLE; + fputs("Disconnect players not on whitelist? (y/N) ", stdout); + fflush(stdout); return; } @@ -302,6 +304,22 @@ static void handle_cmd(char *line) { g_network->ServerMessage(line); return; + case CMD_WHITELIST_ENABLE: + g_current_cmd = CMD_NONE; + g_network->whitelistEnabled = true; + + if (!strcmp(line, "y")) { + g_network->ScheduleServerThread([] { + for (auto& client : g_network->clients) { + if (g_network->whitelist.find(client.name) == g_network->whitelist.end()) { + g_network->DisconnectPlayer(client, "Not on whitelist"); + } + } + }); + } + + puts("Whitelist now disabled!"); + case CMD_WHITELIST_ADD: g_current_cmd = CMD_NONE; g_network->whitelist.insert(line); From 4a620e1201053d4a5a6d2e2e995bf8b491c71e1f Mon Sep 17 00:00:00 2001 From: David Ganz Date: Fri, 18 Feb 2022 22:09:42 +0100 Subject: [PATCH 3/7] feat: make whitelist contain either client IP or player name --- GhostServer/main_cli.cpp | 33 ++++++++++++++++++++++++++++----- GhostServer/networkmanager.cpp | 24 +++++++++++++++++++++--- GhostServer/networkmanager.h | 18 +++++++++++++++++- 3 files changed, 66 insertions(+), 9 deletions(-) diff --git a/GhostServer/main_cli.cpp b/GhostServer/main_cli.cpp index cf8c362..488686d 100644 --- a/GhostServer/main_cli.cpp +++ b/GhostServer/main_cli.cpp @@ -212,8 +212,13 @@ static void handle_cmd(char *line) { puts("Players on whitelist:"); for (auto& entry : g_network->whitelist) { - printf(" %s\n", entry.c_str()); + printf(" %s\n", entry.value.c_str()); } + + if (g_network->whitelistEnabled) + puts("Whitelist enabled"); + else + puts("Whitelist disabled"); return; } @@ -311,24 +316,42 @@ static void handle_cmd(char *line) { if (!strcmp(line, "y")) { g_network->ScheduleServerThread([] { for (auto& client : g_network->clients) { - if (g_network->whitelist.find(client.name) == g_network->whitelist.end()) { + if (!g_network->IsOnWhitelist(client.name, client.IP)) { g_network->DisconnectPlayer(client, "Not on whitelist"); } } }); } - puts("Whitelist now disabled!"); + puts("Whitelist now enabled!"); + return; case CMD_WHITELIST_ADD: g_current_cmd = CMD_NONE; - g_network->whitelist.insert(line); + g_network->whitelist.insert({ WhitelistEntryType::NAME, line }); printf("Added player %s to whitelist\n", line); return; case CMD_WHITELIST_REMOVE: g_current_cmd = CMD_NONE; - g_network->whitelist.erase(line); + + auto index = std::find_if(g_network->whitelist.begin(), g_network->whitelist.end(), [&line](const WhitelistEntry& entry) { + return entry.type == WhitelistEntryType::NAME && entry.value == std::string(line); + }); + + if (index != g_network->whitelist.end()) { + std::string _line(line); + + g_network->ScheduleServerThread([=]() { + g_network->whitelist.erase(index); + auto clients = g_network->GetPlayerByName(_line); + + for (auto client : clients) { + g_network->DisconnectPlayer(*client, "No on whitelist!"); + } + }); + } + printf("Removed player %s from whitelist\n", line); return; } diff --git a/GhostServer/networkmanager.cpp b/GhostServer/networkmanager.cpp index 9279e8c..e5d28e9 100644 --- a/GhostServer/networkmanager.cpp +++ b/GhostServer/networkmanager.cpp @@ -256,9 +256,9 @@ void NetworkManager::CheckConnection() } if (whitelistEnabled) { - auto index = whitelist.find(name); - if (index == whitelist.end()) { - // Refuse connection, since the name was not found in the whitelist + auto clientIp = client.tcpSocket->getRemoteAddress(); + if (!IsOnWhitelist(name, clientIp)) { + // Refuse connection, since the player was not found in the whitelist return; } } @@ -554,3 +554,21 @@ void NetworkManager::DoHeartbeats() } } } + +bool NetworkManager::IsOnWhitelist(std::string name, sf::IpAddress IP) { + if (whitelist.empty()) + return false; + + auto index = std::find_if(whitelist.begin(), whitelist.end(), [&name, &IP](const WhitelistEntry& entry) { + switch (entry.type) { + case WhitelistEntryType::NAME: + return entry.value == name; + case WhitelistEntryType::IP: + return entry.value == IP.toString(); + default: + return false; + } + }); + + return index != whitelist.end(); +} diff --git a/GhostServer/networkmanager.h b/GhostServer/networkmanager.h index 0e2c081..578dd88 100644 --- a/GhostServer/networkmanager.h +++ b/GhostServer/networkmanager.h @@ -65,6 +65,20 @@ struct Client { bool spectator; }; +enum class WhitelistEntryType { + NAME, + IP, +}; + +struct WhitelistEntry { + WhitelistEntryType type; + std::string value; + + bool operator<(const WhitelistEntry& rhs) const { + return value < rhs.value; + } +}; + #ifdef GHOST_GUI class NetworkManager : public QObject { @@ -102,7 +116,7 @@ class NetworkManager bool acceptingSpectators = true; bool whitelistEnabled = true; // false - std::set whitelist; + std::set whitelist; void ScheduleServerThread(std::function func); @@ -124,6 +138,8 @@ class NetworkManager void BanClientIP(Client &cl); void ServerMessage(const char *msg); + bool IsOnWhitelist(std::string name, sf::IpAddress IP); + #ifdef GHOST_GUI signals: void OnNewEvent(QString event); From 6183d0e8a1e004093908d6dd2976df5a47ce41e4 Mon Sep 17 00:00:00 2001 From: David Ganz Date: Fri, 18 Feb 2022 22:41:46 +0100 Subject: [PATCH 4/7] feat: enable adding player IPs and names to the whitelist via the cli You can now either add a player IP or a player name to the whitelist via the "whitelist_add_*" commands respectively. --- GhostServer/main_cli.cpp | 122 +++++++++++++++++++++++---------- GhostServer/networkmanager.cpp | 12 ++++ GhostServer/networkmanager.h | 1 + 3 files changed, 99 insertions(+), 36 deletions(-) diff --git a/GhostServer/main_cli.cpp b/GhostServer/main_cli.cpp index 488686d..a8d226d 100644 --- a/GhostServer/main_cli.cpp +++ b/GhostServer/main_cli.cpp @@ -17,8 +17,10 @@ static enum { CMD_BAN_ID, CMD_SERVER_MSG, CMD_WHITELIST_ENABLE, - CMD_WHITELIST_ADD, - CMD_WHITELIST_REMOVE, + CMD_WHITELIST_ADD_NAME, + CMD_WHITELIST_ADD_IP, + CMD_WHITELIST_REMOVE_NAME, + CMD_WHITELIST_REMOVE_IP, } g_current_cmd = CMD_NONE; static char *g_entered_pre; @@ -48,25 +50,27 @@ static void handle_cmd(char *line) { if (!strcmp(line, "help")) { puts("Available commands:"); - puts(" help show this list"); - puts(" quit terminate the server"); - puts(" list list all the currently connected clients"); - puts(" countdown_set set the pre/post cmds and countdown duration"); - puts(" countdown start a countdown"); - puts(" disconnect disconnect a client by name"); - puts(" disconnect_id disconnect a client by ID"); - puts(" ban ban connections from a certain IP by ghost name"); - puts(" ban_id ban connections from a certain IP by ghost ID"); - puts(" accept_players start accepting connections from players"); - puts(" refuse_players stop accepting connections from players"); - puts(" accept_spectators start accepting connections from spectators"); - puts(" refuse_spectators stop accepting connections from spectators"); - puts(" server_msg send all clients a message from the server"); - puts(" whitelist_enable enable whitelist"); - puts(" whitelist_disable disable whitelist"); - puts(" whitelist_add add player to whitelist"); - puts(" whitelist_remove remove player from whitelist"); - puts(" whitelist print out all players on whitelist"); + puts(" help show this list"); + puts(" quit terminate the server"); + puts(" list list all the currently connected clients"); + puts(" countdown_set set the pre/post cmds and countdown duration"); + puts(" countdown start a countdown"); + puts(" disconnect disconnect a client by name"); + puts(" disconnect_id disconnect a client by ID"); + puts(" ban ban connections from a certain IP by ghost name"); + puts(" ban_id ban connections from a certain IP by ghost ID"); + puts(" accept_players start accepting connections from players"); + puts(" refuse_players stop accepting connections from players"); + puts(" accept_spectators start accepting connections from spectators"); + puts(" refuse_spectators stop accepting connections from spectators"); + puts(" server_msg send all clients a message from the server"); + puts(" whitelist_enable enable whitelist"); + puts(" whitelist_disable disable whitelist"); + puts(" whitelist_add_name add player to whitelist"); + puts(" whitelist_add_ip add player to whitelist"); + puts(" whitelist_remove_name remove player from whitelist"); + puts(" whitelist_remove_ip remove player from whitelist"); + puts(" whitelist print out all players on whitelist"); return; } @@ -190,20 +194,34 @@ static void handle_cmd(char *line) { return; } - if (!strcmp(line, "whitelist_add")) { - g_current_cmd = CMD_WHITELIST_ADD; + if (!strcmp(line, "whitelist_add_name")) { + g_current_cmd = CMD_WHITELIST_ADD_NAME; fputs("Player to add: ", stdout); fflush(stdout); return; } - if (!strcmp(line, "whitelist_remove")) { - g_current_cmd = CMD_WHITELIST_REMOVE; + if (!strcmp(line, "whitelist_add_ip")) { + g_current_cmd = CMD_WHITELIST_ADD_IP; + fputs("Player IP to add: ", stdout); + fflush(stdout); + return; + } + + if (!strcmp(line, "whitelist_remove_name")) { + g_current_cmd = CMD_WHITELIST_REMOVE_NAME; fputs("Player to remove: ", stdout); fflush(stdout); return; } + if (!strcmp(line, "whitelist_remove_ip")) { + g_current_cmd = CMD_WHITELIST_REMOVE_IP; + fputs("Player IP to remove: ", stdout); + fflush(stdout); + return; + } + if (!strcmp(line, "whitelist")) { if (g_network->whitelist.size() == 0) { puts("No players on whitelist"); @@ -216,9 +234,9 @@ static void handle_cmd(char *line) { } if (g_network->whitelistEnabled) - puts("Whitelist enabled"); + puts("(Whitelist enabled)"); else - puts("Whitelist disabled"); + puts("(Whitelist disabled)"); return; } @@ -326,28 +344,34 @@ static void handle_cmd(char *line) { puts("Whitelist now enabled!"); return; - case CMD_WHITELIST_ADD: + case CMD_WHITELIST_ADD_NAME: g_current_cmd = CMD_NONE; g_network->whitelist.insert({ WhitelistEntryType::NAME, line }); printf("Added player %s to whitelist\n", line); return; - case CMD_WHITELIST_REMOVE: + case CMD_WHITELIST_ADD_IP: g_current_cmd = CMD_NONE; + g_network->whitelist.insert({ WhitelistEntryType::IP, line }); + printf("Added player IP %s to whitelist\n", line); + return; + + case CMD_WHITELIST_REMOVE_NAME: { + g_current_cmd = CMD_NONE; + + std::string _line(line); - auto index = std::find_if(g_network->whitelist.begin(), g_network->whitelist.end(), [&line](const WhitelistEntry& entry) { - return entry.type == WhitelistEntryType::NAME && entry.value == std::string(line); + auto index = std::find_if(g_network->whitelist.begin(), g_network->whitelist.end(), [&](const WhitelistEntry& entry) { + return entry.type == WhitelistEntryType::NAME && entry.value == _line; }); if (index != g_network->whitelist.end()) { - std::string _line(line); + g_network->whitelist.erase(index); + auto clients = g_network->GetPlayerByName(_line); g_network->ScheduleServerThread([=]() { - g_network->whitelist.erase(index); - auto clients = g_network->GetPlayerByName(_line); - for (auto client : clients) { - g_network->DisconnectPlayer(*client, "No on whitelist!"); + g_network->DisconnectPlayer(*client, "Not on whitelist!"); } }); } @@ -355,6 +379,32 @@ static void handle_cmd(char *line) { printf("Removed player %s from whitelist\n", line); return; } + + case CMD_WHITELIST_REMOVE_IP: { + g_current_cmd = CMD_NONE; + + std::string _line(line); + + auto index = std::find_if(g_network->whitelist.begin(), g_network->whitelist.end(), [&](const WhitelistEntry& entry) { + return entry.type == WhitelistEntryType::IP && entry.value == _line; + }); + + if (index != g_network->whitelist.end()) { + g_network->ScheduleServerThread([=]() { + g_network->whitelist.erase(index); + + auto* client = g_network->GetClientByIP(_line); + if (client == nullptr) + return; + + g_network->DisconnectPlayer(*client, "Not on whitelist!"); + }); + } + + printf("Removed player IP %s from whitelist\n", line); + return; + } + } } int main(int argc, char **argv) { diff --git a/GhostServer/networkmanager.cpp b/GhostServer/networkmanager.cpp index e5d28e9..cc7c14f 100644 --- a/GhostServer/networkmanager.cpp +++ b/GhostServer/networkmanager.cpp @@ -121,6 +121,18 @@ Client* NetworkManager::GetClientByID(sf::Uint32 ID) return nullptr; } +Client* NetworkManager::GetClientByIP(std::string IP) { + sf::IpAddress clientIP(IP); + + for (auto& client : this->clients) { + if (client.IP == clientIP) { + return &client; + } + } + + return nullptr; +} + bool NetworkManager::StartServer(const int port) { if (this->udpSocket.bind(port) != sf::Socket::Done) { diff --git a/GhostServer/networkmanager.h b/GhostServer/networkmanager.h index 578dd88..d8e796d 100644 --- a/GhostServer/networkmanager.h +++ b/GhostServer/networkmanager.h @@ -121,6 +121,7 @@ class NetworkManager void ScheduleServerThread(std::function func); Client* GetClientByID(sf::Uint32 ID); + Client* GetClientByIP(std::string IP); bool StartServer(const int port); void StopServer(); From d7e9a54afe100b0af179c8358d19f907ecd257b0 Mon Sep 17 00:00:00 2001 From: David Ganz Date: Fri, 18 Feb 2022 22:50:01 +0100 Subject: [PATCH 5/7] fix: make whitelist cli thread safe --- GhostServer/main_cli.cpp | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/GhostServer/main_cli.cpp b/GhostServer/main_cli.cpp index a8d226d..651f8af 100644 --- a/GhostServer/main_cli.cpp +++ b/GhostServer/main_cli.cpp @@ -70,7 +70,7 @@ static void handle_cmd(char *line) { puts(" whitelist_add_ip add player to whitelist"); puts(" whitelist_remove_name remove player from whitelist"); puts(" whitelist_remove_ip remove player from whitelist"); - puts(" whitelist print out all players on whitelist"); + puts(" whitelist print out all entries on whitelist"); return; } @@ -189,7 +189,9 @@ static void handle_cmd(char *line) { } if (!strcmp(line, "whitelist_disable")) { - g_network->whitelistEnabled = false; + g_network->ScheduleServerThread([] { + g_network->whitelistEnabled = false; + }); puts("Whitelist now disabled"); return; } @@ -329,30 +331,34 @@ static void handle_cmd(char *line) { case CMD_WHITELIST_ENABLE: g_current_cmd = CMD_NONE; - g_network->whitelistEnabled = true; + g_network->ScheduleServerThread([=] { + g_network->whitelistEnabled = true; - if (!strcmp(line, "y")) { - g_network->ScheduleServerThread([] { + if (!strcmp(line, "y")) { for (auto& client : g_network->clients) { if (!g_network->IsOnWhitelist(client.name, client.IP)) { g_network->DisconnectPlayer(client, "Not on whitelist"); } } - }); - } + } + }); puts("Whitelist now enabled!"); return; case CMD_WHITELIST_ADD_NAME: g_current_cmd = CMD_NONE; - g_network->whitelist.insert({ WhitelistEntryType::NAME, line }); + g_network->ScheduleServerThread([=] { + g_network->whitelist.insert({ WhitelistEntryType::NAME, line }); + }); printf("Added player %s to whitelist\n", line); return; case CMD_WHITELIST_ADD_IP: g_current_cmd = CMD_NONE; - g_network->whitelist.insert({ WhitelistEntryType::IP, line }); + g_network->ScheduleServerThread([=] { + g_network->whitelist.insert({ WhitelistEntryType::IP, line }); + }); printf("Added player IP %s to whitelist\n", line); return; @@ -366,10 +372,11 @@ static void handle_cmd(char *line) { }); if (index != g_network->whitelist.end()) { - g_network->whitelist.erase(index); auto clients = g_network->GetPlayerByName(_line); g_network->ScheduleServerThread([=]() { + g_network->whitelist.erase(index); + for (auto client : clients) { g_network->DisconnectPlayer(*client, "Not on whitelist!"); } From 2f0fdb6f4c9fd6a0086bde08327732ca07d9bc90 Mon Sep 17 00:00:00 2001 From: David Ganz Date: Fri, 18 Feb 2022 22:50:01 +0100 Subject: [PATCH 6/7] fix: make whitelist cli thread safe --- GhostServer/main_cli.cpp | 27 +++++++++++++++++---------- GhostServer/networkmanager.h | 2 +- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/GhostServer/main_cli.cpp b/GhostServer/main_cli.cpp index a8d226d..651f8af 100644 --- a/GhostServer/main_cli.cpp +++ b/GhostServer/main_cli.cpp @@ -70,7 +70,7 @@ static void handle_cmd(char *line) { puts(" whitelist_add_ip add player to whitelist"); puts(" whitelist_remove_name remove player from whitelist"); puts(" whitelist_remove_ip remove player from whitelist"); - puts(" whitelist print out all players on whitelist"); + puts(" whitelist print out all entries on whitelist"); return; } @@ -189,7 +189,9 @@ static void handle_cmd(char *line) { } if (!strcmp(line, "whitelist_disable")) { - g_network->whitelistEnabled = false; + g_network->ScheduleServerThread([] { + g_network->whitelistEnabled = false; + }); puts("Whitelist now disabled"); return; } @@ -329,30 +331,34 @@ static void handle_cmd(char *line) { case CMD_WHITELIST_ENABLE: g_current_cmd = CMD_NONE; - g_network->whitelistEnabled = true; + g_network->ScheduleServerThread([=] { + g_network->whitelistEnabled = true; - if (!strcmp(line, "y")) { - g_network->ScheduleServerThread([] { + if (!strcmp(line, "y")) { for (auto& client : g_network->clients) { if (!g_network->IsOnWhitelist(client.name, client.IP)) { g_network->DisconnectPlayer(client, "Not on whitelist"); } } - }); - } + } + }); puts("Whitelist now enabled!"); return; case CMD_WHITELIST_ADD_NAME: g_current_cmd = CMD_NONE; - g_network->whitelist.insert({ WhitelistEntryType::NAME, line }); + g_network->ScheduleServerThread([=] { + g_network->whitelist.insert({ WhitelistEntryType::NAME, line }); + }); printf("Added player %s to whitelist\n", line); return; case CMD_WHITELIST_ADD_IP: g_current_cmd = CMD_NONE; - g_network->whitelist.insert({ WhitelistEntryType::IP, line }); + g_network->ScheduleServerThread([=] { + g_network->whitelist.insert({ WhitelistEntryType::IP, line }); + }); printf("Added player IP %s to whitelist\n", line); return; @@ -366,10 +372,11 @@ static void handle_cmd(char *line) { }); if (index != g_network->whitelist.end()) { - g_network->whitelist.erase(index); auto clients = g_network->GetPlayerByName(_line); g_network->ScheduleServerThread([=]() { + g_network->whitelist.erase(index); + for (auto client : clients) { g_network->DisconnectPlayer(*client, "Not on whitelist!"); } diff --git a/GhostServer/networkmanager.h b/GhostServer/networkmanager.h index d8e796d..7acc3d5 100644 --- a/GhostServer/networkmanager.h +++ b/GhostServer/networkmanager.h @@ -115,7 +115,7 @@ class NetworkManager bool acceptingPlayers = true; bool acceptingSpectators = true; - bool whitelistEnabled = true; // false + bool whitelistEnabled = false; std::set whitelist; void ScheduleServerThread(std::function func); From 613f72c17032649fbe54bf0073a0350189027cf2 Mon Sep 17 00:00:00 2001 From: David Ganz Date: Fri, 18 Feb 2022 22:55:04 +0100 Subject: [PATCH 7/7] fix: show whitelist status, even if there are no players on it --- GhostServer/main_cli.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/GhostServer/main_cli.cpp b/GhostServer/main_cli.cpp index 651f8af..03bb02a 100644 --- a/GhostServer/main_cli.cpp +++ b/GhostServer/main_cli.cpp @@ -227,12 +227,11 @@ static void handle_cmd(char *line) { if (!strcmp(line, "whitelist")) { if (g_network->whitelist.size() == 0) { puts("No players on whitelist"); - return; - } - - puts("Players on whitelist:"); - for (auto& entry : g_network->whitelist) { - printf(" %s\n", entry.value.c_str()); + } else { + puts("Players on whitelist:"); + for (auto& entry : g_network->whitelist) { + printf(" %s\n", entry.value.c_str()); + } } if (g_network->whitelistEnabled)