File "spip_loader.php"
Full path: /home/argothem/www/SpipFactory-fichiers_de_travail/sauvegarde-depannage-1.9a3.2/1.9/spip_loader.php
File size: 17.84 KB
MIME-type: text/x-php
Charset: utf-8
<?php
#
# SPIP_LOADER recupere et installe la version stable de SPIP
#
# code de reinstallation
// definir _FILE_CONNECT a autre chose que machin.php si on veut pas
if (@file_exists('ecrire/inc_version.php')) {
include_once 'ecrire/inc_version.php';
if (defined('_FILE_CONNECT')
&& _FILE_CONNECT && strpos(_FILE_CONNECT, '.php'))
spip_loader_reinstalle();
}
######################### CONFIGURATION #
#
# decommenter la ligne ci-dessous pour charger la version
# de developpement (nightly build SVN) et commenter la ligne de
# telechargement de la version STABLE
# define('_URL_PAQUET_ZIP','http://files.spip.org/spip/spip.zip');
# URL du paquet de la version STABLE a telecharger
define('_URL_PAQUET_ZIP','http://www.spip.net/spip-dev/DISTRIB/spip.zip');
# Adresse des librairies necessaires a spip_loader
# (pclzip et fichiers de langue)
define('_URL_LOADER_DL',"http://www.spip.net/spip-dev/INSTALL/");
# telecharger a travers un proxy
define('_URL_LOADER_PROXY', '');
# auteur(s) autorise(s) a proceder aux mises a jour : '1:2:3'
define('_SPIP_LOADER_UPDATE_AUTEURS', '1');
# 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_URL_RETOUR', "ecrire/");
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 <head> genere par spip_loader
define('_SPIP_LOADER_EXTRA', '');
define('_DEST_PAQUET_ZIP','');
define('_PCL_ZIP_SIZE', 249587);
#
#######################################################################
# langues disponibles
$langues = array (
'ar' => 'العربية',
'br' => 'brezhoneg',
'ca' => 'català',
'cs' => 'čeština',
'de' => 'Deutsch',
'en' => 'English',
'eo' => 'Esperanto',
'es' => 'español',
'fr' => 'français',
'gl' => 'galego',
'id' => 'Indonesia',
'it' => 'italiano',
'lb' => 'Lëtzebuergesch',
'oc_lnc' => 'òc lengadocian',
'pt_br' => 'Português do Brasil',
'ro' => 'română',
'tr' => 'Türkçe'
);
//
// 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 move_all($src,$dest) {
if ($dh = opendir($src)) {
while (($file = readdir($dh)) !== false) {
if (!in_array($file, array('.', '..')))
rename ("$src/$file", "$dest/$file");
}
}
}
function regler_langue_navigateurT() {
$accept_langs = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
if (is_array($accept_langs)) {
foreach($accept_langs as $s) {
if (eregi('^([a-z]{2,3})(-[a-z]{2,3})?(;q=[0-9.]+)?$', trim($s), $r)) {
$lang = strtolower($r[1]);
if (isset($GLOBALS['langues'][$lang])) return $lang;
}
}
}
return false;
}
function menu_languesT($lang) {
global $dir_base;
$r = '<div style="float:'.$GLOBALS['spip_lang_right'].';">';
$r .= '<form action="'.$dir_base._SPIP_LOADER_SCRIPT.'" method="get"><div>';
if(preg_match(',action=([a-z_]+),', _SPIP_LOADER_SCRIPT, $m)) {
$r .= "<input type='hidden' name='action' value='".$m[1]."' />";
$sep = '&';
}
else
$sep = '?';
$r .= '<select name="lang"
onchange="window.location=\''.$dir_base._SPIP_LOADER_SCRIPT.$sep.'lang=\'+this.value;">';
foreach ($GLOBALS['langues'] as $l => $nom)
$r .= '<option value="'.$l.'"' . ($l == $lang ? ' selected="selected"' : '')
. '>'.$nom."</option>\n";
$r .= '</select> <noscript><div><input type="submit" name="ok" value="ok" /></div></noscript></div></form>';
$r .= '</div>';
return $r;
}
//
// 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);
$f = @fopen('test/test.php', 'w');
if ($f) {
@fputs($f, '<'.'?php $ok = true; ?'.'>');
@fclose($f);
@chmod('test/test.php', $chmod);
include('test/test.php');
}
@unlink('test/test.php');
@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 (!eregi("^http://", _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 (http://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");
}
}
// fallback : fopen
else if (!$http_proxy) {
$f = @fopen($url, "rb");
$fopen = true;
}
// echec total
else {
$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;
for ($i=0;$i<10;$i++) { // dix tentatives maximum en cas d'entetes 301...
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 (ereg('^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 (eregi('^Location: (.*)', $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;
else if ($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 ($gz = $_GET['gz'])
$result = gzinflate(substr($result,10));
return $result;
}
function telecharger_langue($lang, $droits) {
global $dir_base;
$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
if (isset($_COOKIE['spip_lang_ecrire'])) {
$lang = $_COOKIE['spip_lang_ecrire'];
}
if (isset($_GET['lang']))
$lang = $_GET['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() {
$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 .= '
<!-- css pour tuning optionnel, au premier chargement, il manquera si pas droits ... -->
<link rel="stylesheet" href="' . basename($fil) . '" type="text/css" media="all" />';
break;
case '.js':
$js .= '
<!-- js pour tuning optionnel, au premier chargement, il manquera... -->
<script src="' . basename($fil) . '" type="text/javascript"></script>';
break;
}
}
$h1 = _TT('tradloader:titre', array('paquet'=>strtoupper(_NOM_PAQUET_ZIP)));
$menu_langues = menu_languesT($GLOBALS['lang']);
echo <<<EOD
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html "xml:lang='{$GLOBALS['lang']}' dir='{$GLOBALS['spip_lang_dir']}'">
<head>
<title>$titre</title>
<meta http-equiv="Expires" content="0" />
<meta http-equiv="cache-control" content="no-cache,no-store" />
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
body {
background-color:white;
color:black;
margin:50px 0 0 0;
}
#main {
margin-left: auto;
margin-right: auto;
width:450px;
}
a {
text-decoration: none;
color: #E86519;
}
a:hover {
color:#FF9900;
text-decoration: underline;
}
a:visited {
color:#6E003A;
}
a:active {
color:#FF9900;
}
h1 {
font-family:Verdana ,Arial,Helvetica,sans-serif;
color:#970038;
display:inline;
font-size:120%;
}
h2 {
font-family: Verdana,Arial,Sans,sans-serif;
font-weigth: normal;
font-size: 100%;
}
</style>$css$js
</head>
<body>
<div id="main">
$menu_langues
<h1>$h1</h1>
<div style="font-family:Georgia,Garamond,Times,serif; font-size:110%;">
EOD;
}
function fin_html()
{
global $taux;
echo ($taux ? '
<div id="taux" style="display: none;">' . $taux . '</div>' : '') .
'
</div>
</div>
</body>
</html>
';
}
function nettoyer_racine($fichier) {
global $dir_base;
@unlink($dir_base.$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;
}
// 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);
}
///////////////////////////////////////////////
// debut du process
//
error_reporting(E_ALL ^ E_NOTICE);
$dir_base = './'; //repertoire d'installation
$taux = 0; // calcul eventuel du taux de transfert+dezippage
$droits = tester_repertoire();
if ($lang = selectionner_langue($droits)) {
if(!$droits) {
//on ne peut pas ecrire
debut_html();
echo _TT('tradloader:texte_preliminaire', array('paquet'=>strtoupper(_NOM_PAQUET_ZIP), 'chmod'=>sprintf('%04o',$chmod)));
fin_html();
exit;
}
else {
//on telecharge, on ecrit, au fait, on peut dezipper ?
//
// Verifier si la ZLib est utilisable
//
$gz = function_exists("gzopen");
if ($gz) {
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;
}
}
}
else
die ('fonctions zip non disponibles');
$fichier = basename(_URL_PAQUET_ZIP);
$paquet = (isset($_GET['paquet']) AND preg_match(',[a-zA-Z0-9_]+,', $_GET['paquet'])) ? $_GET['paquet'] : '';
//
// deploiement de l'archive
//
if ($_GET['fichier'] == 'oui'
AND file_exists($dir_base.$fichier)) {
$ok = mkdir ($tmp = $dir_base.'zip_'.uniqid(rand()), $chmod);
$zip = new PclZip($dir_base.$fichier);
$ok &= $zip->extract(
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();
exit;
}
move_all($tmp,$dir_base._DEST_PAQUET_ZIP);
rmdir($tmp);
nettoyer_racine($fichier);
header("Location: ".$dir_base._SPIP_LOADER_URL_RETOUR);
exit;
}
//
// Si pas encore fait, afficher la page de presentation
//
if ($_GET['charger'] != 'oui') {
debut_html();
$dest = (_DEST_PAQUET_ZIP == '') ?
_TT('tradloader:ce_repertoire') :
_TT('tradloader:du_repertoire').' <tt>'._DEST_PAQUET_ZIP.'</tt>';
echo _TT('tradloader:texte_intro', array('paquet'=>strtoupper(_NOM_PAQUET_ZIP),'dest'=> $dest));
echo "<div style='text-align:".$GLOBALS['spip_lang_right']."'>";
echo "<form action='".$dir_base._SPIP_LOADER_SCRIPT."' method='get'><div>";
if(preg_match(',action=([a-z_]+),', _SPIP_LOADER_SCRIPT, $m))
echo "<input type='hidden' name='action' value='".$m[1]."' />";
if($paquet != '')
echo "<input type='hidden' name='paquet' value='$paquet' />";
if(file_exists($dir_base.$fichier))
echo "<input type='hidden' name='fichier' value='oui' />";
else
echo "<input type='hidden' name='charger' value='oui'>";
echo '<input type="submit" name="Valider" value="'._TT('tradloader:bouton_suivant').'" />';
echo "</div></form>";
fin_html();
exit;
}
$contenu = recuperer_page(_URL_PAQUET_ZIP);
if(!($contenu AND ecrire_fichierT($dir_base.$fichier, $contenu))) {
debut_html();
echo _TT('tradloader:echec_chargement');
fin_html();
exit;
}
// Passer a l'etape suivante (desarchivage)
$sep = strpos(_SPIP_LOADER_SCRIPT, '?') ? '&' : '?';
header("Location: ".$dir_base._SPIP_LOADER_SCRIPT.$sep."fichier=oui".($paquet?"&paquet=".$paquet:''));
exit;
}
}
else {
//on ne peut pas telecharger, c'est foutu.
$lang = 'fr'; //francais par defaut
$GLOBALS['i18n_tradloader_fr']['titre'] = 'Téléchargement de SPIP';
$GLOBALS['i18n_tradloader_fr']['echec_chargement'] = '<h4>Le chargement a échoué. Veuillez réessayer, ou utiliser l\'installation manuelle.</h4>';
debut_html();
echo _TT('tradloader:echec_chargement');
fin_html();
exit;
}
function spip_loader_reinstalle() {
if(!defined(_SPIP_LOADER_UPDATE_AUTEURS))
define('_SPIP_LOADER_UPDATE_AUTEURS', '1');
if ($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;
}
}
?>