예제 #1
0
function vertebres_styliser($flux) {

	// si pas de squelette trouve,
	// on verifie si on demande une vue de table
	if (!$squelette = $flux['data']) {
		
		$ext = $flux['args']['ext'];
		$fond = $flux['args']['fond'];
		$connect = $flux['args']['connect'];
		
		// Si pas de squelette regarder si c'est une table
		// et si l'on a la permission de l'afficher
		$trouver_table = charger_fonction('trouver_table', 'base');
		if (preg_match('/^table:(.*)$/', $fond, $r)
		AND $table = $trouver_table($r[1], $connect)
		AND include_spip('inc/autoriser')
		AND autoriser('webmestre')
		) {
			$fond = $r[1];
			$base = _DIR_TMP . 'table_' . $fond . ".$ext";
			if (!file_exists($base)
			OR  $GLOBALS['var_mode']) {
				$vertebrer = charger_fonction('vertebrer', 'public');
				ecrire_fichier($base, $vertebrer($table));
			}
			
			// sauver les changements
			$flux['data'] = _DIR_TMP . 'table_' . $fond;
		}
	}
	
	return $flux;
}
예제 #2
0
/**
 * Plugin SkelEditor
 * Editeur de squelette en ligne
 * (c) 2007-2010 erational
 * Licence GPL-v3
 *
 */

function action_skeleditor_new_from_dist(){
	$securiser_action = charger_fonction('securiser_action','inc');
	$arg = $securiser_action();

	// $arg est le fichier que l'on veut personaliser
	if (strncmp($arg,_DIR_RACINE,strlen(_DIR_RACINE)!==0))
		$arg = _DIR_RACINE.$arg;

	include_spip('inc/skeleditor');
	$file = skeleditor_nom_copie($arg);
	if ($file){
		include_spip('inc/skeleditor');
		$path_base = skeleditor_path_editable();
		list($chemin,) = skeleditor_cree_chemin($path_base, $file);
		if ($chemin){
			$file = basename($file);

			if (!file_exists($chemin . $file)) {
				lire_fichier($arg, $contenu);
				ecrire_fichier($chemin . $file, skeleditor_commente_copie($arg,$contenu));
			}

			if (file_exists($f=$chemin.$file))
				$GLOBALS['redirect'] = parametre_url(_request('redirect'),'f',$f);
		}
	}

}
/**
 * Minifier un fichier JS ou CSS
 *
 * Si la source est un chemin, on retourne un chemin avec le contenu minifié
 * dans _DIR_VAR/cache_$format/
 * Si c'est un flux on le renvoit compacté
 * Si on ne sait pas compacter, on renvoie ce qu'on a recu
 *
 * @param string $source
 *     Contenu à minifier ou chemin vers un fichier dont on veut minifier le contenu
 * @param string $format
 *     Format de la source (js|css).
 * @return string
 *     - Contenu minifié (si la source est un contenu)
 *     - Chemin vers un fichier ayant le contenu minifié (si source est un fichier)
 */
function minifier($source, $format = null)
{
    if (!$format and preg_match(',\\.(js|css)$,', $source, $r)) {
        $format = $r[1];
    }
    include_spip('inc/compresseur_minifier');
    if (!function_exists($minifier = 'minifier_' . $format)) {
        return $source;
    }
    // Si on n'importe pas, est-ce un fichier ?
    if (!preg_match(',[\\s{}],', $source) and preg_match(',\\.' . $format . '$,i', $source, $r) and file_exists($source)) {
        // si c'est une css, il faut reecrire les url en absolu
        if ($format == 'css') {
            $source = url_absolue_css($source);
        }
        $f = basename($source, '.' . $format);
        $f = sous_repertoire(_DIR_VAR, 'cache-' . $format) . preg_replace(",(.*?)(_rtl|_ltr)?\$,", "\\1-minify-" . substr(md5("{$source}-minify"), 0, 4) . "\\2", $f, 1) . '.' . $format;
        if (@filemtime($f) > @filemtime($source) and (!defined('_VAR_MODE') or _VAR_MODE != 'recalcul')) {
            return $f;
        }
        if (!lire_fichier($source, $contenu)) {
            return $source;
        }
        // traiter le contenu
        $contenu = $minifier($contenu);
        // ecrire le fichier destination, en cas d'echec renvoyer la source
        if (ecrire_fichier($f, $contenu, true)) {
            return $f;
        } else {
            return $source;
        }
    }
    // Sinon simple minification de contenu
    return $minifier($source);
}
예제 #4
0
function action_delimport_dist()
{
    // CHANGE xxxx to your delicious User Name
    $base = "http://delicious.com/xxxx";
    $c = recuperer_page_cache($base);
    $count = 0;
    if (preg_match(",<div class=\"left linkCount\">(\\d+),ims", $c, $m)) {
        $count = intval($m[1]);
    }
    echo "<h1>{$count} links</h1>";
    $maxiter = 200;
    $bookmarks = array();
    $url = $base;
    $page = 1;
    do {
        #var_dump($url);
        $c = recuperer_page_cache($url);
        $links = importer_links($c);
        $bookmarks = array_merge($bookmarks, $links);
        $page++;
        $url = parametre_url($base, 'page', $page);
    } while (count($links) and count($bookmarks) < $count and $maxiter--);
    var_dump(count($bookmarks));
    $out = exporter_links($bookmarks);
    ecrire_fichier(_DIR_TMP . "bookmarks.html", $out);
    echo "End";
}
예제 #5
0
/**
 * ecrire le cache dans un casier
 *
 * @param string $nom_cache
 * @param $valeur
 * @return bool
 */
function ecrire_cache($nom_cache, $valeur)
{
    $d = substr($nom_cache, 0, 2);
    $u = substr($nom_cache, 2, 2);
    $rep = _DIR_CACHE;
    $rep = sous_repertoire($rep, '', false, true);
    $rep = sous_repertoire($rep, $d, false, true);
    return ecrire_fichier($rep . $u . ".cache", serialize(array("nom_cache" => $nom_cache, "valeur" => $valeur)));
}
예제 #6
0
파일: install.php 프로젝트: rhertzog/lcs
function install_fichier_connexion($nom, $texte)
{
	$texte = "<"."?php\n"
	. "if (!defined(\"_ECRIRE_INC_VERSION\")) return;\n"
	. $texte
	. "?".">";

	ecrire_fichier($nom, $texte);
}
예제 #7
0
파일: install.php 프로젝트: rougerose/bank
/**
 * Installation des fichiers de configuration/parametrage PAYBOX
 */
