X-Git-Url: https://git.cyclocoop.org/%7B%24admin_url%7Dmembres/modifier.php?a=blobdiff_plain;f=www%2Fprive%2Fformulaires%2Flogin.php;h=9ec45aca8e05a17195b0d4670119dbe8d175f41b;hb=62c0d913327fb32493270c8d6a58b813f74c14de;hp=fe914a53c16246e0e9249886b21eed196cd1035a;hpb=e5ac31e5de77e4efbc3f0583b42444a0943664c7;p=lhc%2Fweb%2Fwww.git diff --git a/www/prive/formulaires/login.php b/www/prive/formulaires/login.php index fe914a53..9ec45aca 100644 --- a/www/prive/formulaires/login.php +++ b/www/prive/formulaires/login.php @@ -3,38 +3,82 @@ /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * - * Copyright (c) 2001-2014 * + * Copyright (c) 2001-2019 * * 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; +/** + * Gestion du formulaire d'identification / de connexion à SPIP + * + * @package SPIP\Core\Formulaires + **/ + +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('base/abstract_sql'); -function is_url_prive($cible){ +/** + * Teste si une URL est une URL de l'espace privé (administration de SPIP) + * ou de l'espace public + * + * @param string $cible URL + * @return bool + * true si espace privé, false sinon. + **/ +function is_url_prive($cible) { include_spip('inc/filtres_mini'); - $path = parse_url(tester_url_absolue($cible)?$cible:url_absolue($cible)); - $path = (isset($path['path'])?$path['path']:''); - return strncmp(substr($path,-strlen(_DIR_RESTREINT_ABS)), _DIR_RESTREINT_ABS, strlen(_DIR_RESTREINT_ABS))==0; + $path = parse_url(tester_url_absolue($cible) ? $cible : url_absolue($cible)); + $path = (isset($path['path']) ? $path['path'] : ''); + + return strncmp(substr($path, -strlen(_DIR_RESTREINT_ABS)), _DIR_RESTREINT_ABS, strlen(_DIR_RESTREINT_ABS)) == 0; } -function formulaires_login_charger_dist($cible="",$login="",$prive=null) -{ +/** + * Chargement du formulaire de login + * + * Si on est déjà connecté, on redirige directement sur l'URL cible ! + * + * @uses auth_informer_login() + * @uses is_url_prive() + * @uses login_auth_http() + * + * @param string $cible + * URL de destination après identification. + * Cas spécifique : la valeur `@page_auteur` permet d'être redirigé + * après connexion sur le squelette public de l'auteur qui se connecte. + * @param string $login + * Login de la personne à identifier (si connu) + * @param null|bool $prive + * Identifier pour l'espace privé (true), public (false) + * ou automatiquement (null) en fonction de la destination de l'URL cible. + * @return array + * Environnement du formulaire + **/ +function formulaires_login_charger_dist($cible = '', $login = '', $prive = null) { $erreur = _request('var_erreur'); - if (!$login) $login = strval(_request('var_login')); + if (!$login) { + $login = strval(_request('var_login')); + } // si on est deja identifie - if (!$login AND isset($GLOBALS['visiteur_session']['login'])) { + if (!$login and isset($GLOBALS['visiteur_session']['email'])) { + $login = $GLOBALS['visiteur_session']['email']; + } + 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)) + and preg_match(',^@(.*)$,', $_COOKIE['spip_admin'], $regs) + ) { $login = $regs[1]; + } } include_spip('inc/auth'); @@ -43,43 +87,45 @@ function formulaires_login_charger_dist($cible="",$login="",$prive=null) // Construire l'environnement du squelette // Ne pas proposer de "rester connecte quelques jours" // si la duree de l'alea est inferieure a 12 h (valeur par defaut) - + $valeurs = array( 'var_login' => $login, 'editable' => !$row, - 'cnx' => isset($row['cnx']) ? $row['cnx'] : '', + 'cnx' => isset($row['cnx']) ? $row['cnx'] : '0', 'auth_http' => login_auth_http(), - 'rester_connecte' => ((_RENOUVELLE_ALEA < 12*3600)? '' : ' '), + 'rester_connecte' => ((_RENOUVELLE_ALEA < 12 * 3600) ? '' : ' '), '_logo' => isset($row['logo']) ? $row['logo'] : '', - '_alea_actuel' => isset($row['alea_actuel'])?$row['alea_actuel']:'', - '_alea_futur' => isset($row['alea_futur'])?$row['alea_futur']:'', + '_alea_actuel' => isset($row['alea_actuel']) ? $row['alea_actuel'] : '', + '_alea_futur' => isset($row['alea_futur']) ? $row['alea_futur'] : '', '_pipeline' => 'affiche_formulaire_login', // faire passer le formulaire dans un pipe dedie pour les methodes auth - ); + ); - if ($erreur OR !isset($GLOBALS['visiteur_session']['id_auteur']) OR !$GLOBALS['visiteur_session']['id_auteur']) + if ($erreur or !isset($GLOBALS['visiteur_session']['id_auteur']) or !$GLOBALS['visiteur_session']['id_auteur']) { $valeurs['editable'] = true; + } if (is_null($prive) ? is_url_prive($cible) : $prive) { include_spip('inc/autoriser'); $loge = autoriser('ecrire'); - } - else - $loge = (isset($GLOBALS['visiteur_session']['auth']) AND $GLOBALS['visiteur_session']['auth'] != ''); + } else { + $loge = (isset($GLOBALS['visiteur_session']['auth']) and $GLOBALS['visiteur_session']['auth'] != ''); + } // Si on est connecte, appeler traiter() // et lancer la redirection si besoin - if (!$valeurs['editable'] AND $loge) { - $traiter = charger_fonction('traiter','formulaires/login'); + if (!$valeurs['editable'] and $loge and _request('formulaire_action')!=='login') { + $traiter = charger_fonction('traiter', 'formulaires/login'); $res = $traiter($cible, $login, $prive); - $valeurs = array_merge($valeurs,$res); + $valeurs = array_merge($valeurs, $res); - if (isset($res['redirect']) and $res['redirect']){ + if (isset($res['redirect']) and $res['redirect']) { include_spip('inc/headers'); # preparer un lien pour quand redirige_formulaire ne fonctionne pas - $m = redirige_formulaire($res['redirect']); + $m = redirige_formulaire($res['redirect'], '', 'ajaxform'); $valeurs['_deja_loge'] = inserer_attribut( - "" . _T('login_par_ici') . "$m", - 'href', $res['redirect'] + '' . _T('login_par_ici') . "$m", + 'href', + $res['redirect'] ); } } @@ -87,38 +133,68 @@ function formulaires_login_charger_dist($cible="",$login="",$prive=null) // pose de cookie ; s'il n'est pas la, c'est echec cookie // s'il est la, c'est probablement un bookmark sur bonjour=oui, // et pas un echec cookie. - if ($erreur == 'cookie') $valeurs['echec_cookie'] = ' '; - elseif ($erreur){ + if ($erreur == 'cookie') { + $valeurs['echec_cookie'] = ' '; + } elseif ($erreur) { // une erreur d'un SSO indique dans la redirection vers ici // mais il faut se proteger de toute tentative d'injection malveilante - include_spip('inc/texte'); - $valeurs['message_erreur'] = safehtml($erreur); + include_spip('inc/filtres'); + $valeurs['message_erreur'] = textebrut($erreur); } return $valeurs; } -// Gerer le cas ou un utilisateur ne souhaite pas de cookie -// on propose alors un formulaire pour s'authentifier via http - -function login_auth_http() -{ +/** + * Identification via HTTP (si pas de cookie) + * + * Gére le cas où un utilisateur ne souhaite pas de cookie : + * on propose alors un formulaire pour s'authentifier via http + * + * @return string + * - Si connection possible en HTTP : URL pour réaliser cette identification, + * - chaîne vide sinon. + **/ +function login_auth_http() { if (!$GLOBALS['ignore_auth_http'] - AND _request('var_erreur')=='cookie' - AND (!isset($_COOKIE['spip_session']) OR $_COOKIE['spip_session'] != 'test_echec_cookie') - AND (($GLOBALS['flag_sapi_name'] AND preg_match(",apache,i", @php_sapi_name())) - OR preg_match(",^Apache.* PHP,", $_SERVER['SERVER_SOFTWARE'])) + and _request('var_erreur') == 'cookie' + and (!isset($_COOKIE['spip_session']) or $_COOKIE['spip_session'] != 'test_echec_cookie') + and (($GLOBALS['flag_sapi_name'] and preg_match(',apache,i', @php_sapi_name())) + or preg_match(',^Apache.* PHP,', $_SERVER['SERVER_SOFTWARE'])) // Attention dans le cas 'intranet' la proposition de se loger // par auth_http peut conduire a l'echec. - AND !(isset($_SERVER['PHP_AUTH_USER']) AND isset($_SERVER['PHP_AUTH_PW']))) - - return generer_url_action('cookie',"",false,true); - else return ''; + and !(isset($_SERVER['PHP_AUTH_USER']) and isset($_SERVER['PHP_AUTH_PW'])) + ) { + return generer_url_action('cookie', '', false, true); + } else { + return ''; + } } -function formulaires_login_verifier_dist($cible="",$login="",$prive=null){ - +/** + * Vérifications du formulaire de login + * + * Connecte la personne si l'identification réussie. + * + * @uses auth_identifier_login() + * @uses auth_loger() + * @uses login_autoriser() + * + * @param string $cible + * URL de destination après identification. + * Cas spécifique : la valeur `@page_auteur` permet d'être redirigé + * après connexion sur le squelette public de l'auteur qui se connecte. + * @param string $login + * Login de la personne à identifier (si connu) + * @param null|bool $prive + * Identifier pour l'espace privé (true), public (false) + * ou automatiquement (null) en fonction de la destination de l'URL cible. + * @return array + * Erreurs du formulaire + **/ +function formulaires_login_verifier_dist($cible = '', $login = '', $prive = null) { + $session_login = _request('var_login'); $session_password = _request('password'); $session_remember = _request('session_remember'); @@ -137,83 +213,124 @@ function formulaires_login_verifier_dist($cible="",$login="",$prive=null){ // on arrive ici si on ne s'est pas identifie avec un SSO if (!is_array($auteur)) { $erreurs = array(); - if (is_string($auteur)) + if (is_string($auteur) and strlen($auteur)) { $erreurs['var_login'] = $auteur; + } include_spip('inc/cookie'); - spip_setcookie("spip_admin", "", time() - 3600); - if (strlen($session_password)) + spip_setcookie('spip_admin', '', time() - 3600); + if (strlen($session_password)) { $erreurs['password'] = _T('login_erreur_pass'); - // sinon c'est un login en deux passe old style (ou js en panne) - // pas de message d'erreur - else + } else { + // sinon c'est un login en deux passe old style (ou js en panne) + // pas de message d'erreur $erreurs['password'] = ' '; + } + return $erreurs; } // on a ete authentifie, construire la session - // en gerant la duree demandee pour son cookie - if ($session_remember !== NULL) + // en gerant la duree demandee pour son cookie + if ($session_remember !== null) { $auteur['cookie'] = $session_remember; - auth_loger($auteur); + } + // si la connexion est refusee on renvoi un message erreur de mot de passe + // car en donnant plus de detail on renseignerait un assaillant sur l'existence d'un compte + if (auth_loger($auteur) === false) { + $erreurs['message_erreur'] = _T('login_erreur_pass'); + return $erreurs; + } return (is_null($prive) ? is_url_prive($cible) : $prive) - ? login_autoriser() : array(); + ? login_autoriser() : array(); } -function login_autoriser() -{ +/** + * Teste l'autorisation d'accéder à l'espace privé une fois une connexion + * réussie, si la cible est une URL privée. + * + * Dans le cas contraire, un message d'erreur est retourné avec un lien + * pour se déconnecter. + * + * @return array + * - Erreur si un connecté n'a pas le droit d'acceder à l'espace privé + * - tableau vide sinon. + **/ +function login_autoriser() { include_spip('inc/autoriser'); - if (!autoriser('ecrire')){ - $h = generer_url_action('logout','logout=prive&url='.urlencode(self())); - return array('message_erreur' => "

" - ._T('avis_erreur_visiteur') - ."

" - ._T('texte_erreur_visiteur') - ."

[" - ._T('icone_deconnecter')."]

"); + if (!autoriser('ecrire')) { + $h = generer_url_action('logout', 'logout=prive&url=' . urlencode(self())); + + return array( + 'message_erreur' => '

' + . _T('avis_erreur_visiteur') + . '

' + . _T('texte_erreur_visiteur') + . "

[" + . _T('icone_deconnecter') . ']

' + ); } + return array(); } -function formulaires_login_traiter_dist($cible="",$login="",$prive=null){ +/** + * Traitements du formulaire de login + * + * On arrive ici une fois connecté. + * On redirige simplement sur l'URL cible désignée. + * + * @param string $cible + * URL de destination après identification. + * Cas spécifique : la valeur `@page_auteur` permet d'être redirigé + * après connexion sur le squelette public de l'auteur qui se connecte. + * @param string $login + * Login de la personne à identifier (si connu) + * @param null|bool $prive + * Identifier pour l'espace privé (true), public (false) + * ou automatiquement (null) en fonction de la destination de l'URL cible. + * @return array + * Retours du traitement + **/ +function formulaires_login_traiter_dist($cible = '', $login = '', $prive = null) { $res = array(); - // Si on se connecte dans l'espace prive, + // Si on se connecte dans l'espace prive, // ajouter "bonjour" (repere a peu pres les cookies desactives) if (is_null($prive) ? is_url_prive($cible) : $prive) { $cible = parametre_url($cible, 'bonjour', 'oui', '&'); } - if ($cible=='@page_auteur') - $cible = generer_url_entite($GLOBALS['auteur_session']['id_auteur'],'auteur'); + if ($cible == '@page_auteur') { + $cible = generer_url_entite($GLOBALS['auteur_session']['id_auteur'], 'auteur'); + } if ($cible) { $cible = parametre_url($cible, 'var_login', '', '&'); // transformer la cible absolue en cible relative // pour pas echouer quand la meta adresse_site est foireuse - if (strncmp($cible,$u = url_de_base(),strlen($u))==0){ - $cible = "./".substr($cible,strlen($u)); - } - - // si c'est une url absolue, refuser la redirection - // sauf si cette securite est levee volontairement par le webmestre - elseif (tester_url_absolue($cible) AND !defined('_AUTORISER_LOGIN_ABS_REDIRECT')) { - $cible = ""; + if (strncmp($cible, $u = url_de_base(), strlen($u)) == 0) { + $cible = './' . substr($cible, strlen($u)); + } elseif (tester_url_absolue($cible) and !defined('_AUTORISER_LOGIN_ABS_REDIRECT')) { + // si c'est une url absolue, refuser la redirection + // sauf si cette securite est levee volontairement par le webmestre + $cible = ''; } } // Si on est connecte, envoyer vers la destination - if ($cible AND ($cible!=self('&')) AND ($cible!=self())) { - if (!headers_sent() AND !$_GET['var_mode']) { - include_spip('inc/headers'); - $res['redirect'] = $cible; - } else { - $res['message_ok'] = inserer_attribut( - "" . _T('login_par_ici') . "", - 'href', $cible - ); - } + if ($cible and ($cible != self('&')) and ($cible != self())) { + $res['redirect'] = $cible; + $res['message_ok'] = inserer_attribut( + '' . _T('login_par_ici') . '', + 'href', + $cible + ); } + + // avant de rediriger il faut mettre a jour les sessions sur le disque si on a charge une session + if (function_exists('terminer_actualiser_sessions')) { + terminer_actualiser_sessions(); + } + return $res; } - -?>