Don't regenerate a verify code when sent privately to its rightful owner

checkAndRegenerateVerifyCodes() regenerated a code on any message
containing it, regardless of who the message was sent to - so sharing
a code exactly as intended, via /chat {agent-id} {code} to the
correct recipient, still burned it immediately, making the puzzle
unsolvable. Now only broadcasts and messages sent to the wrong player
count as a leak.
This commit is contained in:
Frank
2026-08-18 21:47:21 +02:00
parent b0b357f99b
commit 1f35784c52
+14 -5
View File
@@ -431,12 +431,12 @@ class GameResponseService
$this->updateChatTracking($player, (int)$sendTo);
$this->checkAndRegenerateVerifyCodes($player, $chatMessage . ' ' . implode(' ', $messageParts));
$this->checkAndRegenerateVerifyCodes($player, $chatMessage . ' ' . implode(' ', $messageParts), (int)$sendTo);
return true;
}
private function checkAndRegenerateVerifyCodes(Player $player, string $messageContent): void
private function checkAndRegenerateVerifyCodes(Player $player, string $messageContent, int $sendTo): void
{
$screen = $player->getScreen();
$session = $player->getSession();
@@ -456,10 +456,19 @@ class GameResponseService
$regenerated = false;
foreach ($codes as $targetPlayerScreen => $code) {
if (str_contains($messageContent, (string)$code)) {
$codes[$targetPlayerScreen] = bin2hex(random_bytes(3));
$regenerated = true;
if (!str_contains($messageContent, (string)$code)) {
continue;
}
// Sending a code privately to its rightful recipient via /chat {agent-id}
// is the whole point of this puzzle - only a leak (broadcast, or sent to
// the wrong player) should regenerate it.
if ($sendTo === (int)$targetPlayerScreen) {
continue;
}
$codes[$targetPlayerScreen] = bin2hex(random_bytes(3));
$regenerated = true;
}
if ($regenerated) {