function presta_paybox_install_dist()
{
    $dir = sous_repertoire(_DIR_ETC, 'presta');
    $dir = sous_repertoire($dir, 'paybox');
    if (!file_exists($dir . "pbx_ids.php")) {
        $merchant_config = "<" . "?php\n\t\tfunction bank_paybox_pbx_ids(){return array('PBX_IDENTIFIANT'=>'2','PBX_SITE'=>'1999888','PBX_RANG'=>'99');}\n" . "?" . ">";
        ecrire_fichier($dir . "pbx_ids.php", $merchant_config);
        ecrire_meta("bank_paybox_pbx_ids", substr($dir, strlen(_DIR_ETC)) . "pbx_ids.php");
    }
}
예제 #8
0
function formulaires_creer_squelette_traiter_dist($path_base){
	$res = array();

	$filename = _request('filename');
	if (ecrire_fichier($path_base.$filename, ""))
		$res = array('message_ok'=>_T('ok'),'redirect'=>parametre_url(self(),'f',$path_base.$filename));
	else
		$res['message_erreur'] = _T('skeleditor:erreur_ecriture_fichier');

	return $res;
}
function action_generer_recu_souscription_dist($id_souscription = null, $annee = null)
{
    if (is_null($id_souscription)) {
        $id_souscription = _request('id_souscription');
        $annee = _request('annee');
        $hash = _request('hash');
        $lowsec = souscription_hash_lowsec($id_souscription, $annee);
        if ($hash !== $lowsec) {
            die('Erreur : URL pas autorisee');
        }
    } else {
        $lowsec = souscription_hash_lowsec($id_souscription, $annee);
    }
    $format = _request('format');
    if (!in_array($format, array('html', 'pdf'))) {
        // PDF ou HTML ? si le plugin SPIPDF est la on genere un recu en PDF
        $format = "html";
        if (test_plugin_actif("spipdf")) {
            $format = "pdf";
        }
    }
    $numero = souscription_numero_recu($id_souscription, $annee);
    $dir = sous_repertoire(_DIR_IMG, "attestations");
    // securite : dossier inaccessible en http
    if (!file_exists($f = $dir . ".htaccess")) {
        ecrire_fichier($f, "deny from all\n");
    }
    $filename = $numero . ".{$format}";
    $file = $dir . $filename;
    if (!file_exists($file)) {
        $fond = $format == "pdf" ? "attestation_pdf" : "attestation";
        $content = recuperer_fond($fond, array("id_souscription" => $id_souscription, "annee" => $annee, "hash" => $lowsec));
        ecrire_fichier($file, $content);
    }
    $mime = "text/html";
    if ($format == "pdf") {
        $mime = "application/pdf";
    }
    header("Content-type: {$mime}");
    if ($format == "pdf") {
        $filename = preg_replace(",\\W+,", "", $GLOBALS['meta']['nom_site']) . "-Recu-" . $filename;
        header("Content-Disposition: attachment; filename={$filename}");
        //header("Content-Transfer-Encoding: binary");
    }
    // fix for IE catching or PHP bug issue
    header("Pragma: public");
    header("Expires: 0");
    // set expiration time
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    if ($cl = filesize($file)) {
        header("Content-Length: " . $cl);
    }
    readfile($file);
}
예제 #10
0
function exec_cs_boite_rss_dist() {
	cs_minipres();
	// Constantes distantes
	include_spip('cout_define');
	if(defined('_CS_PAS_DE_DISTANT')) { ajax_retour(_T('couteauprive:version_distante_off')); return; }
	$p = '';
	// on cherche le flux rss toutes les _CS_RSS_UPDATE minutes
	$force = _request('force')=='oui';
	if(!$force) {
		$lastmodified = @file_exists(_CS_TMP_RSS)?@filemtime(_CS_TMP_RSS):0;
		if(time()-$lastmodified < _CS_RSS_UPDATE) lire_fichier(_CS_TMP_RSS, $p);
	}
	if(strlen($p)) { ajax_retour($p); return; }
	include_spip('inc/filtres');
	include_spip('action/editer_site');
	include_spip('inc/xml');
	$r = spip_xml_load(_CS_RSS_SOURCE);
	if(function_exists('spip_xml_match_nodes')) $c = spip_xml_match_nodes(',^item$,', $r, $r2);
	else {
		$r2 = !is_array($r)?array():array_shift(array_shift(array_shift(array_shift($r))));
		$c = count($r2);
	}
	if($c) {
		$r3 = &$r2['item'];
		$c = count($r3); $p='';
		for($i=0; $i<min($c, _CS_RSS_COUNT); $i++) {
		 $l = $r3[$i]['link'][0];
		 $d = affdate_court(date('Y-m-d', strtotime($r3[$i]['pubDate'][0])));
		 $t = str_replace('&amp;', '&', htmlentities($r3[$i]['title'][0], ENT_NOQUOTES, "UTF-8"));
		 $t = preg_replace(',\s*&#8364;(&brvbar;)?,', '&nbsp;(&hellip;)', $t);
		 $t = preg_replace(',^(.*?):,', "&bull; <a href='$l' class='spip_out' target='_cout'>$1</a> <i>($d)</i><br/>", $t);
			 $p .= "<li style='padding-top:0.6em;'>$t</li>";
		}
	} else {
		// pour cs_lien()
		include_spip('cout_fonctions');
		$p = '<span style="color: red;">'._T('couteauprive:erreur:probleme', array('pb'=>cs_lien(_CS_RSS_SOURCE,_T('couteauprive:erreur:distant')))).'</span>';
	}
	$du = affdate_heure(date('Y-m-d H:i:s',time()));
	$p = '<ul style="list-style-type:none; padding:0; margin:0; ">'.$p
		.'</ul><p class="spip_xx-small" style="border-top:solid gray thin;"><b>'
		._T('couteauprive:rss_edition')."</b><br/>$du</p>"
		.'<p style="text-align:right"><a href="'
		.generer_url_ecrire('admin_couteau_suisse','var_mode=calcul', true).'" onclick="'
		."javascipt:jQuery('div.cs_boite_rss').children().css('opacity', 0.5).parent().load('".generer_url_ecrire('cs_boite_rss', 'force=oui', true).'\');return false;">'
		._T('couteauprive:rss_actualiser').'</a> | <a href="'
		._CS_RSS_SOURCE.'">'
		._T('couteauprive:rss_source').'</a></p>';
	if($c) ecrire_fichier(_CS_TMP_RSS, $p);
	
	ajax_retour($p);
}
예제 #11
0
/**
 * Lecture du fichier de configuration d'un plugin
 *
 * @staticvar string $filecache
 * @staticvar array $cache
 *
 * @param string|array|bool $plug
 * @param bool $reload
 * @param string $dir
 * @param bool $clean_old
 * @return array
 */
