Пример #1
0
/**
 * 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'));
}
Пример #2
0
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'));
}
Пример #3
0
function traiter_appels_actions()
{
    // cas de l'appel qui renvoie une redirection (302) ou rien (204)
    if ($action = _request('action')) {
        include_spip('base/abstract_sql');
        // chargement systematique pour les actions
        include_spip('inc/autoriser');
        include_spip('inc/headers');
        include_spip('inc/actions');
        // des actions peuvent appeler _T
        if (!isset($GLOBALS['spip_lang'])) {
            include_spip('inc/lang');
            utiliser_langue_visiteur();
        }
        // si l'action est provoque par un hit {ajax}
        // il faut transmettre l'env ajax au redirect
        // on le met avant dans la query string au cas ou l'action fait elle meme sa redirection
        if ($v = _request('var_ajax') and $v !== 'form' and $args = _request('var_ajax_env') and $url = _request('redirect')) {
            $url = parametre_url($url, 'var_ajax', $v, '&');
            $url = parametre_url($url, 'var_ajax_env', $args, '&');
            set_request('redirect', $url);
        } else {
            if (_request('redirect')) {
                set_request('redirect', securiser_redirect_action(_request('redirect')));
            }
        }
        $var_f = charger_fonction($action, 'action');
        $var_f();
        if (!isset($GLOBALS['redirect'])) {
            $GLOBALS['redirect'] = _request('redirect');
            if ($_SERVER['REQUEST_METHOD'] == 'POST') {
                $GLOBALS['redirect'] = urldecode($GLOBALS['redirect']);
            }
            $GLOBALS['redirect'] = securiser_redirect_action($GLOBALS['redirect']);
        }
        if ($url = $GLOBALS['redirect']) {
            // si l'action est provoque par un hit {ajax}
            // il faut transmettre l'env ajax au redirect
            // qui a pu etre defini par l'action
            if ($v = _request('var_ajax') and $v !== 'form' and $args = _request('var_ajax_env')) {
                $url = parametre_url($url, 'var_ajax', $v, '&');
                $url = parametre_url($url, 'var_ajax_env', $args, '&');
                // passer l'ancre en variable pour pouvoir la gerer cote serveur
                $url = preg_replace(',#([^#&?]+)$,', "&var_ajax_ancre=\\1", $url);
            }
            $url = str_replace('&', '&', $url);
            // les redirections se font en &, pas en en &
            redirige_par_entete($url);
        }
        if (!headers_sent() and !ob_get_length()) {
            http_status(204);
        }
        // No Content
        return true;
    }
    return false;
}
Пример #4
0
/**
 * 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'));
}
Пример #5
0
// forcer la langue de l'utilisateur pour les squelettes
$forcer_lang = true;
if (_request('action') or _request('var_ajax') or _request('formulaire_action')) {
    // Charger l'aiguilleur qui va mettre sur la bonne voie les traitements derogatoires
    include_spip('public/aiguiller');
    if (traiter_appels_actions() or traiter_appels_inclusions_ajax() or traiter_formulaires_dynamiques()) {
        exit;
    }
    // le hit est fini !
}
// securiser les redirect du back-office
if (_request('redirect')) {
    if (!function_exists('securiser_redirect_action')) {
        include_spip('public/aiguiller');
    }
    set_request('redirect', securiser_redirect_action(_request('redirect')));
}
//
// Gestion d'une page normale de l'espace prive
//
// Controle de la version, sauf si on est deja en train de s'en occuper
if (!$reinstall == 'oui' and !_AJAX and isset($GLOBALS['meta']['version_installee']) and $GLOBALS['spip_version_base'] != str_replace(',', '.', $GLOBALS['meta']['version_installee'])) {
    $exec = 'demande_mise_a_jour';
} elseif (isset($GLOBALS['meta']["admin"])) {
    if (preg_match('/^(.*)_(\\d+)_/', $GLOBALS['meta']["admin"], $l)) {
        list(, $var_f, $n) = $l;
    }
    if (_AJAX or !(isset($_COOKIE['spip_admin']) or isset($GLOBALS['visiteur_session']) and $GLOBALS['visiteur_session']['statut'] == '0minirezo')) {
        spip_log("Quand la meta admin vaut " . $GLOBALS['meta']["admin"] . " seul un admin peut se connecter et sans AJAX." . " En cas de probleme, detruire cette meta.");
        die(_T('info_travaux_texte'));
    }
Пример #6
0
function action_cookie_dist($set_cookie_admin = null, $change_session = null)
{
    $redirect_echec = $redirect = null;
    $test_echec_cookie = null;
    $url = "";
    if (is_null($set_cookie_admin)) {
        $set_cookie_admin = _request('cookie_admin');
        $change_session = _request('change_session');
        $test_echec_cookie = _request('test_echec_cookie');
        // La cible de notre operation de connexion
        $url = securiser_redirect_action(_request('url'));
        $redirect = $url ? $url : generer_url_ecrire('accueil');
        $redirect_echec = _request('url_echec');
        if (!isset($redirect_echec)) {
            if (strpos($redirect, _DIR_RESTREINT_ABS) !== false) {
                $redirect_echec = generer_url_public('login', '', true);
            } else {
                $redirect_echec = $redirect;
            }
        }
    }
    // rejoue le cookie pour renouveler spip_session
    if ($change_session == 'oui') {
        $session = charger_fonction('session', 'inc');
        $session(true);
        spip_log("statut 204 pour " . $_SERVER['REQUEST_URI']);
        http_status(204);
        // No Content
        return;
    }
    // tentative de connexion en auth_http
    if (_request('essai_auth_http') and !$GLOBALS['ignore_auth_http']) {
        include_spip('inc/auth');
        if (@$_SERVER['PHP_AUTH_USER'] and @$_SERVER['PHP_AUTH_PW'] and $auteur = lire_php_auth($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'])) {
            auth_loger($auteur);
            redirige_par_entete(parametre_url($redirect, 't', time(), '&'));
        } else {
            ask_php_auth(_T('info_connexion_refusee'), _T('login_login_pass_incorrect'), _T('login_retour_site'), "url=" . rawurlencode($redirect), _T('login_nouvelle_tentative'), strpos($url, _DIR_RESTREINT_ABS) !== false);
        }
    } else {
        // en cas de login sur bonjour=oui, on tente de poser un cookie
        // puis de passer au login qui diagnostiquera l'echec de cookie
        // le cas echeant.
        if ($test_echec_cookie == 'oui') {
            spip_setcookie('spip_session', 'test_echec_cookie');
            if ($redirect) {
                $redirect = parametre_url(parametre_url($redirect_echec, 'var_echec_cookie', 'oui', '&'), 'url', rawurlencode($redirect), '&');
            }
        } else {
            $cook = isset($_COOKIE['spip_admin']) ? $_COOKIE['spip_admin'] : '';
            // Suppression cookie d'admin ?
            if ($set_cookie_admin == "non") {
                if ($cook) {
                    spip_setcookie('spip_admin', $cook, time() - 3600 * 24);
                }
            } else {
                if ($set_cookie_admin) {
                    spip_setcookie('spip_admin', $set_cookie_admin, time() + 14 * 24 * 3600);
                }
            }
        }
    }
    // Redirection finale
    if ($redirect) {
        redirige_par_entete($redirect, true);
    }
}