feat(core): implement 31-bit safe petition_id for improved database integrity (#22774)

This commit is contained in:
Yehonal
2025-09-03 03:31:09 +02:00
committed by GitHub
parent 52f79d8dd7
commit a575101751
6 changed files with 130 additions and 30 deletions

View File

@@ -183,7 +183,9 @@ void WorldSession::HandlePetitionBuyOpcode(WorldPacket& recvData)
if (!charter)
return;
charter->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1, charter->GetGUID().GetCounter());
// Use a 31-bit safe petition id instead of the raw item guid
uint32 petitionId = sPetitionMgr->GeneratePetitionId();
charter->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1, petitionId);
// ITEM_FIELD_ENCHANTMENT_1_1 is guild/arenateam id
// ITEM_FIELD_ENCHANTMENT_1_1+1 is current signatures count (showed on item)
charter->SetState(ITEM_CHANGED, _player);
@@ -211,16 +213,18 @@ void WorldSession::HandlePetitionBuyOpcode(WorldPacket& recvData)
// xinef: petition pointer is invalid from now on
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PETITION);
stmt->SetData(0, _player->GetGUID().GetCounter());
stmt->SetData(1, charter->GetGUID().GetCounter());
stmt->SetData(2, name);
stmt->SetData(3, uint8(type));
// petition_id, ownerguid, petitionguid(item guid), name, type
stmt->SetData(0, petitionId);
stmt->SetData(1, _player->GetGUID().GetCounter());
stmt->SetData(2, charter->GetGUID().GetCounter());
stmt->SetData(3, name);
stmt->SetData(4, uint8(type));
trans->Append(stmt);
CharacterDatabase.CommitTransaction(trans);
// xinef: fill petition store
sPetitionMgr->AddPetition(charter->GetGUID(), _player->GetGUID(), name, uint8(type));
// xinef: fill petition store (include petitionId)
sPetitionMgr->AddPetition(charter->GetGUID(), _player->GetGUID(), name, uint8(type), petitionId);
}
void WorldSession::HandlePetitionShowSignOpcode(WorldPacket& recvData)
@@ -249,7 +253,7 @@ void WorldSession::HandlePetitionShowSignOpcode(WorldPacket& recvData)
WorldPacket data(SMSG_PETITION_SHOW_SIGNATURES, (8 + 8 + 4 + 1 + signs * 12));
data << petitionguid; // petition guid
data << _player->GetGUID(); // owner guid
data << uint32(petitionguid.GetCounter()); // guild guid
data << uint32(petition->petitionId); // guild/team id (31-bit safe)
data << uint8(signs); // sign's count
if (signs)
@@ -286,7 +290,7 @@ void WorldSession::SendPetitionQueryOpcode(ObjectGuid petitionguid)
uint8 type = petition->petitionType;
WorldPacket data(SMSG_PETITION_QUERY_RESPONSE, (4 + 8 + petition->petitionName.size() + 1 + 1 + 4 * 12 + 2 + 10));
data << uint32(petitionguid.GetCounter()); // guild/team guid (in Trinity always same as petition low guid
data << uint32(petition->petitionId); // guild/team id (was item low guid)
data << petition->ownerGuid; // charter owner guid
data << petition->petitionName; // name (guild/arena team)
data << uint8(0); // some string
@@ -373,7 +377,7 @@ void WorldSession::HandlePetitionRenameOpcode(WorldPacket& recvData)
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_PETITION_NAME);
stmt->SetData(0, newName);
stmt->SetData(1, petitionGuid.GetCounter());
stmt->SetData(1, petition->petitionId);
CharacterDatabase.Execute(stmt);
@@ -497,7 +501,7 @@ void WorldSession::HandlePetitionSignOpcode(WorldPacket& recvData)
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PETITION_SIGNATURE);
stmt->SetData(0, petition->ownerGuid.GetCounter());
stmt->SetData(1, petitionGuid.GetCounter());
stmt->SetData(1, petition->petitionId);
stmt->SetData(2, playerGuid.GetCounter());
stmt->SetData(3, GetAccountId());
@@ -625,7 +629,7 @@ void WorldSession::HandleOfferPetitionOpcode(WorldPacket& recvData)
WorldPacket data(SMSG_PETITION_SHOW_SIGNATURES, (8 + 8 + 4 + signs + signs * 12));
data << petitionguid; // petition guid
data << _player->GetGUID(); // owner guid
data << uint32(petitionguid.GetCounter()); // guild guid
data << uint32(petition->petitionId); // guild/team id (31-bit safe)
data << uint8(signs); // sign's count
if (signs)
@@ -790,12 +794,12 @@ void WorldSession::HandleTurnInPetitionOpcode(WorldPacket& recvData)
CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PETITION_BY_GUID);
stmt->SetData(0, petitionGuid.GetCounter());
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PETITION_BY_ID);
stmt->SetData(0, petition->petitionId);
trans->Append(stmt);
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PETITION_SIGNATURE_BY_GUID);
stmt->SetData(0, petitionGuid.GetCounter());
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PETITION_SIGNATURE_BY_ID);
stmt->SetData(0, petition->petitionId);
trans->Append(stmt);
CharacterDatabase.CommitTransaction(trans);