function plugins_get_infos_dist($plug = false, $reload = false, $dir = _DIR_PLUGINS, $clean_old = false)
{
    static $cache = '';
    static $filecache = '';
    if ($cache === '') {
        $filecache = _DIR_TMP . "plugin_xml_cache.gz";
        if (is_file($filecache)) {
            lire_fichier($filecache, $contenu);
            $cache = unserialize($contenu);
        }
        if (!is_array($cache)) {
            $cache = array();
        }
    }
    if (defined('_VAR_MODE') and _VAR_MODE == 'recalcul') {
        $reload = true;
    }
    if ($plug === false) {
        ecrire_fichier($filecache, serialize($cache));
        return $cache;
    } elseif (is_string($plug)) {
        $res = plugins_get_infos_un($plug, $reload, $dir, $cache);
    } elseif (is_array($plug)) {
        $res = false;
        if (!$reload) {
            $reload = -1;
        }
        foreach ($plug as $nom) {
            $res |= plugins_get_infos_un($nom, $reload, $dir, $cache);
        }
        // Nettoyer le cache des vieux plugins qui ne sont plus la
        if ($clean_old and isset($cache[$dir]) and count($cache[$dir])) {
            foreach (array_keys($cache[$dir]) as $p) {
                if (!in_array($p, $plug)) {
                    unset($cache[$dir][$p]);
                }
            }
        }
    }
    if ($res) {
        ecrire_fichier($filecache, serialize($cache));
    }
    if (!isset($cache[$dir])) {
        return array();
    }
    if (is_string($plug)) {
        return isset($cache[$dir][$plug]) ? $cache[$dir][$plug] : array();
    } else {
        return $cache[$dir];
    }
}
예제 #12
0
파일: html.php 프로젝트: genma/spip_ynh
/**
 * 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;
}
예제 #13
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;
}
예제 #14
0
function info_maj_cache($nom, $dir, $page='')
{
	$re = '<archives id="a' . $GLOBALS['meta']["alea_ephemere"] . '">';
	if (preg_match("/$re/", $page)) return $page;

	$url = _VERSIONS_SERVEUR . $dir . '/' . _VERSIONS_LISTE;
	$a = file_exists($nom) ? filemtime($nom) : '';
	include_spip('inc/distant');
	$res = recuperer_lapage($url, false, 'GET', _COPIE_LOCALE_MAX_SIZE, '',false, $a);
	// Si rien de neuf (ou inaccessible), garder l'ancienne
	if ($res) list(, $page) = $res;
	// Placer l'indicateur de fraicheur
	$page = preg_replace('/^<archives.*?>/', $re, $page);
	sous_repertoire(_DIR_CACHE_XML);
	ecrire_fichier($nom, $page);
	return $page;
}
예제 #15
0
파일: php.php 프로젝트: jazzman346/CAC_Site
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);
}
예제 #16
0
/**
 * Generer a la volee un fond a partir d'une table de contenu
 *
 * @param string $type
 * @param string $table
 * @param string $table_sql
 * @param array  $desc
 * @param string $ext
 *
 * @return string
 */
function public_echafauder_dist($type, $table, $table_sql, $desc, $ext)
{
    include_spip('public/interfaces');
    $primary = id_table_objet($type);
    if (!$primary and isset($desc['key']["PRIMARY KEY"])) {
        $primary = $desc['key']["PRIMARY KEY"];
    }
    /* reperer un titre */
    $titre = 'titre';
    if (isset($GLOBALS['table_titre'][$table])) {
        $titre = explode(' ', $GLOBALS['table_titre'][$table]);
        $titre = explode(',', reset($titre));
        $titre = reset($titre);
    }
    if (isset($desc['field'][$titre])) {
        unset($desc['field'][$titre]);
        $titre = "<h1 class='h1 #EDIT{titre}'>#" . strtoupper($titre) . "</h1>";
    } else {
        $titre = "";
    }
    /* reperer une date */
    $date = "date";
    if (isset($GLOBALS['table_date'][$table])) {
        $date = $GLOBALS['table_date'][$table];
    }
    if (isset($desc['field'][$date])) {
        unset($desc['field'][$date]);
        $date = strtoupper($date);
        $date = "<p class='info-publi'>[(#{$date}|nom_jour) ][(#{$date}|affdate)][, <span class='auteurs'><:par_auteur:> (#LESAUTEURS)</span>]</p>";
    } else {
        $date = "";
    }
    $content = array();
    foreach ($desc['field'] as $champ => $z) {
        if (!in_array($champ, array('maj', 'statut', 'idx', $primary))) {
            $content[] = "[<div><strong>{$champ}</strong><div class='#EDIT{" . $champ . "} {$champ}'>(#" . strtoupper($champ) . "|image_reduire{500,0})</div></div>]";
        }
    }
    $content = implode("\n\t", $content);
    $scaffold = "#CACHE{0}\n<BOUCLE_contenu({$table_sql}){" . $primary . "}>\n[(#REM) Fil d'Ariane ]\n<p id='hierarchie'><a href='#URL_SITE_SPIP/'><:accueil_site:></a>[ &gt; <strong class='on'>(#TITRE|couper{80})</strong>]</p>\n\n<div class='contenu-principal'>\n\t<div class='cartouche'>\n\t\t{$titre}\n\t\t{$date}\n\t</div>\n\n\t{$content}\n\n</div>\n\n[<div class='notes surlignable'><h2 class='h2 pas_surlignable'><:info_notes:></h2>(#NOTES)</div>]\n</BOUCLE_contenu>";
    $dir = sous_repertoire(_DIR_CACHE, "scaffold", false);
    $dir = sous_repertoire($dir, "contenu", false);
    $f = $dir . "{$type}";
    ecrire_fichier("{$f}.{$ext}", $scaffold);
    return $f;
}
예제 #17
0
/**
 * on essaye de poser un htaccess rewrite global sur IMG/
 * si fonctionne on gardera des ulrs de document permanente
 * si ne fonctionne pas on se rabat sur creer_htaccess du core
 * qui pose un deny sur chaque sous repertoire de IMG/
 *
 * http://doc.spip.org/@gerer_htaccess
 *
 * @param bool $active
 * @return bool
 */
function accesrestreint_gerer_htaccess($active = true)
{
    if (!$active) {
        spip_unlink(_DIR_IMG . _ACCESS_FILE_NAME);
        effacer_meta("creer_htaccess");
        // effacer les xx/.htaccess crees eventuellement par le core
        include_spip("inc/acces");
        gerer_htaccess();
        return false;
    } else {
        $rewrite = <<<rewrite
RewriteEngine On
RewriteCond %{QUERY_STRING} ^(\\d+/[\\da-f]+)\$
RewriteRule ^\\w+/.*\$     ../spip.php?action=api_docrestreint&arg=%1/\$0 [skip=100]
RewriteRule ^\\w+/.*\$     ../spip.php?action=api_docrestreint&arg=0/0/\$0 [skip=100]
rewrite;
        // On cherche si le dossier racine a un RewriteBase plus long que "/"
        if (file_exists(_DIR_RACINE . _ACCESS_FILE_NAME)) {
            $ht = '';
            lire_fichier(_DIR_RACINE . _ACCESS_FILE_NAME, $ht);
            if ($ht and preg_match('|^RewriteBase\\s+/.+$|m', $ht, $rewritebase)) {
                $rewritebase = rtrim(trim($rewritebase[0]), '/') . '/' . _NOM_PERMANENTS_ACCESSIBLES;
                $rewrite = $rewritebase . "\n" . $rewrite;
            }
        }
        ecrire_fichier(_DIR_IMG . _ACCESS_FILE_NAME, $rewrite);
        // verifier sur l'url de test
        include_spip('inc/distant');
        $url_test = url_absolue(_DIR_IMG . "test/.test?0/1");
        $test = recuperer_page($url_test);
        // si l'url de test renvoie bien "OK" alors rewrite rule fonctionne et on peut baser la protection de document sur ce shema
        if ($test == "OK") {
            effacer_meta("creer_htaccess");
            // securite, et permet de generer des urls permanentes
        } else {
            // sinon on se rabat sur un deny et on generera des urls moches
            spip_unlink(_DIR_IMG . _ACCESS_FILE_NAME);
            ecrire_meta("creer_htaccess", "oui");
        }
        // dans tous les cas on passe par gerer_htaccess pour enlever ou mettre les .htaccess dans les sous rep
        include_spip("inc/acces");
        gerer_htaccess();
        return true;
    }
}
예제 #18
0
function compacte($source, $format = null) {
	if (!$format AND preg_match(',\.(js|css)$,', $source, $r))
		$format = $r[1];
	include_spip('inc/compresseur');
	if (!function_exists($compacte = 'compacte_'.$format))
		return $source;

	// Si on n'importe pas, est-ce un fichier ?
	if (!preg_match(',[\s{}],', $source)
	AND preg_match(',\.'.$format.'$,i', $source, $r)
	AND file_exists($source)) {
		// si c'est une css, il faut reecrire les url en absolu
  	if ($format=='css')
  		$source = url_absolue_css($source);

		$f = basename($source,'.'.$format);
		$f = sous_repertoire (_DIR_VAR, 'cache-'.$format)
		. preg_replace(",(.*?)(_rtl|_ltr)?$,","\\1-compacte-"
		. substr(md5("$source-compacte"), 0,4) . "\\2", $f, 1)
		. '.' . $format;

		if ((@filemtime($f) > @filemtime($source))
		AND ($GLOBALS['var_mode'] != 'recalcul'))
			return $f;

		if (!lire_fichier($source, $contenu))
			return $source;

		// traiter le contenu
		$contenu = $compacte($contenu);

		// ecrire le fichier destination, en cas d'echec renvoyer la source
		if (ecrire_fichier($f, $contenu, true))
			return $f;
		else
			return $source;
	}

	// Sinon simple compactage de contenu
	return $compacte($source);
}
예제 #19
0
파일: sips.php 프로젝트: nursit/bank
/**
 * Ecrire les fichiers de config/parametres a la volee avant l'appel a un binaire SIPS
 * @param string $service
 * @param string $merchant_id
 * @param string $certificat
 * @param string $dir_logo
 * @return string
 */
