source: spip-zone/_plugins_/mutualisation/mutualiser_creer.php @ 42952

Last change on this file since 42952 was 42952, checked in by esj@…, 11 years ago

mutualisation. Mauvaise priorité d'opérateur dans la vérification d'accès en écriture du répertoire principal.

File size: 12.7 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2007                                                *
7 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
8 *                                                                         *
9 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
10 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
11\***************************************************************************/
12
13if (!defined("_ECRIRE_INC_VERSION")) return;
14
15define('_PRIVILEGES_MYSQL_USER_BASE','Alter, Select, Insert, Update, Delete, Create, Drop');
16#define('_DIRMUT','mutualisation/');
17define('_DIRMUT', str_replace(str_replace('\\', '/', _ROOT_RACINE), '', str_replace('\\', '/', dirname(__FILE__))) . '/');
18_chemin(_DIRMUT);
19
20include_spip('inc/minipres');
21include_spip('inc/lang');
22
23utiliser_langue_visiteur();
24
25#$menu_langues = menu_langues('var_lang_ecrire');
26
27/* centrage...  */
28function mutu_minipres($titre="",$contenu=""){
29        return minipres($titre,"<div class='petit-centre'>" . $contenu . "</div>");
30}
31
32// http://doc.spip.org/@mutualiser_creer
33function mutualiser_creer($e, $options) {
34        include_spip('base/abstract_sql');
35        include_once(dirname(__FILE__).'/base/abstract_mutu.php');
36
37        $GLOBALS['meta']["charset"] = 'utf-8'; // pour que le mail fonctionne
38
39        //$GLOBALS['spip_connect_version'] = 0.7;
40
41        if (!defined('_INSTALL_SERVER_DB'))
42                define('_INSTALL_SERVER_DB','mysql');
43
44        header("Cache-Control: no-store, no-cache, must-revalidate");
45        header("Pragma: no-cache");
46
47        mutu_etape_code_activation($e, $options);
48        mutu_etape_creer_repertoires($e, $options);
49        mutu_etape_creer_base($e, $options);
50        mutu_etape_fin($e, $options);
51}
52
53
54/*
55 * Code d'activation du site
56 *
57 * Demander le code pour autoriser cette creation de site
58 * Si le code est valide, poser un cookie
59 *
60 */
61function mutu_etape_code_activation($e, $options){
62        if ($options['code']) {
63                $secret = md5($code.$options['code']);
64
65                if ($options['code'] != $_REQUEST['code_activation']
66                AND $_COOKIE['mutu_code_activation'] != $secret) {
67                        echo mutu_minipres(
68                                _T('mutu:install_site'),
69                                "<div>" .$menu_langues ."<br /></div>\n" .
70                                "<div><img alt='SPIP' src='" . _DIR_IMG_PACK . "logo-spip.gif' /></div>\n".
71
72                                (isset($_REQUEST['code_activation'])
73                                        ? _T('mutu:install_err')
74                                        : ''
75                                ) .
76
77                                '<h3>'.
78                                _T('mutu:install_code').
79                                '</h3>'.
80
81                                "<form method='post' action='".self()."'><div>
82                                <input type='password' name='code_activation' size='10' />
83                                <input type='submit' value='ok' />"
84                                .$options['annonce']
85                                ."</div></form>
86                                "
87                        );
88                        exit;
89                } else {
90                        setcookie('mutu_code_activation', $secret);
91                }
92        }
93}
94
95
96/*
97 * Creation de la base
98 *
99 * Cree la base de donnee
100 * Cree eventuellement un utilisateur pour cette base
101 *
102 */
103function mutu_etape_creer_base($e, $options){
104
105        if ($options['creer_base']) {
106
107                if (defined('_INSTALL_SERVER_DB')
108                AND defined('_INSTALL_NAME_DB')) {
109
110                        if (defined('_INSTALL_USER_DB_ROOT')) {
111                                $link = mutu_connect_db(_INSTALL_HOST_DB, 0,  _INSTALL_USER_DB_ROOT, _INSTALL_PASS_DB_ROOT, '', _INSTALL_SERVER_DB);
112                        } else {
113                                $link = mutu_connect_db(_INSTALL_HOST_DB, 0,  _INSTALL_USER_DB, _INSTALL_PASS_DB, '', _INSTALL_SERVER_DB);
114                        }
115
116                        // si la base n'existe pas, on va travailler
117                        if (!sql_selectdb(_INSTALL_NAME_DB, _INSTALL_SERVER_DB)) {
118                                if (_request('creerbase') == 'oui') {
119
120                                        // mode de creation par un ping sur une URL (AlternC)
121                                        // on le fait en local et en POST, donc pas de trou de secu
122                                        // curl indispensable pour le https... devrait aller dans inc/distant
123                                        if ($options['url_creer_base']
124                                        AND defined('_INSTALL_NAME_DB')) {
125                                                $url = str_replace('%x', _INSTALL_NAME_DB, $options['url_creer_base']);
126                                                $ch = curl_init($url);
127                                                curl_setopt($ch, CURLOPT_HEADER, 0);
128                                                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
129                                                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
130                                                curl_setopt($ch, CURLOPT_POST, 1);
131                                                $page = curl_exec($ch);
132                                                curl_close($ch);
133                                                if (!sql_selectdb(_INSTALL_NAME_DB, _INSTALL_SERVER_DB)) {
134                                                        echo mutu_minipres(
135                                                                _T('mutu:install_bd_echec',array('nombase' => '<tt>'._INSTALL_NAME_DB.'</tt>')),
136                                                                "<div><img alt='SPIP' src='" . _DIR_IMG_PACK . "logo-spip.gif' /></div>\n".
137                                                                '<h3>'
138                                                                .'<a href="'.parametre_url(self(), 'creerbase', 'oui').'">'._T('mutu:install_bd_reessayer').'</a>'
139                                                                .'</h3>'
140                                                        );
141                                                        exit;
142                                                }
143                                        }
144
145                                        else if (sql_query('CREATE DATABASE '._INSTALL_NAME_DB, _INSTALL_SERVER_DB)
146                                        AND sql_selectdb(_INSTALL_NAME_DB, _INSTALL_SERVER_DB)) {
147                                                        $GLOBALS['connexions'][_INSTALL_SERVER_DB]['prefixe'] = $GLOBALS['table_prefix'];
148                                                        $GLOBALS['connexions'][_INSTALL_SERVER_DB]['db'] = _INSTALL_NAME_DB;
149
150                                                /*
151                                                 * Creation d'un utilisateur pour la base nouvellement cree
152                                                 *
153                                                 * Pour chaque base creee on cree aussi un user
154                                                 * MYSQL specifique qui aura les droits sur la base
155                                                 */
156                                                if ($options['creer_user_base']) {
157
158                                                        // le nom de la machine MySQL peut etre different
159                                                        // du nom de la connexion via DNS
160                                                        define ('_INSTALL_HOST_DB_LOCALNAME', _INSTALL_HOST_DB);
161
162                                                        // requete differente entre pg et mysql...
163                                                        $req = $err = array();
164                                                        switch (strtolower(_INSTALL_SERVER_DB)){
165
166                                                                case 'pg':
167                                                                        // d'abord creer l'utilisateur
168                                                                        $req[] = "CREATE USER " . _INSTALL_USER_DB . " WITH PASSWORD '" . _INSTALL_PASS_DB . "'";
169                                                                        $err[] = "CREATE USER " . _INSTALL_USER_DB . " WITH PASSWORD 'xxx'";
170                                                                        // l'affecter a sa base de donnee
171                                                                        $req[] = $r = "GRANT ALL PRIVILEGES ON DATABASE "
172                                                                                . _INSTALL_NAME_DB . " TO ". _INSTALL_USER_DB;
173                                                                        $err[] = $r;
174                                                                        break;
175
176                                                                case 'mysql':
177                                                                default:
178                                                                        $req[] = "GRANT " . _PRIVILEGES_MYSQL_USER_BASE . " ON "
179                                                                                . _INSTALL_NAME_DB.".* TO '"
180                                                                                . _INSTALL_USER_DB."'@'"._INSTALL_HOST_DB_LOCALNAME
181                                                                                . "' IDENTIFIED BY '" . _INSTALL_PASS_DB . "'";
182                                                                        $err[] = "GRANT " . _PRIVILEGES_MYSQL_USER_BASE . " ON "
183                                                                                . _INSTALL_NAME_DB.".* TO '"
184                                                                                . _INSTALL_USER_DB."'@'"._INSTALL_HOST_DB_LOCALNAME
185                                                                                . "' IDENTIFIED BY 'xxx'";
186                                                                        break;
187
188                                                        }
189                                                        foreach ($req as $n=>$sql){
190                                                                if (!sql_query($sql, _INSTALL_SERVER_DB)) {
191                                                                        die (__FILE__." " . __LINE__ . ": Erreur (" ._INSTALL_SERVER_DB . ") sur  :" . $err[$n]);
192                                                                }
193                                                        }
194                                                        mutu_close();
195                                                        $link = mutu_connect_db(_INSTALL_HOST_DB,'',  _INSTALL_USER_DB, _INSTALL_PASS_DB, '', _INSTALL_SERVER_DB);
196                                                }
197
198                                                // creation ok
199                                                // supprimer le fichier d'installation
200                                                include_spip('inc/flock');
201                                                @supprimer_fichier($e . _NOM_TEMPORAIRES_INACCESSIBLES . _MUTU_INSTALLATION_FILE);
202
203                                                echo mutu_minipres(
204                                                        _T('mutu:install_bd_cree', array( 'nombase' => '<tt>'._INSTALL_NAME_DB.'</tt>')),
205                                                        "<div><img alt='SPIP' src='" . _DIR_IMG_PACK . "logo-spip.gif' /></div>\n".
206                                                        '<h3>'
207                                                        ._T('mutu:install_spip_1')
208                                                        .'<a href="'.generer_url_ecrire('install').'">'
209                                                        ._T('mutu:install_spip_2')
210                                                        .'</a>.</h3>'
211                                                );
212
213                                                if ($options['mail']) {
214                                                        $mail = charger_fonction('envoyer_mail', 'inc');
215                                                        $mail($options['mail'],
216                                                                _T('mutu:install_creation_bd', array('nombase' => _INSTALL_NAME_DB)),
217                                                                _T('mutu:install_creation_bd_site_2', array('base' => _INSTALL_NAME_DB.'@'._INSTALL_HOST_DB.' ('._INSTALL_USER_DB.')', 'site' => $e)),
218                                                                $options['mail']
219                                                        );
220                                                }
221                                                exit;
222                                        } else {
223                                                echo mutu_minipres(
224                                                        _T('mutu:install_creation_bd', array('nombase' => '<tt>'._INSTALL_NAME_DB.'</tt>')),
225                                                        "<div><img alt='SPIP' src='" . _DIR_IMG_PACK . "logo-spip.gif' /></div>\n".
226                                                        '<h3>'
227                                                        ._T('mutu:install_err')
228                                                        .'</h3>'
229                                                );
230                                                exit;
231                                        }
232
233                                }
234                                else {
235                                        echo mutu_minipres(
236                                                _T('mutu:install_creation_bd', array('nombase' => '<tt>'._INSTALL_NAME_DB.'</tt>')),
237                                                "<div><img alt='SPIP' src='" . _DIR_IMG_PACK . "logo-spip.gif' /></div>\n".
238                                                '<h3>'
239                                                ._T('mutu:install_creer_bd_1')
240                                                .'<a href="'.parametre_url(self(), 'creerbase', 'oui').'">'
241                                                ._T('mutu:install_creer_bd_2')
242                                                .'</a></h3>'
243                                        );
244                                        exit;
245                                }
246                        }
247
248                        // ici la base existe, on passe aux repertoires
249                }
250
251                else {
252                        echo mutu_minipres(
253                                _T('mutu:install_creation_bd_site'). '(<tt>'.joli_repertoire($e).'</tt>)',
254                                "<div><img alt='SPIP' src='" . _DIR_IMG_PACK . "logo-spip.gif' /></div>\n"
255                                .'<h3>'. _T('mutu:install_err') .'</h3>'
256                                . _T('mutu:install_no_data_connexion', array( 'connexion' => strtoupper(_INSTALL_SERVER_DB)))
257                        );
258                        exit;
259                }
260        }
261}
262
263
264/*
265 * Cree les dossiers necessaires au site mutualise
266 */
267function mutu_etape_creer_repertoires($e, $options){
268        if ($options['creer_site']) {
269                $ok_dir = _DIR_RACINE . $options['repertoire'];
270
271                if (!(is_dir($ok_dir)  AND is_writable($ok_dir))) {
272                        echo mutu_minipres(
273                                _T('mutu:install_creation_repertoire', array ('repertoire' => '<tt>'.joli_repertoire($e).'</tt>')),
274                                "<div><img alt='SPIP' src='" . _DIR_IMG_PACK . "logo-spip.gif' /></div>\n"
275                                .'<h3>'. _T('mutu:install_err') .'</h3>'
276                                . _T('mutu:install_repertoire_inaccessible', array( 'repertoire' => '<tt>'.$ok_dir.'/</tt>'))
277                        );
278                        exit;
279                }
280
281                if (_request('creerrepertoire') && _request('creerrepertoire')=='oui') {
282                        $ok =
283                        mkdir($e, _SPIP_CHMOD)
284                        AND chmod($e, _SPIP_CHMOD)
285                        AND mkdir($e._NOM_PERMANENTS_INACCESSIBLES, _SPIP_CHMOD)
286                        AND mkdir($e._NOM_PERMANENTS_ACCESSIBLES, _SPIP_CHMOD)
287                        AND mkdir($e._NOM_TEMPORAIRES_INACCESSIBLES, _SPIP_CHMOD)
288                        AND mkdir($e._NOM_TEMPORAIRES_ACCESSIBLES, _SPIP_CHMOD)
289                        AND chmod($e._NOM_PERMANENTS_INACCESSIBLES, _SPIP_CHMOD)
290                        AND chmod($e._NOM_PERMANENTS_ACCESSIBLES, _SPIP_CHMOD)
291                        AND chmod($e._NOM_TEMPORAIRES_INACCESSIBLES, _SPIP_CHMOD)
292                        AND chmod($e._NOM_TEMPORAIRES_ACCESSIBLES, _SPIP_CHMOD);
293
294                        // pour signaler qu'il reste des etapes a realises,
295                        // malgre la presence des repertoires
296                        if ($ok){
297                                include_spip('inc/flock');
298                                ecrire_fichier($e . _NOM_TEMPORAIRES_INACCESSIBLES . _MUTU_INSTALLATION_FILE, 'ok');
299                        }
300
301                        echo mutu_minipres(
302                                _T('mutu:install_creation_repertoire', array ('repertoire' => '<tt>'.joli_repertoire($e).'</tt>')),
303                                "<div><img alt='SPIP' src='" . _DIR_IMG_PACK . "logo-spip.gif' /></div>\n"
304                                .'<h3>'
305                                . ($ok
306                                        ? _T('mutu:install_creation_rep_ok_1').'<a href="'.parametre_url(self(), 'creerrepertoire', '').'">'._T('mutu:install_creation_rep_ok_2').'</a>.'
307                                        : _T('mutu:install_err')
308                                ).'</h3>'
309                        );
310
311                        if ($options['mail']) {
312                                $mail = charger_fonction('envoyer_mail', 'inc');
313                                $mail($options['mail'],
314                                        _T('mutu:install_creation_site', array('site' => joli_repertoire($e))),
315                                        _T('mutu:install_creation_site', array('site' => $e)),
316                                        $options['mail']
317                                );
318                        }
319                        exit;
320
321                } elseif (
322                           !is_dir($e._NOM_PERMANENTS_INACCESSIBLES)
323                        || !is_dir($e._NOM_PERMANENTS_ACCESSIBLES)
324                        || !is_dir($e._NOM_TEMPORAIRES_INACCESSIBLES)
325                        || !is_dir($e._NOM_TEMPORAIRES_ACCESSIBLES)
326                ) {
327                        echo mutu_minipres(
328                                _T('mutu:install_creation_repertoire', array('repertoire' => '<tt>'.joli_repertoire($e).'</tt>')),
329                                "<div><img alt='SPIP' src='" . _DIR_IMG_PACK . "logo-spip.gif' /></div>\n"
330                                .'<h3>'.
331                                _T('mutu:install_creer_rep_1')
332                                .'<a href="'.parametre_url(self(), 'creerrepertoire', 'oui').'">'
333                                ._T('mutu:install_creer_rep_2')
334                                .'</a></h3>'
335                                . (!$ok_dir ? _T('mutu:install_repertoire_inaccessible', array('repertoire' => '<tt>'.$options['repertoire'].'/</tt>' )) : '')
336                        );
337                        exit;
338
339                }
340
341                } else {
342                        echo mutu_minipres(
343                        _T('mutu:install_repertoire_noexist', array('repertoire' => '<tt>'.joli_repertoire($e).'</tt>')),
344                        "<div><img alt='SPIP' src='" . _DIR_IMG_PACK . "logo-spip.gif' /></div>\n".
345                        '<h3>'
346                        ._T('mutu:install_repertoire_noexist', array( 'repertoire' => joli_repertoire($e)))
347                        .'</h3>'
348                        .'<ul>'
349                        .'<li>'.joli_repertoire($e)._NOM_PERMANENTS_INACCESSIBLES.'</li>'
350                        .'<li>'.joli_repertoire($e)._NOM_PERMANENTS_ACCESSIBLES.'</li>'
351                        .'<li>'.joli_repertoire($e)._NOM_TEMPORAIRES_INACCESSIBLES.'</li>'
352                        .'<li>'.joli_repertoire($e)._NOM_TEMPORAIRES_ACCESSIBLES.'</li>'
353                        .'</ul>'
354                );
355                exit;
356
357        }
358}
359
360
361/*
362 * Fin de la procedure, proposer l'installation de SPIP
363 */
364function mutu_etape_fin($e, $options){
365        // supprimer le fichier d'installation
366        include_spip('inc/flock');
367        @supprimer_fichier($e . _NOM_TEMPORAIRES_INACCESSIBLES . _MUTU_INSTALLATION_FILE);
368
369        echo mutu_minipres(
370                _T('mutu:install_rep_bd_ok'),
371
372                "<div><img alt='SPIP' src='" . _DIR_IMG_PACK . "logo-spip.gif' /></div>\n"
373                .'<h3>'.
374                        _L('Vous pouvez <a href="'.generer_url_ecrire('install').'">poursuivre l\'installation de SPIP</a>.')
375                .'</h3>'
376        );
377        exit;
378}
379?>
Note: See TracBrowser for help on using the repository browser.