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' */ define('_SPIP_LOADER_VERSION', '3.0.2'); /** * 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 define('_DIR_BASE', './'); define('_DIR_PLUGINS', _DIR_BASE . 'plugins/'); # adresse du depot define('_URL_SPIP_DEPOT', 'https://files.spip.net/'); # Adresse des librairies necessaires a spip_loader # (pclzip et fichiers de langue) define('_URL_LOADER_DL', 'https://www.spip.net/spip-dev/INSTALL/'); # telecharger a travers un proxy define('_URL_LOADER_PROXY', ''); # surcharger le script define('_NOM_PAQUET_ZIP', 'spip'); // par defaut le morceau de path a enlever est le nom : spip define('_REMOVE_PATH_ZIP', _NOM_PAQUET_ZIP); define('_SPIP_LOADER_PLUGIN_RETOUR', 'ecrire/?exec=admin_plugin&voir=tous'); 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 define('_SPIP_LOADER_EXTRA', ''); define('_DEST_PAQUET_ZIP', ''); define('_PCL_ZIP_SIZE', 249587); 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. */ 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 define('_URL_ARCHIVELIST', 'https://core.spip.org/projects/spip/repository/raw/archivelist.txt'); // Url du fichier spip_loader permettant de tester sa version distante 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 = 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 = 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'); @rmdir('test'); return $ok; } // // Demarre une transaction HTTP (s'arrete a la fin des entetes) // retourne un descripteur de fichier // function 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 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) = 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 = 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 = 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 = 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'); install_debut_html(); echo _T('ecrire:avis_non_acces_page'); 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 .= ""; } debut_html($corps, $hidden); fin_html(); } function spip_recupere_paquet($paquet, $fichier, $dest, $range) { $contenu = 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"); } $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 { // 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) ); } }

Félicitations !

Votre nom de domaine tozine.com a été crée par LWS

Bien débuter

Si vous êtes le propriétaire de ce domaine, découvrez ici les multiples possibilités qui s'offrent à vous dès maintenant !

Découvrir

Votre espace client

L’espace Client LWS Panel vous permet de gérer votre nom de domaine, vos e-mails, vos services en quelques clics.

Commencer

Des questions ?

Nos équipes techniques et commerciales sont à votre disposition 7j/7, n’hésitez pas à nous contacter !

Nous contacter

Hébergement web

Découvrez nos solutions économiques pour héberger tous vos projets : votre site internet, boutique en ligne etc

Hébergement web

Nom de domaine

Votre nom de domaine en .fr, .be, .eu, .com, .net, .org, .name, .lu, .co.uk, .ch, .es, .pl .info et beaucoup d'autres !

LWS pack domaine

Serveur dédié

Votre projet a besoin de ressources importantes ? Optez pour notre solution Serveurs Privés Virtuels Clés en main !

Serveur dédié

Vous ne connaissez pas encore LWS ?

LWS propose les solutions les moins chères du Net pour la création de site internet, l'hébergement web, l'enregistrement et l'achat de domaine, créer une boutique e-commerce, la location de serveur dédié, serveur VPS, envoi de SMS par internet, sauvegarde en ligne, stockage en ligne en toute simplicité, que vous soyez débutant ou expérimenté. LWS hébergement web, des packs tout compris

Choisir LWS c'est la garantie de bénéficier du savoir-faire d'un professionnel de l'hébergement web, nom de domaine, serveur dédié ... afin de réaliser votre site web en toute simplicité ! Pour tous, que vous soyez débutant ou expérimenté. LWS fait partie des leaders du marché de l'hébergement web et nom de domaine Francophone, la société LWS est un registrar de domaine accrédité Afnic, Icann, Verisign, Affilias, CentralNic, Donuts, Swtich, Denic, Dns.Lu, Eurid, Nominet et Dns.be. Vous avez ainsi la certitude de trouver un partenaire de confiance pour votre hébergement web et votre nom de domaine.

N'hésitez plus et rejoignez les milliers d'internautes qui font déjà confiance à LWS,
commandez dès maintenant votre nom de domaine ou votre solution d'hébergement web complète !

Découvrir LWS