function sips_ecrire_config_merchant($service, $merchant_id, $certificat, $dir_logo)
{
    // creer les fichiers config pour la transaction
    $pathfile = sous_repertoire(_DIR_TMP, "sips");
    $pathfile = sous_repertoire($pathfile, $service);
    $realdir = realpath($pathfile);
    $config_file = "DEBUG!NO!\n" . "D_LOGO!" . substr($dir_logo, strlen(_DIR_RACINE)) . "!\n" . "F_DEFAULT!{$realdir}/parmcom.sips!\n" . "F_PARAM!{$realdir}/parmcom!\n" . "F_CERTIFICATE!{$realdir}/certif!";
    ecrire_fichier($p = $pathfile . "pathfile", $config_file);
    // le fichier par defaut
    if (!file_exists($pathfile . "parmcom.sips")) {
        copy(_DIR_PLUGIN_BANK . "presta/sips/bin/{$service}/param/parmcom.sips", $pathfile . "parmcom.sips");
    }
    // le fichier du merchant
    if (!file_exists($pathfile . "parmcom.{$merchant_id}")) {
        copy(_DIR_PLUGIN_BANK . "presta/sips/bin/{$service}/param/parmcom", $pathfile . "parmcom.{$merchant_id}");
    }
    // le certificat
    if ($merchant_id) {
        ecrire_fichier($p = $pathfile . "certif.fr.{$merchant_id}", $certificat);
    }
    return $realdir;
}
예제 #20
0
파일: etape_ldap5.php 프로젝트: nursit/SPIP
function etape_ldap5_save()
{
    if (!@file_exists(_FILE_CONNECT_TMP)) {
        redirige_url_ecrire('install');
    }
    ecrire_meta('ldap_statut_import', _request('statut_ldap'));
    lire_fichier(_FILE_CONNECT_TMP, $conn);
    if ($p = strpos($conn, "'');")) {
        ecrire_fichier(_FILE_CONNECT_TMP, substr($conn, 0, $p + 1) . _FILE_LDAP . substr($conn, $p + 1));
    }
    $adresse_ldap = addcslashes(_request('adresse_ldap'), "'\\");
    $login_ldap = addcslashes(_request('login_ldap'), "'\\");
    $pass_ldap = addcslashes(_request('pass_ldap'), "'\\");
    $port_ldap = addcslashes(_request('port_ldap'), "'\\");
    $tls_ldap = addcslashes(_request('tls_ldap'), "'\\");
    $protocole_ldap = addcslashes(_request('protocole_ldap'), "'\\");
    $base_ldap = addcslashes(_request('base_ldap'), "'\\");
    $base_ldap_text = addcslashes(_request('base_ldap_text'), "'\\");
    $conn = "\$GLOBALS['ldap_base'] = '{$base_ldap}';\n" . "\$GLOBALS['ldap_link'] = @ldap_connect('{$adresse_ldap}','{$port_ldap}');\n" . "@ldap_set_option(\$GLOBALS['ldap_link'],LDAP_OPT_PROTOCOL_VERSION,'{$protocole_ldap}');\n" . ($tls_ldap != 'oui' ? '' : "@ldap_start_tls(\$GLOBALS['ldap_link']);\n") . "@ldap_bind(\$GLOBALS['ldap_link'],'{$login_ldap}','{$pass_ldap}');\n";
    $champs = is_array($GLOBALS['ldap_attributes']) ? $GLOBALS['ldap_attributes'] : array();
    $res = '';
    foreach ($champs as $champ => $v) {
        $nom = 'ldap_' . $champ;
        $val = trim(_request($nom));
        if (preg_match('/^\\w*$/', $val)) {
            if ($val) {
                $val = _q($val);
            }
        } else {
            $val = "array(" . _q(preg_split('/\\W+/', $val)) . ')';
        }
        if ($val) {
            $res .= "'{$champ}' => " . $val . ",";
        }
    }
    $conn .= "\$GLOBALS['ldap_champs'] = array({$res});\n";
    install_fichier_connexion(_DIR_CONNECT . _FILE_LDAP, $conn);
}
예제 #21
0
파일: export_all.php 프로젝트: rhertzog/lcs
function ramasse_parties($rub, $archive, $meta)
{
	$dir = base_dump_dir($meta);
	$files = preg_files($dir . $archive . ".part_[0-9]+_[0-9]+[.gz]?");
	if (!$files) return false;
	$ok = true;
	$files_o = array();
	$but = export_all_rename($archive, $dir);
	// creer l'en tete du fichier
	ecrire_fichier($but, export_entete(_VERSION_ARCHIVE),false);
	foreach($files as $f) {
	  $contenu = "";
	  if (lire_fichier ($f, $contenu)) {
	    if (!ecrire_fichier($but,$contenu,false,false))
	      { $ok = false; break;}
	  }
	  spip_unlink($f);
	  $files_o[]=$f;
	}
	ecrire_fichier($but, export_enpied(),false,false);
	spip_unlink($dir);
	spip_log("concatenation " . join(' ', $files_o));
	return $ok ? $but : false;
}
/**
 * Déterminer l'utilisation du vertebreur
 *
 * Lorsqu'on inclut le squelette `prive/vertebres:$table`,
 * vérifier l'autorisation et créer le squelette spécifique
 * à la table demandée si on la trouve
 *
 * @pipeline styliser
 * @uses base_trouver_table_dist()
 * @uses public_vertebrer_dist()
 *
 * @param array $flux Données du pipeline
 * @return array Données du pipeline
 */
