Skip to content
Extraits de code Groupes Projets
spip_cookie.php3 8,99 ko
Newer Older
<?php
Yannick Patois's avatar
Yannick Patois a validé

Fil's avatar
Fil a validé
/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
Fil's avatar
Fil a validé
 *  Copyright (c) 2001-2006                                                *
Fil's avatar
Fil a validé
 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
 *                                                                         *
 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
\***************************************************************************/

esj's avatar
esj a validé
include ("ecrire/inc_version.php");
include_ecrire ("inc_session");
include_ecrire('inc_cookie');
function auth_http($url, $essai_auth_http) {
Fil's avatar
 
Fil a validé
	global $_SERVER;
	if ($essai_auth_http == 'oui') {
Fil's avatar
 
Fil a validé
		if (verifier_php_auth())
			redirige_par_entete($url);
Fil's avatar
 
Fil a validé
		else {
			ask_php_auth(_T('login_connexion_refusee'),
			_T('login_login_pass_incorrect'), _T('login_retour_site'),
			"url=".urlencode($url), _T('login_nouvelle_tentative'),
Fil's avatar
 
Fil a validé
			(ereg(_DIR_RESTREINT_ABS, $url)));
			exit;
		}
	}
	// si demande logout auth_http
	else if ($essai_auth_http == 'logout') {
Fil's avatar
 
Fil a validé
		ask_php_auth(_T('login_deconnexion_ok'),
		_T('login_verifiez_navigateur'), _T('login_retour_public'),
		"redirect="._DIR_RESTREINT_ABS, _T('login_test_navigateur'), true);
function spip_cookie_dist()
{
  global
    $auteur_session,
    $change_session,
    $cookie_admin,
    $cookie_session,
    $essai_auth_http,
    $essai_login,
    $id_auteur,
    $ignore_auth_http,
    $ldap_present,
    $logout,
    $logout_public,
    $next_session_password_md5,
    $retour,
    $session_login,
    $session_login_hidden,
    $session_password,
    $session_password_md5,
    $session_remember,
    $spip_admin,
    $spip_session,
    $test_echec_cookie,
    $url,
    $valeur,
    $var_lang,
    $var_lang_ecrire;

// rejoue le cookie pour renouveler spip_session
Fil's avatar
 
Fil a validé
if ($change_session == 'oui') {
	if (verifier_session($spip_session)) {
		// Attention : seul celui qui a le bon IP a le droit de rejouer,
		// ainsi un eventuel voleur de cookie ne pourrait pas deconnecter
		// sa victime, mais se ferait deconnecter par elle.
		if ($auteur_session['hash_env'] == hash_env()) {
Fil's avatar
Fil a validé
			spip_log("rejoue session");
			$auteur_session['ip_change'] = false;
			$cookie = creer_cookie_session($auteur_session);
			supprimer_session($spip_session);
			spip_setcookie('spip_session', $cookie);
Fil's avatar
Fil a validé
		else
			spip_log("session non rejouee, changement d'IP ?");
Fil's avatar
Fil a validé
	@header('Content-Type: image/gif');
	@header('Expires: 0');
	@header("Cache-Control: no-store, no-cache, must-revalidate");
	@header('Pragma: no-cache');
	@header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
	@readfile(_DIR_IMG_PACK . 'rien.gif');
	exit;
// tentative de connexion en auth_http
Fil's avatar
Fil a validé
if ($essai_auth_http AND !$ignore_auth_http) {
	auth_http(($url ? $url : _DIR_RESTREINT_ABS), $essai_auth_http);
// cas particulier, logout dans l'espace public
if ($logout_public) {
	$logout = $logout_public;
esj's avatar
esj a validé
	if (!$url)  $url = $GLOBALS['meta']['adresse_site'];
 }
// tentative de logout
if ($logout) {
	verifier_visiteur();
	if ($auteur_session['login'] == $logout) {
		spip_query("UPDATE spip_auteurs SET en_ligne = DATE_SUB(NOW(),INTERVAL 6 MINUTE) WHERE id_auteur = ".$auteur_session['id_auteur']);
		if ($spip_session) {
			zap_sessions($auteur_session['id_auteur'], true);
			spip_setcookie('spip_session', $spip_session, time() - 3600 * 24);
Fil's avatar
 
Fil a validé
		
		if ($_SERVER['PHP_AUTH_USER']
		AND !$ignore_auth_http
		AND verifier_php_auth()) {
			auth_http(($url ? $url : _DIR_RESTREINT_ABS), 'logout');
	redirige_par_entete($url ? $url : generer_url_public('spip_login'));
// en cas de login sur bonjour=oui, on tente de poser un cookie
// puis de passer a spip_login qui diagnostiquera l'echec de cookie
// le cas echeant.
if ($test_echec_cookie == 'oui') {
	spip_setcookie('spip_session', 'test_echec_cookie');
	redirige_par_entete(generer_url_public('spip_login'),
			    "?var_echec_cookie=oui&url="
			    . ($url ? urlencode($url) : _DIR_RESTREINT_ABS));
Antoine Pitrou's avatar
Antoine Pitrou a validé
// Tentative de login
$redirect = ($url ? $url : _DIR_RESTREINT_ABS);
if ($essai_login == "oui") {
Antoine Pitrou's avatar
Antoine Pitrou a validé
	// Recuperer le login en champ hidden
	if ($session_login_hidden AND !$session_login)
		$session_login = $session_login_hidden;
Antoine Pitrou's avatar
Antoine Pitrou a validé
	$login = $session_login;

	// Essayer differentes methodes d'authentification
	$auths = array('spip');
esj's avatar
esj a validé
	include_local(_FILE_CONNECT); // pour savoir si ldap est present 
Antoine Pitrou's avatar
Antoine Pitrou a validé
	if ($ldap_present) $auths[] = 'ldap';
	$ok = false;
		include_ecrire("inc_auth_".$nom_auth);
Antoine Pitrou's avatar
Antoine Pitrou a validé
		$classe_auth = "Auth_".$nom_auth;
		$auth = new $classe_auth;
		if ($auth->init()) {
			// Essayer les mots de passe md5
			$ok = $auth->verifier_challenge_md5($login, $session_password_md5, $next_session_password_md5);
			// Sinon essayer avec le mot de passe en clair
Antoine Pitrou's avatar
Antoine Pitrou a validé
			if (!$ok && $session_password) $ok = $auth->verifier($login, $session_password);
			if ($ok)  { $auth->lire(); break; }
Fil's avatar
Fil a validé
		}
Antoine Pitrou's avatar
Antoine Pitrou a validé
	}

Fil's avatar
Fil a validé
	// Si la connexion a reussi
Antoine Pitrou's avatar
Antoine Pitrou a validé
	if ($ok) {
		// Nouveau redacteur ou visiteur inscrit par mail :
		// 'nouveau' -> '1comite' ou  '6forum'
		// Si LDAP : importer l'utilisateur vers la base SPIP
Antoine Pitrou's avatar
Antoine Pitrou a validé
		$auth->activer();

		if ($auth->login AND $auth->statut == '0minirezo') // force le cookie pour les admins
			$cookie_admin = "@".$auth->login;

Fil's avatar
Fil a validé
		// On est connecte : recuperer les donnees auteurs
		// poser le cookie session, puis le cas echeant
		// verifier que le statut correspond au minimum requis,
		$query = "SELECT * FROM spip_auteurs WHERE login='".addslashes($auth->login)."'";
Antoine Pitrou's avatar
Antoine Pitrou a validé
		$result = spip_query($query);
Fil's avatar
Fil a validé
		if ($row_auteur = spip_fetch_array($result)) {
Antoine Pitrou's avatar
Antoine Pitrou a validé
			$cookie_session = creer_cookie_session($row_auteur);
Fil's avatar
Fil a validé
		} else
			$ok = false;
Fil's avatar
Fil a validé

Fil's avatar
Fil a validé
		// Si on se connecte dans l'espace prive, ajouter "bonjour" (inutilise)
		if ($ok AND ereg(_DIR_RESTREINT_ABS, $redirect)) {
		      $redirect .= (strpos($redirect, "?") ? "&" : "?") . 'bonjour=oui';
Fil's avatar
Fil a validé

	if (!$ok) {
Fil's avatar
Fil a validé
		if (ereg(_DIR_RESTREINT_ABS, $redirect))
esj's avatar
esj a validé
			$redirect = generer_url_public('spip_login');
		$redirect .= (strpos($redirect, "?") ? "&" : "?") . "var_login=$login";
Antoine Pitrou's avatar
Antoine Pitrou a validé
		if ($session_password || $session_password_md5)
			$redirect .= '&var_erreur=pass';
		$redirect .= '&url=' . urlencode($url);
Antoine Pitrou's avatar
Antoine Pitrou a validé

if ($cookie_admin == "non") {
esj's avatar
esj a validé
		$retour = generer_url_public('spip_login', 'url='.urlencode($url));
	spip_setcookie('spip_admin', $spip_admin, time() - 3600 * 24);
	$redirect = ereg_replace("([?&])var_login=[^&]*&?", '\1', $retour);
	$redirect = ereg_replace("([?&])var_erreur=[^&]*&?", '\1', $redirect);
	$redirect .= (strpos($redirect, "?") ? "&" : "?") . "var_login=-1";
else if ($cookie_admin AND $spip_admin != $cookie_admin) {
	spip_setcookie('spip_admin', $cookie_admin, time() + 3600 * 24 * 14);
Antoine Pitrou's avatar
Antoine Pitrou a validé
if ($cookie_session) {
Fil's avatar
Fil a validé
	if ($session_remember == 'oui')
Antoine Pitrou's avatar
Antoine Pitrou a validé
		spip_setcookie('spip_session', $cookie_session, time() + 3600 * 24 * 14);
	else
		spip_setcookie('spip_session', $cookie_session);
Fil's avatar
Fil a validé

	$prefs = ($row_auteur['prefs']) ? unserialize($row_auteur['prefs']) : array();
	$prefs['cnx'] = ($session_remember == 'oui') ? 'perma' : '';
	spip_query ("UPDATE spip_auteurs SET prefs = '".addslashes(serialize($prefs))."' WHERE id_auteur = ".$row_auteur['id_auteur']);

Antoine Pitrou's avatar
Antoine Pitrou a validé
}
// changement de langue espace public
if ($var_lang) {
Fil's avatar
Fil a validé
	if (changer_langue($var_lang)) {
		spip_setcookie('spip_lang', $var_lang, time() + 365 * 24 * 3600);
		$redirect = ereg_replace("[?&]lang=[^&]*", '', $redirect);
		$redirect .= (strpos($redirect, "?") ? "&" : "?") . "lang=$var_lang";
Fil's avatar
Fil a validé
	}
}

// changer de langue espace prive (ou login)
	if (changer_langue($var_lang_ecrire)) {
		spip_setcookie('spip_lang_ecrire', $var_lang_ecrire, time() + 365 * 24 * 3600);
		spip_setcookie('spip_lang', $var_lang_ecrire, time() + 365 * 24 * 3600);
esj's avatar
esj a validé
		if (_FILE_CONNECT) {
			if (verifier_action_auteur('var_lang_ecrire', $valeur, $id_auteur)) {
				spip_query ("UPDATE spip_auteurs SET lang = '".addslashes($var_lang_ecrire)."' WHERE id_auteur = ".$id_auteur);
				$auteur_session['lang'] = $var_lang_ecrire;
				ajouter_session($auteur_session, $spip_session);	// enregistrer dans le fichier de session
			}
		$redirect = ereg_replace("[?&]lang=[^&]*", '', $redirect);
		$redirect .= (strpos($redirect, "?") ? "&" : "?") . "lang=$var_lang_ecrire";
Antoine Pitrou's avatar
Antoine Pitrou a validé
// Redirection
// Sous Apache, les cookies avec une redirection fonctionnent
Antoine Pitrou's avatar
Antoine Pitrou a validé
// Sinon, on fait un refresh HTTP
if (ereg("^Apache", $GLOBALS['SERVER_SOFTWARE'])) {
	redirige_par_entete($redirect);
Antoine Pitrou's avatar
Antoine Pitrou a validé
}
else {
	spip_header("Refresh: 0; url=" . $redirect);
Antoine Pitrou's avatar
Antoine Pitrou a validé
	echo "<html><head>";
	echo "<meta http-equiv='Refresh' content='0; url=".$redirect."'>";
Antoine Pitrou's avatar
Antoine Pitrou a validé
	echo "</head>\n";
	echo "<body><a href='".$redirect."'>"._T('navigateur_pas_redirige')."</a></body></html>";
Antoine Pitrou's avatar
Antoine Pitrou a validé
}
Yannick Patois's avatar
Yannick Patois a validé

Fil's avatar
Fil a validé
?>