05.08.2013, 14:32 | #1 |
MaNGOS Dev
Регистрация: 11.03.2010
Сообщений: 468
Сказал(а) спасибо: 0
Поблагодарили 514 раз(а) в 163 сообщениях
|
BannedAddons
http://i.imgur.com/RRmpAMN.jpg
http://i.imgur.com/PziqhFd.jpg http://paste2.org/gDIZfIHs Код:
src/game/WorldSession.cpp | 51 ++++++++++++++++++++++++++++++----------------- src/game/WorldSession.h | 12 ++++++----- 2 files changed, 40 insertions(+), 23 deletions(-) diff --git a/src/game/WorldSession.cpp b/src/game/WorldSession.cpp index 12ea9fe..f6ec7a7 100644 --- a/src/game/WorldSession.cpp +++ b/src/game/WorldSession.cpp @@ -38,6 +38,7 @@ #include "SocialMgr.h" #include "Auth/AuthCrypt.h" #include "Auth/HMACSHA1.h" +#include <openssl/md5.h> #include "zlib/zlib.h" // select opcodes appropriate for processing in Map::Update context for current session state @@ -833,13 +834,13 @@ void WorldSession::ReadAddonsInfo(WorldPacket& data) if (uncompress(const_cast<uint8*>(addonInfo.contents()), &uSize, const_cast<uint8*>(data.contents() + pos), data.size() - pos) == Z_OK) { uint32 addonsCount; - addonInfo >> addonsCount; // addons count + addonInfo >> addonsCount; // addons count for (uint32 i = 0; i < addonsCount; ++i) { std::string addonName; - uint8 enabled; - uint32 crc, unk1; + uint8 has_pub_key; + uint32 pub_key_crc, url_crc; // check next addon data format correctness if (addonInfo.rpos() + 1 > addonInfo.size()) @@ -847,15 +848,15 @@ void WorldSession::ReadAddonsInfo(WorldPacket& data) addonInfo >> addonName; - addonInfo >> enabled >> crc >> unk1; + addonInfo >> has_pub_key >> pub_key_crc >> url_crc; - DEBUG_LOG("ADDON: Name: %s, Enabled: 0x%x, CRC: 0x%x, Unknown2: 0x%x", addonName.c_str(), enabled, crc, unk1); + DEBUG_LOG("ADDON: Name: %s, has_pub_key: 0x%x, pub_key_crc: 0x%x, url_crc: 0x%x", addonName.c_str(), has_pub_key, pub_key_crc, url_crc); - m_addonsList.push_back(AddonInfo(addonName, enabled, crc)); + m_addonsList.push_back(AddonInfo(addonName, has_pub_key, pub_key_crc, url_crc)); } - uint32 unk2; - addonInfo >> unk2; + uint32 bannedTimeStamp; + addonInfo >> bannedTimeStamp; // LatestBannedAddOnTimestamp if (addonInfo.rpos() != addonInfo.size()) DEBUG_LOG("packet under read!"); @@ -897,7 +898,7 @@ void WorldSession::SendAddonsInfo() data << uint8(unk1); if (unk1) { - uint8 unk2 = (itr->CRC != 0x4c1c776d); // If addon is Standard addon CRC + uint8 unk2 = (itr->pub_key_crc != 0x4c1c776d); // If addon is Standard addon CRC data << uint8(unk2); // if 1, than add addon public signature if (unk2) // if CRC is wrong, add public key (client need it) data.append(tdata, sizeof(tdata)); @@ -916,17 +917,31 @@ void WorldSession::SendAddonsInfo() m_addonsList.clear(); - uint32 count = 0; + uint32 count = 1; data << uint32(count); // BannedAddons count - /*for(uint32 i = 0; i < count; ++i) + for (uint32 i = 0; i < count; ++i) { - uint32 - string (16 bytes) - string (16 bytes) - uint32 - uint32 - uint32 - }*/ + data << uint32(1); // index + + MD5_CTX ctx; + + MD5_Init(&ctx); + const char *addon = "LFRAdvanced"; // sample addon name + MD5_Update(&ctx, addon, strlen(addon)); + uint8 name_hash[16]; + MD5_Final(name_hash, &ctx); + data.append(name_hash, 16); // Name MD5 (hash of addon's folder name) + + MD5_Init(&ctx); + const char *version = ""; // addon version, ie "1.0" + MD5_Update(&ctx, version, strlen(version)); + uint8 version_hash[16]; + MD5_Final(version_hash, &ctx); + data.append(version_hash, 16); // Version MD5 (hash of "Version" metadata from addon's .toc file, if present) + + data << uint32(time(NULL)); // ban timestamp + data << uint32(1); // state - should have low bit set! (client checks state & 1) + } SendPacket(&data); } diff --git a/src/game/WorldSession.h b/src/game/WorldSession.h index 19f40cd..ac1d6d3 100644 --- a/src/game/WorldSession.h +++ b/src/game/WorldSession.h @@ -77,16 +77,18 @@ struct AccountData struct AddonInfo { - AddonInfo(const std::string& name, uint8 enabled, uint32 crc) : + AddonInfo(const std::string& name, uint8 has_pub_key, uint32 pub_key_crc, uint32 url_crc) : Name(name), - Enabled(enabled), - CRC(crc) + has_pub_key(has_pub_key), + pub_key_crc(pub_key_crc), + url_crc(url_crc) { } std::string Name; - uint8 Enabled; - uint32 CRC; + uint8 has_pub_key; + uint32 pub_key_crc; + uint32 url_crc; }; typedef std::list<AddonInfo> AddonsList; Последний раз редактировалось TOM_RUS; 05.08.2013 в 20:43. |