function vertebres_styliser($flux)
{
    // si pas de squelette trouve,
    // on verifie si on demande une vue de table
    if (!($squelette = $flux['data']) and $fond = $flux['args']['fond'] and strncmp($fond, 'prive/vertebres:', 16) == 0 and $table = substr($fond, 16) and include_spip('inc/autoriser') and autoriser('webmestre')) {
        $ext = $flux['args']['ext'];
        $connect = $flux['args']['connect'];
        // Si pas de squelette regarder si c'est une table
        // et si l'on a la permission de l'afficher
        $trouver_table = charger_fonction('trouver_table', 'base');
        if ($desc = $trouver_table($table, $connect)) {
            $fond = $table;
            $base = _DIR_VERTEBRES . 'table_' . $fond . ".{$ext}";
            if (!file_exists($base) or defined('_VAR_MODE') and _VAR_MODE) {
                sous_repertoire(_DIR_VERTEBRES);
                $vertebrer = charger_fonction('vertebrer', 'public');
                ecrire_fichier($base, $vertebrer($desc));
            }
            // sauver les changements
            $flux['data'] = _DIR_VERTEBRES . 'table_' . $fond;
        }
    }
    return $flux;
}
예제 #23
0
/**
 * Ecrire le status de migration
 * @param string $direction
 * @param bool|array $raz
 * @return array
 */
function ecrire_migration_status($direction, $raz = false){
	if (!in_array($direction,array('depuis','vers')))
		return false;
	$meta = 'migration_'.$direction.'_status';
	$file = _DIR_TMP.$meta.".txt";
	if ($raz===true) {
		spip_unlink($file);
		return false;
	}
	elseif(is_array($raz)){
		$s = $raz;
		ecrire_fichier($file,serialize($s));
	}
	elseif (!$s = lire_migration_status($direction)){
		include_spip('inc/acces');
		$s = array(
			'status'=>'init',
			'timestamp'=>time(),
			'key'=> substr(md5(creer_uniqid()),0,8),
		);
		ecrire_fichier($file,serialize($s));
	}
	return $s;
}
예제 #24
0
function save_path_cache()
{
    if (defined('_SAUVER_CHEMIN') and _SAUVER_CHEMIN) {
        ecrire_fichier(_CACHE_CHEMIN, serialize($GLOBALS['path_files']));
    }
}
예제 #25
0
function base_trouver_table_dist($nom, $serveur=''){
	static $nom_cache_desc_sql=array();
	global $tables_principales, $tables_auxiliaires, $table_des_tables;
	
	if (!spip_connect($serveur)
	OR !preg_match('/^[a-zA-Z0-9._-]*/',$nom))
		return null;

	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];

	// le nom du cache depend du serveur mais aussi du nom de la db et du prefixe
	// ce qui permet une auto invalidation en cas de modif manuelle du fichier
	// de connexion, et tout risque d'ambiguite
	if (!isset($nom_cache_desc_sql[$serveur]))
		$nom_cache_desc_sql[$serveur] =
		  _DIR_CACHE . 'sql_desc_'
		  . ($serveur ? "$serveur_":"")
		  . substr(md5($connexion['db'].":".$connexion['prefixe']),0,8)
			.'.txt';

	// un appel avec $nom vide est une demande explicite de vidange du cache des descriptions
	if (!$nom){
		spip_unlink($nom_cache_desc_sql[$serveur]);
		$connexion['tables'] = array();
		return null;
	}

	$nom_sql = $nom;
	if (preg_match('/\.(.*)$/', $nom, $s))
		$nom_sql = $s[1];
	else
		$nom_sql = $nom;

	$desc = '';

	// base sous SPIP: gerer les abreviations explicites des noms de table
	if ($connexion['spip_connect_version']) {
		include_spip('public/interfaces');
		if (isset($table_des_tables[$nom])) {
			$nom = $table_des_tables[$nom];
			$nom_sql = 'spip_' . $nom;
		}
	}

	// si c'est la premiere table qu'on cherche
	// et si on est pas explicitement en recalcul
	// on essaye de recharger le cache des decriptions de ce serveur
	// dans le fichier cache
	if (!isset($connexion['tables'][$nom])
	  AND $GLOBALS['var_mode']!=='recalcul'
	  AND (!isset($connexion['tables']) OR !$connexion['tables'])) {
		if (lire_fichier($nom_cache_desc_sql[$serveur],$desc_cache)
		  AND $desc_cache=unserialize($desc_cache))
		  $connexion['tables'] = $desc_cache;
	}
	if (!isset($connexion['tables'][$nom])) {
		include_spip('base/serial');

		if (isset($tables_principales[$nom_sql]))
			$fdesc = $tables_principales[$nom_sql];
		// meme si pas d'abreviation declaree, trouver la table spip_$nom
		// si c'est une table principale,
		// puisqu'on le fait aussi pour les tables auxiliaires
		elseif ($nom_sql==$nom AND isset($tables_principales['spip_' .$nom])){
			$nom_sql = 'spip_' . $nom;
			$fdesc = &$tables_principales[$nom_sql];
		}
		else {
			include_spip('base/auxiliaires');
			if (isset($tables_auxiliaires['spip_' .$nom])) {
				$nom_sql = 'spip_' . $nom;
				$fdesc = &$tables_auxiliaires[$nom_sql];
			} else {  # table locale a cote de SPIP, comme non SPIP:
				$fdesc = array();
			}
		}

		// faut il interpreter le prefixe 'spip_' ?
		$transposer_spip = ($nom_sql != $nom);
		
		// La *vraie* base a la priorite
		if (true /*  !$bdesc OR !$bdesc['field']  */) {
			$desc = sql_showtable($nom_sql, $transposer_spip, $serveur);
			if (!$desc OR !$desc['field']) {
				if (!$fdesc) {
					spip_log("trouver_table: table inconnue '$serveur' '$nom'");
					return null;
				}
				// on ne sait pas lire la structure de la table :
				// on retombe sur la description donnee dans les fichiers spip
				$desc = $fdesc;
			}
		}
		// S'il n'y a pas de key (cas d'une VIEW),
		// on va inventer une PRIMARY KEY en prenant le premier champ
		// de la table
		if (!$desc['key']){
			$p = array_keys($desc['field']);
			$desc['key']['PRIMARY KEY'] = array_shift($p);
		}

		$desc['table']= $nom_sql;
		$desc['connexion']= $serveur;
		// objet_type peut provoquer un appel reentrant ici.
		// pour ne pas faire de boucle infinie, on stocke ce qu'on a deja trouve
		$connexion['tables'][$nom] = $desc;

		$table = table_objet(objet_type($nom));
		$desc['titre'] = isset($GLOBALS['table_titre'][$table])
		? $GLOBALS['table_titre'][$table]
		: (isset($desc['field']['titre']) ? 'titre' : '');
		$connexion['tables'][$nom] = $desc;
		// une nouvelle table a ete decrite
		// mettons donc a jour le cache des descriptions de ce serveur
		if (is_writeable(_DIR_CACHE))
			ecrire_fichier($nom_cache_desc_sql[$serveur],serialize($connexion['tables']));
	}

	$connexion['tables'][$nom]['id_table']=$nom;
	return $connexion['tables'][$nom];
}
예제 #26
0
/**
 * Produire un fichier statique a partir d'un squelette dynamique
 * Permet ensuite a apache de le servir en statique sans repasser
 * par spip.php a chaque hit sur le fichier
 * si le format (css ou js) est passe dans contexte['format'], on l'utilise
 * sinon on regarde si le fond finit par .css ou .js
 * sinon on utilie "html"
 *
 * @param string $fond
 * @param array $contexte
 * @param array $options
 * @param string $connect
 * @return string
 */
