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

Last change on this file since 59992 was 59992, checked in by suske@…, 9 years ago

Je reconnais que c'est un peu compliqué pour moi mais bon... Cette virgule fait gueuler spip dans mysql.log et voyant le code produit, marcimat me dit "c'est quoi cette virgule ?" Du coup, soit personne n'a jamais utilisé cette fonction, soit elle a toujours été corrigée localement sans retour ici. Bref gogogo :-p

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.