Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
/**
 * 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;
}
Ejemplo n.º 4
0
/**
 * 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;
}
Ejemplo n.º 5
0
/**
 * 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;
}
Ejemplo n.º 6
0
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();
                }
            }
        }
    }
}
Ejemplo n.º 7
0
 /**
  * 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('&quot;', '"', $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;
     }
 }
Ejemplo n.º 8
0
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;
}
Ejemplo n.º 9
0
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}");
}
Ejemplo n.º 10
0
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;
}
Ejemplo n.º 11
0
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;
}
Ejemplo n.º 12
0
/**
 * 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;
}
Ejemplo n.º 13
0
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;
}
Ejemplo n.º 14
0
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);
}