source: spip-zone/_dev_/spip_loader/spip_loader.php.txt @ 5181

Last change on this file since 5181 was 5181, checked in by james@…, 15 years ago

un GET de moins (a tester serieusement aussi)

File size: 13.4 KB
Line 
1<?php
2
3        #
4        # SPIP_LOADER recupere et installe la version stable de SPIP
5        #
6
7        # decommenter la ligne ci-dessous pour charger la version
8        # de developpement (nightly build SVN) et commenter la ligne de
9        # telechargement de la version STABLE
10        # define('_URL_PAQUET_ZIP','http://trac.rezo.net/files/spip/spip.zip');
11
12
13        # URL du paquet de la version STABLE a telecharger
14        define('_URL_PAQUET_ZIP','http://www.spip.net/spip-dev/DISTRIB/spip.zip');
15
16        # Adresse des librairies necessaires a spip_loader
17        # (pclzip et fichiers de langue)
18        define('_URL_LOADER_DL',"http://www.spip.net/spip-dev/INSTALL/");
19
20        # langues disponibles
21        $langues = array (
22                'ar' => '&#1575;&#1604;&#1593;&#1585;&#1576;&#1610;&#1577;',
23                'ca' => 'catal&agrave;',
24                'en' => 'English',
25                'es' => 'espa&ntilde;ol',
26                'fr' => 'fran&ccedil;ais',
27                'gl' => 'galego',
28                'it' => 'italiano',
29                'pt_br' => 'Portugu&#234;s do Brasil'
30        );
31
32        # telecharger a travers un proxy
33        $http_proxy = '';
34
35
36        //
37        // Gestion des droits d'acces
38        //
39        function tester_repertoire() {
40                global $chmod;
41               
42                $ok = false;
43                $self = basename($_SERVER['PHP_SELF']);
44                $uid = @fileowner('.');
45                $uid2 = @fileowner($self);
46                $gid = @filegroup('.');
47                $gid2 = @filegroup($self);
48                $perms = @fileperms($self);
49
50                // Comparer l'appartenance d'un fichier cree par PHP
51                // avec celle du script et du repertoire courant
52                @rmdir('test');
53                @unlink('test'); // effacer au cas ou
54                @touch('test');
55                if ($uid > 0 && $uid == $uid2 && @fileowner('test') == $uid)
56                        $chmod = 0700;
57                else if ($gid > 0 && $gid == $gid2 && @filegroup('test') == $gid)
58                        $chmod = 0770;
59                else
60                        $chmod = 0777;
61                // Appliquer de plus les droits d'acces du script
62                if ($perms > 0) {
63                        $perms = ($perms & 0777) | (($perms & 0444) >> 2);
64                        $chmod |= $perms;
65                }
66                @unlink('test');
67
68                // Verifier que les valeurs sont correctes
69
70                @mkdir('test', $chmod);
71                @chmod('test', $chmod);
72                $f = @fopen('test/test.php', 'w');
73                if ($f) {
74                        @fputs($f, '<'.'?php $ok = true; ?'.'>');
75                        @fclose($f);
76                        @chmod('test/test.php', $chmod);
77                        include('test/test.php');
78                }
79                @unlink('test/test.php');
80                @rmdir('test');
81
82                return $ok;
83        }
84
85        //
86        // Demarre une transaction HTTP (s'arrete a la fin des entetes)
87        // retourne un descripteur de fichier
88        //
89        function init_http($get, $url, $refuse_gz=false) {
90                global $http_proxy;
91                $fopen = false;
92                if (!eregi("^http://", $http_proxy))
93                        $http_proxy = '';
94
95                $t = @parse_url($url);
96                $host = $t['host'];
97                if ($t['scheme'] == 'http') {
98                        $scheme = 'http'; $scheme_fsock='';
99                } else {
100                        $scheme = $t['scheme']; $scheme_fsock=$scheme.'://';
101                }
102                if (!isset($t['port']) OR !($port = $t['port'])) $port = 80;
103                $query = isset($t['query'])?$t['query']:"";
104                if (!isset($t['path']) OR !($path = $t['path'])) $path = "/";
105
106                if ($http_proxy) {
107                        $t2 = @parse_url($http_proxy);
108                        $proxy_host = $t2['host'];
109                        $proxy_user = $t2['user'];
110                        $proxy_pass = $t2['pass'];
111                        if (!($proxy_port = $t2['port'])) $proxy_port = 80;
112                        $f = @fsockopen($proxy_host, $proxy_port);
113                } else
114                        $f = @fsockopen($scheme_fsock.$host, $port);
115
116                if ($f) {
117                        if ($http_proxy)
118                                fputs($f, "$get $scheme://$host" . (($port != 80) ? ":$port" : "") . $path . ($query ? "?$query" : "") . " HTTP/1.0\r\n");
119                        else
120                                fputs($f, "$get $path" . ($query ? "?$query" : "") . " HTTP/1.0\r\n");
121
122                        $version_affichee = isset($GLOBALS['spip_version_affichee'])?$GLOBALS['spip_version_affichee']:"xx";
123                        fputs($f, "Host: $host\r\n");
124                        fputs($f, "User-Agent: SPIP-$version_affichee (http://www.spip.net/)\r\n");
125
126                        // Proxy authentifiant
127                        if (isset($proxy_user) AND $proxy_user) {
128                                fputs($f, "Proxy-Authorization: Basic "
129                                . base64_encode($proxy_user . ":" . $proxy_pass) . "\r\n");
130                        }
131
132                }
133                // fallback : fopen
134                else if (!$http_proxy) {
135                        $f = @fopen($url, "rb");
136                        $fopen = true;
137                }
138                // echec total
139                else {
140                        $f = false;
141                }
142
143                return array($f, $fopen);
144        }
145
146        //
147        // Recupere une page sur le net
148        // et au besoin l'encode dans le charset local
149        //
150        // options : get_headers si on veut recuperer les entetes
151        function recuperer_page($url) {
152
153                // Accepter les URLs au format feed:// ou qui ont oublie le http://
154                $url = preg_replace(',^feed://,i', 'http://', $url);
155                if (!preg_match(',^[a-z]+://,i', $url)) $url = 'http://'.$url;
156
157                for ($i=0;$i<10;$i++) { // dix tentatives maximum en cas d'entetes 301...
158                        list($f, $fopen) = init_http('GET', $url);
159
160                        // si on a utilise fopen() - passer a la suite
161                        if ($fopen) {
162                                break;
163                        } else {
164                                // Fin des entetes envoyees par SPIP
165                                fputs($f,"\r\n");
166
167                                // Reponse du serveur distant
168                                $s = trim(fgets($f, 16384));
169                                if (ereg('^HTTP/[0-9]+\.[0-9]+ ([0-9]+)', $s, $r)) {
170                                        $status = $r[1];
171                                }
172                                else return;
173
174                                // Entetes HTTP de la page
175                                $headers = '';
176                                while ($s = trim(fgets($f, 16384))) {
177                                        $headers .= $s."\n";
178                                        if (eregi('^Location: (.*)', $s, $r)) {
179                                                $location = $r[1];
180                                        }
181                                        if (preg_match(",^Content-Encoding: .*gzip,i", $s))
182                                                $gz = true;
183                                }
184                                if ($status >= 300 AND $status < 400 AND $location)
185                                        $url = $location;
186                                else if ($status != 200)
187                                        return;
188                                else
189                                        break; # ici on est content
190                                fclose($f);
191                                $f = false;
192                        }
193                }
194
195                // Contenu de la page
196                if (!$f) {
197                        return false;
198                }
199
200                $result = '';
201                while (!feof($f))
202                        $result .= fread($f, 16384);
203                fclose($f);
204
205                // Decompresser le flux
206                if ($gz = $_GET['gz'])
207                        $result = gzinflate(substr($result,10));
208
209                return $result;
210        }
211
212        //
213        // Ecrire un fichier de maniere un peu sure
214        //
215        function ecrire_fichier ($fichier, $contenu) {
216
217                $fp = @fopen($fichier, 'wb');
218                $s = @fputs($fp, $contenu, $a = strlen($contenu));
219
220                $ok = ($s == $a);
221
222                @fclose($fp);
223
224                if (!$ok) {
225                        @unlink($fichier);
226                }
227
228                return $ok;
229        }
230
231        //
232        // Traduction des textes de SPIP
233        //
234        function _T($code, $args=array()) {
235                global $lang;
236                $text = $GLOBALS['i18n_tradloader_'.$lang][$code];
237                while (list($name, $value) = @each($args))
238                        $text = str_replace ("@$name@", $value, $text);
239                return $text;
240        }
241
242function regler_langue_navigateur() {
243        $accept_langs = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
244        if (is_array($accept_langs)) {
245                foreach($accept_langs as $s) {
246                        if (eregi('^([a-z]{2,3})(-[a-z]{2,3})?(;q=[0-9.]+)?$', trim($s), $r)) {
247                                $lang = strtolower($r[1]);
248                                if (isset($GLOBALS['langues'][$lang])) return $lang;
249                        }
250                }
251        }
252        return false;
253}
254
255        function telecharger_langue($lang, $droits) {
256                global $dir_base;
257                $fichier = 'tradloader_'.$lang.'.php';
258                if(!file_exists($dir_base.$fichier)) {
259                        $contenu = recuperer_page(_URL_LOADER_DL.$fichier.".txt");
260                        if ($contenu AND $droits) {
261                                ecrire_fichier($dir_base.$fichier, $contenu);
262                                include($dir_base.$fichier);
263                                return true;
264                        } elseif($contenu AND !$droits) {
265                                eval('?'.'>'.$contenu);
266                                return true;
267                        } else {
268                                return false;
269                        }
270                } else {
271                        include($dir_base.$fichier);
272                        return true;
273                }
274        }
275
276        function selectionner_langue($droits) {
277                global $langues; # langues dispo
278
279                if (isset($_COOKIE['spip_lang_ecrire'])) {
280                        $lang = $_COOKIE['spip_lang_ecrire'];
281                }
282
283                if (isset($_GET['lang']))
284                        $lang = $_GET['lang'];
285
286                # reglage par defaut selon les preferences du brouteur
287                if (!$lang OR !isset($langues[$lang]))
288                        $lang = regler_langue_navigateur();
289
290                # valeur par defaut
291                if (!isset($langues[$lang])) $lang = 'fr';
292
293                # memoriser dans un cookie pour l'etape d'apres *et* pour l'install
294                setcookie('spip_lang_ecrire', $lang);
295
296                # RTL
297                if ($lang == 'ar' OR $lang == 'he' OR $lang == 'fa') {
298                        $GLOBALS['spip_lang_right']='left';
299                        $GLOBALS['spip_lang_dir']='rtl';
300                } else {
301                        $GLOBALS['spip_lang_right']='right';
302                        $GLOBALS['spip_lang_dir']='ltr';
303                }
304
305                # code de retour = capacite a telecharger le fichier de langue
306                return telecharger_langue($lang,$droits) ? $lang : false;
307        }
308
309        function debut_html() {
310                ?>
311                <HTML <?php echo "dir='".$GLOBALS['spip_lang_dir']."'";?>>
312                <HEAD>
313                <TITLE><?php echo _T('titre'); ?></TITLE>
314                <META HTTP-EQUIV="Expires" CONTENT="0">
315                <META HTTP-EQUIV="cache-control" CONTENT="no-cache,no-store">
316                <META HTTP-EQUIV="pragma" CONTENT="no-cache">
317                <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
318
319
320                <style>
321                <!--
322                        a {text-decoration: none; }
323                        A:Hover {color:#FF9900; text-decoration: underline;}
324                        .forml {width: 100%; background-color: #FFCC66; background-position: center bottom; float: none; color: #000000}
325                        .formo {width: 100%; background-color: #970038; background-position: center bottom; float: none; color: #FFFFFF}
326                        .fondl {background-color: #FFCC66; background-position: center bottom; float: none; color: #000000}
327                        .fondo {background-color: #970038; background-position: center bottom; float: none; color: #FFFFFF}
328                        .fondf {background-color: #FFFFFF; border-style: solid ; border-width: 1; border-color: #E86519; color: #E86519}
329                -->
330                </style>
331                </HEAD>
332
333                <body bgcolor="#FFFFFF" text="#000000" link="#E86519" vlink="#6E003A" alink="#FF9900" TOPMARGIN="0" LEFTMARGIN="0" MARGINWIDTH="0" MARGINHEIGHT="0">
334
335                <BR><BR><BR>
336                <CENTER>
337                <TABLE WIDTH=450>
338                <TR><TD WIDTH=450>
339                <?php echo menu_langues($GLOBALS['lang']); ?>
340
341                <FONT FACE="Verdana,Arial,Helvetica,sans-serif" SIZE=4 COLOR="#970038"><B><?php
342                        echo _T('titre');
343                ?></B></FONT>
344                <FONT FACE="Georgia,Garamond,Times,serif" SIZE=3>
345                <?php
346        }
347
348
349        function fin_html() {
350                ?>
351                </FONT>
352                </TD></TR></TABLE>
353                </CENTER>
354                </BODY>
355
356                </HTML>
357                <?php
358        }
359
360        function nettoyer_racine($fichier) {
361                global $dir_base;
362                @unlink($dir_base.$fichier);
363                @unlink($dir_base.'pclzip.php');
364                $d = opendir($dir_base);
365                while (false !== ($f = readdir($d))) {
366                        if(preg_match('/^tradloader_(.+).php$/', $f)) @unlink($dir_base.$f);
367                }
368                closedir($d);
369                return true;
370        }
371
372        function menu_langues($lang) {
373                $r = '<div style="float:'.$GLOBALS['spip_lang_right'].';">';
374                $r .= '<form action="./spip_loader.php" method="get">';
375                $r .= '<select name="lang"
376                        onchange="window.location=\'spip_loader.php?lang=\'+this.value;">';
377                foreach ($GLOBALS['langues'] as $l => $nom)
378                        $r .= '<option value="'.$l.'"' . ($l == $lang ? ' selected' : '')
379                                . '>'.$nom.'</option>';
380                $r .= '</select> <noscript><input type="submit" name="ok" value="ok" /></noscript></form>';
381                $r .= '</div>';
382                return $r;
383        }
384
385
386///////////////////////////////////////////////
387// debut du process
388//
389
390        error_reporting(E_ALL ^ E_NOTICE);
391
392        $dir_base = './'; //repertoire d'installation
393
394        $droits = tester_repertoire();
395
396        if ($lang = selectionner_langue($droits)) {
397                $hash = isset($_GET['hash'])?'&hash='.$_GET['hash']:'';
398                $id_auteur = isset($_GET['id_auteur'])?'&id_auteur='.$_GET['id_auteur']:'';
399                if(!$droits) {
400                        //on ne peut pas ecrire
401                        debut_html(_T('titre'));
402                        echo _T('texte_preliminaire', array('hash' => $hash, 'id_auteur' => $id_auteur));
403
404                        fin_html();
405                        exit;
406                }
407                else {
408                        //on telecharge, on ecrit, au fait, on peut dezipper ?
409                        //
410                        // Verifier si la ZLib est utilisable
411                        //
412                        $gz = function_exists("gzopen");
413                        if ($gz) {
414                                $_fwrite = 'gzwrite';
415                                $_fread = 'gzread';
416                                $_fopen = 'gzopen';
417                                $_fclose = 'gzclose';
418                                if(!file_exists($dir_base."pclzip.php")) {
419                                        $contenu = recuperer_page(_URL_LOADER_DL."pclzip.php.txt");
420                                        if ($contenu) {
421                                                ecrire_fichier($dir_base."pclzip.php", $contenu);
422                                                include($dir_base."pclzip.php");
423                                        }
424                                } else {
425                                        include($dir_base."pclzip.php");
426                                }
427                        }
428                        else
429                                die ('fonctions zip non disponibles');
430
431                        //
432                        // deploiement de l'archive
433                        //
434                        if ($fichier = $_GET['fichier']
435                        AND file_exists($dir_base.$fichier)) {
436                                $nom_tmp = substr($fichier, 0, -4);
437                                $zip = new PclZip($dir_base.$fichier);
438                                $ok = $zip->extract(
439                                        PCLZIP_OPT_PATH, $dir_base,
440                                        PCLZIP_OPT_SET_CHMOD, $chmod & ~0111,
441                                        PCLZIP_OPT_REMOVE_PATH, "spip/");
442                                nettoyer_racine($fichier);
443                                if (!$ok) {
444                                        debut_html();
445                                        echo _T('donnees_incorrectes');
446                                        fin_html();
447                                        exit;
448                                }
449                                header("Location: ".$dir_base."ecrire/");
450                                exit;
451                        }
452                        //
453                        // Si pas encore fait, afficher la page de presentation
454                        //
455                        if ($_GET['charger'] != 'oui') {
456                                debut_html();
457                                echo _T('texte_intro');
458                                echo "<DIV ALIGN='".$GLOBALS['spip_lang_right']."'>";
459                                echo "<FORM ACTION='spip_loader.php' METHOD='get'>";
460                                echo "<INPUT TYPE='hidden' NAME='charger' VALUE='oui'>";
461                                echo "<INPUT TYPE='submit' NAME='Valider' VALUE=\""._T('bouton_suivant')."\">";
462                                echo "</FORM>";
463
464                                fin_html();
465                                exit;
466                        }
467
468                        $contenu = recuperer_page(_URL_PAQUET_ZIP);
469
470                        if(!$contenu) {
471                                debut_html();
472                                echo _T('echec_chargement');
473                                fin_html();
474                                exit;
475                        }
476
477                        $fichier = basename(_URL_PAQUET_ZIP);
478                        ecrire_fichier($dir_base.$fichier, $contenu);
479
480                        // Passer a l'etape suivante (desarchivage)
481                        header("Location: spip_loader.php?fichier=$fichier$hash$id_auteur");
482                        exit;
483                }
484        }
485        else {
486                //on ne peut pas telecharger, c'est foutu.
487                $lang = 'fr'; //francais par defaut
488                $GLOBALS['i18n_tradloader_fr']['titre'] = 'T&eacute;l&eacute;chargement de SPIP';
489                $GLOBALS['i18n_tradloader_fr']['echec_chargement'] = '<h4>Le chargement a &eacute;chou&eacute;. Veuillez r&eacute;essayer, ou utiliser l\'installation manuelle.</h4>';
490                debut_html();
491                echo _T('echec_chargement');
492                fin_html();
493                exit;
494        }
495
496?>
Note: See TracBrowser for help on using the repository browser.