From 041212aa936607333dbf406ad7e92cf78b0a5b1c Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Sat, 24 Oct 2009 15:15:25 +0000
Subject: [PATCH] 3 methodes supplementaires dans l'api inc/auth :
 auth_url_retour_login() fournit une url securisee pour retour apres
 identification chez un sso auth_terminer_identifier_login() appelee au retour
 sur l'url precedente finit l'identification apres le retour du sso
 auth_loger() loge un auteur decrit par son tableau

action/auth gere le retour depuis un SSO

la fonction charger du formulaire de login() retrouve aussi le login si on est identifie mais sans cookie admin, et lance dans ce cas la redirection necessaire
---
 .gitattributes              |  1 +
 ecrire/action/auth.php      | 45 ++++++++++++++++++++
 ecrire/inc/auth.php         | 83 ++++++++++++++++++++++++++++++++++---
 prive/formulaires/login.php | 24 +++++++----
 4 files changed, 138 insertions(+), 15 deletions(-)
 create mode 100644 ecrire/action/auth.php

diff --git a/.gitattributes b/.gitattributes
index 5b20eccffa..7237a1440f 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -4,6 +4,7 @@ config/ecran_securite.php -text
 config/remove.txt -text
 ecrire/action/acceder_document.php -text
 ecrire/action/activer_plugins.php -text
+ecrire/action/auth.php -text
 ecrire/action/changer_mode_document.php -text
 ecrire/action/charger_plugin.php -text
 ecrire/action/configurer.php -text
diff --git a/ecrire/action/auth.php b/ecrire/action/auth.php
new file mode 100644
index 0000000000..08a96d03d9
--- /dev/null
+++ b/ecrire/action/auth.php
@@ -0,0 +1,45 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2009                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+/**
+ * Retour d'authentification pour les SSO
+ */
+function action_auth_dist() {
+	
+	$securiser_action = charger_fonction('securiser_action', 'inc');
+	$arg = $securiser_action();
+
+	if (!preg_match(",^(\w+)[/](.+)$,", $arg, $r)) {
+		spip_log("action_auth_dist $arg pas compris");
+	}
+	else {
+		$auth_methode = $r[1];
+		$login = $r[2];
+		include_spip('inc/auth');
+		$res = auth_terminer_identifier_login($auth_methode, $login);
+
+		if (is_string($res)){ // Erreur
+			$redirect = _request('redirect');
+			$redirect = parametre_url($redirect,'var_erreur',$res);
+			include_spip('inc/headers');
+			redirige_par_entete($redirect);
+		}
+
+		// sinon on loge l'auteur identifie, et on finit (redirection automatique)
+		auth_loger($res);
+	}
+}
+
+
+?>
\ No newline at end of file
diff --git a/ecrire/inc/auth.php b/ecrire/inc/auth.php
index 5768b5e200..2d6e0992d4 100644
--- a/ecrire/inc/auth.php
+++ b/ecrire/inc/auth.php
@@ -295,6 +295,7 @@ function auth_trace($row, $date=null)
 	}
 }
 
+
 /** ----------------------------------------------------------------------------
  * API Authentification, gestion des identites centralisees
  */