function produire_fond_statique($fond, $contexte=array(), $options = array(), $connect=''){
	if (isset($contexte['format'])){
		$extension = $contexte['format'];
		unset($contexte['format']);
	}
	else {
		$extension = "html";
		if (preg_match(',[.](css|js)$,',$fond,$m))
			$extension = $m[1];
	}
	// recuperer le contenu produit par le squelette
	$options['raw'] = true;
	$cache = recuperer_fond($fond,$contexte,$options,$connect);

  // calculer le nom de la css
	$dir_var = sous_repertoire (_DIR_VAR, 'cache-'.$extension);
	$filename = $dir_var . $extension."dyn-".md5($fond.serialize($contexte).$connect) .".$extension";

	// mettre a jour le fichier si il n'existe pas
	// ou trop ancien
  if (!file_exists($filename)
	  OR filemtime($filename)<$cache['lastmodified']){

	  $contenu = $cache['texte'];
	  // passer les urls en absolu si c'est une css
	  if ($extension=="css")
	    $contenu = urls_absolues_css($contenu, generer_url_public($fond));

    $comment = "/* #PRODUIRE{fond=$fond";
    foreach($contexte as $k=>$v)
	    $comment .= ",$k=$v";
    $comment .="} le ".date("Y-m-d H:i:s")." */\n";
	  // et ecrire le fichier
    ecrire_fichier($filename,$comment.$contenu);
  }

  return $filename;
}
예제 #27
0
/**
 * Produire un fichier statique a partir d'un squelette dynamique
 * Permet ensuite a apache de le servir en statique sans repasser
 * par spip.php a chaque hit sur le fichier
 * si le format (css ou js) est passe dans contexte['format'], on l'utilise
 * sinon on regarde si le fond finit par .css ou .js
 * sinon on utilie "html"
 *
 * @param string $fond
 * @param array $contexte
 * @param array $options
 * @param string $connect
 * @return string
 */
