function maj_v016_dist($version_installee, $version_cible) { if (upgrade_vers(1.6, $version_installee, $version_cible)) { #8/08/07 plus d'indexation dans le core # include_spip('inc/indexation'); # purger_index(); # creer_liste_indexation(); maj_version(1.6); } if (upgrade_vers(1.601, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_forum ADD INDEX id_syndic (id_syndic)"); maj_version(1.601); } if (upgrade_vers(1.603, $version_installee, $version_cible)) { // supprimer les fichiers deplaces spip_unlink('inc_meta_cache.php'); spip_unlink('inc_meta_cache.php3'); spip_unlink('data/engines-list.ini'); maj_version(1.603); } if (upgrade_vers(1.604, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_auteurs ADD lang VARCHAR(10) DEFAULT '' NOT NULL"); $u = spip_query("SELECT * FROM spip_auteurs WHERE prefs LIKE '%spip_lang%'"); while ($row = sql_fetch($u)) { $prefs = unserialize($row['prefs']); $l = $prefs['spip_lang']; unset($prefs['spip_lang']); spip_query("UPDATE spip_auteurs SET lang=" . _q($l) . ", prefs='" . addslashes(serialize($prefs)) . "' WHERE id_auteur=" . $row['id_auteur']); } $u = spip_query("SELECT lang FROM spip_auteurs"); maj_version(1.604, $u); } }
function admin_repair_plat(){ spip_log("verification des documents joints"); $out = ""; $repertoire = array(); include_spip('inc/getdocument'); $res = sql_select('*','spip_documents',"fichier REGEXP CONCAT('^',extension,'[^/\]') AND distant='non'"); while ($row=sql_fetch($res)){ $ext = $row['extension']; if (!$ext) { spip_log("document sans extension: " . $row['id_document']); continue; } if (!isset($repertoire[$ext])){ if (@file_exists($plat = _DIR_IMG. $ext .".plat")) spip_unlink($plat); $repertoire[$ext] = creer_repertoire_documents($ext); if (preg_match(',_$,',$repertoire[$ext])) $repertoire[$ext] = false; } if ($d=$repertoire[$ext]){ $d = substr($d,strlen(_DIR_IMG)); $src = $row['fichier']; $dest = $d . substr($src,strlen($d)); if (deplacer_fichier_upload(_DIR_IMG . $src, _DIR_IMG . $dest)) { sql_updateq('spip_documents',array('fichier'=>$dest),'id_document='.intval($row['id_document'])); spip_unlink(_DIR_IMG . $src); $out .= "$src => $dest<br />"; } } } return $out; }
/** * http://code.spip.net/@action_copier_local_post * * @param $id_document * @return bool|mixed|string */ function action_copier_local_post($id_document) { // Il faut la source du document pour le copier $row = sql_fetsel("mode,fichier, descriptif, credits", "spip_documents", "id_document={$id_document}"); $source = $row['fichier']; include_spip('inc/distant'); // pour 'copie_locale' $fichier = copie_locale($source); if ($fichier) { $fichier = _DIR_RACINE . $fichier; $files[] = array('tmp_name' => $fichier, 'name' => basename($fichier)); $ajouter_documents = charger_fonction('ajouter_documents', 'action'); spip_log("convertit doc {$id_document} en local: {$source} => {$fichier}"); $liste = array(); $ajouter_documents($id_document, $files, '', 0, $row['mode'], $liste); spip_unlink($fichier); // ajouter l'origine du document aux credits include_spip('action/editer_document'); document_modifier($id_document, array('credits' => ($row['credits'] ? $row['credits'] . ', ' : '') . $source)); return true; } else { spip_log("echec copie locale {$source}"); } return _T('medias:erreur_copie_fichier', array('nom' => $source)); }
/** * Programme de mise a jour des tables SQL lors d'un chgt de version. * L'entree dans cette fonction est reservee au maj de SPIP coeur * * Marche aussi pour les plugins en appelant directement la fonction maj_plugin * Pour que ceux-ci profitent aussi de la reprise sur interruption, * ils doivent simplement indiquer leur numero de version installee dans une meta * et fournir le tableau maj a la fonction maj_plugin. * La reprise sur timeout se fait alors par la page admin_plugin et jamais par ici * * http://doc.spip.org/@base_upgrade_dist * * @param string $titre * @param string $reprise * @return */ function base_upgrade_dist($titre = '', $reprise = '') { if (!$titre) { return; } // anti-testeur automatique if ($GLOBALS['spip_version_base'] != $GLOBALS['meta']['version_installee']) { if (!is_numeric(_request('reinstall'))) { include_spip('base/create'); spip_log("recree les tables eventuellement disparues", "maj." . _LOG_INFO_IMPORTANTE); creer_base(); } // quand on rentre par ici, c'est toujours une mise a jour de SPIP // lancement de l'upgrade SPIP $res = maj_base(); if ($res) { // on arrete tout ici ! exit; } } spip_log("Fin de mise a jour SQL. Debut m-a-j acces et config", "maj." . _LOG_INFO_IMPORTANTE); // supprimer quelques fichiers temporaires qui peuvent se retrouver invalides @spip_unlink(_CACHE_RUBRIQUES); @spip_unlink(_CACHE_PIPELINES); @spip_unlink(_CACHE_PLUGINS_PATH); @spip_unlink(_CACHE_PLUGINS_OPT); @spip_unlink(_CACHE_PLUGINS_FCT); @spip_unlink(_CACHE_CHEMIN); @spip_unlink(_DIR_TMP . "plugin_xml_cache.gz"); include_spip('inc/auth'); auth_synchroniser_distant(); $config = charger_fonction('config', 'inc'); $config(); }
/** * Plugin SkelEditor * Editeur de squelette en ligne * (c) 2007-2010 erational * Licence GPL-v3 * */ function action_skeleditor_delete_dist(){ $securiser_action = charger_fonction('securiser_action','inc'); $file_name = $securiser_action(); if (autoriser('supprimer','squelette',$file_name)){ spip_unlink($file_name); } }
/** * Cree au besoin la copie locale d'un fichier distant * * * Prend en argument un chemin relatif au rep racine, ou une URL * Renvoie un chemin relatif au rep racine, ou false * * http://doc.spip.org/@copie_locale * * @param $source * @param string $mode * 'test' - ne faire que tester * 'auto' - charger au besoin * 'modif' - Si deja present, ne charger que si If-Modified-Since * 'force' - charger toujours (mettre a jour) * @param string $local * permet de specifier le nom du fichier local (stockage d'un cache par exemple, et non document IMG) * @return bool|string */ function copie_locale($source, $mode='auto') { // si c'est la protection de soi-meme, retourner le path if ($mode !== 'force' AND preg_match(_REGEXP_COPIE_LOCALE, $source, $local)) { $source = substr(_DIR_IMG,strlen(_DIR_RACINE)) . urldecode($local[1]); return @file_exists($source) ? $source : false; } $local = fichier_copie_locale($source); $localrac = _DIR_RACINE.$local; $t = ($mode=='force') ? false : @file_exists($localrac); // test d'existence du fichier if ($mode=='test') return $t ? $local : ''; // si $local = '' c'est un fichier refuse par fichier_copie_locale(), // par exemple un fichier qui ne figure pas dans nos documents ; // dans ce cas on n'essaie pas de le telecharger pour ensuite echouer if (!$local) return false; // sinon voir si on doit/peut le telecharger if ($local==$source OR !preg_match(',^\w+://,', $source)) return $local; if ($mode=='modif' OR !$t){ // passer par un fichier temporaire unique pour gerer les echecs en cours de recuperation // et des eventuelles recuperations concurantes include_spip("inc/acces"); $localractmp = "$localrac.".creer_uniqid().".tmp"; $res = recuperer_page($source, $localractmp, false, _COPIE_LOCALE_MAX_SIZE, '', '', false, $t ? filemtime($localrac) : ''); if ($res) { // si OK on supprime l'ancien fichier et on renomme spip_log("copie_locale : recuperation $source sur $localractmp taille $res OK, renommage en $localrac"); spip_unlink($localrac); @rename($localractmp, $localrac); } else { // sinon on supprime le fichier temporaire qui a echoue et qui est sans doute corrompu... spip_log("copie_locale : Echec recuperation $source sur $localractmp, fichier supprime",_LOG_INFO_IMPORTANTE); spip_unlink($localractmp); } if (!$res) return $t ? $local : false; // pour une eventuelle indexation pipeline('post_edition', array( 'args' => array( 'operation' => 'copie_locale', 'source' => $source, 'fichier' => $local ), 'data' => null ) ); } return $local; }
function action_supprimer_document_dist($id_document = 0) { if (!$id_document) { $securiser_action = charger_fonction('securiser_action', 'inc'); $id_document = $securiser_action(); } include_spip('inc/autoriser'); if (!autoriser('supprimer', 'document', $id_document)) { spip_log("Echec : Suppression document {$id_document} interdite", _LOG_ERREUR); return false; } // si c'etait une vignette, modifier le document source ! if ($source = sql_getfetsel('id_document', 'spip_documents', 'id_vignette=' . intval($id_document))) { include_spip('action/editer_document'); document_modifier($source, array("id_vignette" => 0)); } include_spip('inc/documents'); if (!($doc = sql_fetsel('*', 'spip_documents', 'id_document=' . intval($id_document)))) { spip_log("Echec : Suppression document {$id_document} : le document n'existe pas en base", _LOG_ERREUR); return false; } spip_log("Suppression du document {$id_document} (" . $doc['fichier'] . ")"); include_spip('action/editer_liens'); // Si c'est un document ayant une vignette, supprimer aussi la vignette if ($doc['id_vignette']) { action_supprimer_document_dist($doc['id_vignette']); objet_dissocier(array('document' => $doc['id_vignette']), '*'); } // Si c'est un document ayant des documents annexes (sous-titre, ...) // les supprimer aussi $annexes = array_map('reset', sql_allfetsel("id_document", "spip_documents_liens", "objet='document' AND id_objet=" . intval($id_document))); foreach ($annexes as $id) { action_supprimer_document_dist($id); } // dereferencer dans la base objet_dissocier(array('document' => $id_document), '*', array('role' => '*')); sql_delete('spip_documents', 'id_document=' . intval($id_document)); // Supprimer le fichier si le doc est local, // et la copie locale si le doc est distant if ($doc['distant'] == 'oui') { include_spip('inc/distant'); if ($local = _DIR_RACINE . copie_locale($doc['fichier'], 'test')) { spip_unlink($local); } } else { spip_unlink(get_spip_doc($doc['fichier'])); } pipeline('post_edition', array('args' => array('operation' => 'supprimer_document', 'action' => 'supprimer_document', 'table' => 'spip_documents', 'id_objet' => $id_document, 'document' => $doc), 'data' => null)); return true; }
/** * Action de purge du cache * * L'argument peut être : * * - inhibe_cache : inhibe le cache pendant 24h * - reactive_cache : enlève l'inhibition du cache * - cache : nettoie tous les caches (sauf celui des vignettes) * - squelettes : nettoie le cache de compilation des squelettes * - vignettes : nettoie le cache des vignettes (et compressions css/js) * * @pipeline_appel trig_purger * @uses supprime_invalideurs() * @uses purger_repertoire() * * @param string|null $arg * Argument attendu. En absence utilise l'argument * de l'action sécurisée. */ function action_purger_dist($arg = null) { if (is_null($arg)) { $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); } include_spip('inc/invalideur'); spip_log("purger {$arg}"); switch ($arg) { case 'inhibe_cache': // inhiber le cache pendant 24h ecrire_meta('cache_inhib', $_SERVER['REQUEST_TIME'] + 24 * 3600); break; case 'reactive_cache': effacer_meta('cache_inhib'); break; case 'cache': supprime_invalideurs(); @spip_unlink(_CACHE_RUBRIQUES); @spip_unlink(_CACHE_CHEMIN); @spip_unlink(_DIR_TMP . "plugin_xml_cache.gz"); // on ne supprime que _CACHE_PLUGINS_OPT qui declenche la reconstruction des 3 // _CACHE_PIPELINES _CACHE_PLUGINS_PATH et _CACHE_PLUGINS_FCT // pour eviter des problemes de concurence // cf http://core.spip.org/issues/2989 //@spip_unlink(_CACHE_PIPELINES); //@spip_unlink(_CACHE_PLUGINS_PATH); //@spip_unlink(_CACHE_PLUGINS_FCT); @spip_unlink(_CACHE_PLUGINS_OPT); purger_repertoire(_DIR_CACHE, array('subdir' => true)); purger_repertoire(_DIR_AIDE); purger_repertoire(_DIR_VAR . 'cache-css'); purger_repertoire(_DIR_VAR . 'cache-js'); break; case 'squelettes': purger_repertoire(_DIR_SKELS); break; case 'vignettes': purger_repertoire(_DIR_VAR, array('subdir' => true)); supprime_invalideurs(); purger_repertoire(_DIR_CACHE, array('subdir' => true)); break; } // le faire savoir aux plugins pipeline('trig_purger', $arg); }
function test_ecrire($my_dir) { static $chmod = 0; $ok = false; $script = @file_exists('spip_loader.php') ? 'spip_loader.php' : $_SERVER['PHP_SELF']; $self = basename($script); $uid = @fileowner('.'); $uid2 = @fileowner($self); $gid = @filegroup('.'); $gid2 = @filegroup($self); $perms = @fileperms($self); // Comparer l'appartenance d'un fichier cree par PHP // avec celle du script et du repertoire courant if (!$chmod) { @rmdir('test'); spip_unlink('test'); // effacer au cas ou @touch('test'); if ($uid > 0 && $uid == $uid2 && @fileowner('test') == $uid) { $chmod = 0700; } else { if ($gid > 0 && $gid == $gid2 && @filegroup('test') == $gid) { $chmod = 0770; } else { $chmod = 0777; } } // Appliquer de plus les droits d'acces du script if ($perms > 0) { $perms = $perms & 0777 | ($perms & 0444) >> 2; $chmod |= $perms; } spip_unlink('test'); } // Verifier que les valeurs sont correctes $f = @fopen($my_dir . 'test.php', 'w'); if ($f) { @fputs($f, '<' . '?php $ok = true; ?' . '>'); @fclose($f); @chmod($my_dir . 'test.php', $chmod); include $my_dir . 'test.php'; } spip_unlink($my_dir . 'test.php'); return $ok ? $chmod : false; }
/** * 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; } }
/** * Récupérer la source et détecter son extension * * @uses teleporter_http_extension() * * @param string $source * URL de la source HTTP * @param string $dest_tmp * Répertoire de destination * @return array|string * - Texte d'erreur si une erreur survient, * - Liste sinon (répertoire de destination temporaire, extension du fichier source) */ function teleporter_http_recuperer_source($source, $dest_tmp) { # securite : ici on repart toujours d'une source neuve if (file_exists($dest_tmp)) { spip_unlink($dest_tmp); } $extension = ""; # si on ne dispose pas encore du fichier # verifier que le zip en est bien un (sans se fier a son extension) # en chargeant son entete car l'url initiale peut etre une simple # redirection et ne pas comporter d'extension .zip include_spip('inc/distant'); $head = recuperer_page($source, false, true, 0); if (preg_match(",^Content-Type:\\s*?(.*)\$,Uims", $head, $m) and include_spip('base/typedoc')) { $mime = $m[1]; // passer du mime a l'extension ! if ($e = array_search($mime, $GLOBALS['tables_mime'])) { $extension = $e; } } if (!$extension or in_array($extension, array('bin', 'gz'))) { if (preg_match(",^Content-Disposition:\\s*attachment;\\s*filename=(.*)['\"]?\$,Uims", $head, $m) and $e = teleporter_http_extension($m[1])) { $extension = $e; } else { $extension = teleporter_http_extension($source); } } # format de fichier inconnu if (!$extension) { spip_log("Type de fichier inconnu pour la source {$source}", "teleport" . _LOG_ERREUR); return _T('svp:erreur_teleporter_type_fichier_inconnu', array('source' => $source)); } $dest_tmp = preg_replace(";\\.[\\w]{2,3}\$;i", "", $dest_tmp) . ".{$extension}"; if (!defined('_SVP_PAQUET_MAX_SIZE')) { define('_SVP_PAQUET_MAX_SIZE', 67108864); } // 64Mo include_spip('inc/distant'); $dest_tmp = copie_locale($source, 'force', $dest_tmp, _SVP_PAQUET_MAX_SIZE); if (!$dest_tmp or !file_exists($dest_tmp = _DIR_RACINE . $dest_tmp)) { spip_log("Chargement impossible de la source {$source}", "teleport" . _LOG_ERREUR); return _T('svp:erreur_teleporter_chargement_source_impossible', array('source' => $source)); } return array($dest_tmp, $extension); }
function action_elix_sansson_reencode_dist($arg = false) { if (!intval($arg)) { $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); } $ps_ffmpeg = exec('ps -C ffmpeg', $retour, $retour_int); if ($retour_int == 1 && count($retour) >= 3) { return false; } include_spip('inc/documents'); $source = sql_fetsel('*', 'spip_documents', 'id_document=' . intval($arg)); if (isset($source['fichier'])) { $chemin = get_spip_doc($source['fichier']); $dest = _DIR_TMP . basename($source['fichier']); $commande = 'ffmpeg -i ' . escapeshellarg($chemin) . ' -an -vcodec copy ' . escapeshellarg($dest); $encodage = exec($commande, $retour, $retour_int); if (file_exists($dest) && filesize($dest) > 0) { @rename($chemin, "{$chemin}--.old"); $id_article = sql_getfetsel('id_objet', 'spip_documents_liens', 'id_document=' . intval($arg) . ' AND objet="article"'); $ajouter_doc = charger_fonction('ajouter_documents', 'action'); $objet = 'article'; $id_objet = $id_article; $mode = 'document'; $files = array(); $filename = basename($dest); $files[0]['tmp_name'] = $dest; $files[0]['name'] = $filename; $id_document_new = $ajouter_doc($arg, $files, $objet, $id_objet, $mode); if (intval(reset($id_document_new)) > 0) { // retablir le fichier ! if ($chemin) { @rename("{$chemin}--.old", $chemin); } } else { // supprimer vraiment le fichier initial spip_unlink("{$chemin}--.old"); } } if (file_exists($dest)) { spip_unlink($dest); } } }
function base_upgrade_dist($titre='', $reprise='') { if (!$titre) return; // anti-testeur automatique if ($GLOBALS['spip_version']!=$GLOBALS['meta']['version_installee']) { if (!is_numeric(_request('reinstall'))) { include_spip('base/create'); spip_log("recree les tables eventuellement disparues"); creer_base(); } $meta = _request('meta'); if (!$meta) $res = maj_base(); // reprise sur demande de mise a jour interrompue pour plugin else $res= maj_while($GLOBALS['meta'][$meta], $GLOBALS[$meta]['cible'], $GLOBALS[$meta]['maj'], $meta, _request('table')); if ($res) { if (!is_array($res)) spip_log("Pb d'acces SQL a la mise a jour"); else { include_spip('inc/minipres'); echo minipres(_T('avis_operation_echec') . ' ' . join(' ', $res)); exit; } } } spip_log("Fin de mise a jour SQL. Debut m-a-j acces et config"); // supprimer quelques fichiers temporaires qui peuvent se retrouver invalides spip_unlink(_DIR_TMP.'plugin_xml.cache'); spip_unlink(_DIR_SESSIONS.'ajax_fonctions.txt'); spip_unlink(_CACHE_PIPELINES); spip_unlink(_CACHE_RUBRIQUES); spip_unlink(_CACHE_PLUGINS_OPT); spip_unlink(_CACHE_PLUGINS_FCT); spip_unlink(_CACHE_PLUGINS_VERIF); include_spip('inc/acces'); ecrire_acces(); $config = charger_fonction('config', 'inc'); $config(); }
function convert_utf8_init($tables_a_convertir) { // noter dans les meta qu'on veut convertir, et quoi $charset_source = $GLOBALS['meta']['charset']; ecrire_meta('charset', 'utf-8'); foreach ($tables_a_convertir as $table => $champ) { spip_log("demande update charset table $table ($champ)"); spip_query("UPDATE $table SET $champ = CONCAT('<CONVERT ".$charset_source.">', $champ) WHERE $champ NOT LIKE '<CONVERT %'"); } spip_unlink(_DIR_TMP.'convert_utf8_backup.sql'); // convertir spip_meta foreach ($GLOBALS['meta'] as $c => $v) { $v2 = unicode_to_utf_8(charset2unicode($v, $charset_source)); if ($v2 != $v) ecrire_meta($c, $v2); } }
/** * Telecharger un dump quand on est webmestre * * @param string $arg */ function action_supprimer_dump_dist($arg = null) { if (!$arg) { $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); } $fichier = $arg; if (autoriser('webmestre')) { // verifier que c'est bien une sauvegarde include_spip("inc/dump"); $dir = dump_repertoire(); $dumps = dump_lister_sauvegardes($dir); foreach ($dumps as $dump) { if ($dump['fichier'] == $fichier) { spip_unlink($dir . $fichier); } } } }
function formulaires_changer_fichier_document_traiter_dist($id_document) { if (_request('copier_local')) { $copier_local = charger_fonction('copier_local', 'action'); $res = array('editable' => true); if (($err = $copier_local($id_document)) === true) { $res['message_ok'] = _T('medias:document_copie_locale_succes'); } else { $res['message_erreur'] = $err; } } else { // liberer le nom de l'ancien fichier pour permettre le remplacement par un fichier du meme nom if ($ancien_fichier = sql_getfetsel('fichier', 'spip_documents', 'id_document=' . intval($id_document)) and @file_exists($f = get_spip_doc($ancien_fichier))) { spip_unlink($f); } $traiter = charger_fonction('traiter', 'formulaires/joindre_document'); $res = $traiter($id_document); } return $res; }
function action_supprimer_document_dist($id_document) { include_spip('inc/autoriser'); if (!autoriser('supprimer','document',$id_document)) return false; include_spip('inc/documents'); if (!$doc = sql_fetsel('*', 'spip_documents', 'id_document='.$id_document)) return false; spip_log("Suppression du document $id_document (".$doc['fichier'].")"); // Si c'est un document ayant une vignette, supprimer aussi la vignette if ($doc['id_vignette']) { action_supprimer_document_dist($doc['id_vignette']); sql_delete('spip_documents_liens', 'id_document='.$doc['id_vignette']); } // Supprimer le fichier si le doc est local, // et la copie locale si le doc est distant if ($doc['distant'] == 'oui') { include_spip('inc/distant'); if ($local = copie_locale($doc['fichier'],'test')) spip_unlink($local); } else spip_unlink(get_spip_doc($doc['fichier'])); sql_delete('spip_documents', 'id_document='.$id_document); pipeline('post_edition', array( 'args' => array( 'operation' => 'supprimer_document', 'table' => 'spip_documents', 'id_objet' => $id_document ), 'data' => null ) ); }
function install_etape_fin_dist() { ecrire_acces(); $f = str_replace( _FILE_TMP_SUFFIX, '.php', _FILE_CHMOD_TMP); if (file_exists(_FILE_CHMOD_TMP)) { if (!@rename(_FILE_CHMOD_TMP, $f)) { if (@copy(_FILE_CHMOD_TMP, $f)) spip_unlink(_FILE_CHMOD_TMP); } } $f = str_replace( _FILE_TMP_SUFFIX, '.php', _FILE_CONNECT_TMP); if (file_exists(_FILE_CONNECT_TMP)) { spip_log("renomme $f"); if (!@rename(_FILE_CONNECT_TMP, $f)) { if (@copy(_FILE_CONNECT_TMP, $f)) @spip_unlink(_FILE_CONNECT_TMP); } } // creer le repertoire cache, qui sert partout ! // deja fait en etape 4 en principe, on garde au cas ou if(!@file_exists(_DIR_CACHE)) { $rep = preg_replace(','._DIR_TMP.',', '', _DIR_CACHE); $rep = sous_repertoire(_DIR_TMP, $rep, true,true); } // Verifier la securite des htaccess // Si elle ne fonctionne pas, prevenir $msg = install_verifier_htaccess(); if ($msg) { $cible = _T('public:accueil_site'); $cible = generer_form_ecrire('accueil', '','', $cible); echo minipres('AUTO', $msg . $cible); // ok, deboucher dans l'espace prive } else redirige_url_ecrire('accueil'); }
/** * Enregistre une revision de document. * $set est un contenu (par defaut on prend le contenu via _request()) * * @param int $id_document * @param array|bool $set */ function document_modifier($id_document, $set = false) { include_spip('inc/modifier'); include_spip('inc/filtres'); // champs normaux $champs = collecter_requests(objet_info('document', 'champs_editables'), array('parents', 'ajout_parents'), $set); $invalideur = ""; $indexation = false; // Si le document est publie, invalider les caches et demander sa reindexation $t = sql_getfetsel("statut", "spip_documents", 'id_document=' . intval($id_document)); if ($t == 'publie') { $invalideur = "id='id_document/{$id_document}'"; $indexation = true; } $ancien_fichier = ""; // si le fichier est modifie, noter le nom de l'ancien pour faire le menage if (isset($champs['fichier'])) { $ancien_fichier = sql_getfetsel('fichier', 'spip_documents', 'id_document=' . intval($id_document)); } if ($err = objet_modifier_champs('document', $id_document, array('invalideur' => $invalideur, 'indexation' => $indexation), $champs)) { return $err; } // nettoyer l'ancien fichier si necessaire if ($champs['fichier'] and $ancien_fichier and $ancien_fichier !== $champs['fichier'] and @file_exists($f = get_spip_doc($ancien_fichier))) { spip_unlink($f); } // Changer le statut du document ? // le statut n'est jamais fixe manuellement mais decoule de celui des objets lies $champs = collecter_requests(array('parents', 'ajouts_parents'), array(), $set); if (document_instituer($id_document, $champs)) { // // Post-modifications // // Invalider les caches include_spip('inc/invalideur'); suivre_invalideur("id='id_document/{$id_document}'"); } }
function action_purger_dist() { $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); include_spip('inc/invalideur'); spip_log("purger $arg"); switch ($arg) { case 'cache': supprime_invalideurs(); @spip_unlink(_CACHE_RUBRIQUES); @spip_unlink(_CACHE_PIPELINES); @spip_unlink(_CACHE_PLUGINS_PATH); @spip_unlink(_CACHE_PLUGINS_OPT); @spip_unlink(_CACHE_PLUGINS_FCT); @spip_unlink(_CACHE_PLUGINS_VERIF); @spip_unlink(_CACHE_CHEMIN); purger_repertoire(_DIR_CACHE,array('subdir'=>true)); purger_repertoire(_DIR_AIDE); purger_repertoire(_DIR_VAR.'cache-css'); purger_repertoire(_DIR_VAR.'cache-js'); break; case 'squelettes': purger_repertoire(_DIR_SKELS); break; case 'vignettes': purger_repertoire(_DIR_VAR,array('subdir'=>true)); supprime_invalideurs(); purger_repertoire(_DIR_CACHE); break; } }
function test_ecrire($my_dir) { static $chmod = 0; $ok = false; $script = @file_exists('spip_loader.php') ? 'spip_loader.php' : $_SERVER['PHP_SELF']; $self = basename($script); $uid = @fileowner('.'); $uid2 = @fileowner($self); $gid = @filegroup('.'); $gid2 = @filegroup($self); $perms = @fileperms($self); // Comparer l'appartenance d'un fichier cree par PHP // avec celle du script et du repertoire courant if (!$chmod) { @rmdir('test'); spip_unlink('test'); // effacer au cas ou @touch('test'); if ($uid > 0 && $uid == $uid2 && @fileowner('test') == $uid) { $chmod = 0700; } else { if ($gid > 0 && $gid == $gid2 && @filegroup('test') == $gid) { $chmod = 0770; } else { $chmod = 0777; } } // Appliquer de plus les droits d'acces du script if ($perms > 0) { $perms = $perms & 0777 | ($perms & 0444) >> 2; $chmod |= $perms; } spip_unlink('test'); } $ok = is_dir($my_dir) && is_writable($my_dir); return $ok ? $chmod : false; }
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; }
function base_delete_all_dist($titre) { $delete = _request('delete'); $res = array(); if (is_array($delete)) { foreach ($delete as $table) { if (sql_drop_table($table)) $res[] = $table; else spip_log("SPIP n'a pas pu detruire $table."); } // un pipeline pour detruire les tables installees par les plugins pipeline('delete_tables', ''); spip_unlink(_FILE_CONNECT); spip_unlink(_FILE_CHMOD); spip_unlink(_FILE_META); spip_unlink(_ACCESS_FILE_NAME); spip_unlink(_CACHE_RUBRIQUES); } $d = count($delete); $r = count($res); spip_log("Tables detruites: $r sur $d: " . join(', ',$res)); }
function base_delete_all_dist($titre) { $delete = _request('delete'); $res = array(); if (is_array($delete)) { foreach ($delete as $table) { if (sql_drop_table($table)) { $res[] = $table; } else { spip_log("SPIP n'a pas pu detruire {$table}.", _LOG_ERREUR); } } // un pipeline pour detruire les tables installees par les plugins pipeline('delete_tables', ''); spip_unlink(_FILE_CONNECT); spip_unlink(_FILE_CHMOD); spip_unlink(_FILE_META); spip_unlink(_ACCESS_FILE_NAME); spip_unlink(_CACHE_RUBRIQUES); } $d = count($delete); $r = count($res); spip_log("Tables detruites: {$r} sur {$d}: " . join(', ', $res), _LOG_INFO_IMPORTANTE); }
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]; }
function forum_insert_base($c, $id_forum, $objet, $id_objet, $statut, $ajouter_mot = false) { if (!in_array($statut, array('privrac', 'privadm'))) { // si le statut est vide, c'est qu'on ne veut pas de ce presume spam ! if (!$statut or !$objet or !$id_objet) { $args = func_get_args(); spip_log("Erreur sur forum_insert_base " . var_export($args, 1), 'forum.' . _LOG_ERREUR); return false; } } // Entrer le message dans la base $id_reponse = sql_insertq('spip_forum', array('date_heure' => date('Y-m-d H:i:s'), 'ip' => $GLOBALS['ip'], 'id_auteur' => $GLOBALS['visiteur_session']['id_auteur'])); if ($id_reponse) { if ($id_forum > 0) { $id_thread = sql_getfetsel("id_thread", "spip_forum", "id_forum =" . intval($id_forum)); } else { $id_thread = $id_reponse; } # id_thread oblige INSERT puis UPDATE. // Entrer les cles sql_updateq('spip_forum', array('id_parent' => $id_forum, 'objet' => $objet, 'id_objet' => $id_objet, 'id_thread' => $id_thread, 'statut' => $statut), "id_forum=" . intval($id_reponse)); // Entrer les mots-cles associes if ($ajouter_mot) { mots_du_forum($ajouter_mot, $id_reponse); } // // Entree du contenu et invalidation des caches // include_spip('action/editer_forum'); revision_forum($id_reponse, $c); // Ajouter un document if (isset($_FILES['ajouter_document']) and $_FILES['ajouter_document']['tmp_name']) { $files[] = array('tmp_name' => $_FILES['ajouter_document']['tmp_name'], 'name' => $_FILES['ajouter_document']['name']); $ajouter_documents = charger_fonction('ajouter_documents', 'action'); $ajouter_documents('new', $files, 'forum', $id_reponse, 'document'); // supprimer le temporaire et ses meta donnees spip_unlink($_FILES['ajouter_document']['tmp_name']); spip_unlink(preg_replace(',\\.bin$,', '.txt', $_FILES['ajouter_document']['tmp_name'])); } // Notification $quoi = strncmp($statut, 'priv', 4) == 0 ? 'forumprive' : 'forumposte'; if ($notifications = charger_fonction('notifications', 'inc')) { $notifications($quoi, $id_reponse); } } return $id_reponse; }
function clear_path_cache() { $GLOBALS['path_files'] = array(); spip_unlink(_CACHE_CHEMIN); }
/** * Tourner un document * * http://doc.spip.org/@action_tourner_post * * @param int $id_document * @param int $angle * angle de rotation en degre>0 * @return */ function action_tourner_post($id_document, $angle) { $row = sql_fetsel("fichier,extension", "spip_documents", "id_document=" . intval($id_document)); if (!$row) { return; } include_spip('inc/charsets'); # pour le nom de fichier include_spip('inc/documents'); // Fichier destination : on essaie toujours de repartir de l'original $var_rot = $angle; include_spip('inc/distant'); # pour copie_locale $src = _DIR_RACINE . copie_locale(get_spip_doc($row['fichier'])); if (preg_match(',^(.*)-r(90|180|270)\\.([^.]+)$,', $src, $match)) { $effacer = $src; $src = $match[1] . '.' . $match[3]; $var_rot += intval($match[2]); } $var_rot = (360 + $var_rot) % 360; // 0, 90, 180 ou 270 if ($var_rot > 0) { $dest = preg_replace(',\\.[^.]+$,', '-r' . $var_rot . '$0', $src); spip_log("rotation {$var_rot} {$src} : {$dest}"); include_spip('inc/filtres'); include_spip('public/parametrer'); // charger les fichiers fonctions #bugfix spip 2.1.0 $res = filtrer('image_rotation', $src, $var_rot); $res = filtrer('image_format', $res, $row['extension']); list($hauteur, $largeur) = taille_image($res); $res = extraire_attribut($res, 'src'); include_spip('inc/getdocument'); deplacer_fichier_upload($res, $dest); } else { $dest = $src; $size_image = @getimagesize($dest); $largeur = $size_image[0]; $hauteur = $size_image[1]; } // succes ! if ($largeur > 0 and $hauteur > 0) { $set = array('fichier' => set_spip_doc($dest), 'largeur' => $largeur, 'hauteur' => $hauteur, 'distant' => 'non'); if ($taille = @filesize($dest)) { $set['taille'] = $taille; } sql_updateq('spip_documents', $set, "id_document=" . intval($id_document)); if ($effacer) { spip_log("rotation : j'efface {$effacer}"); spip_unlink($effacer); } // pipeline pour les plugins pipeline('post_edition', array('args' => array('table' => 'spip_documents', 'table_objet' => 'documents', 'spip_table_objet' => 'spip_documents', 'type' => 'document', 'id_objet' => $id_document, 'champs' => array('rotation' => $angle, 'orientation' => $var_rot, 'fichier' => $row['fichier']), 'serveur' => $serveur, 'action' => 'tourner'), 'data' => $set)); } }
function recuperer_body($f, $taille_max = _INC_DISTANT_MAX_SIZE, $fichier = '') { $taille = 0; $result = ''; $fp = false; if ($fichier) { include_spip("inc/acces"); $tmpfile = "{$fichier}." . creer_uniqid() . ".tmp"; $fp = spip_fopen_lock($tmpfile, 'w', LOCK_EX); if (!$fp and file_exists($fichier)) { return filesize($fichier); } if (!$fp) { return false; } $result = 0; // on renvoie la taille du fichier } while (!feof($f) and $taille < $taille_max) { $res = fread($f, 16384); $taille += strlen($res); if ($fp) { fwrite($fp, $res); $result = $taille; } else { $result .= $res; } } if ($fp) { spip_fclose_unlock($fp); spip_unlink($fichier); @rename($tmpfile, $fichier); if (!file_exists($fichier)) { return false; } } return $result; }
/** * fermer la connection depuis le site distant * quand on a fini * * @param array $status * @param array $data * @return bool */ function migration_reception_end_dist($status, $data){ spip_log('fin de migration. Resultat:'.var_export($data,1),'migration'); $status['status'] = 'end'; if ($data['status']=='abort'){ $status = abandonner_migration_depuis($status); } else { // s'assurer que l'auteur qui migre est bien webmestre a l'arrivee $id_webmestre = $data['id_webmestre']; include_spip('base/abstract_sql'); $row = sql_fetsel('*','spip_auteurs','id_auteur='.intval($id_webmestre)); if ($row AND $row['statut']=='0minirezo'){ // y a-t-il un champ webmestre dans la base ? if (!isset($row['webmestre'])){ sql_alter("TABLE spip_auteurs ADD webmestre varchar(3) DEFAULT 'non' NOT NULL"); $row['webmestre']='non'; } if ($row['webmestre']!='oui'){ sql_updateq("spip_auteurs",array('webmestre'=>'oui'),'id_auteur='.intval($id_webmestre)); } } } if ((count($status['ignore']) OR count($data['errors'])) AND defined('_MIGRATION_EMAIL_NOTIFY_IGNORE') AND $email = _MIGRATION_EMAIL_NOTIFY_IGNORE){ $sujet = "[Migration-ERR] ".$GLOBALS['meta']['adresse_site']; $texte = ""; if (count($status['ignore'])) $texte .= var_export($status['ignore'],true); if (count($data['errors'])) $texte .= implode("\n",$data['errors']); job_queue_add('envoyer_mail','Erreur migration',array($email, $sujet, $texte),'inc/'); } update_migration_depuis($status); finir_migration_status_depuis(); // si on a pas d'upgrade a suivre, vidons les cache $version_installee = sql_getfetsel('valeur','spip_meta',"nom='version_installee'"); if ($GLOBALS['spip_version']==$version_installee) { // supprimer les cache pour forcer la mise a jour du site include_spip('inc/invalideur'); spip_log("purger le site","migration"); supprime_invalideurs(); @spip_unlink(_CACHE_RUBRIQUES); @spip_unlink(_CACHE_PIPELINES); @spip_unlink(_CACHE_PLUGINS_PATH); @spip_unlink(_CACHE_PLUGINS_OPT); @spip_unlink(_CACHE_PLUGINS_FCT); @spip_unlink(_CACHE_PLUGINS_VERIF); @spip_unlink(_CACHE_CHEMIN); #purger_repertoire(_DIR_CACHE,array('subdir'=>true)); #purger_repertoire(_DIR_AIDE); purger_repertoire(_DIR_VAR.'cache-css'); purger_repertoire(_DIR_VAR.'cache-js'); } @spip_unlink(_FILE_META); // on renvoit le bilan pour affichage sur le site source return $status; }