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->updateChatTracking($player, (int)$sendTo);
|
||||||
|
|
||||||
$this->checkAndRegenerateVerifyCodes($player, $chatMessage . ' ' . implode(' ', $messageParts));
|
$this->checkAndRegenerateVerifyCodes($player, $chatMessage . ' ' . implode(' ', $messageParts), (int)$sendTo);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function checkAndRegenerateVerifyCodes(Player $player, string $messageContent): void
|
private function checkAndRegenerateVerifyCodes(Player $player, string $messageContent, int $sendTo): void
|
||||||
{
|
{
|
||||||
$screen = $player->getScreen();
|
$screen = $player->getScreen();
|
||||||
$session = $player->getSession();
|
$session = $player->getSession();
|
||||||
@@ -456,10 +456,19 @@ class GameResponseService
|
|||||||
$regenerated = false;
|
$regenerated = false;
|
||||||
|
|
||||||
foreach ($codes as $targetPlayerScreen => $code) {
|
foreach ($codes as $targetPlayerScreen => $code) {
|
||||||
if (str_contains($messageContent, (string)$code)) {
|
if (!str_contains($messageContent, (string)$code)) {
|
||||||
$codes[$targetPlayerScreen] = bin2hex(random_bytes(3));
|
continue;
|
||||||
$regenerated = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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) {
|
if ($regenerated) {
|
||||||
|
|||||||
Reference in New Issue
Block a user