Example #1
0
function inc_meta_dist($table = 'meta')
{
    // Lire les meta, en cache si present, valide et lisible
    // en cas d'install ne pas faire confiance au meta_cache eventuel
    $cache = cache_meta($table);
    if ((_request('exec') !== 'install' or !test_espace_prive()) and $new = jeune_fichier($cache, _META_CACHE_TIME) and lire_fichier_securise($cache, $meta) and $meta = @unserialize($meta)) {
        $GLOBALS[$table] = $meta;
    }
    if (isset($GLOBALS[$table]['touch']) and $GLOBALS[$table]['touch'] < time() - _META_CACHE_TIME) {
        $GLOBALS[$table] = array();
    }
    // sinon lire en base
    if (!$GLOBALS[$table]) {
        $new = !lire_metas($table);
    }
    // renouveller l'alea general si trop vieux ou sur demande explicite
    if (test_espace_prive() || isset($_GET['renouvelle_alea']) and $GLOBALS[$table] and time() > _RENOUVELLE_ALEA + $GLOBALS['meta']['alea_ephemere_date']) {
        // si on n'a pas l'acces en ecriture sur le cache,
        // ne pas renouveller l'alea sinon le cache devient faux
        if (supprimer_fichier($cache)) {
            include_spip('inc/acces');
            renouvelle_alea();
            $new = false;
        } else {
            spip_log("impossible d'ecrire dans " . $cache);
        }
    }
    // et refaire le cache si on a du lire en base
    if (!$new) {
        touch_meta(false, $table);
    }
}
Example #2
0
function cfg_php_enregistrer_fichier($fichier, $contenu)
{
    if (is_null($contenu)) {
        return supprimer_fichier($fichier);
    }
    $contenu = '<?php
/**************
* Config ecrite par CFG le ' . date('r') . '
* 
* NE PAS EDITER MANUELLEMENT !
***************/

$cfg = ' . var_export($contenu, true) . ';
?>
';
    return ecrire_fichier($fichier, $contenu);
}
Example #3
0
function recuperer_lapage($url, $trans = false, $get = 'GET', $taille_max = _INC_DISTANT_MAX_SIZE, $datas = '', $refuser_gz = false, $date_verif = '', $uri_referer = '')
{
    // $copy = copier le fichier ?
    $copy = (is_string($trans) and strlen($trans) > 5);
    // eviter "false" :-)
    // si on ecrit directement dans un fichier, pour ne pas manipuler
    // en memoire refuser gz
    if ($copy) {
        $refuser_gz = true;
    }
    // ouvrir la connexion et envoyer la requete et ses en-tetes
    list($f, $fopen) = init_http($get, $url, $refuser_gz, $uri_referer, $datas, _INC_DISTANT_VERSION_HTTP, $date_verif);
    if (!$f) {
        spip_log("ECHEC init_http {$url}");
        return false;
    }
    // Sauf en fopen, envoyer le flux d'entree
    // et recuperer les en-tetes de reponses
    if ($fopen) {
        $headers = '';
    } else {
        $headers = recuperer_entetes($f, $date_verif);
        if (is_numeric($headers)) {
            fclose($f);
            // Chinoisierie inexplicable pour contrer
            // les actions liberticides de l'empire du milieu
            if ($headers) {
                spip_log("HTTP status {$headers} pour {$url}");
                return false;
            } elseif ($result = @file_get_contents($url)) {
                return array('', $result);
            } else {
                return false;
            }
        }
        if (!is_array($headers)) {
            // cas Location
            fclose($f);
            include_spip('inc/filtres');
            return suivre_lien($url, $headers);
        }
        $headers = join('', $headers);
    }
    if ($trans === NULL) {
        return array($headers, '');
    }
    // s'il faut deballer, le faire via un fichier temporaire
    // sinon la memoire explose pour les gros flux
    $gz = preg_match(",\\bContent-Encoding: .*gzip,is", $headers) ? _DIR_TMP . md5(uniqid(mt_rand())) . '.tmp.gz' : '';
    #	spip_log("entete ($trans $copy $gz)\n$headers");
    $result = recuperer_body($f, $taille_max, $gz ? $gz : ($copy ? $trans : ''));
    fclose($f);
    if (!$result) {
        return array($headers, $result);
    }
    // Decompresser au besoin
    if ($gz) {
        $result = join('', gzfile($gz));
        supprimer_fichier($gz);
    }
    // Faut-il l'importer dans notre charset local ?
    if ($trans === true) {
        include_spip('inc/charsets');
        $result = transcoder_page($result, $headers);
    }
    return array($headers, $result);
}
Example #4
0
/**
 * Récupère le contenu d'une URL
 * au besoin encode son contenu dans le charset local
 *
 * @uses init_http()
 * @uses recuperer_entetes()
 * @uses recuperer_body()
 * @uses transcoder_page()
 *
 * @param string $url
 * @param array $options
 *   bool transcoder : true si on veut transcoder la page dans le charset du site
 *   string methode : Type de requête HTTP à faire (HEAD, GET ou POST)
 *   int taille_max : Arrêter le contenu au-delà (0 = seulement les entetes ==> requête HEAD). Par defaut taille_max = 1Mo ou 16Mo si copie dans un fichier
 *   string|array datas : Pour faire un POST de données (force la methode POST si non vide)
 *   string boundary : boundary pour formater les datas au format array
 *   bool refuser_gz : Pour forcer le refus de la compression (cas des serveurs orthographiques)
 *   int if_modified_since : Un timestamp unix pour arrêter la récuperation si la page distante n'a pas été modifiée depuis une date donnée
 *   string uri_referer : Pour préciser un référer différent
 *   string file : nom du fichier dans lequel copier le contenu
 *   int follow_location : nombre de redirections a suivre (0 pour ne rien suivre)
 *   string version_http : version du protocole HTTP a utiliser (par defaut defini par la constante _INC_DISTANT_VERSION_HTTP)
 * @return array|bool
 *   false si echec
 *   array sinon :
 *     int status : le status de la page
 *     string headers : les entetes de la page
 *     string page : le contenu de la page (vide si copie dans un fichier)
 *     int last_modified : timestamp de derniere modification
 *     string location : url de redirection envoyee par la page
 *     string url : url reelle de la page recuperee
 *     int length : taille du contenu ou du fichier
 *
 *     string file : nom du fichier si enregistre dans un fichier
 */
