mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-11-05 01:23:24 -08:00
[Server] Apply card art rules to playmats (#7532)
* [Server] Apply card art rules to playmats Card art DENY rules were only enforced for user card art (SetCardArtParams) while playmats using the same art bypassed them. Move the rule lookup to Servatrice_DatabaseInterface::isCardArtAllowed with a default-allow base on Server_DatabaseInterface, delegate the session check to it, reject DENY-listed Command_SetPlaymat with RespFunctionNotAllowed, and strip DENY-listed deck playmats on DeckSelect so banned art is never broadcast. * [Server] Address review nits on playmat card art rules --------- Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
This commit is contained in:
parent
bbe438b09a
commit
b11b096828
6 changed files with 55 additions and 22 deletions
|
|
@ -257,6 +257,19 @@ Server_Player::cmdDeckSelect(const Command_DeckSelect &cmd, ResponseContainer &r
|
|||
return Response::RespInternalError;
|
||||
}
|
||||
|
||||
// Card art rules apply to playmats as well: never broadcast a DENY-listed
|
||||
// printing as a playmat. Stripping keeps the deck selectable while hiding
|
||||
// the banned art from all clients.
|
||||
const auto deckPlaymat = newDeck->getPlaymat();
|
||||
if (!deckPlaymat.card.name.isEmpty()) {
|
||||
auto *db = game->getRoom()->getServer()->getDatabaseInterface();
|
||||
// Check the truncated values actually broadcast below; the rule columns are varchar(255).
|
||||
if (db && !db->isCardArtAllowed(deckPlaymat.card.name.left(MAX_NAME_LENGTH),
|
||||
deckPlaymat.card.providerId.left(MAX_NAME_LENGTH))) {
|
||||
newDeck->setPlaymat({});
|
||||
}
|
||||
}
|
||||
|
||||
delete deck;
|
||||
deck = newDeck;
|
||||
sideboardLocked = true;
|
||||
|
|
@ -631,6 +644,14 @@ Server_Player::cmdSetPlaymat(const Command_SetPlaymat &cmd, ResponseContainer &r
|
|||
if (rawName.length() > MAX_NAME_LENGTH || rawProviderId.length() > MAX_NAME_LENGTH) {
|
||||
return Response::RespInvalidData;
|
||||
}
|
||||
// Card art rules apply to playmats as well: reject DENY-listed art, like
|
||||
// cmdSetCardArtParams does. Empty clears the playmat and is always allowed.
|
||||
if (!rawName.isEmpty()) {
|
||||
auto *db = game->getRoom()->getServer()->getDatabaseInterface();
|
||||
if (db && !db->isCardArtAllowed(rawName, rawProviderId)) {
|
||||
return Response::RespFunctionNotAllowed;
|
||||
}
|
||||
}
|
||||
PlaymatInfo playmat;
|
||||
playmat.card.name = rawName;
|
||||
playmat.card.providerId = rawProviderId;
|
||||
|
|
|
|||
|
|
@ -188,6 +188,16 @@ public:
|
|||
virtual void setForcePasswordChange(const QString & /* user */, bool /* force */)
|
||||
{
|
||||
}
|
||||
/**
|
||||
* @brief Whether the given card art may be shown (card art rules).
|
||||
*
|
||||
* Default allows everything; the real server overrides this with a lookup
|
||||
* in {prefix}_card_art_name_rules. Empty names are always allowed (clear path).
|
||||
*/
|
||||
virtual bool isCardArtAllowed(const QString & /* cardName */, const QString & /* providerId */)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue