/ecrire/action/logout.php
PHP | 143 lines | 76 code | 17 blank | 50 comment | 10 complexity | 9c6b9d57cac15da008af2751861f0328 MD5 | raw file
Possible License(s): LGPL-2.1, MIT
- <?php
- /***************************************************************************\
- * SPIP, Systeme de publication pour l'internet *
- * *
- * Copyright (c) 2001-2017 *
- * 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. *
- \***************************************************************************/
- /**
- * Action pour déconnecter une personne authentifiée
- *
- * @package SPIP\Core\Authentification
- */
- if (!defined('_ECRIRE_INC_VERSION')) {
- return;
- }
- include_spip('inc/cookie');
- /**
- * Se déloger
- *
- * Pour éviter les CSRF on passe par une étape de confirmation si pas de jeton fourni
- * avec un autosubmit js pour ne pas compliquer l'expérience utilisateur
- *
- * Déconnecte l'utilisateur en cours et le redirige sur l'URL indiquée par
- * l'argument de l'action sécurisée, et sinon sur la page d'accueil
- * de l'espace public.
- *
- */
- function action_logout_dist() {
- $logout = _request('logout');
- $url = securiser_redirect_action(_request('url'));
- // cas particulier, logout dans l'espace public
- if ($logout == 'public' and !$url) {
- $url = url_de_base();
- }
- // seul le loge peut se deloger (mais id_auteur peut valoir 0 apres une restauration avortee)
- if (isset($GLOBALS['visiteur_session']['id_auteur'])
- and is_numeric($GLOBALS['visiteur_session']['id_auteur'])
- // des sessions anonymes avec id_auteur=0 existent, mais elle n'ont pas de statut : double check
- and isset($GLOBALS['visiteur_session']['statut'])
- ) {
- // il faut un jeton pour fermer la session (eviter les CSRF)
- if (!$jeton = _request('jeton')
- or !verifier_jeton_logout($jeton, $GLOBALS['visiteur_session'])
- ) {
- $jeton = generer_jeton_logout($GLOBALS['visiteur_session']);
- $action = generer_url_action("logout", "jeton=$jeton");
- $action = parametre_url($action, 'logout', _request('logout'));
- $action = parametre_url($action, 'url', _request('url'));
- include_spip("inc/minipres");
- include_spip("inc/filtres");
- $texte = bouton_action(_T('spip:icone_deconnecter'), $action);
- $texte = "<div class='boutons'>$texte</div>";
- $texte .= '<script type="text/javascript">document.write("<style>body{visibility:hidden;}</style>");window.document.forms[0].submit();</script>';
- $res = minipres(_T('spip:icone_deconnecter'), $texte, '', true);
- echo $res;
- return;
- }
- include_spip('inc/auth');
- auth_trace($GLOBALS['visiteur_session'], '0000-00-00 00:00:00');
- // le logout explicite vaut destruction de toutes les sessions
- if (isset($_COOKIE['spip_session'])) {
- $session = charger_fonction('session', 'inc');
- $session($GLOBALS['visiteur_session']['id_auteur']);
- spip_setcookie('spip_session', $_COOKIE['spip_session'], time() - 3600);
- }
- // si authentification http, et que la personne est loge,
- // pour se deconnecter, il faut proposer un nouveau formulaire de connexion http
- if (isset($_SERVER['PHP_AUTH_USER'])
- and !$GLOBALS['ignore_auth_http']
- and $GLOBALS['auth_can_disconnect']
- ) {
- ask_php_auth(_T('login_deconnexion_ok'),
- _T('login_verifiez_navigateur'),
- _T('login_retour_public'),
- "redirect=" . _DIR_RESTREINT_ABS,
- _T('login_test_navigateur'),
- true);
- }
- }
- // Rediriger en contrant le cache navigateur (Safari3)
- include_spip('inc/headers');
- redirige_par_entete($url
- ? parametre_url($url, 'var_hasard', uniqid(rand()), '&')
- : generer_url_public('login'));
- }
- /**
- * Generer un jeton de logout personnel et ephemere
- *
- * @param array $session
- * @param null|string $alea
- * @return string
- */
- function generer_jeton_logout($session, $alea = null) {
- if (is_null($alea)) {
- include_spip('inc/acces');
- $alea = charger_aleas();
- }
- $jeton = md5($session['date_session']
- . $session['id_auteur']
- . $session['statut']
- . $alea
- );
- return $jeton;
- }
- /**
- * Verifier que le jeton de logout est bon
- *
- * Il faut verifier avec alea_ephemere_ancien si pas bon avec alea_ephemere
- * pour gerer le cas de la rotation d'alea
- *
- * @param string $jeton
- * @param array $session
- * @return bool
- */
- function verifier_jeton_logout($jeton, $session) {
- if (generer_jeton_logout($session) === $jeton) {
- return true;
- }
- if (generer_jeton_logout($session, $GLOBALS['meta']['alea_ephemere_ancien']) === $jeton) {
- return true;
- }
- return false;
- }