diff options
| author | polo <ordipolo@gmx.fr> | 2026-03-24 22:39:29 +0100 |
|---|---|---|
| committer | polo <ordipolo@gmx.fr> | 2026-03-24 22:40:33 +0100 |
| commit | 3b369122645b07b290f7fcc7bccb4787745cd5ea (patch) | |
| tree | 3f9c2d1fbd5fe8b26162202e9b1e6cd5c8a940f6 /src/controller | |
| parent | a70dee9b5021a137ae07041c38921553442b0c11 (diff) | |
| download | cms-3b369122645b07b290f7fcc7bccb4787745cd5ea.tar.gz cms-3b369122645b07b290f7fcc7bccb4787745cd5ea.tar.bz2 cms-3b369122645b07b290f7fcc7bccb4787745cd5ea.zip | |
mode maintenance, optimisation moins de contrôles en mode run, dossier service et déplacement fichiers, sessions et entité User préparées à l'implémentation hypothétique des rôles, entité AppMetadata, meilleure sécurité de fillStartingDatabase
Diffstat (limited to 'src/controller')
| -rw-r--r-- | src/controller/UserController.php | 65 | ||||
| -rw-r--r-- | src/controller/ViewController.php | 6 |
2 files changed, 34 insertions, 37 deletions
diff --git a/src/controller/UserController.php b/src/controller/UserController.php index f3c99e7..6928e86 100644 --- a/src/controller/UserController.php +++ b/src/controller/UserController.php | |||
| @@ -22,14 +22,12 @@ class UserController | |||
| 22 | // account | 22 | // account |
| 23 | static public function existUsers(EntityManager $entityManager): bool | 23 | static public function existUsers(EntityManager $entityManager): bool |
| 24 | { | 24 | { |
| 25 | $nb_users = $entityManager | 25 | if(!$entityManager // table vide |
| 26 | ->createQuery('SELECT COUNT(u.id_user) FROM App\Entity\User u') | 26 | ->createQuery("SELECT u FROM App\Entity\User u") |
| 27 | ->getSingleScalarResult(); | 27 | ->setMaxResults(1) |
| 28 | 28 | ->getOneOrNullResult()) | |
| 29 | if($nb_users === 0) // table vide | ||
| 30 | { | 29 | { |
| 31 | $_SESSION['user'] = ''; | 30 | unset($_SESSION['user']); |
| 32 | $_SESSION['admin'] = false; | ||
| 33 | return false; | 31 | return false; |
| 34 | } | 32 | } |
| 35 | else{ | 33 | else{ |
| @@ -38,7 +36,7 @@ class UserController | |||
| 38 | } | 36 | } |
| 39 | 37 | ||
| 40 | // account | 38 | // account |
| 41 | static public function createUser(EntityManager $entityManager) | 39 | static public function createAdminUser(EntityManager $entityManager) |
| 42 | { | 40 | { |
| 43 | unset($_SESSION['user']); | 41 | unset($_SESSION['user']); |
| 44 | 42 | ||
| @@ -48,7 +46,7 @@ class UserController | |||
| 48 | $error = ''; | 46 | $error = ''; |
| 49 | if($form->validate()){ | 47 | if($form->validate()){ |
| 50 | $password = password_hash($_POST['password'], PASSWORD_DEFAULT); | 48 | $password = password_hash($_POST['password'], PASSWORD_DEFAULT); |
| 51 | $user = new App\Entity\User($_POST['login'], $password); | 49 | $user = new User($_POST['login'], 'admin', $password); |
| 52 | $entityManager->persist($user); | 50 | $entityManager->persist($user); |
| 53 | $entityManager->flush(); | 51 | $entityManager->flush(); |
| 54 | } | 52 | } |
| @@ -64,31 +62,34 @@ class UserController | |||
| 64 | die; | 62 | die; |
| 65 | } | 63 | } |
| 66 | 64 | ||
| 65 | // account | ||
| 66 | //static public function createUser(EntityManager $entityManager){} | ||
| 67 | |||
| 67 | // auth | 68 | // auth |
| 68 | static public function connect(EntityManager $entityManager): void | 69 | static public function connect(EntityManager $entityManager): void |
| 69 | { | 70 | { |
| 70 | if($_SESSION['admin']) // déjà connecté? | 71 | if(IS_ADMIN) // déjà connecté? |
| 71 | { | 72 | { |
| 72 | header('Location: ' . new URL); | 73 | header('Location: ' . new URL); |
| 73 | die; | 74 | die; |
| 74 | } | 75 | } |
| 75 | $_SESSION['user'] = ''; | 76 | unset($_SESSION['user']); |
| 76 | $_SESSION['admin'] = false; | ||
| 77 | 77 | ||
| 78 | $form = new FormValidation($_POST, 'connection'); | 78 | $form = new FormValidation($_POST, 'connection'); |
| 79 | 79 | ||
| 80 | $error = ''; | 80 | $error = ''; |
| 81 | if($form->validate()){ | 81 | if($form->validate()){ |
| 82 | // à mettre dans une classe métier UserService, Authentication, AuthService? | 82 | // à mettre dans une classe métier UserService, Authentication, AuthService? |
| 83 | $user = self::getUser($_POST['login'], $entityManager); | 83 | $user = self::getUserByName($_POST['login'], $entityManager); |
| 84 | if(!empty($user) && $_POST['login'] === $user->getLogin() && password_verify($_POST['password'], $user->getPassword())) | 84 | if(!empty($user) && $_POST['login'] === $user->getLogin() && password_verify($_POST['password'], $user->getPassword())) |
| 85 | { | 85 | { |
| 86 | $log = new Log(true); | 86 | $log = new Log(true); |
| 87 | 87 | ||
| 88 | // protection fixation de session, si l'attaquant crée un cookie de session, il est remplacé | 88 | // protection fixation de session, si l'attaquant crée un cookie de session, il est remplacé |
| 89 | session_regenerate_id(true); | 89 | session_regenerate_id(true); |
| 90 | $_SESSION['user'] = $_POST['login']; | 90 | $_SESSION['user']['id'] = $user->getId(); |
| 91 | $_SESSION['admin'] = true; | 91 | $_SESSION['user']['username'] = $user->getLogin(); |
| 92 | $_SESSION['user']['role'] = $user->getRole(); | ||
| 92 | 93 | ||
| 93 | EmailService::cleanEmails($entityManager); | 94 | EmailService::cleanEmails($entityManager); |
| 94 | 95 | ||
| @@ -123,7 +124,7 @@ class UserController | |||
| 123 | static public function disconnect(): void | 124 | static public function disconnect(): void |
| 124 | { | 125 | { |
| 125 | // nettoyage complet | 126 | // nettoyage complet |
| 126 | $_SESSION = []; // mémoire vive | 127 | unset($_SESSION['user']); // mémoire vive |
| 127 | session_destroy(); // fichier côté serveur | 128 | session_destroy(); // fichier côté serveur |
| 128 | setcookie('PHPSESSID', '', time() - 86400, '/'); // cookie de session | 129 | setcookie('PHPSESSID', '', time() - 86400, '/'); // cookie de session |
| 129 | 130 | ||
| @@ -138,7 +139,7 @@ class UserController | |||
| 138 | // user | 139 | // user |
| 139 | static public function updateUsername(EntityManager $entityManager): void | 140 | static public function updateUsername(EntityManager $entityManager): void |
| 140 | { | 141 | { |
| 141 | if(!$_SESSION['admin']){ // superflux, fait dans le routeur | 142 | if(!IS_ADMIN){ // superflux, fait dans le routeur |
| 142 | self::disconnect(); | 143 | self::disconnect(); |
| 143 | } | 144 | } |
| 144 | 145 | ||
| @@ -150,11 +151,11 @@ class UserController | |||
| 150 | $error = ''; | 151 | $error = ''; |
| 151 | if($form->validate()){ | 152 | if($form->validate()){ |
| 152 | // à mettre dans une classe métier UserService? | 153 | // à mettre dans une classe métier UserService? |
| 153 | $user = self::getUser($_POST['login'], $entityManager); | 154 | $user = self::getUserByName($_POST['login'], $entityManager); |
| 154 | if(password_verify($_POST['password'], $user->getPassword())){ | 155 | if(password_verify($_POST['password'], $user->getPassword())){ |
| 155 | $user->setLogin($_POST['new_login']); | 156 | $user->setLogin($_POST['new_login']); |
| 156 | $entityManager->flush(); | 157 | $entityManager->flush(); |
| 157 | $_SESSION['user'] = $_POST['new_login']; | 158 | $_SESSION['user']['username'] = $_POST['new_login']; |
| 158 | 159 | ||
| 159 | $url->addParams(['success_username' => 'new_login']); | 160 | $url->addParams(['success_username' => 'new_login']); |
| 160 | $error = ''; | 161 | $error = ''; |
| @@ -178,7 +179,7 @@ class UserController | |||
| 178 | // user | 179 | // user |
| 179 | static public function updatePassword(EntityManager $entityManager): void | 180 | static public function updatePassword(EntityManager $entityManager): void |
| 180 | { | 181 | { |
| 181 | if(!$_SESSION['admin']){ // superflux, fait dans le routeur | 182 | if(!IS_ADMIN){ // superflux, fait dans le routeur |
| 182 | self::disconnect(); | 183 | self::disconnect(); |
| 183 | } | 184 | } |
| 184 | 185 | ||
| @@ -190,7 +191,7 @@ class UserController | |||
| 190 | $error = ''; | 191 | $error = ''; |
| 191 | if($form->validate()){ | 192 | if($form->validate()){ |
| 192 | // à mettre dans une classe métier UserService? | 193 | // à mettre dans une classe métier UserService? |
| 193 | $user = self::getUser($_POST['login'], $entityManager); | 194 | $user = self::getUserByName($_POST['login'], $entityManager); |
| 194 | if(password_verify($_POST['password'], $user->getPassword())){ | 195 | if(password_verify($_POST['password'], $user->getPassword())){ |
| 195 | $new_password = password_hash($_POST['new_password'], PASSWORD_DEFAULT); | 196 | $new_password = password_hash($_POST['new_password'], PASSWORD_DEFAULT); |
| 196 | $user->setPassword($new_password); | 197 | $user->setPassword($new_password); |
| @@ -216,26 +217,22 @@ class UserController | |||
| 216 | } | 217 | } |
| 217 | 218 | ||
| 218 | // dans une classe mère ou un trait après découpage de UserController? | 219 | // dans une classe mère ou un trait après découpage de UserController? |
| 219 | static private function getUser(string $login, EntityManager $entityManager): ?User | 220 | static private function getUserByName(string $login, EntityManager $entityManager): ?User |
| 220 | { | 221 | { |
| 221 | $users = $entityManager->getRepository('App\Entity\User')->findBy(['login' => $login]); | 222 | $users = $entityManager->getRepository(User::class)->findBy(['login' => $login]); |
| 222 | 223 | foreach($users as $user){ | |
| 223 | if(count($users) === 0) | 224 | if($user->getLogin() === $login){ |
| 224 | { | ||
| 225 | $_SESSION['user'] = ''; | ||
| 226 | $_SESSION['admin'] = false; | ||
| 227 | } | ||
| 228 | |||
| 229 | foreach($users as $user) | ||
| 230 | { | ||
| 231 | if($user->getLogin() === $login) | ||
| 232 | { | ||
| 233 | return $user; | 225 | return $user; |
| 234 | } | 226 | } |
| 235 | } | 227 | } |
| 236 | return null; | 228 | return null; |
| 237 | } | 229 | } |
| 238 | 230 | ||
| 231 | static public function getUserById(int $id, EntityManager $entityManager): ?User | ||
| 232 | { | ||
| 233 | return $entityManager->find(User::class, $id); | ||
| 234 | } | ||
| 235 | |||
| 239 | // dans une classe Form? | 236 | // dans une classe Form? |
| 240 | // erreurs à la création des mots de passe | 237 | // erreurs à la création des mots de passe |
| 241 | static private function removeSpacesTabsCRLF(string $chaine): string | 238 | static private function removeSpacesTabsCRLF(string $chaine): string |
diff --git a/src/controller/ViewController.php b/src/controller/ViewController.php index 8c95526..cf3477c 100644 --- a/src/controller/ViewController.php +++ b/src/controller/ViewController.php | |||
| @@ -21,7 +21,7 @@ class ViewController extends AbstractBuilder // ViewController est aussi le prem | |||
| 21 | /* 1/ 1er contrôle des paramètres */ | 21 | /* 1/ 1er contrôle des paramètres */ |
| 22 | 22 | ||
| 23 | // mode modification d'une page | 23 | // mode modification d'une page |
| 24 | if($_SESSION['admin'] | 24 | if(IS_ADMIN |
| 25 | && $request->query->has('mode') && $request->query->get('mode') === 'page_modif' | 25 | && $request->query->has('mode') && $request->query->get('mode') === 'page_modif' |
| 26 | && !in_array(CURRENT_PAGE, ['article', 'new_page', 'menu_paths', 'user_edit', 'connection'])) | 26 | && !in_array(CURRENT_PAGE, ['article', 'new_page', 'menu_paths', 'user_edit', 'connection'])) |
| 27 | { | 27 | { |
| @@ -29,7 +29,7 @@ class ViewController extends AbstractBuilder // ViewController est aussi le prem | |||
| 29 | } | 29 | } |
| 30 | // page article: mode création et erreurs d'id | 30 | // page article: mode création et erreurs d'id |
| 31 | if(CURRENT_PAGE === 'article'){ | 31 | if(CURRENT_PAGE === 'article'){ |
| 32 | if($_SESSION['admin']){ | 32 | if(IS_ADMIN){ |
| 33 | if(!$request->query->has('id')){ | 33 | if(!$request->query->has('id')){ |
| 34 | return new Response($this->html, 302); | 34 | return new Response($this->html, 302); |
| 35 | } | 35 | } |
| @@ -58,7 +58,7 @@ class ViewController extends AbstractBuilder // ViewController est aussi le prem | |||
| 58 | /* 3/ 2ème contrôle des paramètres avec les données récupérées */ | 58 | /* 3/ 2ème contrôle des paramètres avec les données récupérées */ |
| 59 | 59 | ||
| 60 | // article non trouvé en BDD | 60 | // article non trouvé en BDD |
| 61 | if(CURRENT_PAGE === 'article' && !$_SESSION['admin'] && self::$root_node->getNodeByName('main')->getAdoptedChild() === null){ | 61 | if(CURRENT_PAGE === 'article' && !IS_ADMIN && self::$root_node->getNodeByName('main')->getAdoptedChild() === null){ |
| 62 | return new Response($this->html, 302); | 62 | return new Response($this->html, 302); |
| 63 | } | 63 | } |
| 64 | 64 | ||