function recuperer_url($url, $options = array())
{
    $default = array('transcoder' => false, 'methode' => 'GET', 'taille_max' => null, 'datas' => '', 'boundary' => '', 'refuser_gz' => false, 'if_modified_since' => '', 'uri_referer' => '', 'file' => '', 'follow_location' => 10, 'version_http' => _INC_DISTANT_VERSION_HTTP);
    $options = array_merge($default, $options);
    // copier directement dans un fichier ?
    $copy = $options['file'];
    if ($options['methode'] == "HEAD") {
        $options['taille_max'] = 0;
    }
    if (is_null($options['taille_max'])) {
        $options['taille_max'] = $copy ? _COPIE_LOCALE_MAX_SIZE : _INC_DISTANT_MAX_SIZE;
    }
    if (!empty($options['datas'])) {
        $options['methode'] = 'POST';
        list($head, $postdata) = prepare_donnees_post($options['datas'], $options['boundary']);
        if (stripos($head, "Content-Length:") === false) {
            $head .= 'Content-Length: ' . strlen($postdata);
        }
        $options['datas'] = $head . "\r\n\r\n" . $postdata;
    }
    // Accepter les URLs au format feed:// ou qui ont oublie le http:// ou les urls relatives au protocole
    $url = preg_replace(',^feed://,i', 'http://', $url);
    if (!tester_url_absolue($url)) {
        $url = 'http://' . $url;
    } elseif (strncmp($url, "//", 2) == 0) {
        $url = 'http:' . $url;
    }
    $result = array('status' => 0, 'headers' => '', 'page' => '', 'length' => 0, 'last_modified' => '', 'location' => '', 'url' => $url);
    // si on ecrit directement dans un fichier, pour ne pas manipuler en memoire refuser gz
    $refuser_gz = ($options['refuser_gz'] or $copy) ? true : false;
    // ouvrir la connexion et envoyer la requete et ses en-tetes
    list($handle, $fopen) = init_http($options['methode'], $url, $refuser_gz, $options['uri_referer'], $options['datas'], $options['version_http'], $options['if_modified_since']);
    if (!$handle) {
        spip_log("ECHEC init_http {$url}");
        return false;
    }
    // Sauf en fopen, envoyer le flux d'entree
    // et recuperer les en-tetes de reponses
    if (!$fopen) {
        $res = recuperer_entetes_complets($handle, $options['if_modified_since']);
        if (!$res) {
            fclose($handle);
            $t = @parse_url($url);
            $host = $t['host'];
            // Chinoisierie inexplicable pour contrer
            // les actions liberticides de l'empire du milieu
            if (!need_proxy($host) and $res = @file_get_contents($url)) {
                $result['length'] = strlen($res);
                if ($copy) {
                    ecrire_fichier($copy, $res);
                    $result['file'] = $copy;
                } else {
                    $result['page'] = $res;
                }
                $res = array('status' => 200);
            } else {
                return false;
            }
        } elseif ($res['location'] and $options['follow_location']) {
            $options['follow_location']--;
            fclose($handle);
            include_spip('inc/filtres');
            $url = suivre_lien($url, $res['location']);
            spip_log("recuperer_url recommence sur {$url}");
            return recuperer_url($url, $options);
        } elseif ($res['status'] !== 200) {
            spip_log("HTTP status " . $res['status'] . " pour {$url}");
        }
        $result['status'] = $res['status'];
        if (isset($res['headers'])) {
            $result['headers'] = $res['headers'];
        }
        if (isset($res['last_modified'])) {
            $result['last_modified'] = $res['last_modified'];
        }
        if (isset($res['location'])) {
            $result['location'] = $res['location'];
        }
    }
    // on ne veut que les entetes
    if (!$options['taille_max'] or $options['methode'] == 'HEAD' or $result['status'] == "304") {
        return $result;
    }
    // s'il faut deballer, le faire via un fichier temporaire
    // sinon la memoire explose pour les gros flux
    $gz = false;
    if (preg_match(",\\bContent-Encoding: .*gzip,is", $result['headers'])) {
        $gz = _DIR_TMP . md5(uniqid(mt_rand())) . '.tmp.gz';
    }
    // si on a pas deja recuperer le contenu par une methode detournee
    if (!$result['length']) {
        $res = recuperer_body($handle, $options['taille_max'], $gz ? $gz : $copy);
        fclose($handle);
        if ($copy) {
            $result['length'] = $res;
            $result['file'] = $copy;
        } elseif ($res) {
            $result['page'] =& $res;
            $result['length'] = strlen($result['page']);
        }
    }
    if (!$result['page']) {
        return $result;
    }
    // Decompresser au besoin
    if ($gz) {
        $result['page'] = implode('', gzfile($gz));
        supprimer_fichier($gz);
    }
    // Faut-il l'importer dans notre charset local ?
    if ($options['transcoder']) {
        include_spip('inc/charsets');
        $result['page'] = transcoder_page($result['page'], $result['headers']);
    }
    return $result;
}
Example #5
0
function retire_cache($cache)
{
    if (preg_match("|^([0-9a-f]/)?([0-9]+/)?[^.][\\-_\\%0-9a-z]+--[0-9a-f]+(\\.gz)?\$|i", $cache)) {
        // supprimer le fichier (de facon propre)
        supprimer_fichier(_DIR_CACHE . $cache);
    } else {
        spip_log("Nom de fichier cache incorrect : {$cache}");
    }
}
Example #6
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;
}
Example #7
0
/**
 * Supprimer brutalement un fichier, s'il existe
 *
 * @param string $f
 *     Chemin du fichier
 */
