diff --git a/.gitattributes b/.gitattributes index 5b20eccffa3c6c0f9a0725e3e94709169c56b6a2..7237a1440fe16695166fb4dfe6cbbb5e901f8630 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 0000000000000000000000000000000000000000..08a96d03d974f411df6640f55abfc373f276f2b9 --- /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 5768b5e200e9d82b38732d0dbe12d503bb445dd1..2d6e0992d4402558edfeafe6b7ca1e2396978dd0 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 e2ae5814001b5571fd5b8d93e6959ae5016281f1..2a45085d2f0e01a72438bcfa4f87ac7b3b8a85cd 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(); }