function produire_fond_statique($fond, $contexte = array(), $options = array(), $connect = '')
{
    if (isset($contexte['format'])) {
        $extension = $contexte['format'];
        unset($contexte['format']);
    } else {
        $extension = "html";
        if (preg_match(',[.](css|js|json)$,', $fond, $m)) {
            $extension = $m[1];
        }
    }
    // recuperer le contenu produit par le squelette
    $options['raw'] = true;
    $cache = recuperer_fond($fond, $contexte, $options, $connect);
    // calculer le nom de la css
    $dir_var = sous_repertoire(_DIR_VAR, 'cache-' . $extension);
    $nom_safe = preg_replace(",\\W,", '_', str_replace('.', '_', $fond));
    $filename = $dir_var . $extension . "dyn-{$nom_safe}-" . substr(md5($fond . serialize($contexte) . $connect), 0, 8) . ".{$extension}";
    // mettre a jour le fichier si il n'existe pas
    // ou trop ancien
    // le dernier fichier produit est toujours suffixe par .last
    // et recopie sur le fichier cible uniquement si il change
    if (!file_exists($filename) or !file_exists($filename . ".last") or isset($cache['lastmodified']) and $cache['lastmodified'] and filemtime($filename . ".last") < $cache['lastmodified'] or defined('_VAR_MODE') and _VAR_MODE == 'recalcul') {
        $contenu = $cache['texte'];
        // passer les urls en absolu si c'est une css
        if ($extension == "css") {
            $contenu = urls_absolues_css($contenu, test_espace_prive() ? generer_url_ecrire('accueil') : generer_url_public($fond));
        }
        // ne pas insérer de commentaire si c'est du json
        if ($extension != "json") {
            $comment = "/* #PRODUIRE{fond={$fond}";
            foreach ($contexte as $k => $v) {
                $comment .= ",{$k}={$v}";
            }
            // pas de date dans le commentaire car sinon ca invalide le md5 et force la maj
            // mais on peut mettre un md5 du contenu, ce qui donne un aperu rapide si la feuille a change ou non
            $comment .= "}\n   md5:" . md5($contenu) . " */\n";
        }
        // et ecrire le fichier
        ecrire_fichier($filename . ".last", $comment . $contenu);
        // regarder si on recopie
        if (!file_exists($filename) or md5_file($filename) !== md5_file($filename . ".last")) {
            @copy($filename . ".last", $filename);
            spip_clearstatcache(true, $filename);
            // eviter que PHP ne reserve le vieux timestamp
        }
    }
    return $filename;
}
예제 #28
0
function recuperer_infos_distantes($source, $max = 0, $charger_si_petite_image = true)
{
    # charger les alias des types mime
    include_spip('base/typedoc');
    global $mime_alias;
    $a = array();
    $mime_type = '';
    // On va directement charger le debut des images et des fichiers html,
    // de maniere a attrapper le maximum d'infos (titre, taille, etc). Si
    // ca echoue l'utilisateur devra les entrer...
    if ($headers = recuperer_page($source, false, true, $max, '', '', true)) {
        list($headers, $a['body']) = preg_split(',\\n\\n,', $headers, 2);
        if (preg_match(",\nContent-Type: *([^[:space:];]*),i", "\n{$headers}", $regs)) {
            $mime_type = trim($regs[1]);
        } else {
            $mime_type = '';
        }
        // inconnu
        // Appliquer les alias
        while (isset($mime_alias[$mime_type])) {
            $mime_type = $mime_alias[$mime_type];
        }
        // Si on a un mime-type insignifiant
        // text/plain,application/octet-stream ou vide
        // c'est peut-etre que le serveur ne sait pas
        // ce qu'il sert ; on va tenter de detecter via l'extension de l'url
        // ou le Content-Disposition: attachment; filename=...
        $t = null;
        if (in_array($mime_type, array('text/plain', '', 'application/octet-stream'))) {
            if (!$t and preg_match(',\\.([a-z0-9]+)(\\?.*)?$,i', $source, $rext)) {
                $t = sql_fetsel("extension", "spip_types_documents", "extension=" . sql_quote($rext[1], '', 'text'));
            }
            if (!$t and preg_match(",^Content-Disposition:\\s*attachment;\\s*filename=(.*)\$,Uims", $headers, $m) and preg_match(',\\.([a-z0-9]+)(\\?.*)?$,i', $m[1], $rext)) {
                $t = sql_fetsel("extension", "spip_types_documents", "extension=" . sql_quote($rext[1], '', 'text'));
            }
        }
        // Autre mime/type (ou text/plain avec fichier d'extension inconnue)
        if (!$t) {
            $t = sql_fetsel("extension", "spip_types_documents", "mime_type=" . sql_quote($mime_type));
        }
        // Toujours rien ? (ex: audio/x-ogg au lieu de application/ogg)
        // On essaie de nouveau avec l'extension
        if (!$t and $mime_type != 'text/plain' and preg_match(',\\.([a-z0-9]+)(\\?.*)?$,i', $source, $rext)) {
            $t = sql_fetsel("extension", "spip_types_documents", "extension=" . sql_quote($rext[1], '', 'text'));
            # eviter xxx.3 => 3gp (> SPIP 3)
        }
        if ($t) {
            spip_log("mime-type {$mime_type} ok, extension " . $t['extension']);
            $a['extension'] = $t['extension'];
        } else {
            # par defaut on retombe sur '.bin' si c'est autorise
            spip_log("mime-type {$mime_type} inconnu");
            $t = sql_fetsel("extension", "spip_types_documents", "extension='bin'");
            if (!$t) {
                return false;
            }
            $a['extension'] = $t['extension'];
        }
        if (preg_match(",\nContent-Length: *([^[:space:]]*),i", "\n{$headers}", $regs)) {
            $a['taille'] = intval($regs[1]);
        }
    }
    // Echec avec HEAD, on tente avec GET
    if (!$a and !$max) {
        spip_log("tenter GET {$source}");
        $a = recuperer_infos_distantes($source, _INC_DISTANT_MAX_SIZE);
    }
    // S'il s'agit d'une image pas trop grosse ou d'un fichier html, on va aller
    // recharger le document en GET et recuperer des donnees supplementaires...
    if (preg_match(',^image/(jpeg|gif|png|swf),', $mime_type)) {
        if ($max == 0 and $a['taille'] < _INC_DISTANT_MAX_SIZE and strpos($GLOBALS['meta']['formats_graphiques'], $a['extension']) !== false and $charger_si_petite_image) {
            $a = recuperer_infos_distantes($source, _INC_DISTANT_MAX_SIZE);
        } else {
            if ($a['body']) {
                $a['fichier'] = _DIR_RACINE . nom_fichier_copie_locale($source, $a['extension']);
                ecrire_fichier($a['fichier'], $a['body']);
                $size_image = @getimagesize($a['fichier']);
                $a['largeur'] = intval($size_image[0]);
                $a['hauteur'] = intval($size_image[1]);
                $a['type_image'] = true;
            }
        }
    }
    // Fichier swf, si on n'a pas la taille, on va mettre 425x350 par defaut
    // ce sera mieux que 0x0
    if ($a and $a['extension'] == 'swf' and !$a['largeur']) {
        $a['largeur'] = 425;
        $a['hauteur'] = 350;
    }
    if ($mime_type == 'text/html') {
        include_spip('inc/filtres');
        $page = recuperer_page($source, true, false, _INC_DISTANT_MAX_SIZE);
        if (preg_match(',<title>(.*?)</title>,ims', $page, $regs)) {
            $a['titre'] = corriger_caracteres(trim($regs[1]));
        }
        if (!$a['taille']) {
            $a['taille'] = strlen($page);
        }
        # a peu pres
    }
    return $a;
}
예제 #29
0
파일: dump.php 프로젝트: loorenzooo/aslfc
/**
 * Copier de base a base
 *
 * @param string $status_file
 *   nom avec chemin complet du fichier ou est stocke le status courant
 * @param array $tables
 *   liste des tables a copier
 * @param string $serveur_source
 * @param string $serveur_dest
 * @param array $options
 *   parametres optionnels sous forme de tableau :
 *   param string $callback_progression
 *     fonction a appeler pour afficher la progression, avec les arguments (compteur,total,table)
 *   param int $max_time
 *     limite de temps au dela de laquelle sortir de la fonction proprement (de la forme time()+15)
 *   param bool $drop_source
 *     vider les tables sources apres copie
 *   param array $no_erase_dest
 *     liste des tables a ne pas vider systematiquement (ne seront videes que si existent dans la base source)
 *   param array $where
 *     liste optionnelle de condition where de selection des donnees pour chaque table
 *   param string $racine_fonctions_dest
 *     racine utilisee pour charger_fonction() des operations elementaires sur la base de destination.
 *     Permet de deleguer vers une autre voie de communication.
 *     Par defaut on utilise 'base', ce qui route vers les fonctions de ce fichier. Concerne :
 *     - vider_tables_destination_copie
 *     - preparer_table_dest
 *     - detruire_copieur_si_besoin
 *     - inserer_copie
 *   param array $fonction_base_inserer
 *     fonction d'insertion en base. Par defaut "inserer_copie" qui fait un insertq a l'identique.
 *     Attention, la fonction appelee est prefixee par $racine_fonctions_dest via un charger_fonction()
 *     Peut etre personalisee pour filtrer, renumeroter....
 *   param array $desc_tables_dest
 *     description des tables de destination a utiliser de preference a la description de la table source
 *   param int data_pool
 *     nombre de ko de donnees a envoyer d'un coup en insertion dans la table cible (par defaut 1)
 *     permet des envois groupes pour plus de rapidite, notamment si l'insertion est distante
 *
 * @return bool
 */