function spip_unlink($f)
{
    if (!is_dir($f)) {
        supprimer_fichier($f, false);
    } else {
        @unlink("{$f}/.ok");
        @rmdir($f);
    }
}
Example #8
0
function cs_initialise_includes($count_metas_outils) {
	global $outils, $cs_metas_pipelines;
	// toutes les infos sur les fichiers mes_options/mes_fonctions et sur les pipelines;
	$infos_pipelines = $infos_fichiers =
	// liste des traitements utilises
	$traitements_utilises =
	// variables temporaires
	$temp_js_html = $temp_css_html = $temp_css = $temp_js = $temp_jq = $temp_jq_init = $temp_filtre_imprimer = array();
	@define('_CS_HIT_EXTERNE', 1500);
	// inclure d'office outils/cout_fonctions.php
	if($temp=cs_lire_fichier_php("outils/cout_fonctions.php"))
		$infos_fichiers['code_fonctions'][] = $temp;
	// variable de verification
	$infos_fichiers['code_options'][] = "\$GLOBALS['cs_verif']=$count_metas_outils;";
	// parcours de tous les outils
	foreach ($outils as $i=>$outil) {
		$inc = $outil['id'];
		// stockage de la liste des fonctions par pipeline
		if($outil['actif']) {
			$pipe2 = '';
			foreach ($outil as $pipe=>$fonc) {
				if(is_pipeline_outil($pipe, $pipe2)) {
					// module a inclure
					if(find_in_path("outils/$inc.php"))
						$infos_pipelines[$pipe2]['inclure'][] = "outils/$inc";
					if(isset($outil['distant_pipelines']) && find_in_path("lib/$inc/distant_".basename($outil['distant_pipelines'])))
						$infos_pipelines[$pipe2]['inclure'][] = "lib/$inc/distant_".basename($outil['distant_pipelines'],'.php');
					// fonction a appeler
					$infos_pipelines[$pipe2]['fonction'][] = $fonc;
				} elseif(is_pipeline_outil_inline($pipe, $pipe2)) {
					// code inline
					$infos_pipelines[$pipe2]['inline'][] = cs_optimise_if(cs_parse_code_js($fonc));
				} elseif(is_traitements_outil($pipe, $fonc, $traitements_utilises)) {
					// rien a faire : $traitements_utilises est rempli par is_traitements_outil()
				}
			}
			// recherche des fichiers .css, .css.html, .js et .js.html eventuellement present dans outils/
			foreach(array('css', 'js') as $f) {
				if($file=find_in_path("outils/$inc.$f")) { lire_fichier($file, $ff); ${'temp_'.$f}[] = $ff; }
				// en fait on ne peut pas compiler ici car les balises vont devoir etre traitees et les traitements ne sont pas encore dispo !
				// le code est mis de cote. il sera compile plus tard au moment du pipeline grace a cs_compile_header()
				if($file=find_in_path("outils/$inc.$f.html")) { lire_fichier($file, $ff); ${'temp_'.$f.'_html'}[] = $ff; }
				// TODO : librairies distantes placees dans lib/
/*				if(isset($outil['distant_'.$type]) && ($file=find_in_path("lib/$inc/distant_{$f}_".basename($outil["distant_$f"])))) etc. */
			}
			// recherche d'un code inline eventuellement propose
			if(isset($outil['code:spip_options'])) $infos_fichiers['code_spip_options'][] = $outil['code:spip_options'];
			if(isset($outil['code:options'])) $infos_fichiers['code_options'][] = $outil['code:options'];
			if(isset($outil['code:fonctions'])) $infos_fichiers['code_fonctions'][] = $outil['code:fonctions'];
			if(isset($outil['code:css'])) $temp_css[] = cs_optimise_if(cs_parse_code_js($outil['code:css']));
			if(isset($outil['code:js'])) $temp_js[] = cs_optimise_if(cs_parse_code_js($outil['code:js']));
			if(isset($outil['code:jq_init'])) $temp_jq_init[] = cs_optimise_if(cs_parse_code_js($outil['code:jq_init']));
			if(isset($outil['code:jq'])) $temp_jq[] = cs_optimise_if(cs_parse_code_js($outil['code:jq']));
			// recherche d'un fichier monoutil_options.php ou monoutil_fonctions.php pour l'inserer dans le code
			// TODO : librairies distantes placees dans lib/
			foreach(array('options', 'fonctions') as $f) {
				if($temp=cs_lire_fichier_php("outils/{$inc}_{$f}.php")) $infos_fichiers['code_'.$f][] = $temp;
/*				if(isset($outil['distant_'.$f]) && find_in_path("lib/$inc/distant_{$f}_".basename($outil["distant_$f"])))
					if($temp=cs_lire_fichier_php("lib/$inc/distant_{$f}_$outil[distant_$f].php")) 
						$infos_fichiers['code_'.$f][] = $temp;
*/			}
		} else foreach(array('pre_description_outil') as $p) {
			// outil inactif
			if(isset($outil[$t='pipelinecode:'.$p])) 	
				$infos_pipelines[$p]['inline'][] = cs_optimise_if(cs_parse_code_js($outil[$t]));
			if(isset($outil[$t='pipeline:'.$p])) {
				$infos_pipelines[$p]['inclure'][] = "outils/$inc";
				$infos_pipelines[$p]['fonction'][] = $outil[$t];
			}
		}
	}
	// insertion du css pour la BarreTypo
	if(isset($infos_pipelines['bt_toolbox']) && defined('_DIR_PLUGIN_BARRETYPOENRICHIE'))
		$temp_css[] = 'span.cs_BT {background-color:#FFDDAA; font-weight:bold; border:1px outset #CCCC99; padding:0.2em 0.3em;}
span.cs_BTg {font-size:140%; padding:0 0.3em;}';
	// prise en compte des css.html et js.html qu'il faudra compiler plus tard
	if(count($temp_css_html)){
		$temp_css[] = '<cs_html>'.join("\n", $temp_css_html).'</cs_html>';
		unset($temp_css_html);
	}
	if(count($temp_js_html)){
		$temp_js[] = '<cs_html>'.join("\n", $temp_js_html).'</cs_html>';
		unset($temp_js_html);
	}
	// concatenation des css inline, js inline et filtres trouves
	if(strlen(trim($temp_css = join("\n", $temp_css)))) {
		if(function_exists('compacte_css')) $temp_css = compacte_css($temp_css);
		if(strlen($temp_css)>_CS_HIT_EXTERNE) {
			// hit externe
			$cs_metas_pipelines['header_css_ext'] = $temp_css;
		} else {
			// css inline
			$temp = array("<style type=\"text/css\">\n$temp_css\n</style>");
			if(is_array($cs_metas_pipelines['header_css'])) $temp = array_merge($temp, $cs_metas_pipelines['header_css']);
			$cs_metas_pipelines['header_css'] = $cs_metas_pipelines['header_css_prive'] = join("\n", $temp);
		}
		unset($temp_css);
	}
	if(count($temp_jq_init)) {
		$temp_js[] = "var cs_init = function() {\n\t".join("\n\t", $temp_jq_init)."\n}\nif(typeof onAjaxLoad=='function') onAjaxLoad(cs_init);";
		$temp_jq[] = "cs_init.apply(document);";
		unset($temp_jq_init);
	}
	$temp_jq = count($temp_jq)?"\njQuery(document).ready(function(){\n\t".join("\n\t", $temp_jq)."\n});":'';
	$temp_js[] = "if(window.jQuery) {\nvar cs_sel_jQuery=typeof jQuery(document).selector=='undefined'?'@':'';\nvar cs_CookiePlugin=\"<cs_html>#CHEMIN{javascript/jquery.cookie.js}</cs_html>\";$temp_jq\n}";
	unset($temp_jq);
	if(count($temp_js)) {
		$temp_js = "var cs_prive=window.location.pathname.match(/\\/ecrire\\/\$/)!=null;
jQuery.fn.cs_todo=function(){return this.not('.cs_done').addClass('cs_done');};\n" . join("\n", $temp_js);
		if(function_exists('compacte_js')) $temp_js = compacte_js($temp_js);
		if(strlen($temp_js)>_CS_HIT_EXTERNE) {
			// hit externe
			$cs_metas_pipelines['header_js_ext'] = $temp_js;
		} else {
			// js inline
			$temp = array("<script type=\"text/javascript\"><!--\n$temp_js\n// --></script>\n");
			if(is_array($cs_metas_pipelines['header_js'])) $temp = array_merge($temp, $cs_metas_pipelines['header_js']);
			$cs_metas_pipelines['header_js'] = $cs_metas_pipelines['header_js_prive'] = join("\n", $temp);
		}
		unset($temp_js);
	}
	// effacement du repertoire temporaire de controle
	if(@file_exists(_DIR_CS_TMP) && ($handle = @opendir(_DIR_CS_TMP))) {
		while (($fichier = @readdir($handle)) !== false)
			if($fichier[0] != '.')	supprimer_fichier(_DIR_CS_TMP.$fichier);
		closedir($handle);
	} else spip_log('Erreur - cs_initialise_includes() : '._DIR_CS_TMP.' introuvable !');
	// join final...
	foreach(array('css', 'js') as $type) {
		$f = 'header_'.$type;
		if(isset($cs_metas_pipelines[$temp = $f.'_ext'])) {
			$fichier_dest = _DIR_CS_TMP . "header.$type.html";
			if(!ecrire_fichier($fichier_dest, $cs_metas_pipelines[$temp], true)) cs_log("ERREUR ECRITURE : $fichier_dest");
			unset($cs_metas_pipelines[$temp]);
			$infos_pipelines['header_prive']['inline'][] = "cs_header_hit(\$flux, '$type', '_prive');";
			$infos_pipelines['insert_head'.($type=='css'?'_css':'')]['inline'][] = "cs_header_hit(\$flux, '$type');";
		}
	}
	// SPIP 2.0 ajoute les parametres "TYPO" et $connect aux fonctions typo() et propre()
	$liste_pivots = defined('_SPIP19300')
		?array(
			// Fonctions pivots : on peut en avoir plusieurs pour un meme traitement
			// Exception : 'typo' et 'propre' ne cohabitent pas ensemble
			'typo' => defined('_TRAITEMENT_TYPO')?_TRAITEMENT_TYPO:'typo(%s,"TYPO",$connect)', // guillemets doubles requises pour le compilo
			'propre' => defined('_TRAITEMENT_RACCOURCIS')?_TRAITEMENT_RACCOURCIS:'propre(%s,$connect)',
		):array(
			'typo' => 'typo(%s)',
			'propre' => 'propre(%s)',
		);
	// mise en code des traitements trouves
	$traitements_post_propre = 0;
	foreach($traitements_utilises as $bal=>$balise) {
		foreach($balise as $obj=>$type_objet) {
			// ici, on fait attention de ne pas melanger propre et typo
			if(array_key_exists('typo', $type_objet) && array_key_exists('propre', $type_objet)) die(_T('couteauprive:erreur:traitements'));
			$traitements_type_objet = &$traitements_utilises[$bal][$obj];
			foreach($type_objet as $f=>$fonction)  {
				// pas d'objet precis
				if($f===0)	$traitements_type_objet[$f] = cs_fermer_parentheses(join("(", array_reverse($fonction)).'(%s');
				// un objet precis
				else {
					if(!isset($liste_pivots[$f])) $liste_pivots[$f] = $f . '(%s)';
					$traitements_type_objet[$f] = !isset($fonction['pre'])?$liste_pivots[$f]
						:str_replace('%s',
						 	cs_fermer_parentheses(join('(', $fonction['pre']) . '(%s'), 
							$liste_pivots[$f]
						);
					if(isset($fonction['post']))
						$traitements_type_objet[$f] = cs_fermer_parentheses(join('(', $fonction['post']) . '(' . $traitements_type_objet[$f]);
				}
			}
			// nombre de fonctions pivot ?
			if(count($traitements_type_objet)===1) $temp = join('', $traitements_type_objet);
			else {
				// compilation de plusieurs pivots
				$temp = '%s';
				foreach($traitements_type_objet as $t) $temp = str_replace('%s', $t, $temp);
			}
			// detection d'un traitement post_propre
			if(strpos($temp, '(propre(')) {
				$traitements_post_propre = 1;
				$temp = "cs_nettoie($temp)";
			}
			// traitement particulier des forums (SPIP>=2.1)
			if(defined('_SPIP20100') && $obj==='forums') $temp = "safehtml($temp)";
			$traitements_type_objet = "\$GLOBALS['table_des_traitements']['$bal'][" . ($obj=='0'?'':"'$obj'") . "]='$temp';";
		}
		$traitements_utilises[$bal] = join("\n", $traitements_utilises[$bal]);		
	}
	// mes_options.php : ajout des traitements
	if(count($traitements_utilises))
		$infos_fichiers['code_options'][] = "\n// Table des traitements\n" . join("\n", $traitements_utilises);
	$infos_fichiers['code_options'][] = "\$GLOBALS['cs_post_propre']=$traitements_post_propre;";
	// ecriture des fichiers mes_options et mes_fonctions
	ecrire_fichier_en_tmp($infos_fichiers, 'spip_options');
	ecrire_fichier_en_tmp($infos_fichiers, 'options');
	ecrire_fichier_en_tmp($infos_fichiers, 'fonctions');
	// installation de cs_metas_pipelines[]
	set_cs_metas_pipelines($infos_pipelines);
}
Example #9
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;
}
Example #10
0
<?php

