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:
@@ -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,11 +456,20 @@ class GameResponseService
|
||||
$regenerated = false;
|
||||
|
||||
foreach ($codes as $targetPlayerScreen => $code) {
|
||||
if (str_contains($messageContent, (string)$code)) {
|
||||
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) {
|
||||
$setting->setValue(json_encode($codes));
|
||||
|
||||
Reference in New Issue
Block a user