PageRenderTime 41ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/ecrire/action/logout.php

https://bitbucket.org/re_al_/real.test.spip
PHP | 143 lines | 76 code | 17 blank | 50 comment | 10 complexity | 9c6b9d57cac15da008af2751861f0328 MD5 | raw file
Possible License(s): LGPL-2.1, MIT
  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Systeme de publication pour l'internet *
  4. * *
  5. * Copyright (c) 2001-2017 *
  6. * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
  7. * *
  8. * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
  9. * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
  10. \***************************************************************************/
  11. /**
  12. * Action pour déconnecter une personne authentifiée
  13. *
  14. * @package SPIP\Core\Authentification
  15. */
  16. if (!defined('_ECRIRE_INC_VERSION')) {
  17. return;
  18. }
  19. include_spip('inc/cookie');
  20. /**
  21. * Se déloger
  22. *
  23. * Pour éviter les CSRF on passe par une étape de confirmation si pas de jeton fourni
  24. * avec un autosubmit js pour ne pas compliquer l'expérience utilisateur
  25. *
  26. * Déconnecte l'utilisateur en cours et le redirige sur l'URL indiquée par
  27. * l'argument de l'action sécurisée, et sinon sur la page d'accueil
  28. * de l'espace public.
  29. *
  30. */
  31. function action_logout_dist() {
  32. $logout = _request('logout');
  33. $url = securiser_redirect_action(_request('url'));
  34. // cas particulier, logout dans l'espace public
  35. if ($logout == 'public' and !$url) {
  36. $url = url_de_base();
  37. }
  38. // seul le loge peut se deloger (mais id_auteur peut valoir 0 apres une restauration avortee)
  39. if (isset($GLOBALS['visiteur_session']['id_auteur'])
  40. and is_numeric($GLOBALS['visiteur_session']['id_auteur'])
  41. // des sessions anonymes avec id_auteur=0 existent, mais elle n'ont pas de statut : double check
  42. and isset($GLOBALS['visiteur_session']['statut'])
  43. ) {
  44. // il faut un jeton pour fermer la session (eviter les CSRF)
  45. if (!$jeton = _request('jeton')
  46. or !verifier_jeton_logout($jeton, $GLOBALS['visiteur_session'])
  47. ) {
  48. $jeton = generer_jeton_logout($GLOBALS['visiteur_session']);
  49. $action = generer_url_action("logout", "jeton=$jeton");
  50. $action = parametre_url($action, 'logout', _request('logout'));
  51. $action = parametre_url($action, 'url', _request('url'));
  52. include_spip("inc/minipres");
  53. include_spip("inc/filtres");
  54. $texte = bouton_action(_T('spip:icone_deconnecter'), $action);
  55. $texte = "<div class='boutons'>$texte</div>";
  56. $texte .= '<script type="text/javascript">document.write("<style>body{visibility:hidden;}</style>");window.document.forms[0].submit();</script>';
  57. $res = minipres(_T('spip:icone_deconnecter'), $texte, '', true);
  58. echo $res;
  59. return;
  60. }
  61. include_spip('inc/auth');
  62. auth_trace($GLOBALS['visiteur_session'], '0000-00-00 00:00:00');
  63. // le logout explicite vaut destruction de toutes les sessions
  64. if (isset($_COOKIE['spip_session'])) {
  65. $session = charger_fonction('session', 'inc');
  66. $session($GLOBALS['visiteur_session']['id_auteur']);
  67. spip_setcookie('spip_session', $_COOKIE['spip_session'], time() - 3600);
  68. }
  69. // si authentification http, et que la personne est loge,
  70. // pour se deconnecter, il faut proposer un nouveau formulaire de connexion http
  71. if (isset($_SERVER['PHP_AUTH_USER'])
  72. and !$GLOBALS['ignore_auth_http']
  73. and $GLOBALS['auth_can_disconnect']
  74. ) {
  75. ask_php_auth(_T('login_deconnexion_ok'),
  76. _T('login_verifiez_navigateur'),
  77. _T('login_retour_public'),
  78. "redirect=" . _DIR_RESTREINT_ABS,
  79. _T('login_test_navigateur'),
  80. true);
  81. }
  82. }
  83. // Rediriger en contrant le cache navigateur (Safari3)
  84. include_spip('inc/headers');
  85. redirige_par_entete($url
  86. ? parametre_url($url, 'var_hasard', uniqid(rand()), '&')
  87. : generer_url_public('login'));
  88. }
  89. /**
  90. * Generer un jeton de logout personnel et ephemere
  91. *
  92. * @param array $session
  93. * @param null|string $alea
  94. * @return string
  95. */
  96. function generer_jeton_logout($session, $alea = null) {
  97. if (is_null($alea)) {
  98. include_spip('inc/acces');
  99. $alea = charger_aleas();
  100. }
  101. $jeton = md5($session['date_session']
  102. . $session['id_auteur']
  103. . $session['statut']
  104. . $alea
  105. );
  106. return $jeton;
  107. }
  108. /**
  109. * Verifier que le jeton de logout est bon
  110. *
  111. * Il faut verifier avec alea_ephemere_ancien si pas bon avec alea_ephemere
  112. * pour gerer le cas de la rotation d'alea
  113. *
  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. }
  122. if (generer_jeton_logout($session, $GLOBALS['meta']['alea_ephemere_ancien']) === $jeton) {
  123. return true;
  124. }
  125. return false;
  126. }