[SPIP] ~2.1.12 -->2.1.25
[velocampus/web/www.git] / www / ecrire / action / logout.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2014 *
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 include_spip('public/aiguiller');
17
18 /**
19 * Se deloger
20 * Pour eviter les CSRF on passe par une etape de confirmation si pas de jeton,
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 = _request('url');
30 // seul le loge peut se deloger
31 // (mais id_auteur peut valoir 0 apres une restauration avortee)
32 if (isset($GLOBALS['visiteur_session']['id_auteur'])
33 AND is_numeric($GLOBALS['visiteur_session']['id_auteur'])
34 // des sessions anonymes avec id_auteur=0 existent,
35 // mais elles n'ont pas de statut : verifier ca aussi
36 AND isset($GLOBALS['visiteur_session']['statut'])) {
37 // relancer si pas de jeton
38 if (!action_logout_secu($logout, $url, _request('jeton'))) {
39 return; // page submit retournee
40 } elseif (isset($_COOKIE['spip_session'])) {
41 // le logout explicite vaut destruction de toutes les sessions
42
43 $session = charger_fonction('session', 'inc');
44 $session($GLOBALS['visiteur_session']['id_auteur']);
45 spip_setcookie('spip_session', $_COOKIE['spip_session'], time()-3600);
46 }
47 include_spip('inc/auth');
48 auth_trace($GLOBALS['visiteur_session'],'0000-00-00 00:00:00');
49 }
50 // Action terminee (ou non faite si pas les droits) on redirige.
51 // Cas particulier, logout dans l'espace public
52 $url = securiser_redirect_action($url);
53 if ($logout == 'public' AND !$url)
54 $url = url_de_base();
55 include_spip('inc/headers');
56 redirige_par_entete($url
57 // contrer le cache navigateur (Safari3)
58 ? parametre_url($url, 'var_hasard', uniqid(rand()), '&')
59 : generer_url_public('login'));
60 }
61
62 /**
63 * Verifier un jeton si present, ou envoyer une page le produisant
64 * @param string $logout
65 * @param string $url
66 * @param string $jeton
67 * @return boolean
68 */
69
70 function action_logout_secu($logout, $url, $jeton)
71 {
72 if ($jeton AND verifier_jeton_logout($jeton,$GLOBALS['visiteur_session']))
73 return true;
74 $jeton = generer_jeton_logout($GLOBALS['visiteur_session']);
75 $action = generer_url_action("logout","jeton=$jeton");
76 $action = parametre_url($action,'logout',$logout);
77 $action = parametre_url($action,'url',$url);
78 include_spip("inc/minipres");
79 include_spip("inc/filtres");
80 $texte = bouton_action(_T('spip:icone_deconnecter'),$action);
81 $texte = "<div class='boutons'>$texte</div>";
82 $texte .= '<script type="text/javascript">document.write("<style>body{visibility:hidden;}</style>");window.document.forms[0].submit();</script>';
83 echo minipres(_T('spip:icone_deconnecter'),$texte,'',true);
84 return false;
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 ?>