/** * Se deloger * Pour eviter les CSRF on passe par une etape de confirmation si pas de jeton, * avec un autosubmit js pour ne pas compliquer l'experience utilisateur * * http://doc.spip.org/@action_logout_dist * */ function action_logout_dist() { $logout =_request('logout'); $url = _request('url'); // 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 elles n'ont pas de statut : verifier ca aussi AND isset($GLOBALS['visiteur_session']['statut'])) { // relancer si pas de jeton if (!action_logout_secu($logout, $url, _request('jeton'))) { return; // page submit retournee } elseif (isset($_COOKIE['spip_session'])) { // le logout explicite vaut destruction de toutes les sessions $session = charger_fonction('session', 'inc'); $session($GLOBALS['visiteur_session']['id_auteur']); spip_setcookie('spip_session', $_COOKIE['spip_session'], time()-3600); } include_spip('inc/auth'); auth_trace($GLOBALS['visiteur_session'],'0000-00-00 00:00:00'); } // Action terminee (ou non faite si pas les droits) on redirige. // Cas particulier, logout dans l'espace public $url = securiser_redirect_action($url); if ($logout == 'public' AND !$url) $url = url_de_base(); include_spip('inc/headers'); redirige_par_entete($url // contrer le cache navigateur (Safari3) ? parametre_url($url, 'var_hasard', uniqid(rand()), '&') : generer_url_public('login')); }
function action_logout_dist() { global $visiteur_session, $ignore_auth_http; $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 (is_numeric($visiteur_session['id_auteur'])) { include_spip('inc/auth'); auth_trace($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($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 !$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')); }
/** * Se deloger * Pour eviter les CSRF on passe par une etape de confirmation si pas de jeton fourni * avec un autosubmit js pour ne pas compliquer l'experience 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']) 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')); }
/** * Init des globales pour tout l'espace prive si visiteur connu * Le tableau global visiteur_session contient toutes les infos pertinentes et * a jour (tandis que $visiteur_session peut avoir des valeurs un peu datees * s'il est pris dans le fichier de session) * Les plus utiles sont aussi dans les variables simples ci-dessus * si la globale est vide ce n'est pas un tableau, on la force pour empecher un warning * * @param array $row * @return array|string */ function auth_init_droits($row) { global $connect_statut, $connect_toutes_rubriques, $connect_id_rubrique, $connect_login, $connect_id_auteur; if ($row['statut'] == 'nouveau') { include_spip('action/inscrire_auteur'); $row = confirmer_statut_inscription($row); } $connect_id_auteur = $row['id_auteur']; $connect_login = $row['login']; $connect_statut = $row['statut']; $GLOBALS['visiteur_session'] = array_merge((array) $GLOBALS['visiteur_session'], $row); // au cas ou : ne pas memoriser les champs sensibles unset($GLOBALS['visiteur_session']['pass']); unset($GLOBALS['visiteur_session']['htpass']); unset($GLOBALS['visiteur_session']['alea_actuel']); unset($GLOBALS['visiteur_session']['alea_futur']); // creer la session au besoin if (!isset($_COOKIE['spip_session'])) { $session = charger_fonction('session', 'inc'); $spip_session = $session($row); } // reinjecter les preferences_auteur apres le reset de spip_session // car utilisees au retour par auth_loger() $r = @unserialize($row['prefs']); $GLOBALS['visiteur_session']['prefs'] = $r ? $r : array(); // si prefs pas definies, les definir par defaut if (!isset($GLOBALS['visiteur_session']['prefs']['couleur'])) { $GLOBALS['visiteur_session']['prefs']['couleur'] = 1; $GLOBALS['visiteur_session']['prefs']['display'] = 2; $GLOBALS['visiteur_session']['prefs']["display_navigation"] = "navigation_avec_icones"; $GLOBALS['visiteur_session']['prefs']["display_outils"] = "oui"; } $GLOBALS['visiteur_session'] = pipeline('preparer_visiteur_session', array('args' => array('row' => $row), 'data' => $GLOBALS['visiteur_session'])); // Etablir les droits selon le codage attendu // dans ecrire/index.php ecrire/prive.php // Pas autorise a acceder a ecrire ? renvoyer le tableau // A noter : le premier appel a autoriser() a le bon gout // d'initialiser $GLOBALS['visiteur_session']['restreint'], // qui ne figure pas dans le fichier de session include_spip('inc/autoriser'); if (!autoriser('ecrire')) { return $row; } // autoriser('ecrire') ne laisse passer que les Admin et les Redac auth_trace($row); // Administrateurs if ($connect_statut == '0minirezo') { if (is_array($GLOBALS['visiteur_session']['restreint'])) { $connect_id_rubrique = $GLOBALS['visiteur_session']['restreint']; } $connect_toutes_rubriques = !$connect_id_rubrique; } // Pour les redacteurs, inc_version a fait l'initialisation minimale return ''; // i.e. pas de pb. }
function auth_init_droits($row) { global $connect_statut, $connect_toutes_rubriques, $connect_id_rubrique, $connect_login, $connect_id_auteur; $connect_id_auteur = $row['id_auteur']; $connect_login = $row['login']; $connect_statut = acces_statut($connect_id_auteur, $row['statut'], $row['bio']); // on force l'écriture de cette info dans le fichier de session // pour pouvoir récupérer #SESSION{en_ligne} dans les squelettes session_set('en_ligne', $row['en_ligne']); $GLOBALS['visiteur_session'] = array_merge((array)$GLOBALS['visiteur_session'], $row); $r = @unserialize($row['prefs']); $GLOBALS['visiteur_session']['prefs'] = (@isset($r['couleur'])) ? $r : array('couleur' =>1, 'display'=>0); // au cas ou : ne pas memoriser les champs sensibles unset($GLOBALS['visiteur_session']['pass']); unset($GLOBALS['visiteur_session']['htpass']); unset($GLOBALS['visiteur_session']['alea_actuel']); unset($GLOBALS['visiteur_session']['alea_futur']); // rajouter les sessions meme en mode auth_http // pour permettre les connexions multiples et identifier les visiteurs if (!isset($_COOKIE['spip_session'])) { $session = charger_fonction('session', 'inc'); if ($spip_session = $session($row)) { include_spip('inc/cookie'); spip_setcookie( 'spip_session', $_COOKIE['spip_session'] = $spip_session, time() + 3600 * 24 * 14 ); } } // Etablir les droits selon le codage attendu // dans ecrire/index.php ecrire/prive.php // Pas autorise a acceder a ecrire ? renvoyer le tableau // A noter : le premier appel a autoriser() a le bon gout // d'initialiser $GLOBALS['visiteur_session']['restreint'], // qui ne figure pas dans le fichier de session include_spip('inc/autoriser'); if (!autoriser('ecrire')) return $row; // autoriser('ecrire') ne laisse passer que les Admin et les Redac auth_trace($row); // Administrateurs if ($connect_statut == '0minirezo') { if (is_array($GLOBALS['visiteur_session']['restreint'])) $connect_id_rubrique = $GLOBALS['visiteur_session']['restreint']; $connect_toutes_rubriques = !$connect_id_rubrique; } // Pour les redacteurs, inc_version a fait l'initialisation minimale return ''; // i.e. pas de pb. }