Skip to content
Snippets Groups Projects
Select Git revision
  • ba6ce6dfbc3464bf3c4b98b08e74ed91586fc3e4
  • main default protected
2 results

MainActivity.java

Blame
  • functions.php 19.01 KiB
    <?php
    //Chargement des pages
    function loadPage(){
        global $localSettings, $urlPath;
        // S'il existe un paramètre on l'affecte à pageName
    
        // Ici on va vérifier le mode de récupération de l'url
        if($localSettings["urlMode"] == "parameters"){
            // Ici on fonctionne en mode paramètres, on va donc reconstruire l'alias
    
            $alias = array();
            // Si le paramètre admin existe (pas besoin qu'il ai de valeur)
            if(isset($_GET['admin'])){
                $alias[] = "admin"; // Alors on l'ajoute à l'alias
            }
            // Pareil pour les pages
            if(isset($_GET['page']) && !empty($_GET['page'])){
                $alias[] = $_GET['page'];
            }else{
                // Maisi ici on va donner une valeur par défaut
                $alias[] = "vitrine";
            }
        }else{
            // Si on est en mode alias, alors on récupère directement la variable $urlPath
            $alias = $urlPath;
        }
    
        if(empty($alias[0])){
            // Si le premier alias est vide, on va donc charger la page vitrine
            $alias[0] = "vitrine";
        }
    
        // Maintenant qu'alias[0] aura toujours une valeur, on peut commencer à la comparer
        if($alias[0]=="admin"){
            if(!isset($alias[1])||empty($alias[1])){
                $alias[1] = "index";
            }
    
            // Si le premier alias est admin, on va donc appeller la fonction qui se charge de gérer les pages admin
            array_shift($alias); // On supprime le /admin pour que la fonction loadAdminPage puisse directement vérifier les pages
            require "core/classes/Admin.php";
            Admin::loadPage($alias);
        }else{
            // Il s'agit d'une page client
            require "core/classes/Client.php";
            Client::loadPage($alias);
        }
    }
    
    // Générer les liens
    function genPageLink($path="/"){
        global $localSettings;
        if (substr($path, 0, 1) != '/') {
            $path = '/' . $path;
        }
    
        $pages = explode("/", $path);
        array_shift($pages);
    
        $return = "index.php?";
        // Ici on va vérifier le mode de récupération de l'url
        // On prend l'exemple de ces appels: 
        // /login, /recettes?search=valeur, /admin/recettes?filterBy=DESC
        // 
        if($localSettings["urlMode"] == "parameters"){
            // est-ce que c'est une page admin?
            if($pages[0]=="admin"){
                // Oui
                if(isset($pages[1]) && !empty($pages[1])){
                    $return = $return . "page=".$pages[1];
                }else{
                    $return = $return . "page=index";
                }
                $return = $return . "&admin";
                if(isset($pages[2]) && !empty($pages[2])){
                    $return = $return . "&".str_replace("?", "", $pages[2]);
                }
            }else{
                // Non
                if(isset($pages[0]) && !empty($pages[0])){
                    $return = $return . "page=".$pages[0];
                }
                if(isset($pages[1]) && !empty($pages[1])){
                    $return = $return . "&".str_replace("?", "", $pages[1]);
                }
            }
        }else{
            // Pas besoin de travailler, on donne les alias par défaut
            $path = ltrim($path, '/');
            $return = $path;
        }
        return $return;
    }
    
    // Vérifie si un username ou un email existe dans la bdd
    function checkUsernameEmail($data){
    	$pos = strpos($data, "@");
    	if ($pos !== false) {
    		$response = Connexion::pdo()->prepare("SELECT * FROM m_userSetting WHERE name='email' AND value=?");
    		$response->execute([strtolower($data)]);
    		if (empty($response->fetch())) {
    			return false;
    		} else {
    			return true;
    		}
    	} else {
    		$response = Connexion::pdo()->prepare("SELECT * FROM m_utilisateur WHERE username=?");
    		$response->execute([strtolower($data)]);
    		if (empty($response->fetch())) {
    			return false;
    		} else {
    			return true;
    		}
    	}
    }
    function login($usernameEmail, $password){
        global $ip;
        $usernameEmail = strtolower($usernameEmail);
        $pos = strpos($usernameEmail, "@");
        if ($pos !== false) {
            $response = Connexion::pdo()->prepare("SELECT userId FROM m_userSetting WHERE name='email' AND value=?");
            $response->execute([$usernameEmail]);
            $supposedUserId = $response->fetchColumn();
    
            $response = Connexion::pdo()->prepare("SELECT * FROM m_utilisateur WHERE id=?");
            $response->execute([$supposedUserId]);
        } else {
            $response = Connexion::pdo()->prepare("SELECT * FROM m_utilisateur WHERE username=?");
            $response->execute([$usernameEmail]);
        }
        $user=$response->fetch(PDO::FETCH_ASSOC);
        if (!empty($user)) {
            if(password_verify($password, $user["password"])){
                // On vérifie l'ip
                $response = Connexion::pdo()->prepare("SELECT * FROM m_userSetting WHERE userId=? AND name='lastIp'");
                $response->execute([$user['id']]);
                $result = $response->fetch(PDO::FETCH_ASSOC);
    
                if (empty($result)) {
                    // Aucun champ d'ip n'existe
                    $response = Connexion::pdo()->prepare("INSERT INTO m_userSetting (`userId`, `name`, `value`) VALUES (?,?,?)");
                    $response->execute([$user['id'], 'lastIp', $ip]);
                }else{
                    if($result["value"]!=$ip){
                        // Il existe un champ, on va le comparer
                        $response = Connexion::pdo()->prepare("UPDATE m_userSetting SET `value`=? WHERE `userId`=? AND name='lastIp'");
                        $response->execute([$ip, $user['id']]);
                    }
                    
                }
    
                $_SESSION['userId'] = $user['id'];
                $_SESSION['userName'] = $user['username'];
                $_SESSION['userGroupId'] = $user['groupId'];
    
                $userProfilPic = Connexion::pdo()->prepare("SELECT value FROM m_userSetting WHERE userId=? AND name='profilPic'");
                $userProfilPic->execute([$user['id']]);
                $userProfilPic = $userProfilPic->fetchColumn();
    
                if (empty($userProfilPic)) {
                    $userProfilPic = "data/images/misc/user.png";
                }
                $userProfilPic = getWebsiteSetting("websiteUrl") . $userProfilPic;
                
                $_SESSION['userProfilePic'] = $userProfilPic;
                $return["success"] = "Connexion réussie, bienvenue " . $_SESSION['userName'] . "! 🥳";
            } else {
                $return["error"] = "Mauvais couple identifiant/mot de passe.";
            }
        } else {
            $return["error"] = "Mauvais couple identifiant/mot de passe.";
        }
        return $return;
    }
    
    function registerUser($username, $password, $email){
        if (preg_match('/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,32}$/', $password)==1) {
            $username = strtolower(htmlspecialchars($username));
            $email = strtolower(htmlspecialchars($email)); // ici on converti l'email donné en casse minuscule
            $password = password_hash($password, PASSWORD_DEFAULT);
    
            // Ici on récupère l'id du groupe des utilisateurs
            $userGroupId = Connexion::pdo()->query("SELECT id FROM m_groupeUtilisateur WHERE nom='utilisateur'")->fetchColumn();
    
            // Là on va insérer l'utilisateur dans la table des utilisateurs
            $query = Connexion::pdo()->prepare("INSERT INTO m_utilisateur (id, groupId, username, password) VALUES (?,?, ?, ?)");
            $query->execute([null, $userGroupId, $username, $password]);
    
            // Maintenant on va récuper son id
            $query = Connexion::pdo()->prepare("SELECT id FROM m_utilisateur WHERE username=?");
            $query->execute([$username]);
            $userId = $query->fetchColumn();
            
            // On va insérer son adresse mail
            $query = Connexion::pdo()->prepare("INSERT INTO m_userSetting (`userId`, `name`, `value`) VALUES (?,?,?)");
            $query->execute([$userId, 'email', $email]);
    
            // Sa date d'inscription
            $query = Connexion::pdo()->prepare("INSERT INTO m_userSetting (`userId`, `name`, `value`) VALUES (?,?,?)");
            $query->execute([$userId, 'joinedDate', date("Y-m-d H:i:s")]);
    
            $return["success"] = "Inscription réussie, tu peux désormais te connecter! 🥳";
        } else {
            $return["error"] = 'Ton mot de passe doit être long d\'au moins 8 caractères et doit contenir au moins 1 majuscule, 1 minuscule et 1 nombre.';
        }
        return $return;
    }
    
    // Recettes
    function getRecettes($search=""){
        // C'est gitcopilot qui écrit 75% de cette fonction
    
        // On va récupérer les recettes selon la recherche
        // Si $search est une liste, on va chercher selon son contenu
        // $search["categoryId"], $search["name"], ["ingredientId"], ["difficulte"], ["time"], ["auteurId"]
        if(is_array($search) && !empty($search)){
            // https://stackoverflow.com/a/18603279
            $categoryId = $search["categoryId"] ?? "";
            $name = $search["name"] ?? "";
            $ingredients = $search["ingredients"] ?? "";
            $difficulte = $search["difficulte"] ?? "";
            $tempsPreparation = $search["tempsPreparation"] ?? "";
            $auteurId = $search["auteurId"] ?? "";
    
            // On construit la requête
            $queryString = "SELECT * FROM m_recette INNER JOIN m_recetteIngredient ON m_recette.id=m_recetteIngredient.recetteId  WHERE 1=1";
            if(!empty($categoryId)){
                $queryString .= " AND categoryId=:categoryId";
            }
            if(!empty($name)){
                $queryString .= " AND nom LIKE :name";
            }
            if(!empty($ingredients)){
                $ingredientsIn = implode(',', $ingredients);
                $queryString .= " AND ingredientId IN (:ingredients)";
            }
            if(!empty($difficulte)){
                $queryString .= " AND difficulte=:difficulte";
            }
            if(!empty($tempsPreparation)){
                $queryString .= " AND tempsPreparation=:tempsPreparation";
            }
            if(!empty($auteurId)){
                $queryString .= " AND auteurId=:auteurId";
            }
            // On la prépare
            $query = Connexion::pdo()->prepare($queryString." ORDER BY nom");
    
            // On rempli les paramètres
            if(!empty($categoryId)){
                $query->bindParam(':categoryId', $categoryId);
            }
            if(!empty($name)){
                $name = "%".$name."%";
                $query->bindParam(':name', $name);
            }
            if(!empty($ingredientId)){
                $query->bindParam(':ingredients', $ingredientsIn);
            }
            if(!empty($difficulte)){
                $query->bindParam(':difficulte', $difficulte);
            }
            if(!empty($tempsPreparation)){
                $query->bindParam(':tempsPreparation', $tempsPreparation);
            }
            if(!empty($auteurId)){
                $query->bindParam(':auteurId', $auteurId);
            }
    
            // On exécute
            $query->execute();
            // Et on retourne le résultat
            return $query->fetchAll(PDO::FETCH_ASSOC);
        }else{
            // Si $search n'est pas un array, on va chercher toutes les recettes
            $query = Connexion::pdo()->prepare("SELECT * FROM m_recette ORDER BY nom");
            $query->execute();
            return $query->fetchAll(PDO::FETCH_ASSOC);
        }
    }
    function getRecette($recetteId){
        $query = Connexion::pdo()->prepare("SELECT * FROM m_recette WHERE id=?");
        $query->execute([$recetteId]);
        return $query->fetch(PDO::FETCH_ASSOC);
    }
    
    // Vérifie les permissions
    function verifyUserPermission($userId, $permission){
        // $permission peut être un tableau ou un string
        if(is_array($permission)){
            if(count($permission)!=2){
                throw new Exception('Erreur! Le tableau doit être composé de 2 éléments.');
            }
            $groupName = $permission[0];
            $permissionName = $permission[1];
        }else{
            if(strpos($permission, '.') == false){
                throw new Exception('Erreur! La permission doit suivre la règle suivante: groupeName.permissionName');
            }else{
                $temp = explode('.', $permission);
                if(count($temp)!=2){
                    throw new Exception('Erreur! La permission doit suivre la règle suivante: groupeName.permissionName');
                }
                $groupName = $temp[0];
                $permissionName = $temp[1];
            }
        }
        // On peut maintenant vérifier dans la bdd
        $response = Connexion::pdo()->prepare("SELECT m_permission.id FROM m_permissionGroup INNER JOIN m_permission ON m_permissionGroup.id=m_permission.groupId WHERE m_permissionGroup.name=? AND m_permission.name=?");
        $response->execute([$groupName, $permissionName]);
        $targetPermId = $response->fetchColumn();
    
        if(empty($targetPermId)){
            throw new Exception('Erreur! La permission \''.$groupName.'.'.$permissionName.'\' n\'existe pas.');
        }
        
        // On va commencer par vérifier les permissions de l'utilisateur
        if(isSuperAdmin($userId)){
            return true;
        }else{
            $response = Connexion::pdo()->prepare("SELECT COUNT(*) FROM m_permissionUtilisateur WHERE userId=? AND permId=?");   
            $response->execute([$userId, $targetPermId]);
            $hasPermission = $response->fetchColumn();
            if($hasPermission == 0)$hasPermission = false;
            else $hasPermission = true;
        }
        
    
        // Si l'utilisateur n'a pas la permission, on va vérifier si le groupe l'a
        if(!$hasPermission){
            $response = Connexion::pdo()->prepare("SELECT groupId FROM m_utilisateur WHERE id=?");
            $response->execute([$userId]);
            $userGroupId = $response->fetchColumn();
    
            if(empty($userGroupId)){
                throw new Exception('Erreur! L\'utilisateur n\'existe pas.');
            }
    
            $response = Connexion::pdo()->prepare("SELECT COUNT(*) FROM m_permissionGroupeUtilisateur WHERE groupId=? AND permId=?");   
            $response->execute([$userGroupId, $targetPermId]);
            $hasPermission = $response->fetchColumn();
            if($hasPermission == 0)$hasPermission = false;
            else $hasPermission = true;
        }
    
        return $hasPermission;
    }
    
    // Check si l'utilisateur est surper utilisateur
    function isSuperAdmin($userId){
        $superAdminGroupId = Connexion::pdo()->query("SELECT id FROM m_groupeUtilisateur WHERE nom='superAdmin'")->fetchColumn();
        $response = Connexion::pdo()->prepare("SELECT COUNT(*) FROM m_utilisateur WHERE id=? AND groupId=?");
        $response->execute([$userId, $superAdminGroupId]);
        $isSuperAdmin = $response->fetchColumn();
        if($isSuperAdmin == 0) return false;
        else return true;
    }
    
    // Récupère les paramètres du site
    function getWebsiteSetting($setting){
        $response = Connexion::pdo()->prepare("SELECT value FROM m_siteSetting WHERE name=?");
        $response->execute([$setting]);
        $settingValue = $response->fetchColumn();
        return $settingValue; // Retourne null si le paramètre n'existe pas
    }
    
    // Récupère les utilisateurs
    function getUtilisateur($search=""){
        if(is_array($search)){
            $userId = $search["userId"] ?? "";
    
            // Si l'id utilisateur passé en paramètre est vide, il s'agit du compte Marmiton
            if($userId==0){
                $userMarmiton["username"] = "Marmiton";
                return $userMarmiton;
            } // S'arrête ici
    
            $username = $search["username"] ?? "";
    
            $queryString = "SELECT * FROM m_utilisateur WHERE 1=1";
            if(!empty($userId)){
                $queryString .= " AND id=:userId";
            }
            if(!empty($username)){
                $queryString .= " AND id LIKE :username";
            }
    
            // On la prépare
            $query = Connexion::pdo()->prepare($queryString." ORDER BY username");
    
            // On rempli les paramètres
            if(!empty($userId)){
                $query->bindParam(':userId', $userId);
            }
            if(!empty($username)){
                $query->bindParam(':username', "%".$username."%");
            }
            
            // On exécute
            $query->execute();
            // Et on retourne le résultat
            return $query->fetch(PDO::FETCH_ASSOC);
        }else{
            // Si $search n'est pas un array, on va chercher tous les utilisateurs
            $query = Connexion::pdo()->prepare("SELECT * FROM m_utilisateur ORDER BY username");
            $query->execute();
            return $query->fetchAll(PDO::FETCH_ASSOC);
        }
    }
    
    // Regarde si l'utilisateur est connecté, le renvoie vers la page de connexion s'il ne l'est pas
    function isConnected(){
        if(empty($_SESSION["userId"])){
            header("Location: ".genPageLink("/login"));
            exit();
        }
    }
    
    // Récupréation diverses infos relatives aux recettes
    function getCategories(){
        $query = Connexion::pdo()->prepare("SELECT * FROM m_categorie ORDER BY nom");
        $query->execute();
        return $query->fetchAll(PDO::FETCH_ASSOC);
    }
    function getUstensiles(){
        $query = Connexion::pdo()->prepare("SELECT * FROM m_ustensile ORDER BY nom");
        $query->execute();
        return $query->fetchAll(PDO::FETCH_ASSOC);
    }
    function getIngredients($recetteId=""){
        if(empty($recetteId)){
            $query = Connexion::pdo()->prepare("SELECT * FROM m_ingredient ORDER BY nom");
            $query->execute();
            return $query->fetchAll(PDO::FETCH_ASSOC);
        }else{
            $query = Connexion::pdo()->prepare("SELECT * FROM m_ingredient WHERE id IN (SELECT ingredientId FROM m_recetteIngredient WHERE recetteId=:recetteId) ORDER BY nom");
            $query->bindParam(':recetteId', $recetteId);
            $query->execute();
            return $query->fetchAll(PDO::FETCH_ASSOC);
        }
        
    }
    
    // Envoyer une recette
    function sendRecette($recetteTitle, $recetteContent, $recetteDescription, $recetteCategory, $recetteIngredients, $recettePreparation, $recetteUstensiles, $recetteHeaderPic, $recetteDifficulte){
        $recetteTitle = utf8_encode(htmlspecialchars($recetteTitle));
        $recetteContent = utf8_encode(htmlspecialchars($recetteContent));
        $recetteDescription = utf8_encode(htmlspecialchars($recetteDescription));
        $quantite = 1; // Je suis un boulet j'ai oublié ça xD
    
        // On insert la recette
        $query = Connexion::pdo()->prepare("INSERT INTO m_recette (id, categoryId, auteurId, nom, description, contenu, image, tempsPreparation, difficulte, datePost, dateModif) VALUES (NULL, :categoryId, :auteurId, :nom, :description, :contenu, :image, :tempsPreparation, :difficulte, NOW(), NOW())");
        $query->bindParam(':categoryId', $recetteCategory);
        $query->bindParam(':auteurId', $_SESSION["userId"]);
        $query->bindParam(':nom', $recetteTitle);
        $query->bindParam(':description', $recetteDescription);
        $query->bindParam(':contenu', $recetteContent);
        $query->bindParam(':image', $recetteHeaderPic);
        $query->bindParam(':tempsPreparation', $recettePreparation);
        $query->bindParam(':difficulte', $recetteDifficulte);
        $query->execute();
    
        // Puis on répertorie les ingrédients
        $recetteId = Connexion::pdo()->lastInsertId();
        foreach($recetteIngredients as $ingredient){
            $query = Connexion::pdo()->prepare("INSERT INTO m_recetteIngredient (recetteId, ingredientId, quantite) VALUES (:recetteId, :ingredientId, :quantite)");
            $query->bindParam(':recetteId', $recetteId);
            $query->bindParam(':ingredientId', $ingredient);
            $query->bindParam(':quantite', $quantite); 
            $query->execute();
        }
        // Et on termine par les ustensiles
        foreach($recetteUstensiles as $ustensile){
            $query = Connexion::pdo()->prepare("INSERT INTO m_recetteUstensile (recetteId, ustensileId) VALUES (:recetteId, :ustensileId)");
            $query->bindParam(':recetteId', $recetteId);
            $query->bindParam(':ustensileId', $ustensile);
            $query->execute();
        }
        // On retourne l'id de la recette
        return $recetteId;
    }