source: spip-zone/_plugins_/_stable_/mutualisation/mutualiser.php @ 26070

Last change on this file since 26070 was 25547, checked in by marcimat@…, 12 years ago

@list() pour eviter une notice PHP lorsque le deuxième param est absent

File size: 8.9 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
15
16// Demarrer un site dans le sous-repertoire sites/$f/
17// Options :
18// creer_site => on va creer les repertoires qui vont bien (defaut: false)
19// cookie_prefix, table_prefix => regler les prefixes (defaut: true)
20// http://doc.spip.org/@demarrer_site
21function demarrer_site($site = '', $options = array()) {
22        if (!$site) return;
23
24        // On test si on a une information de port dans l'url ex: http://$site:80/
25        // Si il y a un port de défini on renvoie vers le bon dossier squelette
26        @list($site, $port) = explode(':', $site);
27       
28        $options = array_merge(
29                array(
30                        'creer_site' => false,
31                        'creer_base' => false,
32                        'creer_user_base' => false,
33                        'mail' => '',
34                        'code' => 'ecureuil', // code d'activation par defaut
35                        'table_prefix' => false,
36                        'cookie_prefix' => false,
37                        'repertoire' => 'sites',
38                        'utiliser_panel' => false,
39                        'url_img_courtes' => false
40                ),
41                $options
42        );
43
44        $GLOBALS['mutualisation_dir'] = $options['repertoire'];
45       
46        if ($options['cookie_prefix'])
47                $GLOBALS['cookie_prefix'] = prefixe_mutualisation($site);
48        if ($options['table_prefix'])
49                $GLOBALS['table_prefix'] = prefixe_mutualisation($site);
50
51        /*
52         * Si le dossier du site n'existe pas
53         * ou si le fichier de connexion a la bdd est absent,
54         * le site n'est pas totalement installe.
55         *
56         * Il faut lancer la creation de mutualisation
57         */
58        if  ($a_installer = (!is_dir($e = _DIR_RACINE . $options['repertoire'].'/' . $site . '/')
59            OR !(defined('_DIR_CONNECT')?
60                        (defined('_FILE_CONNECT_INS')?
61                                   file_exists(_DIR_CONNECT . _FILE_CONNECT_INS . '.php'):
62                                   file_exists(_DIR_CONNECT . 'connect.php')):
63                        (defined('_FILE_CONNECT_INS')?
64                                   file_exists($e . _NOM_PERMANENTS_INACCESSIBLES . _FILE_CONNECT_INS . '.php'):
65                                   file_exists($e . _NOM_PERMANENTS_INACCESSIBLES . 'connect.php'))
66                        )
67                ))
68        {       
69                /*
70                 * - Recuperer les identifiants manquants
71                 *
72                 * Nota :
73                 * Il faut que _INSTALL_(NAME|USER|PASS) soient definis ici
74                 * et non dans le fichier mutualiser_creer() car
75                 * ces constantes sont necessaires a l'installation de SPIP
76                 * (ecrire/?exec=install). Dans le cas contraire, le formulaire
77                 * d'installation n'est pas prerempli.
78                 *
79                 *
80                 * > Cas de la gestion d'un pannel
81                 * Recuperer les mots de passes du futur compte dans une table speciale
82                 * Voir http://www.spip-contrib.net/Service-d-hebergement-mutualise
83                 */
84                if ($options['utiliser_panel']) {
85                        include_spip('inc/minipres');
86                        include_spip('base/abstract_sql');
87                        include_once(dirname(__FILE__).'/base/abstract_mutu.php');
88                       
89                        // On cherche en BD si le site est enregistre et on recupere
90                        // password et code d'activation
91                        $link = @mutu_connect_db(_INSTALL_PANEL_HOST_DB, 0, _INSTALL_PANEL_USER_DB, _INSTALL_PANEL_PASS_DB, '', _INSTALL_SERVER_DB);
92                        @sql_selectdb(_INSTALL_PANEL_NAME_DB, _INSTALL_SERVER_DB);
93                        $result=@sql_query("SELECT "
94                                                . _INSTALL_PANEL_FIELD_CODE . " AS code," 
95                                                . _INSTALL_PANEL_FIELD_PASS . " AS pass," 
96                                                . _INSTALL_PANEL_FIELD_SITE . " AS site," 
97                                                . " FROM " . _INSTALL_PANEL_NAME_TABLE 
98                                                . " WHERE "._INSTALL_PANEL_FIELD_SITE . " = '$site'"
99                                                , _INSTALL_SERVER_DB);
100                        if (sql_count($result)>0) {
101                                $data = sql_fetch($result);
102                                $options['code'] = $data['code'];
103                                define ('_INSTALL_NAME_DB', _INSTALL_NAME_DB);
104                                define ('_INSTALL_USER_DB', _INSTALL_NAME_DB);
105                                define ('_INSTALL_PASS_DB', $data['pass']);
106                        }
107                        else {
108                                echo minipres(
109                                        _L('<h2>Erreur 404 : page inexistante</h2>')
110                                );
111                                exit;
112                        }
113                /*
114                 * > Cas de creation d'utilisateur de la base SQL
115                 * (nom et pass non attribuees par un panel)
116                 */             
117                } elseif ($options['creer_user_base']) {
118               
119                        // nom d'utilisateur et mot de passe
120                        define('_INSTALL_USER_DB', _INSTALL_NAME_DB);
121                        define('_INSTALL_PASS_DB',
122                                substr(md5(
123                                        _INSTALL_PASS_DB_ROOT   # secret du site
124                                        . $_SERVER['REMOTE_ADDR'] # un truc variable
125                                        . _INSTALL_USER_DB # un autre truc variable
126                                ), 0, 8)
127                        );
128                }
129               
130                /*
131                 * Si l'installation n'est pas faite,
132                 * il faut soit creer le site mutualise
133                 * soit lancer la procedure d'installation de SPIP
134                 * si le site a deja ete cree
135                 */
136                if ($a_installer) {
137                        /*
138                         * Pour savoir si l'installation de la mutu est terminee,
139                         * on verifie que le fichier d'installation a bien ete supprime
140                         * sinon, c'est qu'il reste quelque chose a faire.
141                         */
142                        define('_MUTU_INSTALLATION_FILE','mutu_tmp_install.txt');
143                       
144                        if (!is_dir($e) || is_file($e . _NOM_TEMPORAIRES_INACCESSIBLES . _MUTU_INSTALLATION_FILE)){
145                                spip_initialisation(
146                                        (_DIR_RACINE  . _NOM_PERMANENTS_INACCESSIBLES),
147                                        (_DIR_RACINE  . _NOM_PERMANENTS_ACCESSIBLES),
148                                        (_DIR_RACINE  . _NOM_TEMPORAIRES_INACCESSIBLES),
149                                        (_DIR_RACINE  . _NOM_TEMPORAIRES_ACCESSIBLES)
150                                );
151                                include_once dirname(__FILE__).'/mutualiser_creer.php';
152                                mutualiser_creer($e, $options);
153                                exit;
154                        }
155                }
156
157        }
158
159        /*
160         * Tout est pret, on execute la mutualisation.
161         */
162        define('_SPIP_PATH',
163                $e . ':' .
164                _DIR_RACINE .':' . 
165                _DIR_RACINE .'squelettes-dist/:' .
166                _DIR_RACINE .'prive/:' .
167                _DIR_RESTREINT);
168
169        // definir une constante qui contient l'adresse du repertoire du site mutualise
170        // peut servir dans les fichiers mes_options des sites inclus
171        // par exemple avec  $GLOBALS['dossier_squelettes'] = _DIR_SITE . 'squelettes:' . _DIR_SITE . 'cheznous:dist';
172        define('_DIR_SITE' , $e);
173
174        if (is_dir($e.'squelettes'))
175                $GLOBALS['dossier_squelettes'] = $options['repertoire'].'/' . $site . '/squelettes';
176
177        if (is_readable($f = $e._NOM_PERMANENTS_INACCESSIBLES._NOM_CONFIG.'.php')) 
178                include($f); // attention cet include n'est pas en globals
179
180        $init = function_exists('spip_initialisation_core') 
181                ?'spip_initialisation_core' // mieux pour la 2.0, mais absente avant...
182                :'spip_initialisation';
183        $init(
184                ($e . _NOM_PERMANENTS_INACCESSIBLES),
185                ($e . _NOM_PERMANENTS_ACCESSIBLES),
186                ($e . _NOM_TEMPORAIRES_INACCESSIBLES),
187                ($e . _NOM_TEMPORAIRES_ACCESSIBLES)
188        );     
189
190
191        /*
192         * Ajouter le chemin vers l'exec=mutualisation pour le site maitre
193         * et seulement pour lui (pour en mettre plusieurs, les separer par
194         * des virgules).
195         */
196        if (_request('exec') === 'mutualisation') {
197                if (!defined('_SITES_ADMIN_MUTUALISATION')
198                OR in_array($site, explode(',',_SITES_ADMIN_MUTUALISATION))) {
199                        _chemin(dirname(__FILE__));
200                }
201
202                // Si un upgrade est demande dans le site fils, et securise par md5
203                // depuis le panneau de controle, le faire directement
204                if (_request('upgrade') == 'oui') {
205                        include_once dirname(__FILE__).'/mutualiser_upgrade.php';
206                        mutualiser_upgrade();
207                }
208        }
209       
210       
211        /*
212         * Gestion des url d'images courtes
213         * sites/nom/IMG/image.jpg -> IMG/image.jpg
214         *
215         * Ne fonctionne que pour de la mutualisation
216         * sur des noms de domaines.
217         *
218         * Une mutualisation de repertoire
219         * ne pourra fonctionner car les fichiers
220         * .htaccess de /IMG et /local n'ont pas
221         * connaissance du nom du repertoire.
222         *
223         * A mettre au debut du pipe pour compatibilite avec fastcache
224         */
225        if ($options['url_img_courtes']) {
226                $GLOBALS['spip_pipeline']['affichage_final']
227                        = '|mutualisation_url_img_courtes'
228                        . $GLOBALS['spip_pipeline']['affichage_final'];
229        }
230}
231
232// transformer les sites/truc/IMG/rtf/chose.rtf en /IMG/...
233function mutualisation_url_img_courtes($flux) {
234        if (strpos($flux, _DIR_IMG)
235        OR strpos($flux, _DIR_VAR)) {
236                require_once dirname(__FILE__).'/mutualiser_gerer_img.php';
237                return mutualisation_traiter_url_img_courtes($flux);
238        }
239        else
240                return $flux;
241}
242
243// Cette fonction cree un prefixe acceptable par MySQL a partir du nom
244// du site ; a utiliser comme prefixe des tables, comme suffixe du nom
245// de la base de donnees ou comme prefixe des cookies... unicite quasi garantie
246// Max 12 caracteres a-z0-9, qui ressemblent au domaine et ne commencent
247// pas par un chiffre
248// http://doc.spip.org/@prefixe_mutualisation
249function prefixe_mutualisation($site) {
250        static $prefix = array();
251
252        if (!isset($prefix[$site])) {
253                $p = preg_replace(',^www\.|[^a-z0-9],', '', strtolower($site));
254                // si c'est plus long que 12 on coupe et on pose un md5 d'unicite
255                // meme chose si ca contenait un caractere autre que [a-z0-9],
256                // afin d'eviter de se faire chiper c.a.domaine.tld par ca.domaine.tld
257                if (strlen($p) > 12
258                OR $p != $site)
259                        $p = substr($p, 0, 8) . substr(md5($site),-4);
260                // si ca commence par un chiffre on ajoute a
261                if (ord($p) < 58)
262                        $p = 'a'.$p;
263                $prefix[$site] = $p;
264        }
265        return $prefix[$site];
266
267}
268
269
270
271?>
Note: See TracBrowser for help on using the repository browser.