[SPIP] ~v3.0.20-->v3.0.25
[lhc/web/clavette_www.git] / www / ecrire / action / logout.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2016 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 if (!defined('_ECRIRE_INC_VERSION')) return;
14
15 include_spip('inc/cookie');
16
17
18 /**
19 * Se deloger
20 * Pour eviter les CSRF on passe par une etape de confirmation si pas de jeton fourni
21 * avec un autosubmit js pour ne pas compliquer l'experience utilisateur
22 *
23 * http://doc.spip.org/@action_logout_dist
24 *
25 */
26 function action_logout_dist()
27 {
28 $logout =_request('logout');
29 $url = securiser_redirect_action(_request('url'));
30 // cas particulier, logout dans l'espace public
31 if ($logout == 'public' AND !$url)
32 $url = url_de_base();
33
34 // seul le loge peut se deloger (mais id_auteur peut valoir 0 apres une restauration avortee)
35 if (isset($GLOBALS['visiteur_session']['id_auteur'])
36 AND is_numeric($GLOBALS['visiteur_session']['id_auteur'])
37 // des sessions anonymes avec id_auteur=0 existent, mais elle n'ont pas de statut : double check
38 AND isset($GLOBALS['visiteur_session']['statut'])) {
39
40 // il faut un jeton pour fermer la session (eviter les CSRF)
41 if (!$jeton = _request('jeton')
42 OR !verifier_jeton_logout($jeton,$GLOBALS['visiteur_session'])){
43 $jeton = generer_jeton_logout($GLOBALS['visiteur_session']);
44 $action = generer_url_action("logout","jeton=$jeton");
45 $action = parametre_url($action,'logout',_request('logout'));
46 $action = parametre_url($action,'url',_request('url'));
47 include_spip("inc/minipres");
48 include_spip("inc/filtres");
49 $texte = bouton_action(_T('spip:icone_deconnecter'),$action);
50 $texte = "<div class='boutons'>$texte</div>";
51 $texte .= '<script type="text/javascript">document.write("<style>body{visibility:hidden;}</style>");window.document.forms[0].submit();</script>';
52 $res = minipres(_T('spip:icone_deconnecter'),$texte,'',true);
53 echo $res;
54 return;
55 }
56
57 include_spip('inc/auth');
58 auth_trace($GLOBALS['visiteur_session'], '0000-00-00 00:00:00');
59 // le logout explicite vaut destruction de toutes les sessions
60 if (isset($_COOKIE['spip_session'])) {
61 $session = charger_fonction('session', 'inc');
62 $session($GLOBALS['visiteur_session']['id_auteur']);
63 spip_setcookie('spip_session', $_COOKIE['spip_session'], time()-3600);
64 }
65 // si authentification http, et que la personne est loge,
66 // pour se deconnecter, il faut proposer un nouveau formulaire de connexion http
67 if (isset($_SERVER['PHP_AUTH_USER'])
68 AND !$GLOBALS['ignore_auth_http']
69 AND $GLOBALS['auth_can_disconnect']) {
70 ask_php_auth(_T('login_deconnexion_ok'),
71 _T('login_verifiez_navigateur'),
72 _T('login_retour_public'),
73 "redirect=". _DIR_RESTREINT_ABS,
74 _T('login_test_navigateur'),
75 true);
76
77 }
78 }
79
80 // Rediriger en contrant le cache navigateur (Safari3)
81 include_spip('inc/headers');
82 redirige_par_entete($url
83 ? parametre_url($url, 'var_hasard', uniqid(rand()), '&')
84 : generer_url_public('login'));
85 }
86
87 /**
88 * Generer un jeton de logout personnel et ephemere
89 * @param array $session
90 * @param null|string $alea
91 * @return string
92 */
93 function generer_jeton_logout($session,$alea=null){
94 if (is_null($alea)){
95 if (!isset($GLOBALS['meta']['alea_ephemere'])){
96 include_spip('base/abstract_sql');
97 $GLOBALS['meta']['alea_ephemere'] = sql_getfetsel('valeur', 'spip_meta', "nom='alea_ephemere'");
98 }
99 $alea = $GLOBALS['meta']['alea_ephemere'];
100 }
101
102 $jeton = md5($session['date_session']
103 .$session['id_auteur']
104 .$session['statut']
105 .$alea
106 );
107 return $jeton;
108 }
109
110 /**
111 * Verifier que le jeton de logout est bon
112 * il faut verifier avec alea_ephemere_ancien si pas bon avec alea_ephemere
113 * pour gerer le cas de la rotation d'alea
114 * @param string $jeton
115 * @param array $session
116 * @return bool
117 */
118 function verifier_jeton_logout($jeton,$session){
119 if (generer_jeton_logout($session)===$jeton)
120 return true;
121 if (!isset($GLOBALS['meta']['alea_ephemere_ancien'])){
122 include_spip('base/abstract_sql');
123 $GLOBALS['meta']['alea_ephemere_ancien'] = sql_getfetsel('valeur', 'spip_meta', "nom='alea_ephemere_ancien'");
124 }
125 if (generer_jeton_logout($session,$GLOBALS['meta']['alea_ephemere_ancien'])===$jeton)
126 return true;
127 return false;
128 }
129
130 ?>