From 1ae0f651d8cb96be70f310b47753335292756ce9 Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 8 Jan 2026 17:02:16 +0100 Subject: [PATCH] Most of the cat command --- src/Game/Enum/SessionSettingType.php | 3 + src/Game/Service/GameDashboardService.php | 2 +- src/Game/Service/GameResponseService.php | 192 +++++++++++++++++++++- 3 files changed, 189 insertions(+), 8 deletions(-) diff --git a/src/Game/Enum/SessionSettingType.php b/src/Game/Enum/SessionSettingType.php index da0c464..36279fb 100644 --- a/src/Game/Enum/SessionSettingType.php +++ b/src/Game/Enum/SessionSettingType.php @@ -57,4 +57,7 @@ enum SessionSettingType: string case VERIFICATION_PROGRESS_FOR_PLAYER9 = 'VerificationProgressForPlayer9'; case VERIFICATION_PROGRESS_FOR_PLAYER10 = 'VerificationProgressForPlayer10'; case EVERYONE_VERIFIED = 'EveryoneVerified'; + case SPECIAL_REPORT_CODE_DOYLE = 'SpecialReportCodeDoyle'; + case SPECIAL_REPORT_CODE_VEGA = 'SpecialReportCodeVega'; + case SPECIAL_REPORT_CODE_LENNOX = 'SpecialReportCodeLennox'; } diff --git a/src/Game/Service/GameDashboardService.php b/src/Game/Service/GameDashboardService.php index 543ca07..efa2887 100644 --- a/src/Game/Service/GameDashboardService.php +++ b/src/Game/Service/GameDashboardService.php @@ -183,7 +183,7 @@ final class GameDashboardService $setting->setSession($player->getSession()); $setting->setPlayer($player); $setting->setName($pwdSettingName); - $setting->setValue('home/' . $player->getUser()->getUserIdentifier()); + $setting->setValue('var/home/' . $player->getUser()->getUsername()); $this->entityManager->persist($setting); } diff --git a/src/Game/Service/GameResponseService.php b/src/Game/Service/GameResponseService.php index d4bd1ae..cacee9d 100644 --- a/src/Game/Service/GameResponseService.php +++ b/src/Game/Service/GameResponseService.php @@ -133,6 +133,15 @@ class GameResponseService $this->playerService->saveCurrentPwdOfPlayer($player, $newLocation); return ['result' => ['Path: ' . $newLocation]]; + case 'cat': + if(!in_array('cat', $rechten)) + return ['result' => ['Unknown command']]; + + $pwd = $this->playerService->getCurrentPwdOfPlayer($player); + + $fileContent = $this->getFileContent($player, $pwd.'/'.$messagePart[1]); + + return ['result' => $fileContent]; case 'pwd': if(!in_array('pwd', $rechten)) return ['result' => ['Unknown command']]; @@ -450,6 +459,30 @@ class GameResponseService return $randomString; } + private function generateSpecialCode(int $firstDigit, int $min, int $max): string + { + $code = $this->generateRandomString($min, $max); + + // Ensure the first numeric digit is the specified $firstDigit + $found = false; + $codeArray = str_split($code); + for ($i = 0; $i < count($codeArray); $i++) { + if (ctype_digit($codeArray[$i])) { + $codeArray[$i] = (string)$firstDigit; + $found = true; + break; + } + } + $code = implode('', $codeArray); + + // If no digit was found (highly unlikely given the character set), prepend it + if (!$found) { + $code = (string)$firstDigit . substr($code, 1); + } + + return $code; + } + private function handleVerifyMessage(string $message, Player $player) : string { $messageParts = explode(' ', $message); @@ -659,20 +692,20 @@ class GameResponseService $paths[] = '/etc/freak'; $paths[] = '/etc/host'; - $paths[] = '/home'; + $paths[] = '/var/home'; $playerNames = ['root', 'Luke', 'Charles', 'William', 'Peter']; $players = $player->getSession()->getPlayers(); - foreach($players as $player) { - $playerNames[] = $player->getUser()->getUsername(); + foreach($players as $p) { + $playerNames[] = $p->getUser()->getUsername(); } $playerNames = array_unique($playerNames); foreach($playerNames as $name) { - $paths[] = '/home/' . $name; + $paths[] = '/var/home/' . $name; } return $paths; @@ -738,12 +771,17 @@ class GameResponseService $files[] = '/var/rapports/017_123-88.txt'; $files[] = '/var/rapports/093_138-24.txt'; $files[] = '/var/rapports/001_145-93.txt'; + $files[] = '/var/rapports/011_130-62.txt'; $files[] = '/var/rapports/index.txt'; + if ($player === null) { + return $files; + } + $players = $player->getSession()->getPlayers(); - foreach($players as $player) { - $files[] = '/var/home/' . $player->getUser()->getUsername() . '/verifyCodes.txt'; + foreach($players as $p) { + $files[] = '/var/home/' . $p->getUser()->getUsername() . '/verifyCodes.txt'; } return $files; @@ -757,7 +795,7 @@ class GameResponseService } $allPaths = $this->getAllPossiblePaths($player); - $allFiles = $this->getAllPossibleFiles(); + $allFiles = $this->getAllPossibleFiles($player); $deletedFiles = $this->playerService->getDeletedFilesOfSession($player); $entries = []; @@ -792,4 +830,144 @@ class GameResponseService sort($entries); return $entries; } + + public function getFileContent(Player $player, string $file) : array + { + $allPossibleFiles = $this->getAllPossibleFiles($player); + if (!in_array($file, $allPossibleFiles)) { + return ['File does not exist']; + } + + if (str_ends_with($file, '.sh')) { + return ['It is not possible to read this file']; + } + + if (str_ends_with($file, 'verifyCodes.txt')) { + return $this->readVerificationFile($player, $file); + } + + $physicalPath = 'assets/game1/filesystem' . $file; + if (!file_exists($physicalPath)) { + return ['File does not exist']; + } + + $content = file($physicalPath); + if ($content === false) { + return ['Error reading file']; + } + + $specialFiles = [ + '/var/rapports/083_25-39.txt' => [ + 'setting' => SessionSettingType::SPECIAL_REPORT_CODE_DOYLE, + 'digit' => 1 + ], + '/var/rapports/019_31-11.txt' => [ + 'setting' => SessionSettingType::SPECIAL_REPORT_CODE_VEGA, + 'digit' => 2 + ], + '/var/rapports/011_130-62.txt' => [ + 'setting' => SessionSettingType::SPECIAL_REPORT_CODE_LENNOX, + 'digit' => 3 + ], + ]; + + if (isset($specialFiles[$file])) { + $everyoneVerifiedSetting = $this->sessionSettingRepository->getSetting($player->getSession(), SessionSettingType::EVERYONE_VERIFIED); + if ($everyoneVerifiedSetting && $everyoneVerifiedSetting->getValue() === 'true') { + $settingInfo = $specialFiles[$file]; + $codeSetting = $this->sessionSettingRepository->getSetting($player->getSession(), $settingInfo['setting']); + + if (!$codeSetting) { + $codeSetting = new SessionSetting(); + $codeSetting->setSession($player->getSession()); + $codeSetting->setName($settingInfo['setting']); + $codeSetting->setValue($this->generateSpecialCode($settingInfo['digit'], 75, 100)); + + $this->entityManager->persist($codeSetting); + $this->entityManager->flush(); + } + + $specialCode = $codeSetting->getValue(); + + $newContent = []; + foreach ($content as $line) { + $newContent[] = $line; + if (str_starts_with(trim($line), 'Date:')) { + $newContent[] = $specialCode . "\n"; + } + } + $content = $newContent; + } + } + + return $content; + } + + private function readVerificationFile(Player $player, string $file) + { + $parts = explode('/', $file); + $ownerUsername = $parts[3] ?? null; + + $ownerPlayer = null; + foreach ($player->getSession()->getPlayers() as $p) { + if ($p->getUser()->getUsername() === $ownerUsername) { + $ownerPlayer = $p; + break; + } + } + + if (!$ownerPlayer) { + return 'File does not exist'; + } + + $screen = $ownerPlayer->getScreen(); + $settingName = SessionSettingType::tryFrom('VerifyCodesForPlayer' . $screen); + + if (!$settingName) { + return 'Error: Invalid player screen.'; + } + + $setting = $this->sessionSettingRepository->getSetting($player->getSession(), $settingName, $ownerPlayer); + if (!$setting) { + $setting = new SessionSetting(); + $setting->setSession($player->getSession()); + $setting->setPlayer($ownerPlayer); + $setting->setName($settingName); + } + + $codes = json_decode($setting->getValue() ?? '[]', true) ?? []; + + $playerNames = ['Luke', 'Charles', 'William', 'Peter']; + foreach ($player->getSession()->getPlayers() as $p) { + $playerNames[] = $p->getUser()->getUsername(); + } + $playerNames = array_unique($playerNames); + sort($playerNames); + + $content = []; + + $content[] = "Verification codes:"; + $content[] = ""; + + foreach ($playerNames as $name) { + $key = null; + foreach ($player->getSession()->getPlayers() as $p) { + if ($p->getUser()->getUsername() === $name) { + $key = (string)$p->getScreen(); + break; + } + } + if ($key === null) { + $key = $name; + } + + if (!isset($codes[$key])) { + $codes[$key] = bin2hex(random_bytes(3)); + } + + $content[] = $name . ": " . $codes[$key] . "\n"; + } + + return $content; + } }