Ejemplo n.º 1
0
/**
 * Supprimer toutes les vieilles sessions d'un auteur
 *
 * Cette fonction efface toutes les sessions appartenant a l'auteur
 * On en profite pour effacer toutes les sessions
 * creees il y a plus de 4*_RENOUVELLE_ALEA
 * Tenir compte de l'ancien format ou les noms commencaient par "session_"
 * et du meme coup des repertoires plats
 * Attention : id_auteur peut etre negatif (cas des auteurs temporaires pendant le dump)
 *
 * http://doc.spip.org/@supprimer_sessions
 *
 * @param int $id_auteur
 * 		Identifiant d'auteur dont on veut supprimer les sessions
 * @param bool $toutes
 * 		Supprimer aussi les vieilles sessions des autres auteurs ?
 * @param bool $actives
 * 		false pour ne pas supprimer les sessions valides de $id_auteur.
 * 		false revient donc a uniquement supprimer les vieilles sessions !
 */
function supprimer_sessions($id_auteur, $toutes = true, $actives = true)
{
    spip_log("supprimer sessions auteur {$id_auteur}");
    if ($toutes or $id_auteur !== $GLOBALS['visiteur_session']['id_auteur']) {
        if ($dir = opendir(_DIR_SESSIONS)) {
            $t = time() - 4 * _RENOUVELLE_ALEA;
            while (($f = readdir($dir)) !== false) {
                if (preg_match(",^[^\\d-]*(-?\\d+)_\\w{32}\\.php[3]?\$,", $f, $regs)) {
                    $f = _DIR_SESSIONS . $f;
                    if ($actives and $regs[1] == $id_auteur or $t > filemtime($f)) {
                        spip_unlink($f);
                    }
                }
            }
        }
    } else {
        verifier_session();
        spip_unlink(fichier_session('alea_ephemere', true));
    }
    // forcer le recalcul de la session courante
    spip_session(true);
}
Ejemplo n.º 2
0
function invalideur_session(&$Cache, $code = NULL)
{
    $Cache['session'] = spip_session();
    return $code;
}
Ejemplo n.º 3
0
function supprimer_sessions($id_auteur) {

	$i = 0;
	$t = (time()  - (_RENOUVELLE_ALEA << 2));
	$dir = opendir(_DIR_SESSIONS);
	while(($e = readdir($dir)) !== false) {
		if (!preg_match(",^\D*(\d+)_\w{32}\.php[3]?$,", $e, $r))
			continue;
		$f = _DIR_SESSIONS . $e;
		if (file_exists($f) AND (($id_auteur AND ($r[1] == $id_auteur))
		OR ($t > filemtime($f)))) {
			spip_unlink($f);
			$i++;
		}
	}
	// pour un anonyme, se fonder sur le cookie pour trouver le fichier
	if (!$id_auteur) {
		verifier_session();
		spip_unlink(fichier_session('alea_ephemere', true));
	}
	if ($i) spip_log("destruction des $i fichiers de session de $id_auteur et 0");
	// forcer le recalcul de la session courante
	spip_session(true);
}
Ejemplo n.º 4
0
/**
 * Interface du gestionnaire de cache
 * Si son 3e argument est non vide, elle passe la main a creer_cache
 * Sinon, elle recoit un contexte (ou le construit a partir de REQUEST_URI)
 * et affecte les 4 autres parametres recus par reference:
 * - use_cache qui vaut
 *     -1 s'il faut calculer la page sans la mettre en cache
 *      0 si on peut utiliser un cache existant
 *      1 s'il faut calculer la page et la mettre en cache
 * - chemin_cache qui est le chemin d'acces au fichier ou vide si pas cachable
 * - page qui est le tableau decrivant la page, si le cache la contenait
 * - lastmodified qui vaut la date de derniere modif du fichier.
 * Elle retourne '' si tout va bien
 * un message d'erreur si le calcul de la page est totalement impossible
 *
 * http://code.spip.net/@public_cacher_dist
 *
 * @param array $contexte
 * @param int $use_cache
 * @param string $chemin_cache
 * @param array $page
 * @param int $lastmodified
 * @return string|void
 */
