<?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;
}

/*
 * Fonction d'initialisation des valeurs de session.
 * Elle utilise les informations de l'utilisateur en base de données pour initialiser une session personnalisée.
 */
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'];
}

/*
 * Fonction de création d'un cookie de connexion automatique.
 * Si la case "Se souvenir de moi" est cochée au formulaire de connexion, un cookie d'une durée d'un mois est créé.
 */
function creerCookie($result) {
	$cookie_params = array (
		'expires' => time() + 60*60*24*30,
		'path' => '/',
		'domain' => $_SERVER['HTTP_HOST'],
		'secure' => false, // Mettre à true pour ne le créer qu'en HTTPS (le faire également dans "deconnexion.php" et au commentaire "Prolongement de la durée du cookie." plus bas).
		'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);
}

/*
 * Fonction de validation du cookie de connexion automatique.
 * Vérifie la légitimité du cookie de connexion de l'utilisateur via les informations en base de données.
 * Si légitime, une session PHP est initialisée et le cookie est renouvelé pour un mois supplémentaire.
 * Si non légitime, la fonction ne fait rien. Le comportement du site s'en remet alors à la seule existence d'une session PHP.
 */
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;
}

?>