require_once "fonctions.php";
require_once "config.php";
$id = $_GET['idev'];
$idp = $_GET['idp'];
$ide = $_GET['ide'];
$sel = "SELECT chemindoc FROM documents_evenement WHERE ide='" . $id . "'";
$res = mysql_query($sel);
while ($row1 = mysql_fetch_array($res)) {
    $chemin = $row1['chemindoc'];
    supprimer_fichier($chemin);
}
// on libère le résultat
mysql_free_result($res);
$sql = "DELETE FROM evenement WHERE id='{$id}'";
$result = mysql_query($sql);
?>
<script language="Javascript">
<!--
document.location.replace("table.php?ide=<?php 
echo $ide;
?>
&idp=<?php 
echo $idp;
?>
");
// -->
</script>';

Example #11
0
<?php

include "fonctions.php";
include 'menu_debut.php';
$ida = $_GET['ida'];
$idp = $_GET['idp'];
$idta = $_GET['idta'];
$sql1 = "SELECT nomdoc,chemindoc FROM documents_action WHERE action='{$ida}' ";
$result = mysql_query($sql1);
while ($row = mysql_fetch_array($result)) {
    $cd = $row['chemindoc'];
}
supprimer_fichier($cd);
mysql_free_result($result);
$sql = "DELETE FROM action WHERE ida='{$ida}' ";
mysql_query($sql);
?>

<script language="Javascript">
<!--
document.location.replace("table_action.php?ida=<?php 
echo $idta;
?>
&idp=<?php 
echo $idp;
?>
");
// -->
</script>';

Example #12
0
function vignette_revision($id, $data, $type, $ref)
{
    $s = sql_fetsel("id_document,id_vignette", "spip_documents", "id_document=" . intval($id));
    if (!is_array($s)) {
        return false;
    }
    include_spip('inc/modifier');
    include_spip('inc/documents');
    include_spip('action/editer_document');
    //pour revision_document
    // Chargement d'un nouveau doc ?
    if ($data['vignette']) {
        define('FILE_UPLOAD', true);
        if (is_numeric($s['id_vignette']) && $s['id_vignette'] > 0) {
            spip_log('suppression de la vignette');
            // Suppression du document
            $vignette = sql_getfetsel('fichier', 'spip_documents', 'id_document=' . intval($s['id_vignette']));
            if (@file_exists($f = get_spip_doc($vignette))) {
                spip_log("efface {$f}");
                supprimer_fichier($f);
            }
            sql_delete('spip_documents', 'id_document=' . intval($s['id_vignette']));
            sql_delete('spip_documents_liens', 'id_document=' . intval($s['id_vignette']));
            pipeline('post_edition', array('args' => array('operation' => 'supprimer_document', 'table' => 'spip_documents', 'id_objet' => $s['id_vignette']), 'data' => null));
            $id_vignette = 0;
        }
        $arg = $data['vignette'];
        check_upload_error($arg['error']);
        // Ajout du document comme vignette
        /**
         * Méthode >= SPIP 3.0 
         * ou SPIP 2.x + Mediatheque
         */
        if ($ajouter_documents = charger_fonction('ajouter_documents', 'action', true)) {
            $x = $ajouter_documents(null, array($arg), '', 0, 'vignette');
            $vignette = reset($x);
            if (intval($vignette)) {
                document_modifier($id, array('id_vignette' => $vignette));
            } else {
                if ($id_vignette) {
                    document_modifier($id, array('id_vignette' => $id_vignette));
                }
            }
        } else {
            if ($ajouter_documents = charger_fonction('ajouter_documents', 'inc', true)) {
                // On remet l'id_vignette a 0 si on l'a supprimé
                if ($id_vignette) {
                    revision_document($s['id_document'], array('id_vignette' => 0));
                }
                $x = $ajouter_documents($arg['tmp_name'], $arg['name'], '', '', 'vignette', $id, $actifs);
            }
        }
    } else {
        // Suppression de la vignette ?
        if ($wid = array_pop($ref) and $_POST['content_' . $wid . '_vignette_supprimer'] == 'on') {
            if (is_numeric($s['id_vignette']) && $s['id_vignette'] > 0) {
                // Suppression du document
                $vignette = sql_getfetsel('fichier', 'spip_documents', 'id_document=' . intval($s['id_vignette']));
                if (@file_exists($f = get_spip_doc($vignette))) {
                    spip_log("efface {$f}");
                    supprimer_fichier($f);
                }
                sql_delete('spip_documents', 'id_document=' . intval($s['id_vignette']));
                sql_delete('spip_documents_liens', 'id_document=' . intval($s['id_vignette']));
                pipeline('post_edition', array('args' => array('operation' => 'supprimer_document', 'table' => 'spip_documents', 'id_objet' => $s['id_vignette']), 'data' => null));
                // On remet l'id_vignette a 0
                revision_document($s['id_document'], array('id_vignette' => 0));
            }
        }
    }
    return true;
}
Example #13
0
function supprimer_documents($liste = array()) {
	if (!count($liste))
		return;

	$in = sql_in('id_document', $liste);

	// Supprimer les fichiers locaux et les copies locales
	// des docs distants
	$s = sql_select("fichier, distant", "spip_documents", $in);
	while ($t = sql_fetch($s)) {
		if ($t['distant'] == 'oui') {
			include_spip('inc/distant');
			if ($local = copie_locale($t['fichier'], 'test'))
				spip_log("efface $local = ".$t['fichier']);
				supprimer_fichier($local);
		}
		else {
			if (@file_exists($f = get_spip_doc($t['fichier']))) {
				spip_log("efface $f");
				supprimer_fichier($f);
			}
		}
	}

	// Supprimer les entrees dans spip_documents et associees
	sql_delete('spip_documents', $in);
	// en principe il ne devrait rien y avoir ici si les documents sont bien orphelins
	sql_delete('spip_documents_liens', $in);
}
Example #14
0
function vignette_revision($id, $data, $type, $ref) {
	$s = sql_fetsel("*","spip_documents","id_document=".intval($id));
	if (!is_array($s))
		return false;

	include_spip('inc/modifier');
	include_spip('inc/documents');
	// Chargement d'un nouveau doc ?
	if ($data['vignette']) {
		define('FILE_UPLOAD', true);
		if(is_numeric($s['id_vignette']) && ($s['id_vignette']>0)){
			spip_log('suppression de la vignette');
			// Suppression du document
			$vignette = sql_getfetsel('fichier', 'spip_documents', 'id_document='.intval($s['id_vignette']));
			if (@file_exists($f = get_spip_doc($vignette))) { 
				spip_log("efface $f"); 
				supprimer_fichier($f); 
			}
			sql_delete('spip_documents', 'id_document='.intval($s['id_vignette']));
			sql_delete('spip_documents_liens',  'id_document='.intval($s['id_vignette']));

			pipeline('post_edition',
				array(
					'args' => array(
						'operation' => 'supprimer_document',
						'table' => 'spip_documents',
						'id_objet' => $s['id_vignette']
					),
					'data' => null
				)
			);
			
			// On remet l'id_vignette a 0
			revision_document($s['id_document'], array('id_vignette'=>0));
		}
		// Ajout du document comme vignette
		$ajouter_documents = charger_fonction('ajouter_documents', 'inc');
		$arg = $data['vignette'];
		check_upload_error($arg['error']);
		$x = $ajouter_documents($arg['tmp_name'], $arg['name'],'','', 'vignette', $id, $actifs);
	}else
		// Suppression de la vignette ?
		if ($wid = array_pop($ref)
			AND $_POST['content_'.$wid.'_vignette_supprimer'] == 'on') {
			if(is_numeric($s['id_vignette']) && ($s['id_vignette']>0)){
				// Suppression du document
				$vignette = sql_getfetsel('fichier', 'spip_documents', 'id_document='.intval($s['id_vignette']));
				if (@file_exists($f = get_spip_doc($vignette))) { 
					spip_log("efface $f"); 
					supprimer_fichier($f); 
				}
				sql_delete('spip_documents', 'id_document='.intval($s['id_vignette']));
				sql_delete('spip_documents_liens',  'id_document='.intval($s['id_vignette']));
				
				pipeline('post_edition',
					array(
						'args' => array(
							'operation' => 'supprimer_document',
							'table' => 'spip_documents',
							'id_objet' => $s['id_vignette']
						),
						'data' => null
					)
				);
				
				// On remet l'id_vignette a 0
				revision_document($s['id_document'], array('id_vignette'=>0));
			}
		}
	return true;
}
Example #15
0
    function ecrire_fichier($contenu)
    {
        $fichier = $this->get_fichier();
        if (!$contenu) {
            return supprimer_fichier($fichier);
        }
        $contenu = '<?php
/**************
* Config ecrite par cfg le ' . date('r') . '
* 
* NE PAS EDITER MANUELLEMENT !
***************/

$cfg = ' . var_export($contenu, true) . ';
?>
';
        return ecrire_fichier($fichier, $contenu);
    }