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

Last change on this file since 111915 was 111915, checked in by real3t@…, 11 months ago

Passer le statut maintenance (503) sur la mire d'installation.

File size: 16.8 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2015                                                *
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')) {
14        return;
15}
16if (find_in_path('images/logo-spip.png')) {
17        define( _SPIP_LOGO_MUTU,find_in_path('images/logo-spip.png'));
18} else {
19        define( _SPIP_LOGO_MUTU,find_in_path('images/logo-spip.gif'));
20}
21
22define('_PRIVILEGES_MYSQL_USER_BASE', 'Alter, Select, Insert, Update, Delete, Create, Drop');
23#define('_DIRMUT','mutualisation/');
24define('_DIRMUT',
25        str_replace(str_replace('\\', '/', _ROOT_RACINE), '', str_replace('\\', '/', dirname(__FILE__))) . '/');
26_chemin(_DIR_RACINE . _DIRMUT);
27
28include_spip('inc/minipres');
29include_spip('inc/lang');
30utiliser_langue_visiteur();
31
32/* choix de la langue (ne fonctionne pas) */
33function mutu_menu_langues() {
34        return '';
35
36        set_request('exec', 'install');
37        $menu_langues = menu_langues('var_lang_ecrire');
38
39        return '<div>' . $menu_langues . "<br /></div>\n";
40}
41
42/* centrage...  */
43function mutu_minipres($titre = '', $contenu = '', $onload = '') {
44        return minipres($titre, "<div class='petit-centre'>" . $contenu . '</div>', $onload);
45}
46
47// https://code.spip.net/@mutualiser_creer
48function mutualiser_creer($e, $options) {
49        include_spip('base/abstract_sql');
50        include_once dirname(__FILE__) . '/base/abstract_mutu.php';
51
52        $GLOBALS['meta']['charset'] = 'utf-8'; // pour que le mail fonctionne
53
54        //$GLOBALS['spip_connect_version'] = 0.7;
55
56        if (!defined('_INSTALL_SERVER_DB')) {
57                define('_INSTALL_SERVER_DB', 'mysql');
58        }
59
60        header('Cache-Control: no-store, no-cache, must-revalidate');
61        header('Pragma: no-cache');
62        header('HTTP/1.1 503 Service Unavailable');
63        header('Retry-After: 3600');
64
65        mutu_etape_code_activation($e, $options);
66        mutu_etape_creer_repertoires($e, $options);
67        mutu_etape_creer_base($e, $options);
68        mutu_etape_fin($e, $options);
69}
70
71/*
72 * Code d'activation du site
73 *
74 * Demander le code pour autoriser cette creation de site
75 * Si le code est valide, poser un cookie
76 *
77 */
78function mutu_etape_code_activation($e, $options) {
79        /*
80         * Cas de la mutu par identification sur site maitre
81         * Verifie en premier lieu si le code donne par l'utilisateur est son mot de passe valide
82         * Sinon on teste si c'est le code d'activation
83         */
84        $panel_nok = true;
85        if ($options['utiliser_panel'] && !defined(_INSTALL_PANEL_HOST_DB)) {
86                if (is_dir(_DIR_RACINE . $options['repertoire'] . '/' . $_SERVER['HTTP_HOST'] . '_disable')) {
87                        $lien = $options['url_contact_hebergeur'] ? $options['url_contact_hebergeur'] : ($options['url_hebergeur'] ? $options['url_hebergeur'] : _SITES_ADMIN_MUTUALISATION);
88                        echo mutu_minipres(
89                                _T('mutu:site_suspendu'),
90                                mutu_menu_langues() .
91                                "<div><img alt='SPIP' src='" . _SPIP_LOGO_MUTU . "' /></div>\n" .
92                                '<h3>' . _T('mutu:message_site_desactive', array('lien' => $lien)) . '</h3>',
93                                " id='mutu'"
94                        );
95                        exit;
96                } elseif (is_dir(_DIR_RACINE . $options['repertoire'] . '/' . $_SERVER['HTTP_HOST'] . '_deleted')) {
97                        $lien = $options['url_contact_hebergeur'] ? $options['url_contact_hebergeur'] : ($options['url_hebergeur'] ? $options['url_hebergeur'] : _SITES_ADMIN_MUTUALISATION);
98                        echo mutu_minipres(
99                                _T('mutu:site_supprime'),
100                                mutu_menu_langues() .
101                                "<div><img alt='SPIP' src='" . _SPIP_LOGO_MUTU . "' /></div>\n" .
102                                '<h3>' . _T('mutu:message_site_desactive', array('lien' => $lien)) . '</h3>',
103                                " id='mutu'"
104                        );
105                        exit;
106                } elseif (!$options['statut']) {
107                        $lien = $options['url_contact_hebergeur'] ? $options['url_contact_hebergeur'] : ($options['url_hebergeur'] ? $options['url_hebergeur'] : _SITES_ADMIN_MUTUALISATION);
108                        echo mutu_minipres(
109                                _T('mutu:site_non_demande'),
110                                mutu_menu_langues() .
111                                "<div><img alt='SPIP' src='" . _SPIP_LOGO_MUTU . "' /></div>\n" .
112                                '<h3>' . _T('mutu:message_site_desactive', array('lien' => $lien)) . '</h3>',
113                                " id='mutu'"
114                        );
115                        exit;
116                } elseif ($options['statut'] != 'publie') {
117                        $lien = $options['url_contact_hebergeur'] ? $options['url_contact_hebergeur'] : ($options['url_hebergeur'] ? $options['url_hebergeur'] : _SITES_ADMIN_MUTUALISATION);
118                        echo mutu_minipres(
119                                _T('mutu:site_non_active'),
120                                mutu_menu_langues() .
121                                "<div><img alt='SPIP' src='" . _SPIP_LOGO_MUTU . "' /></div>\n" .
122                                '<h3>' . _T('mutu:message_site_desactive', array('lien' => $lien)) . '</h3>',
123                                " id='mutu'"
124                        );
125                        exit;
126                }
127                include_spip('base/abstract_sql');
128                $old_connect = _FILE_CONNECT;
129                define(_FILE_CONNECT, $options['repertoire'] . '/' . _SITES_ADMIN_MUTUALISATION . '/config/connect.php');
130                define(_FILE_CONNECT_OLD, $options['repertoire'] . '/' . _SITES_ADMIN_MUTUALISATION . '/config/connect.php');
131                include_spip('auth/spip');
132                $admin = auth_spip_dist($options['login'], $_REQUEST['code_activation']);
133                if (!empty($admin)) {
134                        setcookie('mutu_methode_activation', $panel);
135                        $panel_nok = false;
136                }
137                define(_FILE_CONNECT, $old_connect);
138        }
139        if ($options['code']) {
140                $secret = md5($options['code']);
141
142                if (
143                        $panel_nok and (
144                                $options['code'] != (empty($_REQUEST['code_activation']) ? '' : $_REQUEST['code_activation'])
145                                and $secret != (empty($_COOKIE['mutu_code_activation']) ? '' : $_COOKIE['mutu_code_activation'])
146                        )
147                ) {
148                        echo mutu_minipres(
149                                _T('mutu:install_site'),
150                                mutu_menu_langues() .
151                                "<div><img alt='SPIP' src='" . _SPIP_LOGO_MUTU . "' /></div>\n" .
152                                (isset($_REQUEST['code_activation'])
153                                        ? _T('mutu:install_err')
154                                        : ''
155                                ) .
156                                '<h3>' .
157                                ($options['utiliser_panel'] ? _T('mutu:install_code_panel') : _T('mutu:install_code')) .
158                                '</h3>' .
159                                "<form method='post' action='" . self() . "'><div>
160                <input type='password' name='code_activation' size='10' />
161                <input type='submit' value='ok' />"
162                                . $options['annonce']
163                                . '</div></form>
164                ',
165                                " id='mutu'"
166                        );
167                        exit;
168                } else {
169                        setcookie('mutu_code_activation', $secret);
170                }
171        }
172}
173
174/*
175 * Creation de la base
176 *
177 * Cree la base de donnee
178 * Cree eventuellement un utilisateur pour cette base
179 *
180 */
181function mutu_etape_creer_base($e, $options) {
182        if ($options['creer_base']) {
183                if (defined('_INSTALL_SERVER_DB')
184                        and defined('_INSTALL_NAME_DB')
185                ) {
186                        if (defined('_INSTALL_USER_DB_ROOT')) {
187                                $link = mutu_connect_db(_INSTALL_HOST_DB, 0, _INSTALL_USER_DB_ROOT, _INSTALL_PASS_DB_ROOT, '',
188                                        _INSTALL_SERVER_DB);
189                        } else {
190                                $link = mutu_connect_db(_INSTALL_HOST_DB, 0, _INSTALL_USER_DB, _INSTALL_PASS_DB, '',
191                                        _INSTALL_SERVER_DB);
192                        }
193
194                        // si la base n'existe pas, on va travailler
195
196                        if (!sql_selectdb(_INSTALL_NAME_DB, _INSTALL_SERVER_DB)) {
197                                if (_request('creerbase') == 'oui') {
198                                        // mode de creation par un ping sur une URL (AlternC)
199                                        // on le fait en local et en POST, donc pas de trou de secu
200                                        // curl indispensable pour le https... devrait aller dans inc/distant
201                                        if ($options['url_creer_base']
202                                                and defined('_INSTALL_NAME_DB')
203                                        ) {
204                                                $url = str_replace('%x', _INSTALL_NAME_DB, $options['url_creer_base']);
205                                                $ch = curl_init($url);
206                                                curl_setopt($ch, CURLOPT_HEADER, 0);
207                                                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
208                                                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
209                                                curl_setopt($ch, CURLOPT_POST, 1);
210                                                $page = curl_exec($ch);
211                                                curl_close($ch);
212                                                if (!sql_selectdb(_INSTALL_NAME_DB, _INSTALL_SERVER_DB)) {
213                                                        echo mutu_minipres(
214                                                                _T('mutu:install_bd_echec', array('nombase' => '<tt>' . _INSTALL_NAME_DB . '</tt>')),
215                                                                "<div><img alt='SPIP' src='" . _SPIP_LOGO_MUTU . "' /></div>\n" .
216                                                                '<h3>'
217                                                                . '<a href="' . parametre_url(self(), 'creerbase',
218                                                                        'oui') . '">' . _T('mutu:install_bd_reessayer') . '</a>'
219                                                                . '</h3>',
220                                                                "id='mutu"
221                                                        );
222                                                        exit;
223                                                }
224                                        } elseif (sql_query('CREATE DATABASE ' . _INSTALL_NAME_DB, _INSTALL_SERVER_DB)
225                                                and sql_selectdb(_INSTALL_NAME_DB, _INSTALL_SERVER_DB)
226                                        ) {
227                                                $GLOBALS['connexions'][_INSTALL_SERVER_DB]['prefixe'] = $GLOBALS['table_prefix'];
228                                                $GLOBALS['connexions'][_INSTALL_SERVER_DB]['db'] = _INSTALL_NAME_DB;
229
230                                                /*
231                                                 * Creation d'un utilisateur pour la base nouvellement cree
232                                                 *
233                                                 * Pour chaque base creee on cree aussi un user
234                                                 * MYSQL specifique qui aura les droits sur la base
235                                                 */
236                                                if ($options['creer_user_base']) {
237                                                        // le nom de la machine MySQL peut etre different
238                                                        // du nom de la connexion via DNS
239                                                        define('_INSTALL_HOST_DB_LOCALNAME', _INSTALL_HOST_DB);
240
241                                                        // requete differente entre pg et mysql...
242                                                        $req = $err = array();
243                                                        switch (strtolower(_INSTALL_SERVER_DB)) {
244                                                                case 'pg':
245                                                                        // d'abord creer l'utilisateur
246                                                                        $req[] = 'CREATE USER ' . _INSTALL_USER_DB . " WITH PASSWORD '" . _INSTALL_PASS_DB . "'";
247                                                                        $err[] = 'CREATE USER ' . _INSTALL_USER_DB . " WITH PASSWORD 'xxx'";
248                                                                        // l'affecter a sa base de donnee
249                                                                        $req[] = $r = 'GRANT ALL PRIVILEGES ON DATABASE '
250                                                                                . _INSTALL_NAME_DB . ' TO ' . _INSTALL_USER_DB;
251                                                                        $err[] = $r;
252                                                                        break;
253
254                                                                case 'mysql':
255                                                                default:
256                                                                        // creer user
257                                                                        $req[] = "CREATE user '" . _INSTALL_USER_DB . "'@'" . _INSTALL_HOST_DB_LOCALNAME . "' IDENTIFIED BY '" . _INSTALL_PASS_DB . "'";
258                                                                        $err[] = "CREATE user '" . _INSTALL_USER_DB . "'@'" . _INSTALL_HOST_DB_LOCALNAME . "' IDENTIFIED BY 'xxx'";
259                                                                        // affecter a sa base
260                                                                        $req[] = 'GRANT ' . _PRIVILEGES_MYSQL_USER_BASE . ' ON '
261                                                                                . _INSTALL_NAME_DB . ".* TO '"
262                                                                                . _INSTALL_USER_DB . "'@'" . _INSTALL_HOST_DB_LOCALNAME
263                                                                                . "' IDENTIFIED BY '" . _INSTALL_PASS_DB . "'";
264                                                                        $err[] = 'GRANT ' . _PRIVILEGES_MYSQL_USER_BASE . ' ON '
265                                                                                . _INSTALL_NAME_DB . ".* TO '"
266                                                                                . _INSTALL_USER_DB . "'@'" . _INSTALL_HOST_DB_LOCALNAME
267                                                                                . "' IDENTIFIED BY 'xxx'";
268                                                                        break;
269                                                        }
270                                                        foreach ($req as $n => $sql) {
271                                                                if (!sql_query($sql, _INSTALL_SERVER_DB)) {
272                                                                        die(__FILE__ . ' ' . __LINE__ . ': Erreur (' . _INSTALL_SERVER_DB . ') sur  :' . $err[$n]);
273                                                                }
274                                                        }
275                                                        mutu_close();
276                                                        $link = mutu_connect_db(_INSTALL_HOST_DB, '', _INSTALL_USER_DB, _INSTALL_PASS_DB, '',
277                                                                _INSTALL_SERVER_DB);
278                                                }
279
280                                                // creation ok
281                                                // supprimer le fichier d'installation
282                                                include_spip('inc/flock');
283                                                @supprimer_fichier($e . _NOM_TEMPORAIRES_INACCESSIBLES . _MUTU_INSTALLATION_FILE);
284
285                                                echo mutu_minipres(
286                                                        _T('mutu:install_bd_cree', array('nombase' => '<tt>' . _INSTALL_NAME_DB . '</tt>')),
287                                                        "<div><img alt='SPIP' src='" . _SPIP_LOGO_MUTU . "' /></div>\n" .
288                                                        '<h3>'
289                                                        . _T('mutu:install_spip_1')
290                                                        . '<a href="' . generer_url_ecrire('install') . '">'
291                                                        . _T('mutu:install_spip_2')
292                                                        . '</a>.</h3>',
293                                                        " id='mutu'"
294                                                );
295
296                                                if ($options['mail']) {
297                                                        $mail = charger_fonction('envoyer_mail', 'inc');
298                                                        $mail($options['mail'],
299                                                                _T('mutu:install_creation_bd', array('nombase' => _INSTALL_NAME_DB)),
300                                                                _T('mutu:install_creation_bd_site_2', array(
301                                                                        'base' => _INSTALL_NAME_DB . '@' . _INSTALL_HOST_DB . ' (' . _INSTALL_USER_DB . ')',
302                                                                        'site' => $e
303                                                                )),
304                                                                $options['mail']
305                                                        );
306                                                }
307                                                exit;
308                                        } else {
309                                                echo mutu_minipres(
310                                                        _T('mutu:install_creation_bd', array('nombase' => '<tt>' . _INSTALL_NAME_DB . '</tt>')),
311                                                        "<div><img alt='SPIP' src='" . _SPIP_LOGO_MUTU . "' /></div>\n" .
312                                                        '<h3>'
313                                                        . _T('mutu:install_err')
314                                                        . '</h3>',
315                                                        " id='mutu'"
316                                                );
317                                                exit;
318                                        }
319                                } else {
320                                        echo mutu_minipres(
321                                                _T('mutu:install_creation_bd', array('nombase' => '<tt>' . _INSTALL_NAME_DB . '</tt>')),
322                                                "<div><img alt='SPIP' src='" . _SPIP_LOGO_MUTU . "' /></div>\n" .
323                                                '<h3>'
324                                                . _T('mutu:install_creer_bd_1')
325                                                . '<a href="' . parametre_url(self(), 'creerbase', 'oui') . '">'
326                                                . _T('mutu:install_creer_bd_2')
327                                                . '</a></h3>',
328                                                " id='mutu'"
329                                        );
330                                        exit;
331                                }
332                        }
333
334                        // ici la base existe, on passe aux repertoires
335                } else {
336                        echo mutu_minipres(
337                                _T('mutu:install_creation_bd_site') . '(<tt>' . joli_repertoire($e) . '</tt>)',
338                                "<div><img alt='SPIP' src='" . _SPIP_LOGO_MUTU . "' /></div>\n"
339                                . '<h3>' . _T('mutu:install_err') . '</h3>'
340                                . _T('mutu:install_no_data_connexion', array('connexion' => strtoupper(_INSTALL_SERVER_DB))),
341                                " id='mutu'"
342                        );
343                        exit;
344                }
345        }
346}
347
348/*
349 * Cree les dossiers necessaires au site mutualise
350 */
351function mutu_etape_creer_repertoires($e, $options) {
352        if ($options['creer_site']) {
353                $ok_dir =
354                        is_dir(_DIR_RACINE . $options['repertoire'])
355                and is_writable(_DIR_RACINE . $options['repertoire']);
356
357                if (!$ok_dir) {
358                        echo mutu_minipres(
359                                _T('mutu:install_creation_repertoire', array('repertoire' => '<tt>' . joli_repertoire($e) . '</tt>')),
360                                "<div><img alt='SPIP' src='" . _SPIP_LOGO_MUTU . "' /></div>\n"
361                                . '<h3>' . _T('mutu:install_err') . '</h3>'
362                                . _T('mutu:install_repertoire_inaccessible',
363                                        array('repertoire' => '<tt>' . $options['repertoire'] . '/</tt>')),
364                                " id='mutu'"
365                        );
366                        exit;
367                }
368
369                if (_request('creerrepertoire') && _request('creerrepertoire') == 'oui') {
370                        $ok =
371                                mkdir($e, _SPIP_CHMOD)
372                        and chmod($e, _SPIP_CHMOD)
373                        and mkdir($e . _NOM_PERMANENTS_INACCESSIBLES, _SPIP_CHMOD)
374                        and mkdir($e . _NOM_PERMANENTS_ACCESSIBLES, _SPIP_CHMOD)
375                        and mkdir($e . _NOM_TEMPORAIRES_INACCESSIBLES, _SPIP_CHMOD)
376                        and mkdir($e . _NOM_TEMPORAIRES_ACCESSIBLES, _SPIP_CHMOD)
377                        and chmod($e . _NOM_PERMANENTS_INACCESSIBLES, _SPIP_CHMOD)
378                        and chmod($e . _NOM_PERMANENTS_ACCESSIBLES, _SPIP_CHMOD)
379                        and chmod($e . _NOM_TEMPORAIRES_INACCESSIBLES, _SPIP_CHMOD)
380                        and chmod($e . _NOM_TEMPORAIRES_ACCESSIBLES, _SPIP_CHMOD);
381
382                        // pour signaler qu'il reste des etapes a realises,
383                        // malgre la presence des repertoires
384                        if ($ok) {
385                                include_spip('inc/flock');
386                                ecrire_fichier($e . _NOM_TEMPORAIRES_INACCESSIBLES . _MUTU_INSTALLATION_FILE, 'ok');
387                        }
388
389                        echo mutu_minipres(
390                                _T('mutu:install_creation_repertoire', array('repertoire' => '<tt>' . joli_repertoire($e) . '</tt>')),
391                                "<div><img alt='SPIP' src='" . _SPIP_LOGO_MUTU . "' /></div>\n"
392                                . '<h3>'
393                                . ($ok
394                                        ? _T('mutu:install_creation_rep_ok_1') . '<a href="' . parametre_url(self(), 'creerrepertoire',
395                                                '') . '">' . _T('mutu:install_creation_rep_ok_2') . '</a>.'
396                                        : _T('mutu:install_err')
397                                ) . '</h3>',
398                                " id='mutu'"
399                        );
400
401                        if ($options['mail']) {
402                                $mail = charger_fonction('envoyer_mail', 'inc');
403                                $mail($options['mail'],
404                                        _T('mutu:install_creation_site', array('site' => joli_repertoire($e))),
405                                        _T('mutu:install_creation_site', array('site' => $e)),
406                                        $options['mail']
407                                );
408                        }
409                        exit;
410                } elseif (!is_dir($e . _NOM_PERMANENTS_INACCESSIBLES)
411                        || !is_dir($e . _NOM_PERMANENTS_ACCESSIBLES)
412                        || !is_dir($e . _NOM_TEMPORAIRES_INACCESSIBLES)
413                        || !is_dir($e . _NOM_TEMPORAIRES_ACCESSIBLES)
414                ) {
415                        echo mutu_minipres(
416                                _T('mutu:install_creation_repertoire', array('repertoire' => '<tt>' . joli_repertoire($e) . '</tt>')),
417                                "<div><img alt='SPIP' src='" . _SPIP_LOGO_MUTU . "' /></div>\n"
418                                . '<h3>' .
419                                _T('mutu:install_creer_rep_1')
420                                . '<a href="' . parametre_url(self(), 'creerrepertoire', 'oui') . '">'
421                                . _T('mutu:install_creer_rep_2')
422                                . '</a></h3>'
423                                . (!$ok_dir ? _T('mutu:install_repertoire_inaccessible',
424                                        array('repertoire' => '<tt>' . $options['repertoire'] . '/</tt>')) : ''),
425                                " id='mutu'"
426                        );
427                        exit;
428                }
429        } else {
430                echo mutu_minipres(
431                        _T('mutu:install_repertoire_noexist', array('repertoire' => '<tt>' . joli_repertoire($e) . '</tt>')),
432                        "<div><img alt='SPIP' src='" . _SPIP_LOGO_MUTU . "' /></div>\n" .
433                        '<h3>'
434                        . _T('mutu:install_repertoire_noexist', array('repertoire' => joli_repertoire($e)))
435                        . '</h3>'
436                        . '<ul>'
437                        . '<li>' . joli_repertoire($e) . _NOM_PERMANENTS_INACCESSIBLES . '</li>'
438                        . '<li>' . joli_repertoire($e) . _NOM_PERMANENTS_ACCESSIBLES . '</li>'
439                        . '<li>' . joli_repertoire($e) . _NOM_TEMPORAIRES_INACCESSIBLES . '</li>'
440                        . '<li>' . joli_repertoire($e) . _NOM_TEMPORAIRES_ACCESSIBLES . '</li>'
441                        . '</ul>',
442                        " id='mutu'"
443                );
444                exit;
445        }
446}
447
448/*
449 * Fin de la procedure, proposer l'installation de SPIP
450 */
451function mutu_etape_fin($e, $options) {
452        // supprimer le fichier d'installation
453        include_spip('inc/flock');
454        @supprimer_fichier($e . _NOM_TEMPORAIRES_INACCESSIBLES . _MUTU_INSTALLATION_FILE);
455        $GLOBALS['profondeur_url'] = 0;
456        echo mutu_minipres(
457                _T('mutu:install_rep_bd_ok'),
458                "<div><img alt='SPIP' src='"
459                . _SPIP_LOGO_MUTU
460                . "' /></div>\n"
461                . '<h3>'
462                . _T('mutu:install_spip_3', array('url' => generer_url_ecrire('install')))
463                . '</h3>',
464                " id='mutu'"
465        );
466        exit;
467}
Note: See TracBrowser for help on using the repository browser.