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