function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$lastmodified)
{
    # fonction de cache minimale : dire "non on ne met rien en cache"
    # $use_cache = -1; return;
    // Second appel, destine a l'enregistrement du cache sur le disque
    if (isset($chemin_cache)) {
        return creer_cache($page, $chemin_cache);
    }
    // Toute la suite correspond au premier appel
    $contexte_implicite = $page['contexte_implicite'];
    // Cas ignorant le cache car completement dynamique
    if ($_SERVER['REQUEST_METHOD'] == 'POST' or _request('connect')) {
        $use_cache = -1;
        $lastmodified = 0;
        $chemin_cache = "";
        $page = array();
        return;
    }
    // Controler l'existence d'un cache nous correspondant
    $chemin_cache = generer_nom_fichier_cache($contexte, $page);
    $lastmodified = 0;
    // charger le cache s'il existe (et si il a bien le bon hash = anticollision)
    if (!($page = lire_cache($chemin_cache))) {
        $page = array();
    }
    // s'il est sessionne, charger celui correspondant a notre session
    if (isset($page['invalideurs']) and isset($page['invalideurs']['session'])) {
        $chemin_cache_session = generer_nom_fichier_cache(array("chemin_cache" => $chemin_cache), array("session" => spip_session()));
        if ($page_session = lire_cache($chemin_cache_session) and $page_session['lastmodified'] >= $page['lastmodified']) {
            $page = $page_session;
        } else {
            $page = array();
        }
    }
    // Faut-il effacer des pages invalidees (en particulier ce cache-ci) ?
    if (isset($GLOBALS['meta']['invalider'])) {
        // ne le faire que si la base est disponible
        if (spip_connect()) {
            include_spip('inc/invalideur');
            retire_caches($chemin_cache);
            # API invalideur inutile
            supprimer_fichier(_DIR_CACHE . $chemin_cache);
            if (isset($chemin_cache_session) and $chemin_cache_session) {
                supprimer_fichier(_DIR_CACHE . $chemin_cache_session);
            }
        }
    }
    // Si un calcul, recalcul [ou preview, mais c'est recalcul] est demande,
    // on supprime le cache
    if (defined('_VAR_MODE') && _VAR_MODE && (isset($_COOKIE['spip_session']) || isset($_COOKIE['spip_admin']) || @file_exists(_ACCESS_FILE_NAME))) {
        $page = array('contexte_implicite' => $contexte_implicite);
        // ignorer le cache deja lu
        include_spip('inc/invalideur');
        retire_caches($chemin_cache);
        # API invalideur inutile
        supprimer_fichier(_DIR_CACHE . $chemin_cache);
        if (isset($chemin_cache_session) and $chemin_cache_session) {
            supprimer_fichier(_DIR_CACHE . $chemin_cache_session);
        }
    }
    // $delais par defaut
    // pour toutes les pages sans #CACHE{} hors modeles/ et espace privé
    // qui sont a cache nul par defaut
    if (!isset($GLOBALS['delais'])) {
        if (!defined('_DUREE_CACHE_DEFAUT')) {
            define('_DUREE_CACHE_DEFAUT', 24 * 3600);
        }
        $GLOBALS['delais'] = _DUREE_CACHE_DEFAUT;
    }
    // determiner la validite de la page
    if ($page) {
        $use_cache = cache_valide($page, isset($page['lastmodified']) ? $page['lastmodified'] : 0);
        // le contexte implicite n'est pas stocke dans le cache, mais il y a equivalence
        // par le nom du cache. On le reinjecte donc ici pour utilisation eventuelle au calcul
        $page['contexte_implicite'] = $contexte_implicite;
        if (!$use_cache) {
            // $page est un cache utilisable
            gunzip_page($page);
            return;
        }
    } else {
        $page = array('contexte_implicite' => $contexte_implicite);
        $use_cache = cache_valide($page, 0);
        // fichier cache absent : provoque le calcul
    }
    // Si pas valide mais pas de connexion a la base, le garder quand meme
    if (!spip_connect()) {
        if (isset($page['texte'])) {
            gunzip_page($page);
            $use_cache = 0;
        } else {
            spip_log("Erreur base de donnees, impossible utiliser {$chemin_cache}");
            include_spip('inc/minipres');
            return minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'), array('status' => 503));
        }
    }
    if ($use_cache < 0) {
        $chemin_cache = '';
    }
    return;
}
Ejemplo n.º 5
0
function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$lastmodified) {

	// Second appel, destine a l'enregistrement du cache sur le disque
	if (isset($chemin_cache)) return creer_cache($page, $chemin_cache);

	// Toute la suite correspond au premier appel
	$contexte_implicite = $page['contexte_implicite'];

	// Cas ignorant le cache car completement dynamique
	if ($_SERVER['REQUEST_METHOD'] == 'POST'
	OR (substr($contexte_implicite['cache'],0,8)=='modeles/') 
	OR (_request('connect'))
// Mode auteur authentifie appelant de ecrire/ : il ne faut rien lire du cache
// et n'y ecrire que la compilation des squelettes (pas les pages produites)
// car les references aux repertoires ne sont pas relatifs a l'espace public
	OR test_espace_prive()) {
		$use_cache = -1;
		$lastmodified = 0;
		$chemin_cache = "";
		$page = array();
		return;
	}

	// Controler l'existence d'un cache nous correspondant
	$chemin_cache = generer_nom_fichier_cache($contexte, $page);
	$lastmodified = 0;

	// charger le cache s'il existe
	if (lire_fichier(_DIR_CACHE . $chemin_cache, $page))
		$page = @unserialize($page);
	else
		$page = array();

	// s'il est sessionne, charger celui correspondant a notre session
	if (isset($page['invalideurs'])
	AND isset($page['invalideurs']['session'])) {
		$chemin_cache_session = $chemin_cache . '_' . spip_session();
		if (lire_fichier(_DIR_CACHE . $chemin_cache_session, $page_session)
		AND $page_session = @unserialize($page_session)
		AND $page_session['lastmodified'] >= $page['lastmodified'])
			$page = $page_session;
		else
			$page = array();
	}

	// HEAD : cas sans jamais de calcul pour raisons de performance
	if ($_SERVER['REQUEST_METHOD'] == 'HEAD') {
		$use_cache = 0;
		$page = array('contexte_implicite'=>$contexte_implicite);
		return;
	}

	// Si un calcul, recalcul [ou preview, mais c'est recalcul] est demande,
	// on supprime le cache
	if ($GLOBALS['var_mode'] &&
		(isset($_COOKIE['spip_session'])
		|| isset($_COOKIE['spip_admin'])
		|| @file_exists(_ACCESS_FILE_NAME))
	) {
		$page = array('contexte_implicite'=>$contexte_implicite); // ignorer le cache deja lu
		include_spip('inc/invalideur');
		retire_caches($chemin_cache); # API invalideur inutile
		supprimer_fichier(_DIR_CACHE.$chemin_cache);
		if ($chemin_cache_session)
			supprimer_fichier(_DIR_CACHE.$chemin_cache_session);
	}

	// $delais par defaut (pour toutes les pages sans #CACHE{})
	if (!isset($GLOBALS['delais'])) {
		define('_DUREE_CACHE_DEFAUT', 24*3600);
		$GLOBALS['delais'] = _DUREE_CACHE_DEFAUT;
	}

	// determiner la validite de la page
	if ($page) {
		$use_cache = cache_valide($page, $page['lastmodified']);
		// le contexte implicite n'est pas stocke dans le cache, mais il y a equivalence
		// par le nom du cache. On le reinjecte donc ici pour utilisation eventuelle au calcul
		$page['contexte_implicite'] = $contexte_implicite;
		if (!$use_cache) {
			// $page est un cache utilisable
			gunzip_page($page);
			return;
		}
	} else {
		$page = array('contexte_implicite'=>$contexte_implicite);
		$use_cache = cache_valide($page,0); // fichier cache absent : provoque le calcul
	}

	// Si pas valide mais pas de connexion a la base, le garder quand meme
	if (!spip_connect()) {
		if (isset($page['texte'])) {
			gunzip_page($page);
			$use_cache = 0;
		}
		else {
			spip_log("Erreur base de donnees, impossible utiliser $chemin_cache");
			include_spip('inc/minipres');
			return minipres(_T('info_travaux_titre'),  _T('titre_probleme_technique'));
		}
	}

	if ($use_cache < 0) $chemin_cache = '';
	return;
}
Ejemplo n.º 6
0
/**
 * Supprimer toutes les vieilles sessions d'un auteur
 *
 * Cette fonction efface toutes les sessions appartenant a l'auteur
 * On en profite pour effacer toutes les sessions
 * creees il y a plus de 4*_RENOUVELLE_ALEA
 * Tenir compte de l'ancien format ou les noms commencaient par "session_"
 * et du meme coup des repertoires plats
 * Attention : id_auteur peut etre negatif (cas des auteurs temporaires pendant le dump)
 *
 * http://doc.spip.org/@supprimer_sessions
 *
 * @param int $id_auteur
 * 		Identifiant d'auteur dont on veut supprimer les sessions
 * @param bool $toutes
 * 		Supprimer aussi les vieilles sessions des autres auteurs ?
 * @param bool $actives
 * 		false pour ne pas supprimer les sessions valides de $id_auteur.
 * 		false revient donc a uniquement supprimer les vieilles sessions !
 */
