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

Last change on this file since 48944 was 43520, checked in by kent1@…, 10 years ago

Préparer l'arrivée d'un nouveau panel

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