function authenticate($_login = null, $_password = null) { // Quelques petits tests de sécurité // Vérification de la liste noire des adresses IP if (isset($GLOBALS['liste_noire_ip']) && in_array($_SERVER['REMOTE_ADDR'], $GLOBALS['liste_noire_ip'])) { tentative_intrusion(1, "Tentative de connexion depuis une IP sur liste noire (login utilisé : ".$_login.")"); return "3"; die(); } // On initialise la session de l'utilisateur. // On commence par extraire le mode d'authentification défini // pour l'utilisateur. Si l'utilisateur n'existe pas, on essaiera // l'authentification LDAP et le SSO quand même. $auth_mode = Session::user_auth_mode($_login); switch ($auth_mode) { case "gepi": # Authentification locale sur la base de données Gepi $auth = $this->authenticate_gepi($_login,$_password); break; case "ldap": # Authentification sur un serveur LDAP $auth = $this->authenticate_ldap($_login,$_password); break; case "sso": # Authentification gérée par un service de SSO # On n'a pas besoin du login ni du mot de passe switch ($this->auth_sso) { case "cas": $auth = $this->authenticate_cas(); break; case "lemon": $auth = $this->authenticate_lemon(); break; case "lcs": $auth = $this->authenticate_lcs(); break; } break; case false: # L'utilisateur n'existe pas dans la base de données ou bien # n'a pas été passé en paramètre. # On va donc tenter d'abord une authentification LDAP, # puis une authentification SSO, à condition que celles-ci # soient bien sûr configurées. if ($this->auth_ldap && $_login != null && $_password != null) { $auth = $this->authenticate_ldap($_login,$_password); } else if ($this->auth_sso && $_login == null) { // L'auth LDAP n'a pas marché, on essaie le SSO switch ($this->auth_sso) { case "cas": $auth = $this->authenticate_cas(); break; case "lemon": $auth = $this->authenticate_lemon(); break; case "lcs": $auth = $this->authenticate_lcs(); break; } } else { $auth = false; } break; default: # Si on arrive là, c'est qu'il y a un problème avec la définition # du mode d'authentification pour l'utilisateur en question. $auth = false; break; } // A partir d'ici soit on a un avis d'échec de l'authentification, soit // une session valide. if ($auth) { // L'authentification en elle-même est valide. // Dans le cas du multisite, il faut maintenant déterminer le RNE // de l'utilisateur avant d'aller plus loin, sauf s'il a déjà été passé // en paramètre. if (isset($GLOBALS['multisite']) && $GLOBALS['multisite'] == "y") { if (!isset($_GET['rne']) AND !isset($_COOKIE["RNE"])) { if (LDAPServer::is_setup()) { // Le RNE n'a pas été transmis. Il faut le récupérer et recharger la page // pour obtenir la bonne base de données $ldap = new LDAPServer; $user = $ldap->get_user_profile($this->login); // On teste pour savoir si on a plusieurs RNE $test = count($user["rne"]); if ($test >= 1) { # On a au moins un RNE, on peut continuer if ($test > 1) { // On envoie l'utilisateur choisir lui même son RNE $rnes = NULL; for($a = 0 ; $a < $test ; $a++){ $rnes .= $user["rne"][$a].'|'; } header("Location: choix_rne.php?nbre=".$test."&lesrne=".$rnes); }else{ // Il n'y en a qu'un, on recharge ! if ($this->current_auth_mode == "sso") { header("Location: login_sso.php?rne=".$user["rne"]); exit(); } else { header("Location: login.php?rne=".$user["rne"]); exit(); } } } else { return "8"; exit(); } } else { return "8"; exit(); } } } // On va maintenant effectuer quelques tests pour vérifier // que le compte n'est pas bloqué. if ($this->account_is_locked()) { $this->reset(2); return "2"; exit(); } # On charge les données de l'utilisateur if (!$this->load_user_data()) { # Si on ne parvient pas à charger les données, c'est que # l'utilisateur n'est pas présent en base de données. # On essaie d'importer son profil depuis le LDAP. if (getSettingValue("may_import_user_profile") == "yes") { if (!$this->import_user_profile()) { return "6"; exit(); } else { # Si l'import a réussi, on tente à nouveau de charger # les données de l'utilisateur. $this->load_user_data(); } } } # On vérifie que l'utilisateur est bien actif if ($this->etat != "actif") { $this->reset(2); return "4"; exit(); } # On vérifie que les connexions sont bien activées. $disable_login = getSettingValue("disable_login"); if ($this->statut != "administrateur" && ($disable_login == "yes" || $disable_login == "soft")) { $this->reset(2); return "7"; exit(); } # On teste la cohérence de mode de connexion $auth_mode = Session::user_auth_mode($this->login); if ($auth_mode != $this->current_auth_mode) { $this->reset(2); return "5"; exit; } # Tout est bon. On valide définitivement la session. $this->start = mysql_result(mysql_query("SELECT now();"),0); $_SESSION['start'] = $this->start; $this->insert_log(); # On supprime l'historique des logs conformément à la durée définie. sql_query("delete from log where START < now() - interval " . getSettingValue("duree_conservation_logs") . " day and END < now()"); # On envoie un mail, si l'option a été activée mail_connexion(); return "1"; exit(); } else { // L'authentification a échoué. // On nettoie la session. $this->reset(2); // On enregistre l'échec. // En cas d'échec répété, on renvoie un code d'erreur de // verrouillage de compte, pour brouiller les pistes en cas // d'attaque brute-force sur les logins. if ($this->record_failed_login($_login)) { return "2"; exit(); } // On retourne le code d'erreur générique return "9"; } }