You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							300 lines
						
					
					
						
							10 KiB
						
					
					
				
			
		
		
	
	
							300 lines
						
					
					
						
							10 KiB
						
					
					
				| <?php
 | |
| 
 | |
| /**
 | |
|  * Page de fonctions permettant la gestion des utilisateurs.
 | |
|  */
 | |
| 
 | |
| require_once ($_SERVER["DOCUMENT_ROOT"]."/services/fonctions/bdd/connexion.php");
 | |
| 
 | |
| /**
 | |
|  * Fonction listant tous les utilisateurs.
 | |
|  */
 | |
| function listeTousUtilisateursBdd($pdo) {
 | |
| 	try {
 | |
| 		$req = 'SELECT * FROM postfix_utilisateurs';
 | |
| 
 | |
| 		$sql=$pdo->prepare($req);
 | |
| 		$sql->execute();
 | |
| 
 | |
| 		$liste_utilisateurs = $sql->fetchAll(PDO::FETCH_ASSOC);
 | |
| 		return $liste_utilisateurs;
 | |
| 	}
 | |
| 	catch (\Exception $e) {
 | |
| 		die ("Erreur de requête de selection des utilisateurs : ".$e->getMessage());
 | |
| 	}
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Fonction listant un utilisateur en particulier.
 | |
|  */
 | |
| function listeUtilisateurBdd($pdo,$id_utilisateur) {
 | |
| 	try {
 | |
| 		$req = 'SELECT * FROM postfix_utilisateurs WHERE id=:id_utilisateur';
 | |
| 
 | |
| 		$sql=$pdo->prepare($req);
 | |
| 		$sql->bindValue(':id_utilisateur',$id_utilisateur);
 | |
| 		$sql->execute();
 | |
| 
 | |
| 		$infos_utilisateur = $sql->fetchAll(PDO::FETCH_ASSOC);
 | |
| 		return $infos_utilisateur;
 | |
| 	}
 | |
| 	catch (\Exception $e) {
 | |
| 		die ("Erreur de requête de selection des utilisateurs : ".$e->getMessage());
 | |
| 	}
 | |
| }
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * Fonction d'ajout d'un utilisateur.
 | |
|  */
 | |
| function ajoutUtilisateurBdd($pdo,$prefixe_utilisateur,$nom_utilisateur,$choix_domaine_utilisateur,$mot_de_passe_utilisateur,$nom_complet_utilisateur,$choix_privilege_utilisateur) {
 | |
| 	try {
 | |
| 		// Insertion du nouvelutilisateur entré par l'administrateur. le mot de passe "motdepasse" est mis par défaut et changé juste après par la fonction idoine afin de ne pas dupliquer de code
 | |
| 		$req='INSERT INTO postfix_utilisateurs (utilisateur,mot_de_passe,nom_complet,rep_perso,uid,gid,privilege,prefixe,active) VALUES (:nom_utilisateur,"{SHA512-CRYPT}$6$SAeCKr.vyiMjMMVa$okHL4IbTkVJO2an.mdFo8EizAxC0pfP6EV4xhO78C.OvMsirM9BD5TYhNaGPcfReQZ6ilc9feaETTvN6c.h6Z0",:nom_complet_utilisateur,:rep_perso,3000,3000,:choix_privilege_utilisateur,:prefixe_utilisateur,1);';
 | |
| 
 | |
| 		$sql=$pdo->prepare($req);
 | |
| 		$sql->bindValue(':nom_utilisateur',substr(htmlspecialchars($nom_utilisateur."@".$choix_domaine_utilisateur),0,100));
 | |
| 		$sql->bindValue(':nom_complet_utilisateur',substr(htmlspecialchars($nom_complet_utilisateur),0,100));
 | |
| 		$sql->bindValue(':rep_perso',substr(htmlspecialchars($choix_domaine_utilisateur."/".$nom_utilisateur."/"),0,100));
 | |
| 		$sql->bindValue(':choix_privilege_utilisateur',substr(htmlspecialchars($choix_privilege_utilisateur),0,100));
 | |
| 		$sql->bindValue(':prefixe_utilisateur',substr(htmlspecialchars($prefixe_utilisateur),0,100));
 | |
| 		$sql->execute();
 | |
| 
 | |
| 		if ($sql->rowCount() == 1){
 | |
| 			return true;
 | |
| 		}
 | |
| 
 | |
| 		else {
 | |
| 			return false;
 | |
| 		}
 | |
| 	}
 | |
| 	catch (\Exception $e) {
 | |
| 		// Récupération du code de retour de la commande SQLite
 | |
| 		$code_retour=$sql->errorInfo();
 | |
| 
 | |
| 		if ($code_retour[0]=="23000") {
 | |
| 			// Code de retour envoyé par le pilote PDO SQLite signifiant que la contrainte "UNIQUE" du champ "utilisateur" de la table "postfix_utilisateurs" est violée. Le nom d'utilisateur envoyé via le formulaire par l'administrateur a déjà été renseigné dans la base
 | |
| 			header ("Location: /pages/gestion/administration.php?page=utilisateurs&erreur=25");
 | |
| 			die();
 | |
| 		}
 | |
| 		elseif ($code_retour[0]=="HY000") {
 | |
| 			// Code de retour envoyé par le pilote PDO SQLite lorsque la base de données n'est accessible qu'en lecture seule à www-data
 | |
| 			header ("Location: /pages/gestion/administration.php?page=utilisateurs&erreur=4");
 | |
| 			die();
 | |
| 		}
 | |
| 		else {
 | |
| 			// En cas d'erreur non gérée, le script s'arrête avec un message d'erreur à destination de l'administrateur du serveur
 | |
| 			die ("Erreur de requête d'ajout d'alias virtuel : ".$e->getMessage());
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Fonction vérifiant le mot de passe actuel d'un utilisateur.
 | |
|  */
 | |
| function verificationMotDePasseUtilisateurBdd($pdo,$identifiant,$mdp) {
 | |
| 	try {
 | |
| 		$req = 'SELECT mot_de_passe FROM postfix_utilisateurs WHERE utilisateur=:identifiant';
 | |
| 
 | |
| 		$sql = $pdo->prepare($req);
 | |
| 		$sql->bindValue(':identifiant', $identifiant);
 | |
| 		$sql->execute();
 | |
| 
 | |
| 		$result = $sql ->fetchAll(PDO::FETCH_ASSOC);
 | |
| 		$comptage = count($result);
 | |
| 
 | |
| 	}
 | |
| 	catch(PDOException $e) {
 | |
| 		die ("Erreur lors du traitement de la requête de vérification du mot de passe utilisateur : " . $e->getMessage());
 | |
| 	}
 | |
| 
 | |
| 	if ($comptage == 1) {
 | |
| 
 | |
| 		$mot_de_passe_base=explode('$', $result['0']['mot_de_passe']);
 | |
| 		$mot_de_passe_form=crypt(trim("$mdp"), "$".$mot_de_passe_base[1]."$".$mot_de_passe_base[2]."$");
 | |
| 
 | |
| 		if ("$".$mot_de_passe_base[1]."$".$mot_de_passe_base[2]."$".$mot_de_passe_base[3]==$mot_de_passe_form) {
 | |
| 			// Si le mot de passe renseigné n'est le bon, le visiteur est redirigé vers la page d'accueil avec un message explicatif
 | |
| 			return true;
 | |
| 		}
 | |
| 		else {
 | |
| 				return false;
 | |
| 			}
 | |
| 	}
 | |
| 	else {
 | |
| 		return false;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Fonction changeant le mot de passe d'un utilisateur.
 | |
|  */
 | |
| function changeMotDePasseUtilisateurBdd($pdo,$utilisateur,$nouveau_mdp,$confirmation_mdp) {
 | |
| 	if ($nouveau_mdp===$confirmation_mdp) {
 | |
| 		$caracters = '.0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
 | |
| 		$chaine_aleatoire = '';
 | |
| 
 | |
| 		// Génération d'un sel à 16 caractères
 | |
| 		for ($i = 0; $i < 16; $i++) {
 | |
| 			$index = rand(0, strlen($caracters) - 1);
 | |
| 			$chaine_aleatoire .= $caracters[$index];
 | |
| 		}
 | |
| 
 | |
| 		// Construction d'un mot de passe haché compatible avec Dovecot
 | |
| 		$mot_de_passe_hachis='{SHA512-CRYPT}'.crypt(trim($nouveau_mdp),'$6$'.$chaine_aleatoire);
 | |
| 
 | |
| 		try {
 | |
| 			$req = 'UPDATE postfix_utilisateurs SET mot_de_passe=:nouveau_mdp WHERE utilisateur=:utilisateur';
 | |
| 			$sql=$pdo->prepare($req);
 | |
| 			$sql->bindValue(':utilisateur', $utilisateur);
 | |
| 			$sql->bindValue(':nouveau_mdp', $mot_de_passe_hachis);
 | |
| 			$sql->execute();
 | |
| 		}
 | |
| 		catch (\Exception $e) {
 | |
| 			die ("Erreur de requête de changement de mot de passe utilisateur : ".$e->getMessage());
 | |
| 		}
 | |
| 		return true;
 | |
| 	}
 | |
| 	else {
 | |
| 		return false;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Fonction listant le préfixe de l'utilisateur courant.
 | |
|  */
 | |
| function retournePrefixeUtilisateurBdd($pdo,$utilisateur) {
 | |
| 	try {
 | |
| 		$req = 'SELECT prefixe FROM postfix_utilisateurs WHERE utilisateur=:utilisateur';
 | |
| 		$sql=$pdo->prepare($req);
 | |
| 		$sql->bindValue(':utilisateur', $utilisateur);
 | |
| 		$sql->execute();
 | |
| 
 | |
| 		$prefixe_utilisateurs = $sql->fetchAll();
 | |
| 
 | |
| 		if (isset($prefixe_utilisateurs[0]['prefixe'])) {
 | |
| 			return $prefixe_utilisateurs[0]['prefixe'];
 | |
| 		}
 | |
| 		else {
 | |
| 			$prefixe_utilisateurs[0]['prefixe']="";
 | |
| 			return $prefixe_utilisateurs[0]['prefixe'];
 | |
| 		}
 | |
| 	}
 | |
| 	catch (\Exception $e) {
 | |
| 		die ("Erreur de requête de changement de préfixe utilisateur : ".$e->getMessage());
 | |
| 	}
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Fonction changeant le préfixe d'un utilisateur.
 | |
|  */
 | |
| function changePrefixeUtilisateurBdd($pdo,$utilisateur,$nouveau_prefixe) {
 | |
| 	try {
 | |
| 		$req = 'UPDATE postfix_utilisateurs SET prefixe=:nouveau_prefixe WHERE utilisateur=:utilisateur';
 | |
| 		$sql=$pdo->prepare($req);
 | |
| 		$sql->bindValue(':utilisateur', $utilisateur);
 | |
| 		$sql->bindValue(':nouveau_prefixe', $nouveau_prefixe);
 | |
| 		$sql->execute();
 | |
| 
 | |
| 		return true;
 | |
| 	}
 | |
| 	catch (\Exception $e) {
 | |
| 		die ("Erreur de requête de changement de préfixe utilisateur : ".$e->getMessage());
 | |
| 	}
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Fonction vérifiant que l'utilisateur connecté au site existe toujours dans la base de données.
 | |
|  */
 | |
| function verifUtilisateursExiste($pdo,$utilisateur) {
 | |
| 	try {
 | |
| 		$req = 'SELECT utilisateur FROM postfix_utilisateurs WHERE utilisateur=:utilisateur';
 | |
| 		$sql=$pdo->prepare($req);
 | |
| 		$sql->bindValue(':utilisateur', $utilisateur);
 | |
| 		$sql->execute();
 | |
| 
 | |
| 		$liste_utilisateurs = $sql->fetchAll(PDO::FETCH_ASSOC);
 | |
| 		
 | |
| 		if (count($liste_utilisateurs) === 1) {
 | |
| 			return TRUE;
 | |
| 		}
 | |
| 		else {
 | |
| 			return FALSE;
 | |
| 		}
 | |
| 	}
 | |
| 	catch (\Exception $e) {
 | |
| 		die ("Erreur de requête de vérification d'existence de l'utilisateur connecté : ".$e->getMessage());
 | |
| 	}
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Fonction de suppression d'un utilisateur.
 | |
|  */
 | |
| function supprUtilisateursBdd($pdo,$suppr_utilisateur) {
 | |
| 	try {
 | |
| 		$req='DELETE FROM postfix_utilisateurs WHERE id=:id_utilisateur AND utilisateur!=:pseudo_connexion_utilisateur';
 | |
| 
 | |
| 		$sql=$pdo->prepare($req);
 | |
| 		$sql->bindValue(':id_utilisateur',$suppr_utilisateur);
 | |
| 		$sql->bindValue(':pseudo_connexion_utilisateur',$_SESSION['pseudo_connexion_utilisateur']);
 | |
| 		$sql->execute();
 | |
| 
 | |
| 		if($sql->rowCount() == 1){
 | |
| 			return true;
 | |
| 		}
 | |
| 		else {
 | |
| 			return false;
 | |
| 		}
 | |
| 	}
 | |
| 	catch (\Exception $e) {
 | |
| 		// Récupération du code de retour de la commande SQLite
 | |
| 		$code_retour=$sql->errorInfo();
 | |
| 
 | |
| 		if ($code_retour[0]=="HY000") {
 | |
| 			// Code de retour envoyé par le pilote PDO SQLite lorsque la base est accessible en lecture seule à www-data
 | |
| 			header ("Location: /pages/gestion/administration.php?page=utilisateurs&erreur=4");
 | |
| 			die();
 | |
| 		}
 | |
| 		else {
 | |
| 			// En cas d'erreur non gérée, le script s'arrête avec un message d'erreur à destination de l'administrateur du serveur
 | |
| 			die ("Erreur de requête de suppression d'un utilisateur : ".$e->getMessage());
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Fonction de modification des informations des utilisateurs.
 | |
|  * Suite à une soumission du formulaire dédié, cette fonction va traiter l'ensemble des données modifiables des utilisateurs.
 | |
|  * Seul les utilisateurs recevant au moins une modification sont traités.
 | |
|  */
 | |
| function modifUtilisateursBdd($pdo,$nouvelles_données_utilisateur) {
 | |
| 	try {
 | |
| 		$req='UPDATE postfix_utilisateurs SET active=:etat_utilisateur,nom_complet=:nom_complet_utilisateur,privilege=:choix_privilege_utilisateur,prefixe=:prefixe_utilisateur WHERE id=:id_utilisateur AND utilisateur=:pseudo_utilisateur';
 | |
| 
 | |
| 		$sql=$pdo->prepare($req);
 | |
| 		$sql->bindValue(':etat_utilisateur',$nouvelles_données_utilisateur['etat_utilisateur']);
 | |
| 		$sql->bindValue(':nom_complet_utilisateur',$nouvelles_données_utilisateur['nom_complet_utilisateur']);
 | |
| 		$sql->bindValue(':choix_privilege_utilisateur',$nouvelles_données_utilisateur['choix_privilege_utilisateur']);
 | |
| 		$sql->bindValue(':prefixe_utilisateur',$nouvelles_données_utilisateur['prefixe_utilisateur']);
 | |
| 		$sql->bindValue(':id_utilisateur',$nouvelles_données_utilisateur['id_utilisateur']);
 | |
| 		$sql->bindValue(':pseudo_utilisateur',$nouvelles_données_utilisateur['nom_utilisateur']);
 | |
| 		$sql->execute();
 | |
| 	}
 | |
| 	catch (\Exception $e) {
 | |
| 		// Récupération du code de retour de la commande SQLite
 | |
| 		$code_retour=$sql->errorInfo();
 | |
| 
 | |
| 		if ($code_retour[0]=="HY000") {
 | |
| 			// Code de retour envoyé par le pilote PDO SQLite lorsque la base est accessible en lecture seule à www-data
 | |
| 			header ("Location: /pages/gestion/administration.php?page=utilisateurs&erreur=4");
 | |
| 			die();
 | |
| 		}
 | |
| 		else {
 | |
| 			// En cas d'erreur non gérée, le script s'arrête avec un message d'erreur à destination de l'administrateur du serveur
 | |
| 			die ("Erreur de requête de modification des données pour l'utilisateur $nouvelles_données_utilisateur[nom_utilisateur] : ".$e->getMessage());
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| ?>
 |