From f2a85a82718967ecbcaac96c54941d5b7794aa01 Mon Sep 17 00:00:00 2001 From: JustinAJ Date: Sun, 26 Oct 2014 19:43:48 -0400 Subject: [PATCH] Added RenX::BanDatabase; added ip32 to RenX::PlayerInfo; added RenX_OnBan even to RenX::Plugin; Server::banPlayer() now has an optional length parameter; Updated Jupiter version; Config options added: RCONBan, LocalSteamBan, LocalIPBan, LocalNameBan. --- Jupiter | 2 +- Release/Bot.lib | Bin 19858 -> 19858 bytes Release/Plugins/RenX.Core.lib | Bin 61386 -> 67388 bytes RenX.Core/RenX.Core.vcxproj | 2 + RenX.Core/RenX.Core.vcxproj.filters | 6 ++ RenX.Core/RenX_BanDatabase.cpp | 147 ++++++++++++++++++++++++++++ RenX.Core/RenX_BanDatabase.h | 114 +++++++++++++++++++++ RenX.Core/RenX_Core.cpp | 2 +- RenX.Core/RenX_PlayerInfo.h | 1 + RenX.Core/RenX_Plugin.cpp | 5 + RenX.Core/RenX_Plugin.h | 2 + RenX.Core/RenX_Server.cpp | 62 +++++++++--- RenX.Core/RenX_Server.h | 9 +- 13 files changed, 337 insertions(+), 15 deletions(-) create mode 100644 RenX.Core/RenX_BanDatabase.cpp create mode 100644 RenX.Core/RenX_BanDatabase.h diff --git a/Jupiter b/Jupiter index 94bda33..2132691 160000 --- a/Jupiter +++ b/Jupiter @@ -1 +1 @@ -Subproject commit 94bda33c248ef6fd9c0e09ecda6b27184865df6c +Subproject commit 21326918e9caf39c37d487183801715724908f85 diff --git a/Release/Bot.lib b/Release/Bot.lib index 0c94a68aaaccebf0b8a53f9c523bc10b56c84298..c40ec42d916b610f2bf48f0ae23a399e884b3000 100644 GIT binary patch delta 1584 zcmZuwOH5Ny5TyYu-vIJxMTEANkJte3(f^-9OKB-lqQ;G;pb|q^5E2(AE`*&dNU*cf z5UIw6D-#G|4qQ_fGHYC9%7AdgjcTGjnrmhTNKA_1r0^ z%ji>0f zdhbA6iEe@^RjFn4o-+2UfDdLXR?MHWoO% zW8>Jc&WH^lYcs(|r&Xeed3s#(Jm{QH`P3DZxCh1Ajc&h$ViRtTHK{GD$hDq@PfigT zSiNQ_xSP2R2QuoIjW6YP_~WU96-{0thR>T$dlHiTjSQimJtA7vyvT_Y-lRmtEIInl zD+gos5$g2`&)iaWyqS|<`o@bACt#ajz<7A@$WI!1zfgw7h#8Lkq|p$Vku@F%2!0ii z$EXUDh9#JlJd5-n+?=1J6ul4OXoBE8Y1DQm_EZ)j4Z6gt_jiIxEcP&NOTrOJ5lto?G`*7)-R3O z!M;3@!tku9WCtjE%#G+haLj7D<4QiT<-c0{Du;a8oJj)RU_*3u0MlRgIWMwzl-TDR? zWv@t4k>W;*p{^H>G+~3e#RttrI+5XFYqYe(lZ;@TxQXu>(Vi7%CaACr3w>CqSv#tS N=kN8;+@C3{`3FlBoGSnT delta 1584 zcmZuwOH30{6r}+y-vBanM1;1MkJtb+{ZGFXT1rca5;bl#1r-fpK}cMfxDa--Ai>^^ zhDbFoT$w-!8y9Ygx+o?l#s$Hc7#A*tgbgu%?t5?E^pV)zoSu8`x#!-OUp3`dO)F((%0r;%WL5i-Z>k~-`~z|?mB;%43-Sv`Wh+`zPts_0V|y9|7!f# zP3gS@Z6&$|CKaic(0j_ruL3^EHYh0VMv(;?JrXH|pGr(XGb%%;)VP4YQJGo?YLyc; zvjhjKRbZ_98N)`p5k^fb_N#&gzofHZGA_eYS2ML0LRuxINl1OE7`U|AJch~d+wQ@*4ie=W<<&psY4YM!UWaeqo6VwM!$ z_KU&T0u1#BxMyl9H`YwaF9Kt_#4*^eaTpH|9%@XZpmAkbh{|xJF^z`cw5ahY$l#Yj zag3@E)3Anef@hxoMu?|RZPbTZVEq_aD+z4ArUinXO>oP_9|YxLuyl&&;WT%!A7hNCdrpV3>vV$GN z0ql6NYi)K=x*TvZDK4GP@N19>H^q$^CgaS)a{LMx-ATysH_k+7P_z?8587_PgCXP6 zh#l-p11S#8@Je!kyvOXY(F4bwylNNAGi(v?`1;_SWdE4wL%~r`a

O8VHj@T1>L^XmpB!;D_f{5PSu diff --git a/Release/Plugins/RenX.Core.lib b/Release/Plugins/RenX.Core.lib index 41da5c796a052d57a99cf2483bc31549d3c05c23..9a3bc6f0a7d9b34dba924d103f81983a77a0f493 100644 GIT binary patch literal 67388 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 E0w1x&vj6}9 delta 8179 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 diff --git a/RenX.Core/RenX.Core.vcxproj b/RenX.Core/RenX.Core.vcxproj index 87d9cf7..21d663f 100644 --- a/RenX.Core/RenX.Core.vcxproj +++ b/RenX.Core/RenX.Core.vcxproj @@ -70,6 +70,7 @@ + @@ -80,6 +81,7 @@ + diff --git a/RenX.Core/RenX.Core.vcxproj.filters b/RenX.Core/RenX.Core.vcxproj.filters index e375b38..24b4e41 100644 --- a/RenX.Core/RenX.Core.vcxproj.filters +++ b/RenX.Core/RenX.Core.vcxproj.filters @@ -47,6 +47,9 @@ Header Files + + Header Files + @@ -67,5 +70,8 @@ Source Files + + Source Files + \ No newline at end of file diff --git a/RenX.Core/RenX_BanDatabase.cpp b/RenX.Core/RenX_BanDatabase.cpp new file mode 100644 index 0000000..8f372cb --- /dev/null +++ b/RenX.Core/RenX_BanDatabase.cpp @@ -0,0 +1,147 @@ +/** + * Copyright (C) 2014 Justin James. + * + * This license must be preserved. + * Any applications, libraries, or code which make any use of any + * component of this program must not be commercial, unless explicit + * permission is granted from the original author. The use of this + * program for non-profit purposes is permitted. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * In the event that this license restricts you from making desired use of this program, contact the original author. + * Written by Justin James + */ + +#include +#include "Jupiter/IRC_Client.h" +#include "Jupiter/INIFile.h" +#include "RenX_PlayerInfo.h" +#include "RenX_BanDatabase.h" +#include "RenX_Core.h" +#include "RenX_Plugin.h" + +RenX::BanDatabase _banDatabase; +RenX::BanDatabase *RenX::banDatabase = &_banDatabase; +RenX::BanDatabase &RenX::defaultBanDatabase = _banDatabase; + +bool RenX::BanDatabase::load(const Jupiter::ReadableString &fname) +{ + RenX::BanDatabase::filename = fname; + FILE *file = fopen(RenX::BanDatabase::filename.c_str(), "rb"); + if (file != nullptr) + { + RenX::BanDatabase::version = fgetc(file); + while (!feof(file)) + if (fgetc(file) == '\n') + break; + Entry *entry; + char c; + while (!feof(file)) + { + entry = new Entry(); + fread(&entry->active, 1, 1, file); + fread(&entry->timestamp, sizeof(time_t), 1, file); + fread(&entry->length, sizeof(time_t), 1, file); + fread(&entry->steamid, sizeof(uint64_t), 1, file); + fread(&entry->ip, sizeof(uint32_t), 1, file); + if (feof(file)) + { + delete entry; + break; + } + c = fgetc(file); + while (c != '\n' && c != EOF) + { + if (c == '\0') + { + // add plugin data. + break; + } + entry->name += c; + c = fgetc(file); + } + entries.add(entry); + } + fclose(file); + return true; + } + else + { + RenX::BanDatabase::version = 0; + file = fopen(RenX::BanDatabase::filename.c_str(), "ab"); + if (file != nullptr) + { + fputc(RenX::BanDatabase::version, file); + fputc('\n', file); + fclose(file); + return true; + } + return false; + } +} + +void RenX::BanDatabase::add(RenX::Server *server, const RenX::PlayerInfo *player, time_t length) +{ + Entry *entry = new Entry(); + entry->active = 1; + entry->timestamp = time(0); + entry->length = length; + entry->steamid = player->steamid; + entry->ip = player->ip32; + entry->name = player->name; + entries.add(entry); + + FILE *file = fopen(RenX::BanDatabase::filename.c_str(), "ab"); + if (file != nullptr) + { + fwrite(&entry->active, 1, 1, file); + fwrite(&entry->timestamp, sizeof(time_t), 1, file); + fwrite(&entry->length, sizeof(time_t), 1, file); + fwrite(&entry->steamid, sizeof(uint64_t), 1, file); + fwrite(&entry->ip, sizeof(uint32_t), 1, file); + fwrite(entry->name.ptr(), sizeof(char), entry->name.size(), file); + // add plugin data + Jupiter::String pluginData; + Jupiter::ArrayList &xPlugins = *RenX::getCore()->getPlugins(); + for (size_t i = 0; i < xPlugins.size(); i++) + if (xPlugins.get(i)->RenX_OnBan(server, player, pluginData)) + { + fputc('\0', file); + fwrite(xPlugins.get(i)->getName().ptr(), sizeof(char), xPlugins.get(i)->getName().size(), file); + fputc('\0', file); + fwrite(pluginData.ptr(), sizeof(char), pluginData.size(), file); + } + + + fputc('\n', file); + fclose(file); + } +} + +uint8_t RenX::BanDatabase::getVersion() const +{ + return RenX::BanDatabase::version; +} + +const Jupiter::ReadableString &RenX::BanDatabase::getFileName() const +{ + return RenX::BanDatabase::filename; +} + +const Jupiter::ArrayList &RenX::BanDatabase::getEntries() const +{ + return RenX::BanDatabase::entries; +} + +RenX::BanDatabase::BanDatabase() +{ + RenX::BanDatabase::load(Jupiter::IRC::Client::Config->get(STRING_LITERAL_AS_REFERENCE("RenX"), STRING_LITERAL_AS_REFERENCE("BanDB"), STRING_LITERAL_AS_REFERENCE("Bans.db"))); +} + +RenX::BanDatabase::~BanDatabase() +{ + RenX::BanDatabase::entries.emptyAndDelete(); +} \ No newline at end of file diff --git a/RenX.Core/RenX_BanDatabase.h b/RenX.Core/RenX_BanDatabase.h new file mode 100644 index 0000000..491c6eb --- /dev/null +++ b/RenX.Core/RenX_BanDatabase.h @@ -0,0 +1,114 @@ +/** + * Copyright (C) 2014 Justin James. + * + * This license must be preserved. + * Any applications, libraries, or code which make any use of any + * component of this program must not be commercial, unless explicit + * permission is granted from the original author. The use of this + * program for non-profit purposes is permitted. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * In the event that this license restricts you from making desired use of this program, contact the original author. + * Written by Justin James + */ + +#if !defined _RENX_BANDATABASE_H_HEADER +#define _RENX_BANDATABASE_H_HEADER + +#include +#include +#include "Jupiter/String.h" +#include "Jupiter/CString.h" +#include "Jupiter/ArrayList.h" + +/** DLL Linkage Nagging */ +#if defined _MSC_VER +#pragma warning(push) +#pragma warning(disable: 4251) +#endif + +namespace RenX +{ + struct PlayerInfo; + class Server; + + /** + * @brief Represents the local ban database. + */ + class RENX_API BanDatabase + { + public: + /** + * @brief Represents a Ban entry in the database. + */ + struct RENX_API Entry + { + unsigned char active; /** 1 if the ban is active, 0 otherwise */ + time_t timestamp /** Time the ban was created */; + time_t length /** Duration of the ban; 0 if permanent */; + uint64_t steamid /** SteamID of the banned player */; + uint32_t ip /** IPv4 address of the banned player */; + Jupiter::StringS name /** Name of the banned player */; + }; + + /** + * @brief Loads a file into the ban system. + * Note: This will generate a database file if none is found. + * + * @param fname String containing the name of the file to load + * @return True on success, false otherwise. + */ + bool load(const Jupiter::ReadableString &fname); + + /** + * @param Adds a ban entry for a player and immediately writes it to the database. + * + * @param server Server the player is playing in + * @param player Data of the player to be banned + * @param length Duration of the ban + */ + void add(RenX::Server *server, const RenX::PlayerInfo *player, time_t length); + + /** + * @brief Fetches the version of the database file. + * + * @return Database version + */ + uint8_t getVersion() const; + + /** + * @brief Fetches the name of the database file. + * + * @return Database file name + */ + const Jupiter::ReadableString &getFileName() const; + + /** + * @brief Fetches the list of ban entries. + * + * @return List of entries + */ + const Jupiter::ArrayList &getEntries() const; + + BanDatabase(); + ~BanDatabase(); + + private: + uint8_t version; + Jupiter::CStringS filename; + Jupiter::ArrayList entries; + }; + + RENX_API extern RenX::BanDatabase *banDatabase; + RENX_API extern RenX::BanDatabase &defaultBanDatabase; +} + +/** Re-enable warnings */ +#if defined _MSC_VER +#pragma warning(pop) +#endif + +#endif // _RENX_BANDATABASE_H_HEADER \ No newline at end of file diff --git a/RenX.Core/RenX_Core.cpp b/RenX.Core/RenX_Core.cpp index 76be9f7..c1508b7 100644 --- a/RenX.Core/RenX_Core.cpp +++ b/RenX.Core/RenX_Core.cpp @@ -40,7 +40,7 @@ RenX::Core::Core() RenX::Core::translationsFile.readFile(Jupiter::IRC::Client::Config->get(STRING_LITERAL_AS_REFERENCE("RenX"), STRING_LITERAL_AS_REFERENCE("TranslationsFile"), STRING_LITERAL_AS_REFERENCE("Translations.ini"))); RenX::initTranslations(RenX::Core::translationsFile); RenX::Core::commandsFile.readFile(Jupiter::IRC::Client::Config->get(STRING_LITERAL_AS_REFERENCE("RenX"), STRING_LITERAL_AS_REFERENCE("CommandsFile"), STRING_LITERAL_AS_REFERENCE("RenXGameCommands.ini"))); - + unsigned int wc = serverList.wordCount(WHITESPACE); RenX::Server *server; diff --git a/RenX.Core/RenX_PlayerInfo.h b/RenX.Core/RenX_PlayerInfo.h index cf4fc75..49423be 100644 --- a/RenX.Core/RenX_PlayerInfo.h +++ b/RenX.Core/RenX_PlayerInfo.h @@ -46,6 +46,7 @@ namespace RenX Jupiter::StringS adminType; Jupiter::StringS uuid; uint64_t steamid = 0; + uint32_t ip32 = 0; TeamType team = Other; int id = 0; bool isBot = false; diff --git a/RenX.Core/RenX_Plugin.cpp b/RenX.Core/RenX_Plugin.cpp index 9d3ec14..797a89e 100644 --- a/RenX.Core/RenX_Plugin.cpp +++ b/RenX.Core/RenX_Plugin.cpp @@ -45,6 +45,11 @@ void RenX::Plugin::RenX_OnPlayerDelete(Server *, const RenX::PlayerInfo *) return; } +bool RenX::Plugin::RenX_OnBan(Server *, const RenX::PlayerInfo *, Jupiter::StringType &) +{ + return false; +} + void RenX::Plugin::RenX_OnJoin(Server *, const RenX::PlayerInfo *) { return; diff --git a/RenX.Core/RenX_Plugin.h b/RenX.Core/RenX_Plugin.h index cdae664..ded8d74 100644 --- a/RenX.Core/RenX_Plugin.h +++ b/RenX.Core/RenX_Plugin.h @@ -24,6 +24,7 @@ */ #include "Jupiter/Plugin.h" +#include "Jupiter/String_Type.h" #include "RenX.h" namespace RenX @@ -40,6 +41,7 @@ namespace RenX /** Non-RCON RenX logs */ virtual void RenX_OnPlayerCreate(Server *server, const PlayerInfo *player); virtual void RenX_OnPlayerDelete(Server *server, const PlayerInfo *player); + virtual bool RenX_OnBan(Server *server, const PlayerInfo *player, Jupiter::StringType &data); /** Player type logs */ virtual void RenX_OnJoin(Server *server, const PlayerInfo *player); diff --git a/RenX.Core/RenX_Server.cpp b/RenX.Core/RenX_Server.cpp index 11a2990..f2ed0b6 100644 --- a/RenX.Core/RenX_Server.cpp +++ b/RenX.Core/RenX_Server.cpp @@ -25,6 +25,7 @@ #include "RenX_GameCommand.h" #include "RenX_Functions.h" #include "RenX_Plugin.h" +#include "RenX_BanDatabase.h" int RenX::Server::think() { @@ -300,24 +301,38 @@ void RenX::Server::kickPlayer(const RenX::PlayerInfo *player) void RenX::Server::banPlayer(int id) { - RenX::Server::sock.send(Jupiter::StringS::Format("cadminkickban pid%d\n", id)); + if (RenX::Server::rconBan) + RenX::Server::sock.send(Jupiter::StringS::Format("cadminkickban pid%d\n", id)); + else + { + RenX::PlayerInfo *player = RenX::Server::getPlayer(id); + if (player != nullptr) + RenX::Server::banPlayer(player); + } } -void RenX::Server::banPlayer(const RenX::PlayerInfo *player) +void RenX::Server::banPlayer(const RenX::PlayerInfo *player, time_t length) { - if (this->profile->pidbug) + if (RenX::Server::rconBan && length == 0) { - if (player->isBot) - RenX::Server::sock.send(Jupiter::StringS::Format("cadminkickban %.*s\n", player->name.size(), player->name.ptr())); - else if (player->id < 1000) - RenX::Server::banPlayer(player->id); - else if (player->name.contains('|') == false) - RenX::Server::sock.send(Jupiter::StringS::Format("cadminkickban %.*s\n", player->name.size(), player->name.ptr())); + if (this->profile->pidbug) + { + if (player->isBot) + RenX::Server::sock.send(Jupiter::StringS::Format("cadminkickban %.*s\n", player->name.size(), player->name.ptr())); + else if (player->id < 1000) + RenX::Server::banPlayer(player->id); + else if (player->name.contains('|') == false) + RenX::Server::sock.send(Jupiter::StringS::Format("cadminkickban %.*s\n", player->name.size(), player->name.ptr())); + else + RenX::Server::banPlayer(player->id); + } else - RenX::Server::banPlayer(player->id); + RenX::Server::sock.send(Jupiter::StringS::Format("cadminkickban pid%d\n", player->id)); } else - RenX::Server::banPlayer(player->id); + RenX::Server::kickPlayer(player); + if (RenX::Server::localBan) + RenX::banDatabase->add(this, player, length); } bool RenX::Server::removePlayer(int id) @@ -665,6 +680,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) r->joinTime = time(nullptr); r->steamid = steamid; r->ip = ip; + r->ip32 = Jupiter::Socket::pton4(Jupiter::CStringS(r->ip).c_str()); if (id != 0) server->players.add(r); switch (this->uuidMode) @@ -680,6 +696,24 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) } for (size_t i = 0; i < xPlugins.size(); i++) xPlugins.get(i)->RenX_OnPlayerCreate(server, r); + + const Jupiter::ArrayList &entries = RenX::banDatabase->getEntries(); + RenX::BanDatabase::Entry *entry; + for (size_t i = 0; i != entries.size(); i++) + { + entry = entries.get(i); + if (entry->active) + { + if (entry->timestamp + entry->length > time(0)) + entry->active = false; + else if (server->localSteamBan && entry->steamid == r->steamid) + server->kickPlayer(r); + else if (server->localIPBan && entry->ip == r->ip32) + server->kickPlayer(r); + else if (server->localNameBan && entry->name.equalsi(r->name)) + server->kickPlayer(r); + } + } } else if (r->name.size() == 0) r->name = name; r->team = team; @@ -990,7 +1024,6 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) name = playerData.gotoToken(4, CListDelim); } - printf("Name: %.*s - ID: %d - isBot: %u - steamid: %llu - ip: %.*s" ENDL, name.size(), name.ptr(), id, isBot, steamid.asUnsignedLongLong(), ip.size(), ip.ptr()); RenX::PlayerInfo *player = getPlayerOrAdd(this, name, id, team, isBot, steamid.asUnsignedLongLong(), ip); } else @@ -1134,6 +1167,11 @@ void RenX::Server::init() RenX::Server::rules = Jupiter::IRC::Client::Config->get(RenX::Server::configSection, STRING_LITERAL_AS_REFERENCE("Rules"), STRING_LITERAL_AS_REFERENCE("Anarchy!")); RenX::Server::delay = Jupiter::IRC::Client::Config->getInt(RenX::Server::configSection, STRING_LITERAL_AS_REFERENCE("ReconnectDelay"), 60); RenX::Server::uuidMode = Jupiter::IRC::Client::Config->getInt(RenX::Server::configSection, STRING_LITERAL_AS_REFERENCE("UUIDMode"), 0); + RenX::Server::rconBan = Jupiter::IRC::Client::Config->getBool(RenX::Server::configSection, STRING_LITERAL_AS_REFERENCE("RCONBan"), false); + RenX::Server::localSteamBan = Jupiter::IRC::Client::Config->getBool(RenX::Server::configSection, STRING_LITERAL_AS_REFERENCE("LocalSteamBan"), true); + RenX::Server::localIPBan = Jupiter::IRC::Client::Config->getBool(RenX::Server::configSection, STRING_LITERAL_AS_REFERENCE("LocalIPBan"), true); + RenX::Server::localNameBan = Jupiter::IRC::Client::Config->getBool(RenX::Server::configSection, STRING_LITERAL_AS_REFERENCE("LocalNameBan"), false); + RenX::Server::localBan = RenX::Server::localIPBan || RenX::Server::localSteamBan || RenX::Server::localNameBan; RenX::Server::steamFormat = Jupiter::IRC::Client::Config->getInt(RenX::Server::configSection, STRING_LITERAL_AS_REFERENCE("SteamFormat"), 16); RenX::Server::neverSay = Jupiter::IRC::Client::Config->getBool(RenX::Server::configSection, STRING_LITERAL_AS_REFERENCE("NeverSay"), false); diff --git a/RenX.Core/RenX_Server.h b/RenX.Core/RenX_Server.h index 9705adb..9d76fcb 100644 --- a/RenX.Core/RenX_Server.h +++ b/RenX.Core/RenX_Server.h @@ -23,6 +23,7 @@ * @brief Defines the Server class. */ +#include #include "Jupiter/TCPSocket.h" #include "Jupiter/DLList.h" #include "Jupiter/ArrayList.h" @@ -257,8 +258,9 @@ namespace RenX * @brief Bans a player from the server. * * @param player Data of the player to ban. + * @param length Duration of the ban (0 for permanent). */ - void banPlayer(const RenX::PlayerInfo *player); + void banPlayer(const RenX::PlayerInfo *player, time_t length = 0); /** * @brief Removes a player's data based on their ID number. @@ -523,6 +525,11 @@ namespace RenX time_t delay; int steamFormat; /** 16 = hex, 10 = base 10, 8 = octal, -2 = SteamID 2, -3 = SteamID 3 */ unsigned int uuidMode; /** 0 = steam, 1 = nickname */ + bool rconBan; + bool localBan; + bool localSteamBan; + bool localIPBan; + bool localNameBan; bool neverSay; Jupiter::TCPSocket sock; Jupiter::CStringS clientHostname;