From 15130c502ea1223718a93bb11dd5edf11d2c9e05 Mon Sep 17 00:00:00 2001 From: JAJames Date: Thu, 12 May 2016 18:18:45 -0400 Subject: [PATCH] Finished HWID support --- Release/Plugins/RenX.Core.lib | Bin 201884 -> 201888 bytes RenX.Commands/RenX_Commands.cpp | 45 ++++++++++++++++++--------- RenX.Core/RenX_BanDatabase.cpp | 18 +++++++++-- RenX.Core/RenX_BanDatabase.h | 5 +-- RenX.Core/RenX_Server.cpp | 52 +++++++++++++++++++++----------- RenX.Core/RenX_Server.h | 1 + RenX.Core/RenX_Tags.cpp | 8 +++++ RenX.Core/RenX_Tags.h | 4 +++ RenX.Logging/RenX_Logging.cpp | 4 +-- 9 files changed, 99 insertions(+), 38 deletions(-) diff --git a/Release/Plugins/RenX.Core.lib b/Release/Plugins/RenX.Core.lib index 697b720f5d2bd26608c7a6cdc0ab9b90194f9228..e517467e513cabdf6e0a5683777b73dc665d44af 100644 GIT binary patch delta 18990 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 delta 19068 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::getName(), STRING_LITERAL_AS_REFERENCE("TBanTime"), 86400)); RenX_CommandsPlugin::playerInfoFormat = Jupiter::IRC::Client::Config->get(RenX_CommandsPlugin::getName(), STRING_LITERAL_AS_REFERENCE("PlayerInfoFormat"), STRING_LITERAL_AS_REFERENCE(IRCCOLOR "03[Player Info]" IRCCOLOR "{TCOLOR} Name: " IRCBOLD "{RNAME}" IRCBOLD " - ID: {ID} - Team: " IRCBOLD "{TEAML}" IRCBOLD " - Vehicle Kills: {VEHICLEKILLS} - Building Kills {BUILDINGKILLS} - Kills {KILLS} - Deaths: {DEATHS} - KDR: {KDR} - Access: {ACCESS}")); - RenX_CommandsPlugin::adminPlayerInfoFormat = Jupiter::IRC::Client::Config->get(RenX_CommandsPlugin::getName(), STRING_LITERAL_AS_REFERENCE("AdminPlayerInfoFormat"), Jupiter::StringS::Format("%.*s - IP: " IRCBOLD "{IP}" IRCBOLD " - RDNS: " IRCBOLD "{RDNS}" IRCBOLD " - Steam ID: " IRCBOLD "{STEAM}", RenX_CommandsPlugin::playerInfoFormat.size(), RenX_CommandsPlugin::playerInfoFormat.ptr())); + RenX_CommandsPlugin::adminPlayerInfoFormat = Jupiter::IRC::Client::Config->get(RenX_CommandsPlugin::getName(), STRING_LITERAL_AS_REFERENCE("AdminPlayerInfoFormat"), Jupiter::StringS::Format("%.*s - IP: " IRCBOLD "{IP}" IRCBOLD " - HWID: " IRCBOLD "{HWID}" IRCBOLD " - RDNS: " IRCBOLD "{RDNS}" IRCBOLD " - Steam ID: " IRCBOLD "{STEAM}", RenX_CommandsPlugin::playerInfoFormat.size(), RenX_CommandsPlugin::playerInfoFormat.ptr())); RenX_CommandsPlugin::buildingInfoFormat = Jupiter::IRC::Client::Config->get(RenX_CommandsPlugin::getName(), STRING_LITERAL_AS_REFERENCE("BuildingInfoFormat"), STRING_LITERAL_AS_REFERENCE(IRCCOLOR) + RenX::tags->buildingTeamColorTag + RenX::tags->buildingNameTag + STRING_LITERAL_AS_REFERENCE(IRCCOLOR " - " IRCCOLOR "07") + RenX::tags->buildingHealthPercentageTag + STRING_LITERAL_AS_REFERENCE("%")); RenX_CommandsPlugin::staffTitle = Jupiter::IRC::Client::Config->get(RenX_CommandsPlugin::getName(), STRING_LITERAL_AS_REFERENCE("StaffTitle"), STRING_LITERAL_AS_REFERENCE("Moderator")); @@ -1865,15 +1865,17 @@ void BanSearchIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString return true; case 2: // IP return entry->ip == params.asUnsignedInt(); - case 3: // RDNS + case 3: // HWID + return entry->hwid.equals(params); + case 4: // RDNS return entry->rdns.equals(params); - case 4: // STEAM + case 5: // STEAM return entry->steamid == params.asUnsignedLongLong(); - case 5: // NAME + case 6: // NAME return entry->name.equalsi(params); - case 6: // BANNER + case 7: // BANNER return entry->banner.equalsi(params); - case 7: // ACTIVE + case 8: // ACTIVE return params.asBool() == entry->is_active(); } }; @@ -1884,16 +1886,18 @@ void BanSearchIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString type = 1; else if (type_str.equalsi(STRING_LITERAL_AS_REFERENCE("ip"))) type = 2; - else if (type_str.equalsi(STRING_LITERAL_AS_REFERENCE("rdns"))) + else if (type_str.equalsi(STRING_LITERAL_AS_REFERENCE("hwid"))) type = 3; - else if (type_str.equalsi(STRING_LITERAL_AS_REFERENCE("steam"))) + else if (type_str.equalsi(STRING_LITERAL_AS_REFERENCE("rdns"))) type = 4; - else if (type_str.equalsi(STRING_LITERAL_AS_REFERENCE("name"))) + else if (type_str.equalsi(STRING_LITERAL_AS_REFERENCE("steam"))) type = 5; - else if (type_str.equalsi(STRING_LITERAL_AS_REFERENCE("banner"))) + else if (type_str.equalsi(STRING_LITERAL_AS_REFERENCE("name"))) type = 6; - else if (type_str.equalsi(STRING_LITERAL_AS_REFERENCE("active"))) + else if (type_str.equalsi(STRING_LITERAL_AS_REFERENCE("banner"))) type = 7; + else if (type_str.equalsi(STRING_LITERAL_AS_REFERENCE("active"))) + type = 8; else { type = 0; @@ -1935,9 +1939,9 @@ void BanSearchIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString types += ";"_jrs; } - out.format("ID: %lu (" IRCCOLOR "%sactive" IRCCOLOR "); Date: %s; IP: %.*s/%u; Steam: %llu; Types:%.*s Name: %.*s; Banner: %.*s", - i, entry->is_active() ? "12" : "04in", timeStr, ip_str.size(), ip_str.ptr(), entry->prefix_length, entry->steamid, types.size(), types.ptr(), - entry->name.size(), entry->name.ptr(), entry->banner.size(), entry->banner.ptr()); + out.format("ID: %lu (" IRCCOLOR "%sactive" IRCCOLOR "); Date: %s; IP: %.*s/%u; HWID: %.*s; Steam: %llu; Types:%.*s Name: %.*s; Banner: %.*s", + i, entry->is_active() ? "12" : "04in", timeStr, ip_str.size(), ip_str.ptr(), entry->prefix_length, entry->hwid.size(), entry->hwid.ptr(), entry->steamid, + types.size(), types.ptr(), entry->name.size(), entry->name.ptr(), entry->banner.size(), entry->banner.ptr()); if (entry->rdns.isNotEmpty()) { @@ -2119,6 +2123,7 @@ void AddBanIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString &c uint32_t ip = 0U; uint8_t prefix_length = 32U; uint64_t steamid = 0U; + Jupiter::ReferenceString hwid; Jupiter::StringS rdns; Jupiter::String banner = nick + "@IRC"_jrs; Jupiter::ReferenceString reason = "No reason"_jrs; @@ -2160,6 +2165,16 @@ void AddBanIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString &c steamid = Jupiter::ReferenceString::getWord(parameters, index++, ADDBAN_WHITESPACE).asUnsignedLongLong(); } + else if (word.equalsi("HWID"_jrs) || word.equalsi("HardwareID"_jrs)) + { + if (index == words) + { + source->sendNotice(nick, "ERROR: No value specified for token: "_jrs + word); + return; + } + + hwid = Jupiter::ReferenceString::getWord(parameters, index++, ADDBAN_WHITESPACE); + } else if (word.equalsi("RDNS"_jrs) || word.equalsi("DNS"_jrs)) { if (index == words) @@ -2232,7 +2247,7 @@ void AddBanIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString &c else flags |= RenX::BanDatabase::Entry::FLAG_USE_RDNS; - RenX::banDatabase->add(name, ip, prefix_length, steamid, rdns, banner, reason, duration, flags); + RenX::banDatabase->add(name, ip, prefix_length, steamid, hwid, rdns, banner, reason, duration, flags); RenX::getCore()->banCheck(); source->sendMessage(channel, Jupiter::StringS::Format("Ban added to the database with ID #%u", RenX::banDatabase->getEntries().size() - 1)); } diff --git a/RenX.Core/RenX_BanDatabase.cpp b/RenX.Core/RenX_BanDatabase.cpp index 5bb3050..b95553a 100644 --- a/RenX.Core/RenX_BanDatabase.cpp +++ b/RenX.Core/RenX_BanDatabase.cpp @@ -54,6 +54,8 @@ void RenX::BanDatabase::process_data(Jupiter::DataBuffer &buffer, FILE *file, fp entry->steamid = buffer.pop(); entry->ip = buffer.pop(); entry->prefix_length = buffer.pop(); + if (this->read_version >= 5U) + entry->hwid = buffer.pop(); entry->rdns = buffer.pop(); entry->name = buffer.pop(); entry->banner = buffer.pop(); @@ -93,6 +95,15 @@ void RenX::BanDatabase::process_file_finish(FILE *file) } return; } + else if (RenX::BanDatabase::read_version < RenX::BanDatabase::write_version) + { + if (freopen(RenX::BanDatabase::filename.c_str(), "wb", file) != nullptr) + { + this->create_header(file); + for (size_t index = 0; index != RenX::BanDatabase::entries.size(); ++index) + RenX::BanDatabase::write(RenX::BanDatabase::entries.get(index), file); + } + } fgetpos(file, std::addressof(RenX::BanDatabase::eof)); } @@ -103,7 +114,7 @@ void RenX::BanDatabase::upgrade_database() if (file != nullptr) { this->create_header(file); - for (size_t index = 0; RenX::BanDatabase::entries.size(); ++index) + for (size_t index = 0; index != RenX::BanDatabase::entries.size(); ++index) RenX::BanDatabase::write(RenX::BanDatabase::entries.get(index), file); fclose(file); @@ -133,6 +144,7 @@ void RenX::BanDatabase::write(RenX::BanDatabase::Entry *entry, FILE *file) buffer.push(entry->steamid); buffer.push(entry->ip); buffer.push(entry->prefix_length); + buffer.push(entry->hwid); buffer.push(entry->rdns); buffer.push(entry->name); buffer.push(entry->banner); @@ -165,6 +177,7 @@ void RenX::BanDatabase::add(RenX::Server *server, const RenX::PlayerInfo *player entry->steamid = player->steamid; entry->ip = player->ip32; entry->prefix_length = 32U; + entry->hwid = player->hwid; if (player->rdns_thread.joinable()) player->rdns_thread.join(); entry->rdns = player->rdns; @@ -183,7 +196,7 @@ void RenX::BanDatabase::add(RenX::Server *server, const RenX::PlayerInfo *player RenX::BanDatabase::write(entry); } -void RenX::BanDatabase::add(const Jupiter::ReadableString &name, uint32_t ip, uint8_t prefix_length, uint64_t steamid, const Jupiter::ReadableString &rdns, const Jupiter::ReadableString &banner, Jupiter::ReadableString &reason, std::chrono::seconds length, uint16_t flags) +void RenX::BanDatabase::add(const Jupiter::ReadableString &name, uint32_t ip, uint8_t prefix_length, uint64_t steamid, const Jupiter::ReadableString &hwid, const Jupiter::ReadableString &rdns, const Jupiter::ReadableString &banner, Jupiter::ReadableString &reason, std::chrono::seconds length, uint16_t flags) { Entry *entry = new Entry(); entry->set_active(); @@ -193,6 +206,7 @@ void RenX::BanDatabase::add(const Jupiter::ReadableString &name, uint32_t ip, ui entry->steamid = steamid; entry->ip = ip; entry->prefix_length = prefix_length; + entry->hwid = hwid; entry->rdns = rdns; entry->name = name; entry->banner = banner; diff --git a/RenX.Core/RenX_BanDatabase.h b/RenX.Core/RenX_BanDatabase.h index c6de7fd..2f2ef6a 100644 --- a/RenX.Core/RenX_BanDatabase.h +++ b/RenX.Core/RenX_BanDatabase.h @@ -86,6 +86,7 @@ namespace RenX uint64_t steamid /** SteamID of the banned player */; uint32_t ip /** IPv4 address of the banned player */; uint8_t prefix_length /** Prefix length for the IPv4 address block */; + Jupiter::StringS hwid; /** Hardware ID of the banned player */ Jupiter::StringS rdns /** RDNS of the banned player */; Jupiter::StringS name /** Name of the banned player */; Jupiter::StringS banner /** Name of the user who initiated the ban */; @@ -155,7 +156,7 @@ namespace RenX * @param reason Reason the player is getting banned * @param length Duration of the ban */ - void add(const Jupiter::ReadableString &name, uint32_t ip, uint8_t prefix_length, uint64_t steamid, const Jupiter::ReadableString &rdns, const Jupiter::ReadableString &banner, Jupiter::ReadableString &reason, std::chrono::seconds length, uint16_t flags = RenX::BanDatabase::Entry::FLAG_TYPE_GAME); + void add(const Jupiter::ReadableString &name, uint32_t ip, uint8_t prefix_length, uint64_t steamid, const Jupiter::ReadableString &hwid, const Jupiter::ReadableString &rdns, const Jupiter::ReadableString &banner, Jupiter::ReadableString &reason, std::chrono::seconds length, uint16_t flags = RenX::BanDatabase::Entry::FLAG_TYPE_GAME); /** * @brief Upgrades the ban database to the current write_version. @@ -211,7 +212,7 @@ namespace RenX private: /** Database version */ - const uint8_t write_version = 3U; + const uint8_t write_version = 5U; uint8_t read_version = write_version; fpos_t eof; diff --git a/RenX.Core/RenX_Server.cpp b/RenX.Core/RenX_Server.cpp index 5ce57a2..64d9d34 100644 --- a/RenX.Core/RenX_Server.cpp +++ b/RenX.Core/RenX_Server.cpp @@ -510,6 +510,7 @@ void RenX::Server::banCheck(RenX::PlayerInfo *player) if ((this->localSteamBan && entry->steamid != 0 && entry->steamid == player->steamid) || (this->localIPBan && entry->ip != 0 && (entry->ip & netmask) == (player->ip32 & netmask)) + || (this->localHWIDBan && entry->hwid.isNotEmpty() && entry->hwid.equals(player->hwid)) || (this->localRDNSBan && entry->rdns.isNotEmpty() && entry->is_rdns_ban() && player->rdns_thread.joinable() == false && player->rdns.match(entry->rdns)) || (this->localNameBan && entry->name.isNotEmpty() && entry->name.equalsi(player->name))) { @@ -700,7 +701,7 @@ bool RenX::Server::fetchClientList() { RenX::Server::lastClientListUpdate = std::chrono::steady_clock::now(); if (this->rconVersion >= 4) - return RenX::Server::sock.send(STRING_LITERAL_AS_REFERENCE("cclientvarlist KILLS DEATHS SCORE CREDITS CHARACTER VEHICLE PING ADMIN STEAM IP PLAYERLOG\n")) > 0 + return RenX::Server::sock.send(STRING_LITERAL_AS_REFERENCE("cclientvarlist KILLS DEATHS SCORE CREDITS CHARACTER VEHICLE PING ADMIN STEAM IP HWID PLAYERLOG\n")) > 0 && RenX::Server::sock.send(STRING_LITERAL_AS_REFERENCE("cbotvarlist KILLS DEATHS SCORE CREDITS CHARACTER VEHICLE PLAYERLOG\n")) > 0; else return RenX::Server::sock.send(STRING_LITERAL_AS_REFERENCE("cclientvarlist KILLS\xA0""DEATHS\xA0""SCORE\xA0""CREDITS\xA0""CHARACTER\xA0""VEHICLE\xA0""PING\xA0""ADMIN\xA0""STEAM\xA0""IP\xA0""PLAYERLOG\n")) > 0 @@ -1396,7 +1397,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) isBot = false; id = idToken.asInt(10); }; - auto getPlayerOrAdd = [&](const Jupiter::ReadableString &name, int id, RenX::TeamType team, bool isBot, uint64_t steamid, const Jupiter::ReadableString &ip) + auto getPlayerOrAdd = [&](const Jupiter::ReadableString &name, int id, RenX::TeamType team, bool isBot, uint64_t steamid, const Jupiter::ReadableString &ip, const Jupiter::ReadableString &hwid) { RenX::PlayerInfo *r = this->getPlayer(id); if (r == nullptr) @@ -1407,6 +1408,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) r->team = team; r->ip = ip; r->ip32 = Jupiter::Socket::pton4(Jupiter::CStringS(r->ip).c_str()); + r->hwid = hwid; if (this->resolvesRDNS() && r->ip32 != 0) { r->rdns_thread = std::thread(resolve_rdns, r); @@ -1447,6 +1449,11 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) } recalcUUID = true; } + if (r->hwid.isEmpty() && hwid.isNotEmpty()) + { + r->hwid = hwid; + recalcUUID = true; + } if (r->steamid == 0U && steamid != 0U) { r->steamid = steamid; @@ -1472,18 +1479,24 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) auto parseGetPlayerOrAdd = [&parsePlayerData, &getPlayerOrAdd](const Jupiter::ReadableString &token) { PARSE_PLAYER_DATA_P(token); - return getPlayerOrAdd(name, id, team, isBot, 0U, Jupiter::ReferenceString::empty); + return getPlayerOrAdd(name, id, team, isBot, 0U, Jupiter::ReferenceString::empty, Jupiter::ReferenceString::empty); }; - auto gotoToken = [&line, &tokens](size_t index) + auto gotoToken = [&line, &tokens, this](size_t index) { if (index >= tokens.token_count) return Jupiter::ReferenceString::empty; - size_t offset = index; + const char delim = this->getVersion() >= 4 ? RenX::DelimC : RenX::DelimC3; + const char *itr = line.ptr(); + while (index != 0) - offset += tokens.tokens[--index].size() + 1; + { + if (*itr == delim) + --index; + ++itr; + } - return Jupiter::ReferenceString::substring(line, offset); + return Jupiter::ReferenceString::substring(line, itr - line.ptr()); }; auto finished_connecting = [this, &xPlugins]() { @@ -1527,9 +1540,9 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) team = RenX::getTeam(teamToken); if (adminToken.equalsi("None"_jrs)) - getPlayerOrAdd(tokens.getToken(5), id, team, isBot, steamid, tokens.getToken(1)); + getPlayerOrAdd(tokens.getToken(5), id, team, isBot, steamid, tokens.getToken(1), Jupiter::ReferenceString::empty); else - getPlayerOrAdd(tokens.getToken(5), id, team, isBot, steamid, tokens.getToken(1))->adminType = adminToken; + getPlayerOrAdd(tokens.getToken(5), id, team, isBot, steamid, tokens.getToken(1), Jupiter::ReferenceString::empty)->adminType = adminToken; } } else if (this->lastCommand.equalsi("clientvarlist"_jrs)) @@ -1538,7 +1551,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) this->commandListFormat = tokens; else { - /* + /*e lRCON Command; Conn4 executed: clientvarlist PlayerLog Kills PlayerKills BotKills Deaths Score Credits Character BoundVehicle Vehicle Spy RemoteC4 ATMine KDR Ping Admin Steam IP ID Name Team TeamNum rPlayerLog Kills PlayerKills BotKills Deaths Score Credits Character BoundVehicle Vehicle Spy RemoteC4 ATMine KDR Ping Admin Steam IP ID Name Team TeamNum rGDI,256,EKT-J 0 0 0 0 0 5217.9629 Rx_FamilyInfo_GDI_Soldier   False 0 0 0.0000 8 None 0x0110000104AE0666 127.0.0.1 256 EKT-J GDI 0 @@ -1590,7 +1603,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) }; Jupiter::INIFile::Section::KeyValuePair *pair = table.getPair("PlayerLog"_jrs); if (pair != nullptr) - parse(getPlayerOrAdd(Jupiter::ReferenceString::getToken(pair->getValue(), 2, ','), Jupiter::ReferenceString::getToken(pair->getValue(), 1, ',').asInt(), RenX::getTeam(Jupiter::ReferenceString::getToken(pair->getValue(), 0, ',')), false, table.get("STEAM"_jrs).asUnsignedLongLong(), table.get("IP"_jrs))); + parse(getPlayerOrAdd(Jupiter::ReferenceString::getToken(pair->getValue(), 2, ','), Jupiter::ReferenceString::getToken(pair->getValue(), 1, ',').asInt(), RenX::getTeam(Jupiter::ReferenceString::getToken(pair->getValue(), 0, ',')), false, table.get("STEAM"_jrs).asUnsignedLongLong(), table.get("IP"_jrs), table.get("HWID"_jrs))); else { Jupiter::INIFile::Section::KeyValuePair *namePair = table.getPair("Name"_jrs); @@ -1608,6 +1621,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) } if (player->ip.isEmpty()) player->ip = table.get("IP"_jrs); + if (player->hwid.isEmpty()) + player->hwid = table.get("HWID"_jrs); if (player->steamid == 0) { uint64_t steamid = table.get("STEAM"_jrs).asUnsignedLongLong(); @@ -1640,6 +1655,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { if (player->ip.isEmpty()) player->ip = table.get("IP"_jrs); + if (player->hwid.isEmpty()) + player->hwid = table.get("HWID"_jrs); if (player->steamid == 0) { uint64_t steamid = table.get("STEAM"_jrs).asUnsignedLongLong(); @@ -1720,7 +1737,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) }; Jupiter::INIFile::Section::KeyValuePair *pair = table.getPair("PlayerLog"_jrs); if (pair != nullptr) - parse(getPlayerOrAdd(Jupiter::ReferenceString::getToken(pair->getValue(), 2, ','), Jupiter::ReferenceString::getToken(pair->getValue(), 1, ',').substring(1).asInt(), RenX::getTeam(Jupiter::ReferenceString::getToken(pair->getValue(), 0, ',')), true, 0ULL, Jupiter::ReferenceString::empty)); + parse(getPlayerOrAdd(Jupiter::ReferenceString::getToken(pair->getValue(), 2, ','), Jupiter::ReferenceString::getToken(pair->getValue(), 1, ',').substring(1).asInt(), RenX::getTeam(Jupiter::ReferenceString::getToken(pair->getValue(), 0, ',')), true, 0ULL, Jupiter::ReferenceString::empty, Jupiter::ReferenceString::empty)); else { Jupiter::INIFile::Section::KeyValuePair *namePair = table.getPair("Name"_jrs); @@ -2265,7 +2282,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) } else kID = kIDToken.asInt(); - RenX::PlayerInfo *killer = getPlayerOrAdd(kName, kID, vTeam, kIsBot, 0, Jupiter::ReferenceString::empty); + RenX::PlayerInfo *killer = getPlayerOrAdd(kName, kID, vTeam, kIsBot, 0, Jupiter::ReferenceString::empty, Jupiter::ReferenceString::empty); killer->kills++; if (damageType.equals("Rx_DmgType_Headshot")) killer->headshots++; @@ -2356,7 +2373,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) idToken.shiftRight(1); } id = idToken.asInt(); - RenX::PlayerInfo *player = getPlayerOrAdd(name, id, team, isBot, 0, Jupiter::ReferenceString::empty); + RenX::PlayerInfo *player = getPlayerOrAdd(name, id, team, isBot, 0, Jupiter::ReferenceString::empty, Jupiter::ReferenceString::empty); switch (type) { case RenX::ObjectType::Vehicle: @@ -2522,8 +2539,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) if (tokens.getToken(7).equals("steamid")) steamid = tokens.getToken(8).asUnsignedLongLong(); - player = getPlayerOrAdd(name, id, team, isBot, steamid, tokens.getToken(4)); - player->hwid = tokens.getToken(6); + player = getPlayerOrAdd(name, id, team, isBot, steamid, tokens.getToken(4), tokens.getToken(6)); } else { @@ -2531,7 +2547,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) if (tokens.getToken(5).equals("steamid")) steamid = tokens.getToken(6).asUnsignedLongLong(); - player = getPlayerOrAdd(name, id, team, isBot, steamid, tokens.getToken(4)); + player = getPlayerOrAdd(name, id, team, isBot, steamid, tokens.getToken(4), Jupiter::ReferenceString::empty); } if (steamid != 0ULL && default_ladder_database != nullptr && (player->ban_flags & RenX::BanDatabase::Entry::FLAG_TYPE_LADDER) == 0) @@ -2688,6 +2704,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) else for (size_t i = 0; i < xPlugins.size(); i++) xPlugins.get(i)->RenX_OnExecute(this, user, command); + if (this->rconUser.equals(user)) { this->lastCommand = cmd; @@ -3332,6 +3349,7 @@ void RenX::Server::init() RenX::Server::rconBan = Jupiter::IRC::Client::Config->getBool(RenX::Server::configSection, "RCONBan"_jrs, false); RenX::Server::localSteamBan = Jupiter::IRC::Client::Config->getBool(RenX::Server::configSection, "LocalSteamBan"_jrs, true); RenX::Server::localIPBan = Jupiter::IRC::Client::Config->getBool(RenX::Server::configSection, "LocalIPBan"_jrs, true); + RenX::Server::localHWIDBan = Jupiter::IRC::Client::Config->getBool(RenX::Server::configSection, "LocalHWIDBan"_jrs, true); RenX::Server::localRDNSBan = Jupiter::IRC::Client::Config->getBool(RenX::Server::configSection, "LocalRDNSBan"_jrs, false); RenX::Server::localNameBan = Jupiter::IRC::Client::Config->getBool(RenX::Server::configSection, "LocalNameBan"_jrs, false); RenX::Server::localBan = RenX::Server::localIPBan || RenX::Server::localRDNSBan || RenX::Server::localSteamBan || RenX::Server::localNameBan; diff --git a/RenX.Core/RenX_Server.h b/RenX.Core/RenX_Server.h index 8cb68b1..72696c3 100644 --- a/RenX.Core/RenX_Server.h +++ b/RenX.Core/RenX_Server.h @@ -1044,6 +1044,7 @@ namespace RenX bool localBan; bool localSteamBan; bool localIPBan; + bool localHWIDBan; bool localRDNSBan; bool localNameBan; bool neverSay; diff --git a/RenX.Core/RenX_Tags.cpp b/RenX.Core/RenX_Tags.cpp index af9f96d..558d1c8 100644 --- a/RenX.Core/RenX_Tags.cpp +++ b/RenX.Core/RenX_Tags.cpp @@ -89,6 +89,7 @@ TagsImp::TagsImp() this->INTERNAL_NAME_TAG = this->getUniqueInternalTag(); this->INTERNAL_RAW_NAME_TAG = this->getUniqueInternalTag(); this->INTERNAL_IP_TAG = this->getUniqueInternalTag(); + this->INTERNAL_HWID_TAG = this->getUniqueInternalTag(); this->INTERNAL_RDNS_TAG = this->getUniqueInternalTag(); this->INTERNAL_STEAM_TAG = this->getUniqueInternalTag(); this->INTERNAL_UUID_TAG = this->getUniqueInternalTag(); @@ -141,6 +142,7 @@ TagsImp::TagsImp() this->INTERNAL_VICTIM_NAME_TAG = this->getUniqueInternalTag(); this->INTERNAL_VICTIM_RAW_NAME_TAG = this->getUniqueInternalTag(); this->INTERNAL_VICTIM_IP_TAG = this->getUniqueInternalTag(); + this->INTERNAL_VICTIM_HWID_TAG = this->getUniqueInternalTag(); this->INTERNAL_VICTIM_RDNS_TAG = this->getUniqueInternalTag(); this->INTERNAL_VICTIM_STEAM_TAG = this->getUniqueInternalTag(); this->INTERNAL_VICTIM_UUID_TAG = this->getUniqueInternalTag(); @@ -273,6 +275,7 @@ TagsImp::TagsImp() this->nameTag = Jupiter::IRC::Client::Config->get(configSection, "NameTag"_jrs, "{NAME}"_jrs); this->rawNameTag = Jupiter::IRC::Client::Config->get(configSection, "RawNameTag"_jrs, "{RNAME}"_jrs); this->ipTag = Jupiter::IRC::Client::Config->get(configSection, "IPTag"_jrs, "{IP}"_jrs); + this->hwidTag = Jupiter::IRC::Client::Config->get(configSection, "HWIDTag"_jrs, "{HWID}"_jrs); this->rdnsTag = Jupiter::IRC::Client::Config->get(configSection, "RDNSTag"_jrs, "{RDNS}"_jrs); this->steamTag = Jupiter::IRC::Client::Config->get(configSection, "SteamTag"_jrs, "{STEAM}"_jrs); this->uuidTag = Jupiter::IRC::Client::Config->get(configSection, "UUIDTag"_jrs, "{UUID}"_jrs); @@ -325,6 +328,7 @@ TagsImp::TagsImp() this->victimNameTag = Jupiter::IRC::Client::Config->get(configSection, "VictimNameTag"_jrs, "{VNAME}"_jrs); this->victimRawNameTag = Jupiter::IRC::Client::Config->get(configSection, "VictimRawNameTag"_jrs, "{VRNAME}"_jrs); this->victimIPTag = Jupiter::IRC::Client::Config->get(configSection, "VictimIPTag"_jrs, "{VIP}"_jrs); + this->victimHWIDTag = Jupiter::IRC::Client::Config->get(configSection, "VictimHWIDTag"_jrs, "{VHWID}"_jrs); this->victimRDNSTag = Jupiter::IRC::Client::Config->get(configSection, "VictimRDNSTag"_jrs, "{VRDNS}"_jrs); this->victimSteamTag = Jupiter::IRC::Client::Config->get(configSection, "VictimSteamTag"_jrs, "{VSTEAM}"_jrs); this->victimUUIDTag = Jupiter::IRC::Client::Config->get(configSection, "VictimUUIDTag"_jrs, "{VUUID}"_jrs); @@ -474,6 +478,7 @@ void TagsImp::processTags(Jupiter::StringType &msg, const RenX::Server *server, PROCESS_TAG(this->INTERNAL_NAME_TAG, RenX::getFormattedPlayerName(player)); PROCESS_TAG(this->INTERNAL_RAW_NAME_TAG, player->name); PROCESS_TAG(this->INTERNAL_IP_TAG, player->ip); + PROCESS_TAG(this->INTERNAL_HWID_TAG, player->hwid); if (player->rdns_thread.joinable()) { PROCESS_TAG(this->INTERNAL_RDNS_TAG, RenX::rdns_pending); @@ -519,6 +524,7 @@ void TagsImp::processTags(Jupiter::StringType &msg, const RenX::Server *server, PROCESS_TAG(this->INTERNAL_VICTIM_NAME_TAG, RenX::getFormattedPlayerName(victim)); PROCESS_TAG(this->INTERNAL_VICTIM_RAW_NAME_TAG, victim->name); PROCESS_TAG(this->INTERNAL_VICTIM_IP_TAG, victim->ip); + PROCESS_TAG(this->INTERNAL_VICTIM_HWID_TAG, victim->hwid); if (victim->rdns_thread.joinable()) { PROCESS_TAG(this->INTERNAL_VICTIM_RDNS_TAG, RenX::rdns_pending); @@ -701,6 +707,7 @@ void TagsImp::sanitizeTags(Jupiter::StringType &fmt) fmt.replace(this->nameTag, this->INTERNAL_NAME_TAG); fmt.replace(this->rawNameTag, this->INTERNAL_RAW_NAME_TAG); fmt.replace(this->ipTag, this->INTERNAL_IP_TAG); + fmt.replace(this->hwidTag, this->INTERNAL_HWID_TAG); fmt.replace(this->rdnsTag, this->INTERNAL_RDNS_TAG); fmt.replace(this->steamTag, this->INTERNAL_STEAM_TAG); fmt.replace(this->uuidTag, this->INTERNAL_UUID_TAG); @@ -753,6 +760,7 @@ void TagsImp::sanitizeTags(Jupiter::StringType &fmt) fmt.replace(this->victimNameTag, this->INTERNAL_VICTIM_NAME_TAG); fmt.replace(this->victimRawNameTag, this->INTERNAL_VICTIM_RAW_NAME_TAG); fmt.replace(this->victimIPTag, this->INTERNAL_VICTIM_IP_TAG); + fmt.replace(this->victimHWIDTag, this->INTERNAL_VICTIM_HWID_TAG); fmt.replace(this->victimRDNSTag, this->INTERNAL_VICTIM_RDNS_TAG); fmt.replace(this->victimSteamTag, this->INTERNAL_VICTIM_STEAM_TAG); fmt.replace(this->victimUUIDTag, this->INTERNAL_VICTIM_UUID_TAG); diff --git a/RenX.Core/RenX_Tags.h b/RenX.Core/RenX_Tags.h index 78432c5..547d8c0 100644 --- a/RenX.Core/RenX_Tags.h +++ b/RenX.Core/RenX_Tags.h @@ -75,6 +75,7 @@ namespace RenX Jupiter::StringS INTERNAL_NAME_TAG; Jupiter::StringS INTERNAL_RAW_NAME_TAG; Jupiter::StringS INTERNAL_IP_TAG; + Jupiter::StringS INTERNAL_HWID_TAG; Jupiter::StringS INTERNAL_RDNS_TAG; Jupiter::StringS INTERNAL_STEAM_TAG; Jupiter::StringS INTERNAL_UUID_TAG; @@ -127,6 +128,7 @@ namespace RenX Jupiter::StringS INTERNAL_VICTIM_NAME_TAG; Jupiter::StringS INTERNAL_VICTIM_RAW_NAME_TAG; Jupiter::StringS INTERNAL_VICTIM_IP_TAG; + Jupiter::StringS INTERNAL_VICTIM_HWID_TAG; Jupiter::StringS INTERNAL_VICTIM_RDNS_TAG; Jupiter::StringS INTERNAL_VICTIM_STEAM_TAG; Jupiter::StringS INTERNAL_VICTIM_UUID_TAG; @@ -259,6 +261,7 @@ namespace RenX Jupiter::StringS nameTag; Jupiter::StringS rawNameTag; Jupiter::StringS ipTag; + Jupiter::StringS hwidTag; Jupiter::StringS rdnsTag; Jupiter::StringS steamTag; Jupiter::StringS uuidTag; @@ -311,6 +314,7 @@ namespace RenX Jupiter::StringS victimNameTag; Jupiter::StringS victimRawNameTag; Jupiter::StringS victimIPTag; + Jupiter::StringS victimHWIDTag; Jupiter::StringS victimRDNSTag; Jupiter::StringS victimSteamTag; Jupiter::StringS victimUUIDTag; diff --git a/RenX.Logging/RenX_Logging.cpp b/RenX.Logging/RenX_Logging.cpp index 26ce9d0..e69de2a 100644 --- a/RenX.Logging/RenX_Logging.cpp +++ b/RenX.Logging/RenX_Logging.cpp @@ -115,10 +115,10 @@ void RenX_LoggingPlugin::init() Jupiter::StringS::Format(IRCCOLOR "12[Join] " IRCBOLD "%.*s" IRCBOLD " joined the game fighting for the %.*s!", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->teamLongTag.size(), RenX::tags->teamLongTag.ptr())); RenX_LoggingPlugin::joinAdminFmt = Jupiter::IRC::Client::Config->get(this->getName(), "JoinAdminFormat"_jrs, - Jupiter::StringS::Format(IRCCOLOR "12[Join] " IRCBOLD "%.*s" IRCBOLD " joined the game fighting for the %.*s from " IRCBOLD "%.*s" IRCBOLD " using Steam ID " IRCBOLD "%.*s" IRCBOLD ".", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->teamLongTag.size(), RenX::tags->teamLongTag.ptr(), RenX::tags->ipTag.size(), RenX::tags->ipTag.ptr(), RenX::tags->steamTag.size(), RenX::tags->steamTag.ptr())); + Jupiter::StringS::Format(IRCCOLOR "12[Join] " IRCBOLD "%.*s" IRCBOLD " joined the game fighting for the %.*s from " IRCBOLD "%.*s" IRCBOLD " using Steam ID " IRCBOLD "%.*s" IRCBOLD ". HWID: \"" IRCBOLD "%.*s" IRCBOLD "\"", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->teamLongTag.size(), RenX::tags->teamLongTag.ptr(), RenX::tags->ipTag.size(), RenX::tags->ipTag.ptr(), RenX::tags->steamTag.size(), RenX::tags->steamTag.ptr(), RenX::tags->hwidTag.size(), RenX::tags->hwidTag.ptr())); RenX_LoggingPlugin::joinNoSteamAdminFmt = Jupiter::IRC::Client::Config->get(this->getName(), "JoinNoSteamAdminFormat"_jrs, - Jupiter::StringS::Format(IRCCOLOR "12[Join] " IRCBOLD "%.*s" IRCBOLD " joined the game fighting for the %.*s from " IRCBOLD "%.*s" IRCBOLD ", but is " IRCBOLD "not" IRCBOLD " using Steam.", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->teamLongTag.size(), RenX::tags->teamLongTag.ptr(), RenX::tags->ipTag.size(), RenX::tags->ipTag.ptr())); + Jupiter::StringS::Format(IRCCOLOR "12[Join] " IRCBOLD "%.*s" IRCBOLD " joined the game fighting for the %.*s from " IRCBOLD "%.*s" IRCBOLD ", but is " IRCBOLD "not" IRCBOLD " using Steam. HWID: \"" IRCBOLD "%.*s" IRCBOLD "\"", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->teamLongTag.size(), RenX::tags->teamLongTag.ptr(), RenX::tags->ipTag.size(), RenX::tags->ipTag.ptr(), RenX::tags->hwidTag.size(), RenX::tags->hwidTag.ptr())); RenX_LoggingPlugin::partFmt = Jupiter::IRC::Client::Config->get(this->getName(), "PartFormat"_jrs, Jupiter::StringS::Format(IRCCOLOR "12[Part] " IRCBOLD "%.*s" IRCBOLD " left the %.*s.", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->teamLongTag.size(), RenX::tags->teamLongTag.ptr()));