• Bienvenue !

    Bienvenue sur le site de la classe des CE1A.

    Nous avons remarqués que les dimensions étaient trop petites. Elles seront réglés d'ici la fin des vacances de la Toussaint.

     

     

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
" . "
" . menu_languesT($lang, $script, $hidden) . "

" . $titre . "

". $corps . $hid . "
"; } function fin_html() { global $taux; echo ($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 "
\n"; echo _T('ecrire:avis_non_acces_page'); echo '
' . _T('public:lien_connecter') . ''; echo "\n
"; echo install_fin_html(); exit; } } function spip_deballe_paquet($paquet, $fichier, $dest, $range) { global $chmod; // le repertoire temporaire est invariant pour permettre la reprise @mkdir($tmp = _DIR_BASE.'zip_'.md5($fichier), $chmod); $ok = is_dir($tmp); $zip = new PclZip($fichier); $content = $zip->listContent(); $max_index = count($content); $start_index = isset($_REQUEST['start']) ? intval($_REQUEST['start']) : 0; if ($start_index < $max_index) { if (!$range) { $range = _PCL_ZIP_RANGE; } $end_index = min($start_index + $range, $max_index); $ok &= $zip->extractByIndex( "$start_index-$end_index", PCLZIP_OPT_PATH, $tmp, PCLZIP_OPT_SET_CHMOD, $chmod, PCLZIP_OPT_REPLACE_NEWER, PCLZIP_OPT_REMOVE_PATH, _REMOVE_PATH_ZIP."/", PCLZIP_CB_POST_EXTRACT, 'touchCallBack' ); } if (!$ok or $zip->error_code < 0) { debut_html(); echo _TT('tradloader:donnees_incorrectes', array('erreur' => $zip->errorInfo())); fin_html(); } else { // si l'extraction n'est pas finie, relancer if ($start_index < $max_index) { $url = _DIR_BASE._SPIP_LOADER_SCRIPT . (strpos(_SPIP_LOADER_SCRIPT, '?') ? '&' : '?') . "etape=fichier&chemin=$paquet&dest=$dest&start=$end_index"; $progres = $start_index/$max_index; spip_redirige_boucle($url, $progres); } if ($dest) { @mkdir(_DIR_PLUGINS, $chmod); $dir = _DIR_PLUGINS . $dest; $url = _DIR_BASE . _SPIP_LOADER_PLUGIN_RETOUR; } else { $dir = _DIR_BASE; $url = _DIR_BASE . _SPIP_LOADER_URL_RETOUR; } move_all($tmp, $dir); rmdir($tmp); nettoyer_superflus($content, $dir); nettoyer_racine($fichier); header("Location: $url"); } } function spip_redirige_boucle($url, $progres = ''){ //@apache_setenv('no-gzip', 1); // provoque page blanche chez certains hebergeurs donc ne pas utiliser @ini_set('zlib.output_compression', '0'); // pour permettre l'affichage au fur et a mesure @ini_set('output_buffering', 'off'); @ini_set('implicit_flush', 1); @ob_implicit_flush(1); $corps = ''; if ($progres) { $corps .="
".round($progres*100)."%
"; } debut_html($corps); fin_html(); exit; } function spip_presente_deballe($fichier, $paquet, $dest, $range) { global $version_installee; $nom = (_DEST_PAQUET_ZIP == '') ? _TT('tradloader:ce_repertoire') : (_TT('tradloader:du_repertoire'). ' '._DEST_PAQUET_ZIP.''); $hidden = array( 'chemin' => $paquet, 'dest' => $dest, 'range' => $range, 'etape' => file_exists($fichier) ? 'fichier' : 'charger' ); // Version proposée à l'installation par défaut $versions_spip = lister_versions_spip(); $version_future = $versions_spip[$paquet]['version']; if ($versions_spip[$paquet]['etat'] == 'dev') { $version_future .= '-dev'; } $version_future_affichee = 'SPIP ' . $version_future; if ($version_installee) { // Mise à jour $bloc_courant = '
' . _TT('tradloader:titre_version_courante') . ''. 'SPIP ' . $version_installee .'' . '
'; $bouton = _TT('tradloader:bouton_suivant_maj'); } else { // Installation nue $bloc_courant = ''; $bouton = _TT('tradloader:bouton_suivant'); } // Détection d'une incompatibilité avec la version de PHP installée $branche_future = branche_spip($versions_spip[$paquet]['version']); $version_php_installee = phpversion(); $version_php_spip = lister_branches_proposees($branche_future); $version_php_spip = $version_php_spip['php']; $php_incompatible = version_compare($version_php_spip, $version_php_installee, '>'); if ($php_incompatible) { $bouton = '
' . _TT('tradloader:echec_php', array('php1' => $version_php_installee, 'php2' => $version_php_spip)) . '
'; } elseif (version_compare($version_installee, $version_future, '>') and ($version_future !== 'spip-dev')) { // Épargnons un downgrade aux personnes étourdies $bouton = "
" . '' . '
'; } else { $bouton = "
" . '' . '
'; } // Construction du corps $corps = _TT('tradloader:texte_intro', array('paquet'=>strtoupper(_NOM_PAQUET_ZIP),'dest'=> $nom)) . '
' . $bloc_courant . '
' . _TT('tradloader:titre_version_future') . ''. $version_future_affichee. '' . menu_branches($paquet, $version_installee) . '
' . '
' . $bouton; if (spip_loader_necessite_maj()) { $corps .= "
" . _TT('tradloader:spip_loader_maj', array('version' => spip_loader_recupere_version())) . "" . "
" . "" . "
"; } 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); } }