Skip to content

Commit c42b052

Browse files
committed
Check string size in guild packets and name some unknowns.
Thanks to Giperion.
1 parent 3ea0ccc commit c42b052

5 files changed

Lines changed: 73 additions & 29 deletions

File tree

src/game/Guild/Guild.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -757,6 +757,16 @@ void Guild::Disband()
757757
sGuildMgr.RemoveGuild(m_Id);
758758
}
759759

760+
inline uint8 GetGuildRosterFlagsForPlayer(Player* pPlayer)
761+
{
762+
uint8 flags = GRF_ONLINE;
763+
if (pPlayer->IsAFK())
764+
flags |= GRF_AFK;
765+
if (pPlayer->IsDND())
766+
flags |= GRF_DND;
767+
return flags;
768+
}
769+
760770
void Guild::Roster(WorldSession* session /*= nullptr*/)
761771
{
762772
// we can only guess size
@@ -805,7 +815,7 @@ void Guild::Roster(WorldSession* session /*= nullptr*/)
805815
if (Player* pl = ObjectAccessor::FindPlayer(ObjectGuid(HIGHGUID_PLAYER, itr.first)))
806816
{
807817
data << pl->GetObjectGuid();
808-
data << uint8(1);
818+
data << uint8(GetGuildRosterFlagsForPlayer(pl));
809819
data << itr.second.Name;
810820
data << uint32(itr.second.RankId);
811821
data << uint8(pl->GetLevel());

src/game/Guild/Guild.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,14 @@
2727

2828
class Petition;
2929

30+
#define GUILD_EVENTLOG_MAX_RECORDS 100
3031
#define GUILD_RANKS_MIN_COUNT 5
3132
#define GUILD_RANKS_MAX_COUNT 10
3233

3334
enum
3435
{
36+
GUILD_RANK_MAX_LENGTH = 15,
37+
GUILD_NAME_MAX_LENGTH = 24,
3538
GUILD_NOTE_MAX_LENGTH = 31,
3639
GUILD_INFO_MAX_LENGTH = 500,
3740
GUILD_MOTD_MAX_LENGTH = 128,
@@ -127,12 +130,19 @@ enum GuildEvents
127130
GE_LEADER_CHANGED = 0x07,
128131
GE_DISBANDED = 0x08,
129132
GE_TABARDCHANGE = 0x09,
130-
GE_UNK1 = 0x0A, // string, string EVENT_GUILD_ROSTER_UPDATE tab content change?
131-
GE_UNK2 = 0x0B, // EVENT_GUILD_ROSTER_UPDATE
133+
GE_UPDATE_RANK_NAME = 0x0A, // Arg1: RankID, Arg2: NewRankName
134+
GE_UPDATE_ROSTER = 0x0B, // EVENT_GUILD_ROSTER_UPDATE
132135
GE_SIGNED_ON = 0x0C, // ERR_FRIEND_ONLINE_SS
133136
GE_SIGNED_OFF = 0x0D, // ERR_FRIEND_OFFLINE_S
134137
};
135138

139+
enum GuildRosterFlags
140+
{
141+
GRF_ONLINE = 0x01,
142+
GRF_AFK = 0x02,
143+
GRF_DND = 0x04
144+
};
145+
136146
enum PetitionSigns
137147
{
138148
PETITION_SIGN_OK = 0,

src/game/Handlers/GuildHandler.cpp

Lines changed: 49 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#include "GossipDef.h"
3232
#include "SocialMgr.h"
3333
#include "Language.h"
34+
#include "Anticheat.h"
3435

3536
void WorldSession::HandleGuildQueryOpcode(WorldPacket& recvPacket)
3637
{
@@ -60,6 +61,12 @@ void WorldSession::HandleGuildCreateOpcode(WorldPacket& recvPacket)
6061
return;
6162
}
6263

64+
if (gname.size() > GUILD_NAME_MAX_LENGTH)
65+
{
66+
ProcessAnticheatAction("PassiveAnticheat", "Attempt to set guild name to string longer than client limit.", CHEAT_ACTION_LOG | CHEAT_ACTION_REPORT_GMS | CHEAT_ACTION_KICK);
67+
return;
68+
}
69+
6370
Guild *guild = new Guild;
6471
if (!guild->Create(GetPlayer(), gname))
6572
{
@@ -72,17 +79,16 @@ void WorldSession::HandleGuildCreateOpcode(WorldPacket& recvPacket)
7279

7380
void WorldSession::HandleGuildInviteOpcode(WorldPacket& recvPacket)
7481
{
75-
std::string Invitedname, plname;
76-
Player* player = nullptr;
77-
78-
recvPacket >> Invitedname;
82+
std::string invitedName;
83+
recvPacket >> invitedName;
7984

80-
if (normalizePlayerName(Invitedname))
81-
player = ObjectAccessor::FindPlayerByName(Invitedname.c_str());
85+
Player* player = nullptr;
86+
if (normalizePlayerName(invitedName))
87+
player = ObjectAccessor::FindPlayerByName(invitedName.c_str());
8288

8389
if (!player)
8490
{
85-
SendGuildCommandResult(GUILD_INVITE_S, Invitedname, ERR_GUILD_PLAYER_NOT_FOUND_S);
91+
SendGuildCommandResult(GUILD_INVITE_S, invitedName, ERR_GUILD_PLAYER_NOT_FOUND_S);
8692
return;
8793
}
8894

@@ -102,29 +108,26 @@ void WorldSession::HandleGuildInviteOpcode(WorldPacket& recvPacket)
102108
// OK result but not send invite
103109
if (player->GetSocial()->HasIgnore(GetPlayer()->GetObjectGuid()))
104110
{
105-
plname = player->GetName();
106-
SendGuildCommandResult(GUILD_INVITE_S, plname, ERR_GUILD_IGNORING_YOU_S);
111+
SendGuildCommandResult(GUILD_INVITE_S, invitedName, ERR_GUILD_IGNORING_YOU_S);
107112
return;
108113
}
109114

110115
// not let enemies sign guild charter
111116
if (!sWorld.getConfig(CONFIG_BOOL_ALLOW_TWO_SIDE_INTERACTION_GUILD) && player->GetTeam() != GetPlayer()->GetTeam())
112117
{
113-
SendGuildCommandResult(GUILD_INVITE_S, Invitedname, ERR_GUILD_NOT_ALLIED);
118+
SendGuildCommandResult(GUILD_INVITE_S, invitedName, ERR_GUILD_NOT_ALLIED);
114119
return;
115120
}
116121

117122
if (player->GetGuildId())
118123
{
119-
plname = player->GetName();
120-
SendGuildCommandResult(GUILD_INVITE_S, plname, ERR_ALREADY_IN_GUILD_S);
124+
SendGuildCommandResult(GUILD_INVITE_S, invitedName, ERR_ALREADY_IN_GUILD_S);
121125
return;
122126
}
123127

124128
if (player->GetGuildIdInvited())
125129
{
126-
plname = player->GetName();
127-
SendGuildCommandResult(GUILD_INVITE_S, plname, ERR_ALREADY_INVITED_TO_GUILD_S);
130+
SendGuildCommandResult(GUILD_INVITE_S, invitedName, ERR_ALREADY_INVITED_TO_GUILD_S);
128131
return;
129132
}
130133

@@ -134,7 +137,7 @@ void WorldSession::HandleGuildInviteOpcode(WorldPacket& recvPacket)
134137
return;
135138
}
136139

137-
sLog.Out(LOG_BASIC, LOG_LVL_DEBUG, "Player %s Invited %s to Join his Guild", GetPlayer()->GetName(), Invitedname.c_str());
140+
sLog.Out(LOG_BASIC, LOG_LVL_DEBUG, "Player %s Invited %s to Join his Guild", GetPlayer()->GetName(), invitedName.c_str());
138141

139142
player->SetGuildIdInvited(GetPlayer()->GetGuildId());
140143
// Put record into guildlog
@@ -493,7 +496,10 @@ void WorldSession::HandleGuildMOTDOpcode(WorldPacket& recvPacket)
493496
MOTD.clear();
494497

495498
if (MOTD.size() > GUILD_MOTD_MAX_LENGTH)
499+
{
500+
ProcessAnticheatAction("PassiveAnticheat", "Attempt to set guild motd to string longer than client limit.", CHEAT_ACTION_LOG | CHEAT_ACTION_REPORT_GMS | CHEAT_ACTION_KICK);
496501
return;
502+
}
497503

498504
Guild* guild = sGuildMgr.GetGuildById(GetPlayer()->GetGuildId());
499505
if (!guild)
@@ -542,7 +548,10 @@ void WorldSession::HandleGuildSetPublicNoteOpcode(WorldPacket& recvPacket)
542548

543549
recvPacket >> PNOTE;
544550
if (PNOTE.size() > GUILD_NOTE_MAX_LENGTH)
551+
{
552+
ProcessAnticheatAction("PassiveAnticheat", "Attempt to set guild player note to string longer than client limit.", CHEAT_ACTION_LOG | CHEAT_ACTION_REPORT_GMS | CHEAT_ACTION_KICK);
545553
return;
554+
}
546555

547556
slot->SetPNOTE(PNOTE);
548557

@@ -579,7 +588,10 @@ void WorldSession::HandleGuildSetOfficerNoteOpcode(WorldPacket& recvPacket)
579588

580589
recvPacket >> OFFNOTE;
581590
if (OFFNOTE.size() > GUILD_NOTE_MAX_LENGTH)
591+
{
592+
ProcessAnticheatAction("PassiveAnticheat", "Attempt to set guild officer note to string longer than client limit.", CHEAT_ACTION_LOG | CHEAT_ACTION_REPORT_GMS | CHEAT_ACTION_KICK);
582593
return;
594+
}
583595

584596
slot->SetOFFNOTE(OFFNOTE);
585597

@@ -588,7 +600,7 @@ void WorldSession::HandleGuildSetOfficerNoteOpcode(WorldPacket& recvPacket)
588600

589601
void WorldSession::HandleGuildRankOpcode(WorldPacket& recvPacket)
590602
{
591-
std::string rankname;
603+
std::string rankName;
592604
uint32 rankId;
593605
uint32 rights;
594606

@@ -609,9 +621,15 @@ void WorldSession::HandleGuildRankOpcode(WorldPacket& recvPacket)
609621

610622
recvPacket >> rankId;
611623
recvPacket >> rights;
612-
recvPacket >> rankname;
624+
recvPacket >> rankName;
625+
626+
if (rankName.size() > GUILD_RANK_MAX_LENGTH)
627+
{
628+
ProcessAnticheatAction("PassiveAnticheat", "Attempt to set guild rank name to string longer than client limit.", CHEAT_ACTION_LOG | CHEAT_ACTION_REPORT_GMS | CHEAT_ACTION_KICK);
629+
return;
630+
}
613631

614-
guild->SetRankName(rankId, rankname);
632+
guild->SetRankName(rankId, rankName);
615633

616634
if (rankId == GR_GUILDMASTER) // prevent loss leader rights
617635
rights = GR_RIGHT_ALL;
@@ -624,8 +642,14 @@ void WorldSession::HandleGuildRankOpcode(WorldPacket& recvPacket)
624642

625643
void WorldSession::HandleGuildAddRankOpcode(WorldPacket& recvPacket)
626644
{
627-
std::string rankname;
628-
recvPacket >> rankname;
645+
std::string rankName;
646+
recvPacket >> rankName;
647+
648+
if (rankName.size() > GUILD_RANK_MAX_LENGTH)
649+
{
650+
ProcessAnticheatAction("PassiveAnticheat", "Attempt to set guild rank name to string longer than client limit.", CHEAT_ACTION_LOG | CHEAT_ACTION_REPORT_GMS | CHEAT_ACTION_KICK);
651+
return;
652+
}
629653

630654
Guild* guild = sGuildMgr.GetGuildById(GetPlayer()->GetGuildId());
631655
if (!guild)
@@ -643,7 +667,7 @@ void WorldSession::HandleGuildAddRankOpcode(WorldPacket& recvPacket)
643667
if (guild->GetRanksSize() >= GUILD_RANKS_MAX_COUNT) // client not let create more 10 than ranks
644668
return;
645669

646-
guild->CreateRank(rankname, GR_RIGHT_GCHATLISTEN | GR_RIGHT_GCHATSPEAK);
670+
guild->CreateRank(rankName, GR_RIGHT_GCHATLISTEN | GR_RIGHT_GCHATSPEAK);
647671

648672
guild->Query(this);
649673
guild->Roster(); // broadcast for tab rights update
@@ -683,8 +707,12 @@ void WorldSession::HandleGuildChangeInfoTextOpcode(WorldPacket& recvPacket)
683707
{
684708
std::string GINFO;
685709
recvPacket >> GINFO;
710+
686711
if (GINFO.size() > GUILD_INFO_MAX_LENGTH)
712+
{
713+
ProcessAnticheatAction("PassiveAnticheat", "Attempt to set guild info to string longer than client limit.", CHEAT_ACTION_LOG | CHEAT_ACTION_REPORT_GMS | CHEAT_ACTION_KICK);
687714
return;
715+
}
688716

689717
Guild* guild = sGuildMgr.GetGuildById(GetPlayer()->GetGuildId());
690718
if (!guild)

src/game/SharedDefines.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1326,11 +1326,6 @@ enum PetDiet
13261326

13271327
#define CHAIN_SPELL_JUMP_RADIUS 10
13281328

1329-
// Max values for Guild
1330-
#define GUILD_EVENTLOG_MAX_RECORDS 100
1331-
#define GUILD_RANKS_MIN_COUNT 5
1332-
#define GUILD_RANKS_MAX_COUNT 10
1333-
13341329
enum AiReaction
13351330
{
13361331
AI_REACTION_ALERT = 0, // pre-aggro (used in client packet handler)

src/game/World.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
#include "AuctionHouseMgr.h"
4141
#include "ObjectMgr.h"
4242
#include "CreatureEventAIMgr.h"
43+
#include "Guild.h"
4344
#include "GuildMgr.h"
4445
#include "SpellMgr.h"
4546
#include "Chat.h"

0 commit comments

Comments
 (0)