@@ -337,6 +338,7 @@ function auth_formulaire_login($flux){
  * qui sera alors converti en login interne apres verification
  *
  * @param string $login
+ * @param string $serveur
  * @return string/bool
  */
 function auth_retrouver_login($login, $serveur=''){
@@ -364,6 +366,7 @@ function auth_retrouver_login($login, $serveur=''){
  * N'y aurait-il pas plus simple ?
  *
  * @param string $login
+ * @param string $serveur
  * @return array
  */
 function auth_informer_login($login, $serveur=''){
@@ -398,8 +401,7 @@ function auth_informer_login($login, $serveur=''){
  *
  * @param string $login
  * @param string $password
- * @param string $md5pass
- * @param string $md5next
+ * @param string $serveur
  * @return mixed
  */
 function auth_identifier_login($login, $password, $serveur=''){
@@ -419,11 +421,61 @@ function auth_identifier_login($login, $password, $serveur=''){
 	return $erreur;
 }
 
+/**
+ * Fournir une url de retour apres login par un SSO
+ * pour finir l'authentification
+ *
+ * @param string $auth_methode
+ * @param string $login
+ * @param string $serveur
+ * @return string
+ */
+function auth_url_retour_login($auth_methode, $login, $redirect='', $serveur=''){
+	$securiser_action = charger_fonction('securiser_action','inc');
+	return $securiser_action('auth', "$auth_methode/$login", $redirect, true);
+}
+
+function auth_terminer_identifier_login($auth_methode, $login, $serveur=''){
+	$args = func_get_args();
+	$auteur = auth_administrer('terminer_identifier_login',$args);
+	return $auteur;
+}
+
+ /**
+  * Loger un auteur suite a son identification
+  *
+  * @param array $auteur
+  */
+ function auth_loger($auteur){
+	if (!is_array($auteur) OR !count($auteur))
+		return false;
+
+	$session = charger_fonction('session', 'inc');
+	$session($auteur);
+	$p = ($auteur['prefs']) ? unserialize($auteur['prefs']) : array();
+	$p['cnx'] = ($session_remember == 'oui') ? 'perma' : '';
+	$p = array('prefs' => serialize($p));
+	sql_updateq('spip_auteurs', $p, "id_auteur=" . $auteur['id_auteur']);
+
+	// Si on est admin, poser le cookie de correspondance
+	if ($auteur['statut'] == '0minirezo') {
+		include_spip('inc/cookie');
+		spip_setcookie('spip_admin', '@'.$auteur['login'],
+		time() + 7 * 24 * 3600);
+	}
+
+	//  bloquer ici le visiteur qui tente d'abuser de ses droits
+	verifier_visiteur();
+	return true;
+}
+
+
 /**
  * Tester la possibilite de modifier le login d'authentification
  * pour la methode donnee
  *
  * @param string $auth_methode
+ * @param string $serveur
  * @return bool
  */
 function auth_autoriser_modifier_login($auth_methode, $serveur=''){
@@ -438,6 +490,7 @@ function auth_autoriser_modifier_login($auth_methode, $serveur=''){
  * @param string $auth_methode
  * @param string $new_login
  * @param int $id_auteur
+ * @param string $serveur
  * @return string
  *  message d'erreur ou chaine vide si pas d'erreur
  */
@@ -452,6 +505,7 @@ function auth_verifier_login($auth_methode, $new_login, $id_auteur=0, $serveur='
  * @param string $auth_methode
  * @param string $new_login
  * @param int $id_auteur
+ * @param string $serveur
  * @return bool
  */
 function auth_modifier_login($auth_methode, $new_login, $id_auteur, $serveur=''){
@@ -464,6 +518,7 @@ function auth_modifier_login($auth_methode, $new_login, $id_auteur, $serveur='')
  * pour la methode donnee
  *
  * @param string $auth_methode
+ * @param string $serveur
  * @return bool
  *	succes ou echec
  */
@@ -480,6 +535,7 @@ function auth_autoriser_modifier_pass($auth_methode, $serveur=''){
  * @param string $login
  * @param string $new_pass
  * @param int $id_auteur
+ * @param string $serveur
  * @return string
  *	message d'erreur ou chaine vide si pas d'erreur
  */
@@ -496,6 +552,7 @@ function auth_verifier_pass($auth_methode, $login, $new_pass, $id_auteur=0, $ser
  * @param string $login
  * @param string $new_pass
  * @param int $id_auteur
+ * @param string $serveur
  * @return bool
  *	succes ou echec
  */
@@ -513,6 +570,7 @@ function auth_modifier_pass($auth_methode, $login, $new_pass, $id_auteur, $serve
  * @param int $id_auteur
  * @param array $champs
  * @param array $options
+ * @param string $serveur
  * @return void
  */
 function auth_synchroniser_distant($auth_methode=true, $id_auteur=0, $champs=array(), $options = array(), $serveur=''){
@@ -531,6 +589,13 @@ function auth_synchroniser_distant($auth_methode=true, $id_auteur=0, $champs=arr
 }
 
 
+/**
+ *
+ * @param string $login
+ * @param string $pw
+ * @param string $serveur
+ * @return array
+ */
 function lire_php_auth($login, $pw, $serveur=''){
 	// en auth php, le login est forcement celui en base
 	// pas la peine de passer par la methode auth/xxx pour identifier le login
@@ -552,10 +617,16 @@ function lire_php_auth($login, $pw, $serveur=''){
 	return false;
 }
 
-//
-// entete php_auth (est-encore utilise ?)
-//
-// http://doc.spip.org/@ask_php_auth
+/**
+ * entete php_auth (est-encore utilise ?)
+ *
+ * @param <type> $pb
+ * @param <type> $raison
+ * @param <type> $retour
+ * @param <type> $url
+ * @param <type> $re
+ * @param <type> $lien
+ */
 function ask_php_auth($pb, $raison, $retour, $url='', $re='', $lien='') {
 	@Header("WWW-Authenticate: Basic realm=\"espace prive\"");
 	@Header("HTTP/1.0 401 Unauthorized");
diff --git a/prive/formulaires/login.php b/prive/formulaires/login.php
index e2ae581400..2a45085d2f 100644
--- a/prive/formulaires/login.php
+++ b/prive/formulaires/login.php
@@ -24,6 +24,11 @@ function formulaires_login_charger_dist($cible="",$login="",$prive=null)
 	$erreur = _request('var_erreur');
 
 	if (!$login) $login = _request('var_login');
+	// si on est deja identifie
+	if (!$login AND isset($GLOBALS['visiteur_session']['login'])) {
+		$login = $GLOBALS['visiteur_session']['login'];
+	}
+	// ou si on a un cookie admin
 	if (!$login) {
 		if (isset($_COOKIE['spip_admin'])
 		AND preg_match(",^@(.*)$,", $_COOKIE['spip_admin'], $regs))
@@ -55,7 +60,9 @@ function formulaires_login_charger_dist($cible="",$login="",$prive=null)
 	if (is_null($prive) ? is_url_prive($cible) : $prive) {
 		include_spip('inc/autoriser');
 		$loge = autoriser('ecrire');
-	} else 	$loge = ($GLOBALS['visiteur_session']['auth'] != '');
+	} 
+	else
+		$loge = ($GLOBALS['visiteur_session']['auth'] != '');
 
 	// Si on est connecte, appeler traiter()
 	// et lancer la redirection si besoin
@@ -113,8 +120,13 @@ function formulaires_login_verifier_dist($cible="",$login="",$prive=null){
 				array('login' => htmlspecialchars($login))));
 	}
 
+	// appeler auth_identifier_login qui va :
+	// - renvoyer un string si echec (message d'erreur)
+	// - un array decrivant l'auteur identifie si possible
+	// - rediriger vers un SSO qui renverra in fine sur action/auth qui finira l'authentification
 	include_spip('inc/auth');
 	$auteur = auth_identifier_login($session_login, $session_password);
+	// on arrive ici si on ne s'est pas identifie avec un SSO
 	if (!is_array($auteur)) {
 		$erreurs = array();
 		if (is_string($auteur))
@@ -134,14 +146,8 @@ function formulaires_login_verifier_dist($cible="",$login="",$prive=null){
 	// en gerant la duree demandee pour son cookie 
 	if ($session_remember !== NULL)
 		$auteur['cookie'] = $session_remember;
-	$session = charger_fonction('session', 'inc');
-	$session($auteur);
-	$p = ($auteur['prefs']) ? unserialize($auteur['prefs']) : array();
-	$p['cnx'] = ($session_remember == 'oui') ? 'perma' : '';
-	$p = array('prefs' => serialize($p));
-	sql_updateq('spip_auteurs', $p, "id_auteur=" . $auteur['id_auteur']);
-	//  bloquer ici le visiteur qui tente d'abuser de ses droits
-	verifier_visiteur();
+	auth_loger($auteur);
+
 	return (is_null($prive) ? is_url_prive($cible) : $prive)
 	?  login_autoriser() : array();
 }
-- 
GitLab