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; }
/** * 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); }
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"; }
/** * 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))); }
function install_fichier_connexion($nom, $texte) { $texte = "<"."?php\n" . "if (!defined(\"_ECRIRE_INC_VERSION\")) return;\n" . $texte . "?".">"; ecrire_fichier($nom, $texte); }
/** * 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"); } }
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); }
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('&', '&', htmlentities($r3[$i]['title'][0], ENT_NOQUOTES, "UTF-8")); $t = preg_replace(',\s*€(¦)?,', ' (…)', $t); $t = preg_replace(',^(.*?):,', "• <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); }
/** * 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]; } }
/** * 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 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; }
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); }
/** * 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>[ > <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; }
/** * 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; } }
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); }
/** * 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; }
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); }
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; }
/** * 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; }
function save_path_cache() { if (defined('_SAUVER_CHEMIN') and _SAUVER_CHEMIN) { ecrire_fichier(_CACHE_CHEMIN, serialize($GLOBALS['path_files'])); } }
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]; }
/** * 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; }
/** * 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; }
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; }
/** * 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; }
/** * 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; }