function supprimer_sessions($id_auteur, $toutes = true, $actives = true)
{
    $nb_files = 0;
    $nb_max_files = defined('_MAX_NB_SESSIONS_OUVERTES') ? _MAX_NB_SESSIONS_OUVERTES : 1000;
    spip_log("supprimer sessions auteur {$id_auteur}");
    if ($toutes or $id_auteur !== $GLOBALS['visiteur_session']['id_auteur']) {
        if ($dir = opendir(_DIR_SESSIONS)) {
            $t = $_SERVER['REQUEST_TIME'] - 4 * _RENOUVELLE_ALEA;
            // 48h par defaut
            $t_short = $_SERVER['REQUEST_TIME'] - max(_RENOUVELLE_ALEA / 4, 3 * 3600);
            // 3h par defaut
            while (($f = readdir($dir)) !== false) {
                $nb_files++;
                if (preg_match(",^[^\\d-]*(-?\\d+)_\\w{32}\\.php[3]?\$,", $f, $regs)) {
                    $f = _DIR_SESSIONS . $f;
                    if ($actives and $regs[1] == $id_auteur or $t > filemtime($f)) {
                        spip_unlink($f);
                    } elseif ($nb_files > $nb_max_files and !intval($regs[1]) and $t_short > filemtime($f)) {
                        spip_unlink($f);
                    }
                }
            }
        }
    } else {
        verifier_session();
        spip_unlink(fichier_session('alea_ephemere', true));
    }
    // forcer le recalcul de la session courante
    spip_session(true);
}