diff --git a/src/Game/Enum/SessionSettingType.php b/src/Game/Enum/SessionSettingType.php index f55a3fc..1cdd428 100644 --- a/src/Game/Enum/SessionSettingType.php +++ b/src/Game/Enum/SessionSettingType.php @@ -11,4 +11,5 @@ enum SessionSettingType: string case RIGHTS_FOR_PLAYER2 = 'RightsForPlayer2'; case RIGHTS_FOR_PLAYER3 = 'RightsForPlayer3'; case INVITE_CODE = 'InviteCode'; + case SET_OF_DELETED_FILES = 'SetOfDeletedFiles'; } diff --git a/src/Game/Service/GameResponseService.php b/src/Game/Service/GameResponseService.php index 0dfccb6..78e8454 100644 --- a/src/Game/Service/GameResponseService.php +++ b/src/Game/Service/GameResponseService.php @@ -116,8 +116,13 @@ class GameResponseService case 'help': return ['result' => $this->getHelpCommand($rechten)]; case 'ls': + if(!in_array('ls', $rechten)) + return ['result' => ['Unknown command']]; break; case 'cd': + if(!in_array('cd', $rechten)) + return ['result' => ['Unknown command']]; + $pwd = $this->playerService->getCurrentPwdOfPlayer($player); if(!$pwd) return ['result' => ['Unknown command']]; @@ -129,12 +134,39 @@ class GameResponseService $this->playerService->saveCurrentPwdOfPlayer($player, $newLocation); return ['result' => ['Path: ' . $newLocation]]; case 'pwd': + if(!in_array('pwd', $rechten)) + return ['result' => ['Unknown command']]; + $pwd = $this->playerService->getCurrentPwdOfPlayer($player); return ['result' => ['Path: ' . $pwd]]; case 'rm': - break; + if(!in_array('rm', $rechten)) + return ['result' => ['Unknown command']]; + + $pwd = $this->playerService->getCurrentPwdOfPlayer($player); + if(!$pwd) + return ['result' => ['Unknown command']]; + + if (!isset($messagePart[1])) { + return ['result' => ['Usage: rm {filename}']]; + } + + $filename = $messagePart[1]; + $fullPath = ($pwd === '/' ? '' : $pwd) . '/' . $filename; + + if(!$this->isAllowedToRemove($fullPath, $player, $sudo)) + return ['result' => ['You are not allowed to remove this file.']]; + + $this->playerService->addDeletedFileToSession($player, $fullPath); + return ['result' => ['File removed: ' . $filename]]; case 'sudo': - break; + if(!in_array('sudo', $rechten)) + return ['result' => ['Unknown command']]; + + $sudo = array_shift($messagePart); + $message = implode(' ', $messagePart); + + return $this->checkConsoleCommando($message, $player, true); default: return ['result' => ['Unknown command']]; } @@ -376,4 +408,69 @@ class GameResponseService return $paths; } + + private function isAllowedToRemove(string $file, Player $player, bool $sudo) : bool + { + if(!$this->fileExists($file)) + return false; + + if(str_starts_with($file, '/var/rapports/')) + return false; + + $rights = $this->getRechten($player); + + if(in_array('sudo', $rights) || $sudo) + return true; + + $sudoFiles = [ + '/var/arrest/handle.sh', + '/var/arrest/cell.sh', + '/var/marriage/divorce.sh', + ]; + + return !in_array($file, $sudoFiles); + } + + private function fileExists(string $file) + { + $files = $this->getAllPossibleFiles(); + + if(in_array($file, $files)) + return true; + + return false; + } + + private function getAllPossibleFiles() + { + $files = []; + + $files[] = '/var/arrest/handle.sh'; + $files[] = '/var/arrest/bars.sh'; + $files[] = '/var/arrest/cell.sh'; + $files[] = '/var/marriage/share.sh'; + $files[] = '/var/marriage/divorce.sh'; + $files[] = '/var/rapports/095_07-14.txt'; + $files[] = '/var/rapports/007_19-52.txt'; + $files[] = '/var/rapports/083_25-39.txt'; + $files[] = '/var/rapports/019_31-11.txt'; + $files[] = '/var/rapports/075_46-77.txt'; + $files[] = '/var/rapports/031_53-28.txt'; + $files[] = '/var/rapports/072_61-05.txt'; + $files[] = '/var/rapports/064_72-90.txt'; + $files[] = '/var/rapports/091_81-33.txt'; + $files[] = '/var/rapports/079_89-47.txt'; + $files[] = '/var/rapports/098_92-14.txt'; + $files[] = '/var/rapports/012_94-31.txt'; + $files[] = '/var/rapports/016_98-07.txt'; + $files[] = '/var/rapports/087_102-45.txt'; + $files[] = '/var/rapports/094_110-19.txt'; + $files[] = '/var/rapports/063_117-56.txt'; + $files[] = '/var/rapports/017_123-88.txt'; + $files[] = '/var/rapports/093_138-24.txt'; + $files[] = '/var/rapports/001_145-93.txt'; + $files[] = '/var/rapports/index.txt'; + + return $files; + } } diff --git a/src/Game/Service/PlayerService.php b/src/Game/Service/PlayerService.php index 23e8f5c..4f43c63 100644 --- a/src/Game/Service/PlayerService.php +++ b/src/Game/Service/PlayerService.php @@ -4,6 +4,7 @@ namespace App\Game\Service; use App\Game\Entity\Game; use App\Game\Entity\Player; +use App\Game\Entity\SessionSetting; use App\Game\Enum\SessionSettingType; use App\Game\Enum\SessionStatus; use App\Game\Repository\PlayerRepository; @@ -73,4 +74,33 @@ class PlayerService $this->entityManager->persist($setting); $this->entityManager->flush(); } + + public function getDeletedFilesOfSession(Player $player): array + { + $setting = $this->sessionSettingRepository->getSetting($player->getSession(), SessionSettingType::SET_OF_DELETED_FILES); + if (!$setting || !$setting->getValue()) { + return []; + } + + return json_decode($setting->getValue(), true) ?? []; + } + + public function addDeletedFileToSession(Player $player, string $filename): void + { + $setting = $this->sessionSettingRepository->getSetting($player->getSession(), SessionSettingType::SET_OF_DELETED_FILES); + if (!$setting) { + $setting = new SessionSetting(); + $setting->setSession($player->getSession()); + $setting->setName(SessionSettingType::SET_OF_DELETED_FILES); + } + + $deletedFiles = json_decode($setting->getValue() ?? '[]', true) ?? []; + if (!in_array($filename, $deletedFiles)) { + $deletedFiles[] = $filename; + $setting->setValue(json_encode($deletedFiles)); + + $this->entityManager->persist($setting); + $this->entityManager->flush(); + } + } }