function base_copier_tables($status_file, $tables, $serveur_source, $serveur_dest, $options = array())
{
    $callback_progression = isset($options['callback_progression']) ? $options['callback_progression'] : '';
    $max_time = isset($options['max_time']) ? $options['max_time'] : 0;
    $drop_source = isset($options['drop_source']) ? $options['drop_source'] : false;
    $no_erase_dest = isset($options['no_erase_dest']) ? $options['no_erase_dest'] : array();
    $where = isset($options['where']) ? $options['where'] : array();
    $fonction_base_inserer = isset($options['fonction_base_inserer']) ? $options['fonction_base_inserer'] : 'inserer_copie';
    $desc_tables_dest = isset($options['desc_tables_dest']) ? $options['desc_tables_dest'] : array();
    $racine_fonctions = isset($options['racine_fonctions_dest']) ? $options['racine_fonctions_dest'] : 'base';
    $data_pool = isset($options['data_pool']) ? $options['data_pool'] : 50 * 1024;
    spip_log("Copier " . count($tables) . " tables de '{$serveur_source}' vers '{$serveur_dest}'", 'dump.' . _LOG_INFO_IMPORTANTE);
    if (!($inserer_copie = charger_fonction($fonction_base_inserer, $racine_fonctions, true))) {
        spip_log("Fonction '{$racine_fonctions}_{$fonction_base_inserer}' inconnue. Abandon", 'dump.' . _LOG_INFO_IMPORTANTE);
        return true;
        // echec mais on a fini, donc true
    }
    if (!($preparer_table_dest = charger_fonction('preparer_table_dest', $racine_fonctions, true))) {
        spip_log("Fonction '{$racine_fonctions}_{$preparer_table_dest}' inconnue. Abandon", 'dump.' . _LOG_INFO_IMPORTANTE);
        return true;
        // echec mais on a fini, donc true
    }
    if (!lire_fichier($status_file, $status) or !($status = unserialize($status))) {
        $status = array();
    }
    $status['etape'] = 'basecopie';
    // puis relister les tables a importer
    // et les vider si besoin, au moment du premier passage ici
    $initialisation_copie = !isset($status["dump_status_copie"]) ? 0 : $status["dump_status_copie"];
    // si init pas encore faite, vider les tables du serveur destination
    if (!$initialisation_copie) {
        if (!($vider_tables_destination_copie = charger_fonction('vider_tables_destination_copie', $racine_fonctions, true))) {
            spip_log("Fonction '{$racine_fonctions}_vider_tables_destination_copie' inconnue. Abandon", 'dump.' . _LOG_INFO_IMPORTANTE);
            return true;
            // echec mais on a fini, donc true
        }
        $vider_tables_destination_copie($tables, $no_erase_dest, $serveur_dest);
        $status["dump_status_copie"] = 'ok';
        ecrire_fichier($status_file, serialize($status));
    }
    // les tables auteurs et meta doivent etre copiees en dernier !
    if (in_array('spip_auteurs', $tables)) {
        $tables = array_diff($tables, array('spip_auteurs'));
        $tables[] = 'spip_auteurs';
    }
    if (in_array('spip_meta', $tables)) {
        $tables = array_diff($tables, array('spip_meta'));
        $tables[] = 'spip_meta';
    }
    spip_log("Tables a copier :" . implode(", ", $tables), 'dump.' . _LOG_INFO);
    $trouver_table = charger_fonction('trouver_table', 'base');
    foreach ($tables as $table) {
        // en principe, pas de spip_ dans le nom de table passe a trouver_table
        $desc_source = $trouver_table(preg_replace(",^spip_,", "", $table), $serveur_source, false);
        if (!$desc_source) {
            $desc_source = $trouver_table($table, $serveur_source, false);
        }
        // verifier que la table est presente dans la base source
        if ($desc_source) {
            // $status['tables_copiees'][$table] contient l'avancement
            // de la copie pour la $table : 0 a N et -N quand elle est finie (-1 si vide et finie...)
            if (!isset($status['tables_copiees'][$table])) {
                $status['tables_copiees'][$table] = 0;
            }
            if (is_numeric($status['tables_copiees'][$table]) and $status['tables_copiees'][$table] >= 0 and $desc_dest = $preparer_table_dest($table, isset($desc_tables_dest[$table]) ? $desc_tables_dest[$table] : $desc_source, $serveur_dest, $status['tables_copiees'][$table] == 0)) {
                if ($callback_progression) {
                    $callback_progression($status['tables_copiees'][$table], 0, $table);
                }
                while (true) {
                    $n = intval($status['tables_copiees'][$table]);
                    // on copie par lot de 400
                    $res = sql_select('*', $table, isset($where[$table]) ? $where[$table] : '', '', '', "{$n},400", '', $serveur_source);
                    while ($row = sql_fetch($res, $serveur_source)) {
                        $rows = array($row);
                        // lire un groupe de donnees si demande en option
                        // (permet un envoi par lot vers la destination)
                        if ($data_pool > 0) {
                            $s = strlen(serialize($row));
                            while ($s < $data_pool and $row = sql_fetch($res, $serveur_source)) {
                                $s += strlen(serialize($row));
                                $rows[] = $row;
                            }
                        }
                        // si l'enregistrement est deja en base, ca fera un echec ou un doublon
                        // mais si ca renvoie false c'est une erreur fatale => abandon
                        if ($inserer_copie($table, $rows, $desc_dest, $serveur_dest) === false) {
                            // forcer la sortie, charge a l'appelant de gerer l'echec
                            // copie finie
                            return true;
                        }
                        $status['tables_copiees'][$table] += count($rows);
                        if ($max_time and time() > $max_time) {
                            break;
                        }
                    }
                    if ($n == $status['tables_copiees'][$table]) {
                        break;
                    }
                    spip_log("recopie {$table} " . $status['tables_copiees'][$table], 'dump.' . _LOG_INFO_IMPORTANTE);
                    if ($callback_progression) {
                        $callback_progression($status['tables_copiees'][$table], 0, $table);
                    }
                    ecrire_fichier($status_file, serialize($status));
                    if ($max_time and time() > $max_time) {
                        return false;
                    }
                    // on a pas fini, mais le temps imparti est ecoule
                }
                if ($drop_source) {
                    sql_drop_table($table, '', $serveur_source);
                    spip_log("drop {$table} sur serveur source '{$serveur_source}'", 'dump.' . _LOG_INFO_IMPORTANTE);
                }
                $status['tables_copiees'][$table] = $status['tables_copiees'][$table] ? -$status['tables_copiees'][$table] : "zero";
                ecrire_fichier($status_file, serialize($status));
                spip_log("tables_recopiees " . implode(',', $status['tables_copiees']), 'dump.' . _LOG_INFO);
                if ($callback_progression) {
                    $callback_progression($status['tables_copiees'][$table], $status['tables_copiees'][$table], $table);
                }
            } else {
                if ($status['tables_copiees'][$table] < 0) {
                    spip_log("Table {$table} deja copiee : " . $status['tables_copiees'][$table], "dump." . _LOG_INFO);
                }
                if ($callback_progression) {
                    $callback_progression(0, $status['tables_copiees'][$table], "{$table}" . ((is_numeric($status['tables_copiees'][$table]) and $status['tables_copiees'][$table] >= 0) ? "[Echec]" : ""));
                }
            }
        } else {
            $status['errors'][] = "Impossible de lire la description de la table {$table}";
            ecrire_fichier($status_file, serialize($status));
            spip_log("Impossible de lire la description de la table {$table}", "dump." . _LOG_ERREUR);
        }
    }
    // si le nombre de tables envoyees n'est pas egal au nombre de tables demandees
    // abandonner
    if (count($status['tables_copiees']) < count($tables)) {
        spip_log("Nombre de tables copiees incorrect : " . count($status['tables_copiees']) . "/" . count($tables), "dump." . _LOG_ERREUR);
        $status['errors'][] = "Nombre de tables copiees incorrect : " . count($status['tables_copiees']) . "/" . count($tables);
        ecrire_fichier($status_file, serialize($status));
    }
    if ($detruire_copieur_si_besoin = charger_fonction('detruire_copieur_si_besoin', $racine_fonctions, true)) {
        $detruire_copieur_si_besoin($serveur_dest);
    } else {
        spip_log("Fonction '{$racine_fonctions}_detruire_copieur_si_besoin' inconnue.", 'dump.' . _LOG_INFO_IMPORTANTE);
    }
    // OK, copie complete
    return true;
}
예제 #30
0
/**
 * Regrouper les @import restants dans la CSS concatenee en debut de celle-ci
 *
 * @param string $nom_tmp
 * @param string $nom
 * @return bool|string
 */
function css_regroup_atimport($nom_tmp, $nom)
{
    lire_fichier($nom_tmp, $contenu);
    if (!$contenu or strpos($contenu, "@import") === false) {
        return false;
    }
    // rien a faire
    preg_match_all(",@import ([^;]*);,UmsS", $contenu, $matches, PREG_SET_ORDER);
    $imports = array_map("reset", $matches);
    $contenu = str_replace($imports, "", $contenu);
    $contenu = implode("\n", $imports) . "\n" . $contenu;
    ecrire_fichier($nom, $contenu, true);
    // ecrire une version .gz pour content-negociation par apache, cf. [11539]
    ecrire_fichier("{$nom}.gz", $contenu, true);
    return $nom;
}