Nous avons remarqués que les dimensions étaient trop petites. Elles seront réglés d'ici la fin des vacances de la Toussaint.
Créer mon blog
Créer mon compte
array(
'zip' => 'spip/dev/SPIP-svn.zip',
'php' => '5.4.0',
),
'3.2' => array(
'zip' => 'spip/stable/spip-3.2.zip',
'php' => '5.4.0',
),
'3.1' => array(
'zip' => 'spip/stable/spip-3.1.zip',
'php' => '5.1.0',
),
'3.0' => array(
'zip' => 'spip/stable/spip-3.0.zip',
'php' => '5.1.0',
),
'2.1' => array(
'zip' => 'spip/stable/spip-2.1.zip',
'php' => '4.0.8',
),
);
if (!is_null($branche)) {
return isset($branches[$branche]) ? $branches[$branche] : false;
}
return $branches;
}
/**
* Version de SPIP Loader
*
* Historique
* ----------
* - 2.1 : introduction du parametre d'URL chemin
* - 2.2 : introduction du parametre d'URL dest
* - 2.3 : introduction du parametre d'URL range
* - 2.4 : redirection par meta refresh au lieu de header Location
* - 2.5 : affichage de la version à installer, de la version déjà installée (si elle existe),
* - compatibilite PHP, loader obsolete
* - 2.5.10 : on télécharge maintenant SPIP 3.2
* - 2.5.11 : coquille empechant des mises à jour
* - 2.6.0 : déclaration simplifiée des branches / zips + sélecteur de branche
* - 3.0.0 : le SPIP loader analyse et déplace les fichiers obsolètes dans un répertoire 'fichiers_obsoletes_{date}'
* pour les répertoires appartenant à SPIP (ecrire, prive, plugins-dist, squelettes-dist).
* /!\ si vous avez ajouté des plugins dans plugins-dist, ils seront aussi déplacés !!
* - 3.0.1 : le sélecteur choisit par défaut la branche actuel du SPIP déjà installé, s’il la connait.
* - 3.0.2 : Un répertoire obsolète n’est pas déplacé s’il contient un fichier '.spip_loader_keep'
* - 3.0.3 : Isoler les define dans une fichier de configuration dédié spip_loader.php
* spip_loader peut se mettre à jour
* - 3.0.4 : Correction d’une URL.
* - 3.0.5 : Création des dossiers plugins/auto et lib
* - 3.0.6 : Corrections PHP 7.2+
* - 3.0.7 : Correction présentation page accès interdit + afficher un lien vers le formulaire de login dans ce cas
* - 3.0.8 : Eviter des conflits de methodes existantes avec SPIP (https://core.spip.net/issues/4061)
*/
define('_SPIP_LOADER_VERSION', '3.0.8');
/**
* Notre branche de destination par défaut
*
* - ignoré si la constante _CHEMIN_FICHIER_ZIP est forcée
* - ignoré si un SPIP est déjà installé (tentera de rester sur la même branche par défaut)
*/
$notre_branche = lister_branches_proposees(_DEFAUT_BRANCHE_MAJ);
if (!$notre_branche) {
die("Mauvaise définition de la constante _DEFAUT_BRANCHE_MAJ. Branche " . _DEFAUT_BRANCHE_MAJ . " inconnue");
}
if (!defined('_CHEMIN_FICHIER_ZIP')) {
/**
* Chemin du zip installé par défaut
*
* Si la constante _CHEMIN_FICHIER_ZIP est déjà définie,
* alors le zip défini sera utilisé.
*
* Sinon, on prend par défaut le zip de la branche installée par défaut.
*/
define('_CHEMIN_FICHIER_ZIP', $notre_branche['zip']);
} else {
// éviter d’afficher le sélecteur de branche dans ces cas là.
define('_CHEMIN_FICHIER_ZIP_FORCEE', true);
}
# repertoires d'installation
if (!defined('_DIR_BASE')) {
define('_DIR_BASE', './');
}
if (!defined('_DIR_PLUGINS')) {
define('_DIR_PLUGINS', _DIR_BASE . 'plugins/');
}
# adresse du depot
if (!defined('_URL_SPIP_DEPOT')) {
define('_URL_SPIP_DEPOT', 'https://files.spip.net/');
}
# Adresse des librairies necessaires a spip_loader
# (pclzip et fichiers de langue)
if (!defined('_URL_LOADER_DL')) {
define('_URL_LOADER_DL', 'https://www.spip.net/spip-dev/INSTALL/');
}
# telecharger a travers un proxy
if (!defined('_URL_LOADER_PROXY')) {
define('_URL_LOADER_PROXY', '');
}
# surcharger le script
if (!defined('_NOM_PAQUET_ZIP')) {
define('_NOM_PAQUET_ZIP', 'spip');
}
// par defaut le morceau de path a enlever est le nom : spip
if (!defined('_REMOVE_PATH_ZIP')) {
define('_REMOVE_PATH_ZIP', _NOM_PAQUET_ZIP);
}
if (!defined('_SPIP_LOADER_PLUGIN_RETOUR')) {
define('_SPIP_LOADER_PLUGIN_RETOUR', 'ecrire/?exec=admin_plugin&voir=tous');
}
if (!defined('_SPIP_LOADER_SCRIPT')) {
define('_SPIP_LOADER_SCRIPT', 'spip_loader.php');
}
// "habillage" optionnel
// liste separee par virgules de fichiers inclus dans spip_loader
// charges a la racine comme spip_loader.php et pclzip.php
// selon l'extension: include .php , .css et .js dans le genere par spip_loader
if (!defined('_SPIP_LOADER_EXTRA')) {
define('_SPIP_LOADER_EXTRA', '');
}
if (!defined('_DEST_PAQUET_ZIP')) {
define('_DEST_PAQUET_ZIP', '');
}
if (!defined('_PCL_ZIP_SIZE')) {
define('_PCL_ZIP_SIZE', 249587);
}
if (!defined('_PCL_ZIP_RANGE')) {
define('_PCL_ZIP_RANGE', 200);
}
/**
* Le SPIP Loader ne place pas dans le répertoire obsolète
* un répertoire qui contiendrait un fichier avec ce nom.
*/
if (!defined('_SPIP_LOADER_KEEP')) {
define('_SPIP_LOADER_KEEP', '.spip_loader_keep');
}
#######################################################################
# langues disponibles
$langues = array (
'ar' => "عربي",
'ast' => "asturianu",
'br' => "brezhoneg",
'ca' => "català",
'cs' => "čeština",
'de' => "Deutsch",
'en' => "English",
'eo' => "Esperanto",
'es' => "Español",
'eu' => "euskara",
'fa' => "فارسى",
'fr' => "français",
'fr_tu' => "français copain",
'gl' => "galego",
'hr' => "hrvatski",
'id' => "Indonesia",
'it' => "italiano",
'km' => "Cambodian",
'lb' => "Lëtzebuergesch",
'nap' => "napulitano",
'nl' => "Nederlands",
'oc_lnc' => "òc lengadocian",
'oc_ni' => "òc niçard",
'pt_br' => "Português do Brasil",
'ro' => "română",
'sk' => "slovenčina", // (Slovakia)
'sv' => "svenska",
'tr' => "Türkçe",
'wa' => "walon",
'zh_tw' => "台灣中文", // chinois taiwan (ecr. traditionnelle)
);
// Url du fichier archivelist permettant de créer les zips de spip
if (!defined('_URL_ARCHIVELIST')) {
define('_URL_ARCHIVELIST', 'https://core.spip.net/projects/spip/repository/raw/archivelist.txt');
}
// Url du fichier spip_loader permettant de tester sa version distante
if (!defined('_URL_SPIP_LOADER')) {
define('_URL_SPIP_LOADER', _URL_LOADER_DL . 'spip_loader.php');
}
//
// Renvoie un tableau des versions SPIP dont l'index correspond à au chemin du fichier zip tel
// qu'utilisé par spip_loader
//
function lister_versions_spip() {
$versions = array();
// Récupération du fichier archivelist.txt du core
$archivelist = spip_loader_recuperer_page(_URL_ARCHIVELIST);
$contenu = explode("\n", $archivelist);
// on supprime les retours chariot
$contenu = array_filter($contenu, 'trim');
// on supprime les lignes vides
$contenu = array_filter($contenu);
if ($contenu) {
// On lit le fichier ligne par ligne et on
foreach ($contenu as $ligne) {
if (substr($ligne, 0, 1) != '#') {
// C'est une ligne de definition d'un paquet :
$parametres = explode(';', $ligne);
// - et on extrait la version de spip du chemin svn
$arbo_svn = rtrim($parametres[0], '/');
$version = str_replace('spip-', '', basename($arbo_svn));
// - on separe calcul le nom complet du zip
$chemin = 'spip/' . $parametres[1] . '.zip';
// - on determine l'état de l'archive (stable, dev, archives)
$etat = substr($parametres[1], 0, strpos($parametres[1], '/'));
// Ajout au tableau des versions
$versions[$chemin] = array(
'version' => $version,
'etat' => $etat);
}
}
}
return $versions;
}
function branche_spip($version) {
if ($version == 'spip') {
return 'dev';
}
$v = explode('.', $version);
$branche = $v[0] . '.' . (isset($v[1]) ? $v[1] : '0');
return $branche;
}
// faut il mettre à jour le spip_loader ?
function spip_loader_necessite_maj() {
return version_compare(_SPIP_LOADER_VERSION, spip_loader_recupere_version(), '<');
}
// trouver le numéro de version du dernier spip_loader
function spip_loader_recupere_version() {
static $version = null;
if (is_null($version)) {
$version = false;
$spip_loader = spip_loader_recuperer_page(_URL_SPIP_LOADER);
if (preg_match("/define\('_SPIP_LOADER_VERSION', '([0-9.]*)'\)/", $spip_loader, $m)) {
$version = $m[1];
}
}
return $version;
}
//
// Traduction des textes de SPIP
//
function _TT($code, $args = array()) {
global $lang;
$code = str_replace('tradloader:', '', $code);
$text = $GLOBALS['i18n_tradloader_'.$lang][$code];
while (list($name, $value) = @each($args)) {
$text = str_replace("@$name@", $value, $text);
}
return $text;
}
//
// Ecrire un fichier de maniere un peu sure
//
function ecrire_fichierT($fichier, $contenu) {
$fp = @fopen($fichier, 'wb');
$s = @fputs($fp, $contenu, $a = strlen($contenu));
$ok = ($s == $a);
@fclose($fp);
if (!$ok) {
@unlink($fichier);
}
return $ok;
}
function mkdir_recursif($chemin, $chmod) {
$dirs = explode('/', $chemin);
$d = array_shift($dirs);
foreach ($dirs as $dir) {
$d = "$d/$dir";
if (!is_dir($d)) {
mkdir($d, $chmod);
}
}
return is_dir($chemin);
}
function move_all($src, $dest) {
global $chmod;
$dest = rtrim($dest, '/');
if ($dh = opendir($src)) {
while (($file = readdir($dh)) !== false) {
if (in_array($file, array('.', '..'))) {
continue;
}
$s = "$src/$file";
$d = "$dest/$file";
if (is_dir($s)) {
if (!is_dir($d)) {
if (!mkdir_recursif($d, $chmod)) {
die("impossible de creer $d");
}
}
move_all($s, $d);
rmdir($s);
// verifier qu'on en a pas oublie (arrive parfois il semblerait ...)
// si cela arrive, on fait un clearstatcache, et on recommence un move all...
if (is_dir($s)) {
clearstatcache();
move_all($s, $d);
rmdir($s);
}
} else {
if (is_file($s)) {
rename($s, $d);
}
}
}
// liberer le pointeur sinon windows ne permet pas le rmdir eventuel
closedir($dh);
}
}
function regler_langue_navigateurT() {
$accept_langs = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
if (is_array($accept_langs)) {
foreach ($accept_langs as $s) {
if (preg_match('#^([a-z]{2,3})(-[a-z]{2,3})?(;q=[0-9.]+)?$#i', trim($s), $r)) {
$lang = strtolower($r[1]);
if (isset($GLOBALS['langues'][$lang])) {
return $lang;
}
}
}
}
return false;
}
function menu_languesT($lang, $script = '', $hidden = array()) {
$r = '';
if (preg_match(',action=([a-z_]+),', $script, $m)) {
$r .= "";
$script .= '&';
} else {
$script .= '?';
}
foreach ($hidden as $k => $v) {
if ($v and $k!='etape') {
$script .= "$k=$v&";
}
}
$r .= ' ';
return $r;
}
/**
* Affiche un sélecteur de menu pour choisir le zip (la branche) à utiliser.
*
* @param array $active Chemin du paquet à télécharger actuellement sélectionné
* @param string $version_installee Version de SPIP actuellement installée
* @return string
*/
function menu_branches($active, $version_installee) {
$select = '';
if (!defined('_CHEMIN_FICHIER_ZIP_FORCEE')) {
$script = _DIR_BASE . _SPIP_LOADER_SCRIPT . '?';
$select .= "
";
$select .= ' ';
$select .= '
';
}
return $select;
}
//
// Gestion des droits d'acces
//
function tester_repertoire() {
global $chmod;
$ok = false;
$self = basename($_SERVER['PHP_SELF']);
$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
@rmdir('test');
@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;
}
@unlink('test');
// Verifier que les valeurs sont correctes
@mkdir('test', $chmod);
@chmod('test', $chmod);
$ok = (is_dir('test') && is_writable('test')) ? $chmod : false;
@rmdir('test');
return $ok;
}
// creer repertoire
function creer_repertoires_plugins($chmod) {
// créer les répertoires plugins/auto et lib
if (!is_dir('plugins')) {
@mkdir('plugins', $chmod);
}
if (!is_dir('plugins/auto')) {
@mkdir('plugins/auto', $chmod);
}
if (!is_dir('lib')) {
@mkdir('lib', $chmod);
}
return 'cretion des repertoires tentee';
}
//
// Demarre une transaction HTTP (s'arrete a la fin des entetes)
// retourne un descripteur de fichier
//
function spip_loader_init_http($get, $url, $refuse_gz = false) {
//global $http_proxy;
$fopen = false;
if (!preg_match(",^http://,i", _URL_LOADER_PROXY)) {
$http_proxy = '';
} else {
$http_proxy = _URL_LOADER_PROXY;
}
$t = @parse_url($url);
$host = $t['host'];
if ($t['scheme'] == 'http') {
$scheme = 'http';
$scheme_fsock = '';
} else {
$scheme = $t['scheme'];
$scheme_fsock = $scheme.'://';
}
if (!isset($t['port']) or !($port = $t['port'])) {
$port = 80;
}
$query = isset($t['query']) ? $t['query'] : '';
if (!isset($t['path']) or !($path = $t['path'])) {
$path = "/";
}
if ($http_proxy) {
$t2 = @parse_url($http_proxy);
$proxy_host = $t2['host'];
$proxy_user = $t2['user'];
$proxy_pass = $t2['pass'];
if (!($proxy_port = $t2['port'])) {
$proxy_port = 80;
}
$f = @fsockopen($proxy_host, $proxy_port);
} else {
$f = @fsockopen($scheme_fsock.$host, $port);
}
if ($f) {
if ($http_proxy) {
fputs(
$f,
"$get $scheme://$host" . (($port != 80) ? ":$port" : "") .
$path . ($query ? "?$query" : "") . " HTTP/1.0\r\n"
);
} else {
fputs($f, "$get $path" . ($query ? "?$query" : "") . " HTTP/1.0\r\n");
}
$version_affichee = isset($GLOBALS['spip_version_affichee'])?$GLOBALS['spip_version_affichee']:"xx";
fputs($f, "Host: $host\r\n");
fputs($f, "User-Agent: SPIP-$version_affichee (https://www.spip.net/)\r\n");
// Proxy authentifiant
if (isset($proxy_user) and $proxy_user) {
fputs($f, "Proxy-Authorization: Basic "
. base64_encode($proxy_user . ":" . $proxy_pass) . "\r\n");
}
} elseif (!$http_proxy) {
// fallback : fopen
$f = @fopen($url, "rb");
$fopen = true;
} else {
// echec total
$f = false;
}
return array($f, $fopen);
}
//
// Recupere une page sur le net
// et au besoin l'encode dans le charset local
//
// options : get_headers si on veut recuperer les entetes
function spip_loader_recuperer_page($url) {
// Accepter les URLs au format feed:// ou qui ont oublie le http://
$url = preg_replace(',^feed://,i', 'http://', $url);
if (!preg_match(',^[a-z]+://,i', $url)) {
$url = 'http://'.$url;
}
// dix tentatives maximum en cas d'entetes 301...
for ($i = 0; $i < 10; $i++) {
list($f, $fopen) = spip_loader_init_http('GET', $url);
// si on a utilise fopen() - passer a la suite
if ($fopen) {
break;
} else {
// Fin des entetes envoyees par SPIP
fputs($f, "\r\n");
// Reponse du serveur distant
$s = trim(fgets($f, 16384));
if (preg_match(',^HTTP/[0-9]+\.[0-9]+ ([0-9]+),', $s, $r)) {
$status = $r[1];
} else {
return;
}
// Entetes HTTP de la page
$headers = '';
while ($s = trim(fgets($f, 16384))) {
$headers .= $s."\n";
if (preg_match(',^Location: (.*),i', $s, $r)) {
$location = $r[1];
}
if (preg_match(",^Content-Encoding: .*gzip,i", $s)) {
$gz = true;
}
}
if ($status >= 300 and $status < 400 and $location) {
$url = $location;
} elseif ($status != 200) {
return;
} else {
break; # ici on est content
}
fclose($f);
$f = false;
}
}
// Contenu de la page
if (!$f) {
return false;
}
$result = '';
while (!feof($f)) {
$result .= fread($f, 16384);
}
fclose($f);
// Decompresser le flux
if (isset($_GET['gz']) and $gz = $_GET['gz']) {
$result = gzinflate(substr($result, 10));
}
return $result;
}
function telecharger_langue($lang, $droits) {
$fichier = 'tradloader_'.$lang.'.php';
$GLOBALS['idx_lang'] = 'i18n_tradloader_'.$lang;
if (!file_exists(_DIR_BASE.$fichier)) {
$contenu = spip_loader_recuperer_page(_URL_LOADER_DL.$fichier.".txt");
if ($contenu and $droits) {
ecrire_fichierT(_DIR_BASE.$fichier, $contenu);
include(_DIR_BASE.$fichier);
return true;
} elseif ($contenu and !$droits) {
eval('?'.'>'.$contenu);
return true;
} else {
return false;
}
} else {
include(_DIR_BASE.$fichier);
return true;
}
}
function selectionner_langue($droits) {
global $langues; # langues dispo
$lang = '';
if (isset($_COOKIE['spip_lang_ecrire'])) {
$lang = $_COOKIE['spip_lang_ecrire'];
}
if (isset($_REQUEST['lang'])) {
$lang = $_REQUEST['lang'];
}
# reglage par defaut selon les preferences du brouteur
if (!$lang or !isset($langues[$lang])) {
$lang = regler_langue_navigateurT();
}
# valeur par defaut
if (!isset($langues[$lang])) {
$lang = 'fr';
}
# memoriser dans un cookie pour l'etape d'apres *et* pour l'install
setcookie('spip_lang_ecrire', $lang);
# RTL
if ($lang == 'ar' or $lang == 'he' or $lang == 'fa') {
$GLOBALS['spip_lang_right']='left';
$GLOBALS['spip_lang_dir']='rtl';
} else {
$GLOBALS['spip_lang_right']='right';
$GLOBALS['spip_lang_dir']='ltr';
}
# code de retour = capacite a telecharger le fichier de langue
$GLOBALS['idx_lang'] = 'i18n_tradloader_'.$lang;
return telecharger_langue($lang, $droits) ? $lang : false;
}
function debut_html($corps = '', $hidden = array()) {
global $lang, $spip_lang_dir, $spip_lang_right, $version_installee;
if ($version_installee) {
$titre = _TT('tradloader:titre_maj', array('paquet'=>strtoupper(_NOM_PAQUET_ZIP)));
} else {
$titre = _TT('tradloader:titre', array('paquet'=>strtoupper(_NOM_PAQUET_ZIP)));
}
$css = $js = '';
foreach (explode(',', _SPIP_LOADER_EXTRA) as $fil) {
switch (strrchr($fil, '.')) {
case '.css':
$css .= '
';
break;
case '.js':
$js .= '
';
break;
}
}
$hid = '';
foreach ($hidden as $k => $v) {
$hid .= "\n";
}
$script = _DIR_BASE . _SPIP_LOADER_SCRIPT;
echo
"
$titre
$css$js
";
}
function fin_html()
{
global $taux;
echo ($taux ? '
'.$taux.'
' : '') .
'
spip_loader '
. _SPIP_LOADER_VERSION
.'
';
// forcer l'envoi du buffer par tous les moyens !
echo(str_repeat(" \r\n", 256));
while (@ob_get_level()) {
@ob_flush();
@flush();
@ob_end_flush();
}
}
function nettoyer_racine($fichier) {
@unlink($fichier);
@unlink(_DIR_BASE.'pclzip.php');
$d = opendir(_DIR_BASE);
while (false !== ($f = readdir($d))) {
if (preg_match('/^tradloader_(.+).php$/', $f)) {
@unlink(_DIR_BASE.$f);
}
}
closedir($d);
return true;
}
/**
* Déplace les fichiers qui sont en trop entre le contenu du zip et le répertoire destination.
*
* @param array $content Liste des fichiers issus de pclZip
* @param string $dir Répertoire où ils ont été copiés.
*/
function nettoyer_superflus($content, $dir) {
global $chmod;
$diff = comparer_contenus($content, $dir);
if ($diff) {
@mkdir($old = _DIR_BASE . 'fichiers_obsoletes_' . date('Ymd_His'), $chmod);
if (!is_dir($old)) {
return false;
}
$old .= '/';
foreach ($diff as $file => $isDir) {
$root = $isDir ? $file : dirname($file);
if (!is_dir($old . $root)) {
mkdir_recursif($old . $root, $chmod);
}
if ($isDir) {
move_all(_DIR_BASE . $root, $old . $root);
rmdir(_DIR_BASE . $root);
} else {
rename(_DIR_BASE . $file, $old . $file);
}
}
}
}
/**
* Retourne la liste des fichiers/répertoires en trop entre le zip et la destination,
* pour certains répertoires seulement.
*/
function comparer_contenus($content, $dir) {
$base = _REMOVE_PATH_ZIP . "/";
if ($content[0]['filename'] !== $base) {
return false;
}
$len = strlen($base);
// On se considère dans SPIP et on vérifie seulement ces répertoires
$repertoires_testes = array(
'ecrire',
'prive',
'plugins-dist',
'squelettes-dist',
'extensions', // spip 2.1 hum.
);
// Liste des contenus sources (chemin => isdir?)
$contenus_source = array();
foreach ($content as $c) {
$fichier = substr($c['filename'], $len);
$root = explode('/', $fichier, 2);
$root = reset($root);
if (!in_array($root, $repertoires_testes)) {
continue;
}
$contenus_source[substr($c['filename'], $len)] = $c['folder'];
}
// Liste des contenus destination (chemin => isdir?)
$diff = lister_contenus_superflus($contenus_source, $dir, '', $repertoires_testes);
return $diff;
}
/**
* Liste les contenus en trop dans certains répertoires, en fonction d’une liste de fichiers
*
* Un répertoire superflu, mais contenant un fichier .spip_loader_keep est conservé,
* c'est à dire qu’il ne sera pas retourné dans cette liste de fichiers/répertoire obsolètes.
*
* @param array $contenus_source liste(chemin => isDir?)
* @param string $dir Chemin du répertoire à tester
* @param string $base Répertoire en cours d’analyse (pour récursivité)
* @param array|null $repertoires_testes Liste de répertoires à uniquement parcourrir si défini.
* @return array liste(chemin => isDir?) des fichiers/répertoire en trop.
*/
function lister_contenus_superflus($contenus_source, $dir, $base, $repertoires_testes = null) {
$liste = array();
// trop gentils de gerer PHP 4...
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
if (in_array($file, array('.', '..', '.ok'))) {
continue;
}
if ($repertoires_testes and !in_array($file, $repertoires_testes)) {
continue;
}
$_base = $base . $file;
if (is_dir($dir . '/' . $file)) {
// répertoire présent ou en trop ?
if (!isset($contenus_source[$_base . '/'])) {
// ne pas rendre obsolète si un fichier de conservation est présent.
if (file_exists($dir . '/' . $file. '/' . _SPIP_LOADER_KEEP)) {
continue;
}
$liste[$_base . '/'] = true;
} else {
$liste = array_merge(
$liste,
lister_contenus_superflus($contenus_source, $dir . '/' . $file, $_base . '/')
);
}
} else {
// fichier présent ou en trop ?
if (!isset($contenus_source[$_base])) {
$liste[$_base] = false;
}
}
}
closedir($dh);
}
return $liste;
}
// un essai pour parer le probleme incomprehensible des fichiers pourris
function touchCallBack($p_event, &$p_header)
{
// bien extrait ?
if ($p_header['status'] == 'ok') {
// allez, on touche le fichier, le @ est pour les serveurs sous Windows qui ne comprennent pas touch()
@touch($p_header['filename']);
}
return 1;
}
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
function verifie_zlib_ok()
{
global $taux;
if (!function_exists("gzopen") and !function_exists("gzopen64")) {
return false;
}
if (!file_exists($f = _DIR_BASE . 'pclzip.php')) {
$taux = microtime_float();
$contenu = spip_loader_recuperer_page(_URL_LOADER_DL . 'pclzip.php.txt');
if ($contenu) {
ecrire_fichierT($f, $contenu);
}
$taux = _PCL_ZIP_SIZE / (microtime_float() - $taux);
}
include $f;
$necessaire = array();
foreach (explode(',', _SPIP_LOADER_EXTRA) as $fil) {
$necessaire[$fil] = strrchr($fil, '.') == '.php' ? '.txt' : '';
}
foreach ($necessaire as $fil => $php) {
if (!file_exists($f = _DIR_BASE . basename($fil))) {
$contenu = spip_loader_recuperer_page(_URL_LOADER_DL . $fil . $php);
if ($contenu) {
ecrire_fichierT($f, $contenu);
}
}
if ($php) {
include $f;
}
}
return true;
}
function spip_loader_reinstalle() {
if (!defined('_SPIP_LOADER_UPDATE_AUTEURS')) {
define('_SPIP_LOADER_UPDATE_AUTEURS', '1');
}
if (!isset($GLOBALS['auteur_session']['statut']) or
$GLOBALS['auteur_session']['statut'] != '0minirezo' or
!in_array($GLOBALS['auteur_session']['id_auteur'], explode(':', _SPIP_LOADER_UPDATE_AUTEURS))) {
include_spip('inc/headers');
include_spip('inc/minipres');
http_status('403');
echo install_debut_html(_T('info_acces_interdit'));
echo "
";
}
debut_html($corps, $hidden);
fin_html();
}
function spip_recupere_paquet($paquet, $fichier, $dest, $range)
{
$contenu = spip_loader_recuperer_page(_URL_SPIP_DEPOT . $paquet);
if (!($contenu and ecrire_fichierT($fichier, $contenu))) {
debut_html();
echo _TT('tradloader:echec_chargement'), "$paquet, $fichier, $range" ;
fin_html();
} else {
// Passer a l'etape suivante (desarchivage)
$sep = strpos(_SPIP_LOADER_SCRIPT, '?') ? '&' : '?';
header("Location: "._DIR_BASE._SPIP_LOADER_SCRIPT.$sep."etape=fichier&chemin=$paquet&dest=$dest&range=$range");
}
}
function spip_deballe($paquet, $etape, $dest, $range)
{
$fichier = _DIR_BASE . basename($paquet);
if ($etape == 'fichier' and file_exists($fichier)) {
// etape finale: deploiement de l'archive
spip_deballe_paquet($paquet, $fichier, $dest, $range);
} elseif ($etape == 'charger') {
// etape intermediaire: charger l'archive
spip_recupere_paquet($paquet, $fichier, $dest, $range);
} else {
// etape intiale, afficher la page de presentation
spip_presente_deballe($fichier, $paquet, $dest, $range);
}
}
///////////////////////////////////////////////
// debut du process
//
error_reporting(E_ALL ^ E_NOTICE);
// PHP >= 5.3 rale si cette init est absente du php.ini et consorts
// On force a defaut de savoir anticiper l'erreur (il doit y avoir mieux)
if (function_exists('date_default_timezone_set')) {
date_default_timezone_set('Europe/Paris');
}
$GLOBALS['taux'] = 0; // calcul eventuel du taux de transfert+dezippage
// En cas de reinstallation, verifier que le demandeur a les droits avant tout
// definir _FILE_CONNECT a autre chose que machin.php si on veut pas
$version_installee = '';
if (@file_exists('ecrire/inc_version.php')) {
define('_SPIP_LOADER_URL_RETOUR', "ecrire/?exec=accueil");
include_once 'ecrire/inc_version.php';
$version_installee = $GLOBALS['spip_version_branche'];
if ((defined('_FILE_CONNECT') and
_FILE_CONNECT and
strpos(_FILE_CONNECT, '.php')) or
defined('_SITES_ADMIN_MUTUALISATION')) {
spip_loader_reinstalle();
}
} else {
define('_SPIP_LOADER_URL_RETOUR', "ecrire/?exec=install");
// _DIR_TMP n’existe pas encore
if (!defined('PCLZIP_TEMPORARY_DIR')) {
define('PCLZIP_TEMPORARY_DIR', '');
}
}
$droits = tester_repertoire();
$GLOBALS['lang'] = selectionner_langue($droits);
if (!$GLOBALS['lang']) {
//on ne peut pas telecharger
$GLOBALS['lang'] = 'fr'; //francais par defaut
$GLOBALS['i18n_tradloader_fr']['titre'] = 'Téléchargement de SPIP';
$GLOBALS['i18n_tradloader_fr']['echec_chargement'] = '
Le chargement a échoué.'.
' Veuillez réessayer, ou utiliser l\'installation manuelle.
';
debut_html();
echo _TT('tradloader:echec_chargement');
fin_html();
} elseif (!$droits) {
//on ne peut pas ecrire
debut_html();
$q = $_SERVER['QUERY_STRING'];
echo _TT(
'tradloader:texte_preliminaire',
array(
'paquet' => strtoupper(_NOM_PAQUET_ZIP),
'href' => ('spip_loader.php' . ($q ? "?$q" : '')),
'chmod' => sprintf('%04o', $chmod)
)
);
fin_html();
} elseif (!verifie_zlib_ok()) {
// on ne peut pas decompresser
die('fonctions zip non disponibles');
} else {
//Update himself
if (!empty($_REQUEST['spip_loader_update'])) {
$spip_loader = spip_loader_recuperer_page(_URL_SPIP_LOADER);
if (defined('_SPIP_LOADER_UPDATE_AUTEURS')) {
$spip_loader = preg_replace(
"/(define\(['\"]_SPIP_LOADER_UPDATE_AUTEURS['\"],).*/",
"$1'"._SPIP_LOADER_UPDATE_AUTEURS."');",
$spip_loader
);
}
ecrire_fichierT(_SPIP_LOADER_SCRIPT, $spip_loader);
spip_redirige_boucle(_DIR_BASE._SPIP_LOADER_SCRIPT);
}
// y a tout ce qu'il faut pour que cela marche
$dest = '';
$paquet = _CHEMIN_FICHIER_ZIP;
if (isset($_REQUEST['dest']) and preg_match('/^[\w_.-]+$/', $_REQUEST['dest'])) {
$dest = $_REQUEST['dest'];
}
if (isset($_REQUEST['chemin']) and $_REQUEST['chemin']) {
$paquet = urldecode($_REQUEST['chemin']);
} elseif ($version_installee and !defined('_CHEMIN_FICHIER_ZIP_FORCEE')) {
if ($branche = lister_branches_proposees(branche_spip($version_installee))) {
$paquet = $branche['zip'];
} elseif ((strpos($version_installee, '-dev') !== false) and $branche = lister_branches_proposees('dev')) {
$paquet = $branche['zip'];
}
}
if ((strpos($paquet, '../') !== false) or (substr($paquet, -4, 4) != '.zip')) {
die("chemin incorrect $paquet");
} else {
spip_deballe(
$paquet,
(isset($_REQUEST['etape']) ? $_REQUEST['etape'] : ''),
$dest,
intval(isset($_REQUEST['range']) ? $_REQUEST['range'] : 0)
);
creer_repertoires_plugins($droits);
}
}