From b11673088585e325a834866ffeeb7f8f242870a0 Mon Sep 17 00:00:00 2001 From: hg <4683435+hgtw@users.noreply.github.com> Date: Fri, 8 May 2020 16:32:16 -0400 Subject: [PATCH] Fix wrong group leader name in expedition requests Get group leader name from Client if possible and ask database otherwise Group::GetLeaderName() is unreliable and broken for groups formed across zones. The correct leader name is needed here to avoid any possible exploits with an invalid leader bypassing lockout checks. --- zone/expedition_request.cpp | 10 +++++++++- zone/expedition_request.h | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/zone/expedition_request.cpp b/zone/expedition_request.cpp index e123611cb..da6cce915 100644 --- a/zone/expedition_request.cpp +++ b/zone/expedition_request.cpp @@ -120,7 +120,8 @@ bool ExpeditionRequest::CanGroupRequest(Group* group) { m_leader = group->GetLeader()->CastToClient(); } - m_leader_name = group->GetLeaderName(); + // Group::GetLeaderName() is broken if group formed across zones, ask database instead + m_leader_name = m_leader ? m_leader->GetName() : GetGroupLeaderName(group->GetID()); // group->GetLeaderName(); m_leader_id = m_leader ? m_leader->CharacterID() : database.GetCharacterID(m_leader_name.c_str()); uint32_t count = 0; @@ -142,6 +143,13 @@ bool ExpeditionRequest::CanGroupRequest(Group* group) return ValidateMembers(query_member_names, count); } +std::string ExpeditionRequest::GetGroupLeaderName(uint32_t group_id) +{ + char leader_name_buffer[64] = { 0 }; + database.GetGroupLeadershipInfo(group_id, leader_name_buffer); + return std::string(leader_name_buffer); +} + bool ExpeditionRequest::ValidateMembers(const std::string& query_member_names, uint32_t member_count) { if (query_member_names.empty() || !LoadLeaderLockouts()) diff --git a/zone/expedition_request.h b/zone/expedition_request.h index 8cedf6392..864aa855a 100644 --- a/zone/expedition_request.h +++ b/zone/expedition_request.h @@ -58,6 +58,7 @@ private: bool CanRaidRequest(Raid* raid); bool CanGroupRequest(Group* group); bool CheckMembersForConflicts(MySQLRequestResult& results, bool is_solo); + std::string GetGroupLeaderName(uint32_t group_id); bool IsPlayerCountValidated(uint32_t member_count); bool LoadLeaderLockouts(); void SendLeaderMemberInExpedition(const std::string& member_name, bool is_solo);