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.
		
		
		
		
		
			
		
			
				
					
					
						
							121 lines
						
					
					
						
							4.4 KiB
						
					
					
				
			
		
		
	
	
							121 lines
						
					
					
						
							4.4 KiB
						
					
					
				| <?php
 | |
| 
 | |
| /**
 | |
|  * Page de fonctions permettant d'identifier la légitimité d'un utilisateur.
 | |
|  */
 | |
| 
 | |
| require_once ($_SERVER["DOCUMENT_ROOT"]."/services/fonctions/bdd/connexion.php");
 | |
| require_once ($_SERVER["DOCUMENT_ROOT"]."/services/fonctions/bdd/domaines.php");
 | |
| 
 | |
| /*
 | |
| * Fonction d'authentification des utilisateurs.
 | |
| * Elle récupère le couple identifiant/mot de passe renseigné par le visiteur sur la page d'accueil.
 | |
| * Elle compare ces information avec la ligne correspondante dans la base de donnée (en prenant l'adresse de courriel comme sélecteur).
 | |
| * Elle hache le mot de passe du formulaire et le compare à celui de l'entrée correspondante en base.
 | |
| */
 | |
| function validationIdentifiants($pdo,$identifiant,$mdp) {
 | |
| 	try {
 | |
| 		$req = 'SELECT * FROM postfix_utilisateurs WHERE utilisateur=:identifiant';
 | |
| 		
 | |
| 		if (!strpos($identifiant, '@')) {
 | |
| 				$identifiant.="@".retourneDomaineDefautPostfix($pdo);
 | |
| 		}
 | |
| 		
 | |
| 		$sql = $pdo->prepare($req);
 | |
| 		$sql->bindValue(':identifiant', htmlspecialchars($identifiant));
 | |
| 		$sql->execute();
 | |
| 
 | |
| 		$result = $sql ->fetchAll(PDO::FETCH_ASSOC);
 | |
| 		$comptage = count($result);
 | |
| 
 | |
| 	}
 | |
| 	catch(PDOException $e) {
 | |
| 		die ("Erreur lors du traitement de la requête : " . $e->getMessage());
 | |
| 	}
 | |
| 
 | |
| 	if ($comptage == 1) {
 | |
| 		
 | |
| 		/**
 | |
| 		* Les paramètres de la fonction crypt de $mot_de_passe_form sont composés du mot de passe issue du formulaire accueil ainsi que du sel.
 | |
| 		* Les signes dollars sont des séparateurs. $mot_de_passe_base[1]=6=SHA512. $mot_de_passe_base[2]=au sel du mot de passe contenu dans la base.
 | |
| 		* Les paramètres de sel sont issus du mot de passe haché contenu dans la base.
 | |
| 		* L'opération de vérification s'adapte ainsi automatiquement aux algoritmes utilisés par Dovecot lors du hachage du mot de passe utilisateur.
 | |
| 		*/
 | |
| 		$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
 | |
| 			header('Location: /pages/visiteurs/echec_auth.php');
 | |
| 			die();
 | |
| 		}
 | |
| 		
 | |
| 		return $result;
 | |
| 	}
 | |
| 	else
 | |
| 		return false;
 | |
| }
 | |
| 
 | |
| function initValeursSession($result) {
 | |
| 	$_SESSION['id_utilisateur'] = $result[0]['id'];
 | |
| 	$_SESSION['pseudo_utilisateur'] = $result[0]['utilisateur'];
 | |
| 	$_SESSION['nom_utilisateur'] = $result[0]['nom_complet'];
 | |
| 	$_SESSION['privilege_utilisateur'] = $result[0]['privilege'];
 | |
| 	$_SESSION['pseudo_connexion_utilisateur'] = $result[0]['utilisateur'];
 | |
| }
 | |
| 
 | |
| function creerCookie($result) {
 | |
| 	$cookie_params = array (
 | |
| 		'expires' => time() + 60*60*24*30,
 | |
| 		'path' => '/',
 | |
| 		'domain' => $_SERVER['HTTP_HOST'],
 | |
| 		'secure' => false, // Mettre à true en prod (PENSER À LE FAIRE DANS deconnexion.php ET "Prolongement de la durée du cookie" AUSSI !)
 | |
| 		'httponly' => true,
 | |
| 		'samesite' => 'Strict'
 | |
| 		);
 | |
| 	setcookie('souvenir-session', htmlspecialchars($_SESSION['pseudo_utilisateur']).'|--@--|'.hash('sha3-512', $result['0']['id'].$result['0']['utilisateur'].$result['0']['mot_de_passe']), $cookie_params);
 | |
| }
 | |
| 
 | |
| function validationCookie($pdo) {
 | |
| 	if (isset($_COOKIE['souvenir-session'])) {
 | |
| 		if (!isset($_SESSION['id_utilisateur'])) {
 | |
| 			$donnees_cookie=explode('|--@--|', $_COOKIE['souvenir-session']);
 | |
| 			try {
 | |
| 				$req = 'SELECT * FROM postfix_utilisateurs WHERE utilisateur=:identifiant';
 | |
| 				
 | |
| 				$sql = $pdo->prepare($req);
 | |
| 				$sql->bindValue(':identifiant', htmlspecialchars($donnees_cookie['0']));
 | |
| 				$sql->execute();
 | |
| 		
 | |
| 				$result = $sql ->fetchAll(PDO::FETCH_ASSOC);
 | |
| 				$comptage = count($result);
 | |
| 		
 | |
| 			}
 | |
| 			catch(PDOException $e) {
 | |
| 				die ("Erreur lors du traitement de la requête : " . $e->getMessage());
 | |
| 			}
 | |
| 		
 | |
| 			if ($comptage == 1) {
 | |
| 				if (hash('sha3-512', $result['0']['id'].$result['0']['utilisateur'].$result['0']['mot_de_passe'])===$donnees_cookie['1']) {
 | |
| 					// Cookie valide. On initialise les variables de sessions pour le bon fonctionnement du site.
 | |
| 					initValeursSession($result);
 | |
| 				}
 | |
| 				else {
 | |
| 					// Cookie invalide (probablement modifié par l'utilisateur).
 | |
| 					return false;
 | |
| 				}
 | |
| 				
 | |
| 				return $result;
 | |
| 			}
 | |
| 			else
 | |
| 				return false;
 | |
| 		}
 | |
| 		// Prolongement de la durée du cookie
 | |
| 		setcookie('souvenir-session', $_COOKIE['souvenir-session'], ['expires' => time() + 60*60*24*30, 'path' => '/', 'domain' => $_SERVER['HTTP_HOST'], 'secure' => false, 'httponly' => true, 'samesite' => 'strict']);
 | |
| 	}
 | |
| 	else
 | |
| 		return false;
 | |
| 
 | |
| }
 | |
| 
 | |
| ?>
 |