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); } }
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); }
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); }
/** * 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; }
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}"); } }
/** * 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; }
/** * 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); } }
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); }
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; }
<?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>';
<?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>';
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; }
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); }
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; }
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); }