From aa1ec2296f8c02f70706cbdd70dc2d277b1ae281 Mon Sep 17 00:00:00 2001 From: Benjamin Date: Tue, 7 Apr 2026 12:10:39 +0200 Subject: [PATCH] Add verification for images and add Utilisateur classes. --- public/assets/js/login.js | 5 +- .../Ingredients/IngredientsAPIController.php | 2 +- src/Domain/Recettes/RecettesAPIController.php | 4 +- .../AuthentificationController.php | 10 ++- src/Domain/Utilisateurs/Utilisateur.php | 20 +++++ .../Utilisateurs/UtilisateurRepository.php | 80 +++++++++++++++++++ src/Helpers/UploadFiles.php | 11 ++- views/partials/tag-sidebar.php | 6 -- 8 files changed, 122 insertions(+), 16 deletions(-) create mode 100644 src/Domain/Utilisateurs/Utilisateur.php create mode 100644 src/Domain/Utilisateurs/UtilisateurRepository.php diff --git a/public/assets/js/login.js b/public/assets/js/login.js index e14ca46..15e0d21 100755 --- a/public/assets/js/login.js +++ b/public/assets/js/login.js @@ -49,14 +49,15 @@ document.addEventListener( 'DOMContentLoaded', function(){ fetch( FORM.action, options ).then( ( response ) => { if( response.ok ){ response.json().then( ( responseJSON ) => { - if( responseJSON.success === true ){ window.location.href = window.location.origin; // Redirection sur la page d'accueil si succès. } else { - FORM.showError( responseJSON.message || "Mauvais nom d'utilisateur ou mauvais mot de passe." ); + FORM.showError( "Mauvais nom d'utilisateur ou mauvais mot de passe." ); } }) + } else { + FORM.showError( "Mauvais nom d'utilisateur ou mauvais mot de passe." ); } }) diff --git a/src/Domain/Ingredients/IngredientsAPIController.php b/src/Domain/Ingredients/IngredientsAPIController.php index 1e3b59d..d906e14 100644 --- a/src/Domain/Ingredients/IngredientsAPIController.php +++ b/src/Domain/Ingredients/IngredientsAPIController.php @@ -25,7 +25,7 @@ class IngredientsAPIController extends Controller { if( !$name || $name == "" ) JSONResponse::sendError( [ 'error' => 'Name not defined' ] ); - $urlOrError = UploadFiles::uploadFile( $fileNameField ); + $urlOrError = UploadFiles::uploadFile( $fileNameField, UploadFiles::IMAGE_MIME_TYPES ); if( is_int( $urlOrError ) ){ JSONResponse::sendError( [ 'error' => $urlOrError ] ); } diff --git a/src/Domain/Recettes/RecettesAPIController.php b/src/Domain/Recettes/RecettesAPIController.php index 9698c57..5819b09 100644 --- a/src/Domain/Recettes/RecettesAPIController.php +++ b/src/Domain/Recettes/RecettesAPIController.php @@ -80,7 +80,7 @@ class RecettesAPIController extends Controller { JSONResponse::sendError( [ 'error' => "One required fields is missing" ] ); // Upload & Vérification de l'image. - $urlOrError = UploadFiles::uploadFile( $fileField ); + $urlOrError = UploadFiles::uploadFile( $fileField, UploadFiles::IMAGE_MIME_TYPES ); if( is_int( $urlOrError ) ){ JSONResponse::sendError( [ 'error' => $urlOrError ] ); } @@ -171,7 +171,7 @@ class RecettesAPIController extends Controller { } // Upload & Vérification de l'image. - $urlOrError = UploadFiles::uploadFile( $fileField ); + $urlOrError = UploadFiles::uploadFile( $fileField, UploadFiles::IMAGE_MIME_TYPES ); if( is_int( $urlOrError ) ){ // Ingore image. } else { diff --git a/src/Domain/Utilisateurs/AuthentificationController.php b/src/Domain/Utilisateurs/AuthentificationController.php index f1e93e8..481f0f4 100644 --- a/src/Domain/Utilisateurs/AuthentificationController.php +++ b/src/Domain/Utilisateurs/AuthentificationController.php @@ -43,12 +43,14 @@ class AuthentificationController extends Controller { Request::setCORS(); - $username = Request::get( 'username' ); - $password = Request::get( 'password' ); + $username = Request::post( 'username' ); + $password = Request::post( 'password' ); - // TODO : Récupération de l'utilisateur et verify_password. + $userId = new UtilisateurRepository()->login( $username, $password ); + if( !$userId ) { + return JSONResponse::sendError(); + } - $userId = 1; Authentification::loginUser( $userId ); return JSONResponse::sendSuccess( [ 'user_id' => $userId ] ); diff --git a/src/Domain/Utilisateurs/Utilisateur.php b/src/Domain/Utilisateurs/Utilisateur.php new file mode 100644 index 0000000..f69c15b --- /dev/null +++ b/src/Domain/Utilisateurs/Utilisateur.php @@ -0,0 +1,20 @@ +num_user; + } + +} \ No newline at end of file diff --git a/src/Domain/Utilisateurs/UtilisateurRepository.php b/src/Domain/Utilisateurs/UtilisateurRepository.php new file mode 100644 index 0000000..1d7295c --- /dev/null +++ b/src/Domain/Utilisateurs/UtilisateurRepository.php @@ -0,0 +1,80 @@ + 'User', + 'columns' => [ + 'num_user', 'username', 'userpassword' + ] + ]; + + } + + /** + * Permet d'obtenir une liste de toutes les recettes objet Utilisateur. + * + * @return Utilisateur[]|null + */ + public function getAll(): ?array { + $sqlQuery = "SELECT * FROM {$this->tableName};"; + $results = $this->selectGetAll($sqlQuery); + if( $results === null ) + return null; + return $results; + } + + + /** + * Permet d'avoir un utilisateur par un ID. + * + * @param int $id + * @return Utilisateur|null + */ + public function getByID( int $id ): ?Utilisateur { + $sqlQuery = "SELECT * FROM {$this->tableName} WHERE num_user = {$id}"; + $results = $this->selectGetAll($sqlQuery); + if( $results === null || count( $results ) > 1 ) + return null; + return $results[0]; + } + + + public function login(string $name, string $pass): int|bool{ + + $users = new UtilisateurRepository()->getAll(); + foreach($users as $user){ + if((strcmp($name,$user->username)==0) and (strcmp($pass,$user->userpassword)==0))return $user->num_user; + } + return false; + } + + public function add( Model $utilisateurs ): bool { + return $this->addEntity( $utilisateurs ); + } + + public function update( Model $utilisateurs ): bool { + return $this->updateEntity( $utilisateurs, 'num_user' ); + } + + public function delete( Model $utilisateurs ): bool { + return $this->deleteEntity( $utilisateurs, 'num_user' ); + } + +} \ No newline at end of file diff --git a/src/Helpers/UploadFiles.php b/src/Helpers/UploadFiles.php index 658fe48..8c3ac92 100644 --- a/src/Helpers/UploadFiles.php +++ b/src/Helpers/UploadFiles.php @@ -7,6 +7,8 @@ use App\Kernel; class UploadFiles { + const array IMAGE_MIME_TYPES = [ 'image/png', 'image/jpeg' ]; + public static function uploadFolderPath(){ return APP_ROOT . 'public/uploads/'; } @@ -16,6 +18,7 @@ class UploadFiles { /** * @param string $fileName + * @param array $allowedMimeTypes Les mimes types autorisés pour ce fichier. Une liste vide n'a pas de restriction de mime type. * * @return string|int * @@ -23,8 +26,9 @@ class UploadFiles { * 2: Erreur dans le fichier * 3: Déjà existant. * 4: Erreur dans le déplacement. + * 5: Erreur dans le mimetype. */ - public static function uploadFile( string $fileArg ): string|int { + public static function uploadFile( string $fileArg, array $allowedMimeTypes = [] ): string|int { if( !isset( $_FILES[ $fileArg ] ) ) return 1; @@ -36,6 +40,11 @@ class UploadFiles { $tempFileName = $file['tmp_name']; $fileName = $file['name']; + if( $allowedMimeTypes !== [] ){ + if( !in_array( $file['type'], $allowedMimeTypes ) ) + return 5; + } + $full_name = self::uploadFolderPath() . $fileName; $full_uri = self::uploadFolderUri() . $fileName; diff --git a/views/partials/tag-sidebar.php b/views/partials/tag-sidebar.php index 89c70a6..31d930c 100644 --- a/views/partials/tag-sidebar.php +++ b/views/partials/tag-sidebar.php @@ -7,9 +7,6 @@ -
-