function pack_cQuery($chemin) { $flux = spip_file_get_contents($chemin); $flux = str_replace('jQuery', 'cQuery', $flux); // On ne compacte PAS deux fois (c'est inutile et en plus ca bugge) if (!strlen($flux) // mode debug des crayons OR _request('debug_crayons') // le vieil auto_compress_js OR ($GLOBALS['meta']['auto_compress_js'] == 'oui' AND @file_exists(_DIR_RESTREINT.'inc/compacte_js.php')) // ou l'espace prive OR !function_exists('test_espace_prive') OR test_espace_prive()) return $flux; include_spip('lib/JavaScriptPacker/class.JavaScriptPacker'); $packer = new JavaScriptPacker($flux, 0, true, false); // en cas d'echec (?) renvoyer l'original if (strlen($t = $packer->pack())) return $t; // erreur spip_log('erreur de pack_js'); return $flux; }
function contenu_document($arg, $charset = '') { if (is_numeric($arg)) { $r = sql_fetsel("fichier,distant", "spip_documents", "id_document=" . intval($arg)); if (!$r) { return ''; } $f = $r['fichier']; $f = $r['distant'] == 'oui' ? _DIR_RACINE . copie_locale($f) : get_spip_doc($f); } else { if (!@file_exists($f = $arg)) { if (!($f = copie_locale($f))) { return ''; } $f = _DIR_RACINE . $f; } } $r = spip_file_get_contents($f); if ($charset) { include_spip('inc/charset'); if ($charset !== 'auto') { $r = importer_charset($r, $charset); } elseif ($GLOBALS['meta']['charset'] == 'utf-8' and !is_utf8($r)) { $r = importer_charset($r, CHARSET_JOINT); } } return $r; }
/** * Insertion dans le pipeline recuperer_fond (SPIP) * * Ajouter le script leaflet.geodiv.js au squelette du script de GIS * * @param array $flux * @return array $flux */ function geol_recuperer_fond($flux) { if ($flux['args']['fond'] == 'javascript/gis.js') { $flux['data']['texte'] .= "\n\n(function() { L.gisConfig.getInfowindowUrl = '" . url_absolue(generer_url_public('get_infowindow')) . "'; })();"; $flux['data']['texte'] .= "\n\n" . spip_file_get_contents(find_in_path('javascript/leaflet.geodiv.js')); } return $flux; }
/** * enlever les scripts de html si necessaire * on utilise safehtml * * @param string $file * @return array */ function medata_html_dist($file) { $meta = array(); // Securite si pas autorise : virer les scripts et les references externes // sauf si on est en mode javascript 'ok' (1), cf. inc_version if ($GLOBALS['filtrer_javascript'] < 1 and !autoriser('televerser', 'script')) { $texte = spip_file_get_contents($file); include_spip('inc/texte'); $new = trim(safehtml($texte)); // petit bug safehtml if ($new != $texte) { ecrire_fichier($file, $new); } } return $meta; }
/** * Déterminer les dimensions d'un svg, et enlever ses scripts si nécessaire * * On utilise safehtml qui n'est pas apropriée pour ça en attendant mieux * cf http://www.slideshare.net/x00mario/the-image-that-called-me * http://heideri.ch/svgpurifier/SVGPurifier/index.php * * @param string $file * @return array Tableau (largeur, hauteur) */ function metadata_svg_dist($file) { $meta = array(); $texte = spip_file_get_contents($file); // Securite si pas autorise : virer les scripts et les references externes // sauf si on est en mode javascript 'ok' (1), cf. inc_version if ($GLOBALS['filtrer_javascript'] < 1 and !autoriser('televerser', 'script')) { include_spip('inc/texte'); $new = trim(safehtml($texte)); // petit bug safehtml if (substr($new, 0, 2) == ']>') { $new = ltrim(substr($new, 2)); } if ($new != $texte) { ecrire_fichier($file, $texte = $new); } } $width = $height = 150; if (preg_match(',<svg[^>]+>,', $texte, $s)) { $s = $s[0]; if (preg_match(',\\WviewBox\\s*=\\s*.\\s*(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+),i', $s, $r)) { $width = $r[3]; $height = $r[4]; } else { // si la taille est en centimetre, estimer le pixel a 1/64 de cm if (preg_match(',\\Wwidth\\s*=\\s*.(\\d+)([^"\']*),i', $s, $r)) { if ($r[2] != '%') { $width = $r[1]; if ($r[2] == 'cm') { $width <<= 6; } } } if (preg_match(',\\Wheight\\s*=\\s*.(\\d+)([^"\']*),i', $s, $r)) { if ($r[2] != '%') { $height = $r[1]; if ($r[2] == 'cm') { $height <<= 6; } } } } } $meta['largeur'] = $width; $meta['hauteur'] = $height; return $meta; }
function load_path_cache() { // charger le path des plugins if (@is_readable(_CACHE_PLUGINS_PATH)) { include_once _CACHE_PLUGINS_PATH; } $GLOBALS['path_files'] = array(); // si le visiteur est admin, // on ne recharge pas le cache pour forcer sa mise a jour if (!_request('var_mode')) { // on essaye de lire directement sans verrou pour aller plus vite if ($contenu = spip_file_get_contents(_CACHE_CHEMIN)) { // mais si semble corrompu on relit avec un verrou if (!($GLOBALS['path_files'] = unserialize($contenu))) { lire_fichier(_CACHE_CHEMIN, $contenu); if (!($GLOBALS['path_files'] = unserialize($contenu))) { $GLOBALS['path_files'] = array(); } } } } }
/** * Aller chercher les donnees de la boucle DATA * depuis une source * {source format, [URL], [arg2]...} */ protected function select_source() { # un peu crado : avant de charger le cache il faut charger # les class indispensables, sinon PHP ne saura pas gerer # l'objet en cache ; cf plugins/icalendar # perf : pas de fonction table_to_array ! (table est deja un array) if (isset($this->command['sourcemode']) and !in_array($this->command['sourcemode'], array('table', 'array', 'tableau'))) { charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true); } # le premier argument peut etre un array, une URL etc. $src = $this->command['source'][0]; # avons-nous un cache dispo ? $cle = null; if (is_string($src)) { $cle = 'datasource_' . md5($this->command['sourcemode'] . ':' . var_export($this->command['source'], true)); } $cache = $this->cache_get($cle); if (isset($this->command['datacache'])) { $ttl = intval($this->command['datacache']); } if ($cache and $cache['time'] + (isset($ttl) ? $ttl : $cache['ttl']) > time() and !(_request('var_mode') === 'recalcul' and include_spip('inc/autoriser') and autoriser('recalcul'))) { $this->tableau = $cache['data']; } else { try { # dommage que ca ne soit pas une option de yql_to_array... if ($this->command['sourcemode'] == 'yql') { if (!isset($ttl)) { $ttl = 3600; } } if (isset($this->command['sourcemode']) and in_array($this->command['sourcemode'], array('table', 'array', 'tableau'))) { if (is_array($a = $src) or is_string($a) and $a = str_replace('"', '"', $a) and is_array($a = @unserialize($a))) { $this->tableau = $a; } } else { if (preg_match(',^https?://,', $src)) { include_spip('inc/distant'); $u = recuperer_page($src, false, false, _DATA_SOURCE_MAX_SIZE); if (!$u) { throw new Exception("404"); } if (!isset($ttl)) { $ttl = 24 * 3600; } } else { if (@is_dir($src)) { $u = $src; if (!isset($ttl)) { $ttl = 10; } } else { if (@is_readable($src) && @is_file($src)) { $u = spip_file_get_contents($src); if (!isset($ttl)) { $ttl = 10; } } else { $u = $src; if (!isset($ttl)) { $ttl = 10; } } } } if (!$this->err and $g = charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true)) { $args = $this->command['source']; $args[0] = $u; if (is_array($a = call_user_func_array($g, $args))) { $this->tableau = $a; } } } if (!is_array($this->tableau)) { $this->err = true; } if (!$this->err and isset($ttl) and $ttl > 0) { $this->cache_set($cle, $ttl); } } catch (Exception $e) { $e = $e->getMessage(); $err = sprintf("[%s, %s] {$e}", $src, $this->command['sourcemode']); erreur_squelette(array($err, array())); $this->err = true; } } # en cas d'erreur, utiliser le cache si encore dispo if ($this->err and $cache) { $this->tableau = $cache['data']; $this->err = false; } }
function charge_scripts($scripts) { $flux = ""; $args = is_array($scripts) ? $scripts : explode("|", $scripts); foreach ($args as $script) { if (preg_match(",^\\w+\$,", $script)) { $path = find_in_path("javascript/{$script}.js"); if ($path) { $flux .= spip_file_get_contents($path); } } } return $flux; }
function fichier_copie_locale($source) { // Si c'est deja local pas de souci if (!preg_match(',^\\w+://,', $source)) { if (_DIR_RACINE) { $source = preg_replace(',^' . preg_quote(_DIR_RACINE) . ',', '', $source); } return $source; } // optimisation : on regarde si on peut deviner l'extension dans l'url et si le fichier // a deja ete copie en local avec cette extension // dans ce cas elle est fiable, pas la peine de requeter en base $path_parts = pathinfo($source); $ext = $path_parts ? $path_parts['extension'] : ''; if ($ext and preg_match(',^\\w+$,', $ext) and $f = nom_fichier_copie_locale($source, $ext) and file_exists(_DIR_RACINE . $f)) { return $f; } // Si c'est deja dans la table des documents, // ramener le nom de sa copie potentielle $ext = sql_getfetsel("extension", "spip_documents", "fichier=" . sql_quote($source) . " AND distant='oui' AND extension <> ''"); if ($ext) { return nom_fichier_copie_locale($source, $ext); } // voir si l'extension indiquee dans le nom du fichier est ok // et si il n'aurait pas deja ete rapatrie $ext = $path_parts ? $path_parts['extension'] : ''; if ($ext and sql_getfetsel("extension", "spip_types_documents", "extension=" . sql_quote($ext))) { $f = nom_fichier_copie_locale($source, $ext); if (file_exists(_DIR_RACINE . $f)) { return $f; } } // Ping pour voir si son extension est connue et autorisee // avec mise en cache du resultat du ping $cache = sous_repertoire(_DIR_CACHE, 'rid') . md5($source); if (!@file_exists($cache) or !($path_parts = @unserialize(spip_file_get_contents($cache))) or _request('var_mode') == 'recalcul') { $path_parts = recuperer_infos_distantes($source, 0, false); ecrire_fichier($cache, serialize($path_parts)); } $ext = $path_parts ? $path_parts['extension'] : ''; if ($ext and sql_getfetsel("extension", "spip_types_documents", "extension=" . sql_quote($ext))) { return nom_fichier_copie_locale($source, $ext); } spip_log("pas de copie locale pour {$source}"); }
function plugins_get_infos_un($plug, $reload, $dir, &$cache) { if (!is_readable($file = "{$dir}{$plug}/" . ($desc = "paquet") . ".xml")) { if (!is_readable($file = "{$dir}{$plug}/" . ($desc = "plugin") . ".xml")) { return false; } } if (($time = intval(@filemtime($file))) < 0) { return false; } $md5 = md5_file($file); $pcache = isset($cache[$dir][$plug]) ? $cache[$dir][$plug] : array('filemtime' => 0, 'md5_file' => ''); // si le cache est valide if (intval($reload) <= 0 and $time > 0 and $time <= $pcache['filemtime'] and $md5 == $pcache['md5_file']) { return false; } // si on arrive pas a lire le fichier, se contenter du cache if (!($texte = spip_file_get_contents($file))) { return false; } $f = charger_fonction('infos_' . $desc, 'plugins'); $ret = $f($texte, $plug, $dir); $ret['filemtime'] = $time; $ret['md5_file'] = $md5; $diff = $ret != $pcache; if ($diff) { $cache[$dir][$plug] = $ret; # echo count($cache[$dir]), $dir,$plug, " $reloadc<br>"; } return $diff; }
function charge_scripts($files, $script = true) { $flux = ""; foreach (is_array($files) ? $files : explode("|", $files) as $file) { if (!is_string($file)) { continue; } if ($script) { $file = preg_match(",^\\w+\$,", $file) ? "javascript/{$file}.js" : ''; } if ($file) { $path = find_in_path($file); } if ($path) { $flux .= spip_file_get_contents($path); } } return $flux; }
/** * Lit un fichier et place son contenu dans le paramètre transmis. * * Décompresse automatiquement les fichiers `.gz` * * @uses spip_fopen_lock() * @uses spip_file_get_contents() * @uses spip_fclose_unlock() * * @param string $fichier * Chemin du fichier * @param string $contenu * Le contenu du fichier sera placé dans cette variable * @param array $options * Options tel que : * * - 'phpcheck' => 'oui' : vérifie qu'on a bien du php * @return bool * true si l'opération a réussie, false sinon. **/ function lire_fichier($fichier, &$contenu, $options = array()) { $contenu = ''; // inutile car si le fichier n'existe pas, le lock va renvoyer false juste apres // economisons donc les acces disque, sauf chez free qui rale pour un rien if (_TEST_FILE_EXISTS and !@file_exists($fichier)) { return false; } #spip_timer('lire_fichier'); // pas de @ sur spip_fopen_lock qui est silencieux de toute facon if ($fl = spip_fopen_lock($fichier, 'r', LOCK_SH)) { // lire le fichier avant tout $contenu = spip_file_get_contents($fichier); // le fichier a-t-il ete supprime par le locker ? // on ne verifie que si la tentative de lecture a echoue // pour discriminer un contenu vide d'un fichier absent // et eviter un acces disque if (!$contenu and !@file_exists($fichier)) { spip_fclose_unlock($fl); return false; } // liberer le verrou spip_fclose_unlock($fl); // Verifications $ok = true; if (isset($options['phpcheck']) and $options['phpcheck'] == 'oui') { $ok &= preg_match(",[?]>\n?\$,", $contenu); } #spip_log("$fread $fichier ".spip_timer('lire_fichier')); if (!$ok) { spip_log("echec lecture {$fichier}"); } return $ok; } return false; }
function plugins_get_infos_un($plug, $reload, $dir, &$cache) { if (!is_readable($file = "{$dir}{$plug}/" . ($desc = "paquet") . ".xml")) { if (!is_readable($file = "{$dir}{$plug}/" . ($desc = "plugin") . ".xml")) { return false; } } if (($time = intval(@filemtime($file))) < 0) { return false; } $md5 = md5_file($file); $pcache = isset($cache[$dir][$plug]) ? $cache[$dir][$plug] : array('filemtime' => 0, 'md5_file' => ''); // si le cache est valide if (intval($reload) <= 0 and $time > 0 and $time <= $pcache['filemtime'] and $md5 == $pcache['md5_file']) { return false; } // si on arrive pas a lire le fichier, se contenter du cache if (!($texte = spip_file_get_contents($file))) { return false; } $f = charger_fonction('infos_' . $desc, 'plugins'); $ret = $f($texte, $plug, $dir); $ret['filemtime'] = $time; $ret['md5_file'] = $md5; // Si on lit le paquet.xml de SPIP, on rajoute un procure php afin que les plugins puissent // utiliser un necessite php. SPIP procure donc la version php courante du serveur. if (isset($ret['prefix']) and $ret['prefix'] == 'spip') { $ret['procure']['php'] = array('nom' => 'php', 'version' => phpversion()); } $diff = $ret != $pcache; if ($diff) { $cache[$dir][$plug] = $ret; # echo count($cache[$dir]), $dir,$plug, " $reloadc<br>"; } return $diff; }
function load_path_cache(){ // charger le path des plugins if (@is_readable(_CACHE_PLUGINS_PATH)){ include_once(_CACHE_PLUGINS_PATH); } $GLOBALS['path_files'] = array(); // si le visiteur est admin, // on ne recharge pas le cache pour forcer sa mise a jour // le cache de chemin n'est utilise que dans le public if (_DIR_RESTREINT // la session n'est pas encore chargee a ce moment, on ne peut donc pas s'y fier //AND (!isset($GLOBALS['visiteur_session']['statut']) OR $GLOBALS['visiteur_session']['statut']!='0minirezo') // utiliser le cookie est un pis aller qui marche 'en general' // on blinde par un second test au moment de la lecture de la session AND !isset($_COOKIE[$GLOBALS['cookie_prefix'].'_admin']) // et en ignorant ce cache en cas de recalcul explicite AND _request('var_mode')!=='recalcul' ){ // on essaye de lire directement sans verrou pour aller plus vite if ($contenu = spip_file_get_contents(_CACHE_CHEMIN)){ // mais si semble corrompu on relit avec un verrou if (!$GLOBALS['path_files']=unserialize($contenu)){ lire_fichier(_CACHE_CHEMIN,$contenu); if (!$GLOBALS['path_files']=unserialize($contenu)) $GLOBALS['path_files'] = array(); } } } // pas de sauvegarde du chemin si on est pas dans le public if (!_DIR_RESTREINT) define('_SAUVER_CHEMIN',false); }