Browse Source

Fusion des fonctions spip_initialisation et spip_intialisation_parametree.

Suite à quelques essais (pas toujours réussis il est vrai) et échanges divers, l'installation de Spip, notamment en mutualisé, repose à présent sur les symboles suivants:

- plusieurs constantes _DIR_* au début de inc_version définissent les répertoires où se trouvent les sources, considérées comme inaccessibles en écriture car partageable par plusieurs sites.

- ensuite, plusieurs constantes _NOM_* définissent le nom (relatif) des fichiers et répertoires propres et indispensables à chaque site utilisant Spip, savoir 

	define('_NOM_CONFIG', 'mes_options');	
	define('_NOM_TEMPORAIRES_INACCESSIBLES', "tmp/"); 
	define('_NOM_TEMPORAIRES_ACCESSIBLES', "var/");
	define('_NOM_PERMANENTS_INACCESSIBLES', "etc/");
	define('_NOM_PERMANENTS_ACCESSIBLES', "IMG/");

	var/ comportant les images réduites créé dynamiquement
	tmp/ jouant le role d'ecrire/data  et comportant egalement CACHE/
	etc/ jouant le role de ecrire/ en tant que repertoire accessible en écriture.

- inc_version ne définit plus de fontions, mais charge immédiatement inc/utils qui à l'inverse ne fait que définir des fonctions.

- inc_version charge ensuite le fichier ecrire/mes_options.php (pour compatibilité) ou etc/mes_options (préférable aujourd'hui);

- enfin, il appelle la fonction d'initialisation ainsi:

	@spip_initialisation(
	       (_DIR_RACINE  . _NOM_PERMANENTS_INACCESSIBLES),
	       (_DIR_RACINE  . _NOM_PERMANENTS_ACCESSIBLES),
	       (_DIR_RACINE  . _NOM_TEMPORAIRES_INACCESSIBLES),
	       (_DIR_RACINE  . _NOM_TEMPORAIRES_ACCESSIBLES)
	       );

ce qui va définir les 4 répertoires accessibles en écriture à la racine du site, et initialiser toutes les autres constantes (notamment _SPIP_CHMOD).

- toutefois l'inclusion de mes_options peut neutraliser cet appel soit partiellement (en définissant quelques unes des constantes normalement définies par spip_initialisation qui ne pourra plus agir dessus) soit totalement (en appelant lui-meme spip_initialisation avec d'autres arguments que ceux ci-dessus).

Une application typique est de mettre dans ecrire/mes_options.php (ou etc/mes_otpions.php) les lignes suivantes:

define('_SPIP_CHMOD', 0770);

if ( preg_match(',/([a-zA-Z0-9_-]*)[/?],',$_SERVER['REQUEST_URI'],$r)) {
	if (is_dir($e = _DIR_RACINE . 'Ajouts/' . $r[1]. '/')) {
		$cookie_prefix = $table_prefix = $r[1];
		define('_SPIP_PATH', 
			_DIR_RACINE . 'Ajouts/' . $table_prefix  . '/:' .
			_DIR_RACINE.':'.
			_DIR_RACINE .'dist/:' .
			_DIR_RESTREINT);

		spip_initialisation(
		       ($e . _NOM_PERMANENTS_INACCESSIBLES),
		       ($e . _NOM_PERMANENTS_ACCESSIBLES),
		       ($e . _NOM_TEMPORAIRES_INACCESSIBLES),
		       ($e . _NOM_TEMPORAIRES_ACCESSIBLES)
		       );

		if (is_readable($e .=  _NOM_CONFIG . '.php')) include($e);
	}
 }

La première ligne réduit l'accès aux répertoires et fichiers créés par le serveur http à ce seul serveur. 

A partir de l'URL du script appelé, les lignes suivantes déduisent un nom qui doit etre le nom d'un sous-répertoire Ajouts dans l'installation de Spip. L'exécution de ce script commence donc par déclarer les 4 sous-répertoires spécifiques au site, ainsi que le préfixe de ses table SQL. Au cas où existerait un fichier etc/mes_options pour ce site spécifique, celui est également chargé.

L'utilisation des constantes _NOM_* permet donc de disposer d'un ensemble de répertoires et fichiers qui n'ont meme pas à savoir s'ils utilisent une installation mutualisée ou non de Spip.

ATTENTION: il faut bien voir que les fonctions de inc/utils ne seront vraiment utilisables qu'après appel de spip_initialisation, car les constantes qu'elles utilisent (_DIR_TMP, _DIR_IMG etc) ne sont pas encore définies à l'entrée de mes_options (c'est justement ce qui permet de les personnaliser).
1.9.2
Committo,Ergo:sum 16 years ago
parent
commit
5b1b73fff6
  1. 10
      ecrire/action/purger.php
  2. 6
      ecrire/action/tester.php
  3. 2
      ecrire/inc/filtres.php
  4. 4
      ecrire/inc/filtres_images.php
  5. 8
      ecrire/inc/flock.php
  6. 2
      ecrire/inc/logos.php
  7. 8
      ecrire/inc/maintenance.php
  8. 2
      ecrire/inc/math.php
  9. 64
      ecrire/inc/utils.php
  10. 95
      ecrire/inc_version.php

10
ecrire/action/purger.php

@ -42,7 +42,7 @@ function action_purger_dist()
break;
case 'vignettes':
purger_repertoire(_DIR_TMP_IMG, $age='ignore', $regexp = '^cache\-');
purger_repertoire(_DIR_VAR, $age='ignore', $regexp = '^cache\-');
spip_log('vider le cache');
supprime_invalideurs();
purger_repertoire(_DIR_CACHE, 0);
@ -51,7 +51,7 @@ function action_purger_dist()
case 'taille_vignettes':
global $lang;
$handle = @opendir(_DIR_TMP_IMG);
$handle = @opendir(_DIR_VAR);
if (!$handle) return;
$taille = 0;
@ -59,8 +59,8 @@ function action_purger_dist()
// Eviter ".", "..", ".htaccess", etc.
if ($fichier[0] == '.') continue;
if ($regexp AND !ereg($regexp, $fichier)) continue;
if (is_dir(_DIR_TMP_IMG.$fichier) AND ereg("^cache-", $fichier)) {
$taille += calculer_taille_dossier(_DIR_TMP_IMG.$fichier);
if (is_dir($d = _DIR_VAR . $fichier) AND ereg("^cache-", $fichier)) {
$taille += calculer_taille_dossier($d);
}
}
closedir($handle);
@ -70,7 +70,7 @@ function action_purger_dist()
minipres('', "<div style='font-family: verdana, arial, sans; font-size: 12px;'>" .
_T('ecrire:taille_cache_image',
array('dir' => _DIR_IMG,
array('dir' => _DIR_VAR,
'taille' => "<b>".taille_en_octets($taille)."</b>")) .'</div>');
break;
}

6
ecrire/action/tester.php

@ -88,7 +88,7 @@ function action_tester_dist() {
"pnmtojpeg", $pnmscale_command);
$vignette = _ROOT_IMG_PACK."test.jpg";
$dest = _DIR_TMP_IMG . "test-jpg.jpg";
$dest = _DIR_VAR . "test-jpg.jpg";
$commande = "$jpegtopnm_command $vignette | $pnmscale_command -width 10 | $pnmtojpeg_command > $dest";
spip_log($commande);
exec($commande);
@ -98,7 +98,7 @@ function action_tester_dist() {
$giftopnm_command = str_replace("pnmscale", "giftopnm", $pnmscale_command);
$pnmtojpeg_command = str_replace("pnmscale", "pnmtojpeg", $pnmscale_command);
$vignette = _ROOT_IMG_PACK."test.gif";
$dest = _DIR_TMP_IMG . "test-gif.jpg";
$dest = _DIR_VAR . "test-gif.jpg";
$commande = "$giftopnm_command $vignette | $pnmscale_command -width 10 | $pnmtojpeg_command > $dest";
spip_log($commande);
exec($commande);
@ -108,7 +108,7 @@ function action_tester_dist() {
$pngtopnm_command = str_replace("pnmscale", "pngtopnm", $pnmscale_command);
$vignette = _ROOT_IMG_PACK."test.png";
$dest = _DIR_TMP_IMG . "test-gif.jpg";
$dest = _DIR_VAR . "test-gif.jpg";
$commande = "$pngtopnm_command $vignette | $pnmscale_command -width 10 | $pnmtojpeg_command > $dest";
spip_log($commande);
exec($commande);

2
ecrire/inc/filtres.php

@ -1589,7 +1589,7 @@ function direction_css ($css, $voulue='') {
return $f;
// 2.
$f = sous_repertoire (_DIR_TMP_IMG, 'cache-css')
$f = sous_repertoire (_DIR_VAR, 'cache-css')
. preg_replace(',.*/(.*?)(_rtl)?\.css,', '\1', $css)
. '.' . substr(md5($css), 0,4) . '_' . $ndir . '.css';

4
ecrire/inc/filtres_images.php

@ -43,7 +43,7 @@ function image_valeurs_trans($img, $effet, $forcer_format = false) {
$nom_fichier = substr($fichier, 0, strlen($fichier) - 4);
$fichier_dest = "$nom_fichier-$effet";
$fichier_dest = md5($fichier_dest);
$fichier_dest = sous_repertoire(_DIR_TMP_IMG, "cache-gd2") . $fichier_dest . "." .$terminaison_dest;
$fichier_dest = sous_repertoire(_DIR_VAR, "cache-gd2") . $fichier_dest . "." .$terminaison_dest;
$creer = true;
if (@filemtime($fichier) < @filemtime($fichier_dest)) {
@ -1623,7 +1623,7 @@ function produire_image_typo() {
$string = "$text-$taille-$couleur-$align-$police-$largeur-$hauteur_ligne-$padding";
$query = md5($string);
$dossier = sous_repertoire(_DIR_TMP_IMG, 'cache-texte');
$dossier = sous_repertoire(_DIR_VAR, 'cache-texte');
$fichier = "$dossier$query.png";
$flag_gd_typo = function_exists("imageftbbox")

8
ecrire/inc/flock.php

@ -182,12 +182,12 @@ function sous_repertoire($base, $subdir, $nobase = false) {
if ($f)
fclose($f);
else {
spip_log("echec creation $base${subdir}_");
spip_log("echec creation $base${subdir}");
redirige_par_entete(
generer_url_action('test_dirs',"test_dir=$base${subdir}_",true));
generer_url_action('test_dirs',"test_dir=$base${subdir}",true));
}
spip_log("faux sous-repertoire $base${subdir}_");
return "$baseaff${subdir}_";
spip_log("faux sous-repertoire $base${subdir}");
return "$baseaff${subdir}";
}
// compatibilite ascendante
// http://doc.spip.org/@creer_repertoire

2
ecrire/inc/logos.php

@ -65,7 +65,7 @@ function creer_vignette($image, $maxWidth, $maxHeight, $format, $destdir, $destf
// si le doc n'est pas une image, refuser
if (!$force AND !$img) return;
$destination = sous_repertoire(_DIR_IMG, $destdir) . $destfile;
$destination = sous_repertoire(_DIR_VAR, $destdir) . $destfile;
// chercher un cache
$vignette = '';

8
ecrire/inc/maintenance.php

@ -16,10 +16,12 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
// http://doc.spip.org/@cron_maintenance
function cron_maintenance ($t) {
// Verifier que le .htaccess (deny all) est bien la
// (re)mettre .htaccess avec deny from all
// dans les deux repertoires dits inaccessibles par http
include_spip('inc/acces');
verifier_htaccess(_DIR_CONFIG);
verifier_htaccess(_DIR_CACHE);
verifier_htaccess(_DIR_ETC);
verifier_htaccess(_DIR_TMP);
// Supprimer les vieilles fonctions ajax enregistrees
spip_query("DELETE FROM spip_ajax_fonc WHERE date < DATE_SUB(NOW(), INTERVAL 2 HOUR)");

2
ecrire/inc/math.php

@ -36,7 +36,7 @@ function image_math($tex) {
}
// Regarder dans le repertoire local des images TeX et blocs MathML
if (!@is_dir($dir_tex = _DIR_IMG_TMP.'cache-TeX/'))
if (!@is_dir($dir_tex = _DIR_VAR.'cache-TeX/'))
@mkdir ($dir_tex, _SPIP_CHMOD);
$fichier = $dir_tex .md5(trim($tex)).$ext;

64
ecrire/inc/utils.php

@ -933,24 +933,19 @@ function spip_register_globals() {
}
// Fonction definissant les repertoires et fichiers non partageables
// Elle indique dans $test_dirs ceux devant etre accessibles en ecriture
// Fonction d'initialisation, appelle dans inc_version ou mes_options
// Elle definit les repertoires et fichiers non partageables
// et indique dans $test_dirs ceux devant etre accessibles en ecriture
// mais ne touche pas a cette variable si elle est deja definie
// afin que mes_options.php puisse en specifier d'autres.
function spip_initialisation_parametree($pi=NULL, $pa=NULL, $ti=NULL, $ta=NULL){
static $too_late = 0;
if ($too_late++) return;
// Elle definit ensuite les noms des fichiers et les droits.
// Puis simule un register_global=on securise.
// http://doc.spip.org/@spip_initialisation
function spip_initialisation($pi=NULL, $pa=NULL, $ti=NULL, $ta=NULL) {
// Quatre repertoires modifiables par les scripts de SPIP
# Repertoire des fichiers Permanents Inaccessibles par http://
isset($pi) OR $pi = _DIR_RACINE.'config/';
# Repertoire des fichiers Permanents Accessibles par http://
isset($pa) OR $pa = _DIR_RACINE.'IMG/';
# Repertoire des fichiers Temporaires Inaccessibles par http://
isset($ti) OR $ti = _DIR_RACINE.'tmp/';
# Repertoire des fichiers Temporaires Accessibles par http://
isset($ta) OR $ta = _DIR_RACINE.'IMG/'; # provisoire ?
static $too_late = 0;
if ($too_late++) return;
define('_DIR_IMG', $pa);
define('_DIR_DOC', $pa);
@ -966,32 +961,24 @@ function spip_initialisation_parametree($pi=NULL, $pa=NULL, $ti=NULL, $ta=NULL){
define('_FILE_META', $ti . 'meta_cache.txt');
define('_DIR_TMP_IMG', $ta);
define('_DIR_VAR', $ta);
define('_DIR_CONFIG', $pi);
define('_DIR_ETC', $pi);
if (!isset($GLOBALS['test_dirs']))
$GLOBALS['test_dirs'] = array($pa, $ti, $ta);
// Definition des droits d'acces en ecriture
if (@is_readable($f = _DIR_CONFIG . 'chmod.php')) {
include_once $f;
} else
define('_SPIP_CHMOD', 0777);
define('_SPIP_CHMOD', 0777);
// Le fichier de connexion a la base de donnees
define('_FILE_CONNECT_INS', _DIR_CONFIG . 'connect');
define('_FILE_CONNECT_INS', _DIR_ETC . 'connect');
define('_FILE_CONNECT',
(@is_readable($f = _FILE_CONNECT_INS . '.php') ? $f
: (@is_readable($f = _DIR_RESTREINT . 'inc_connect.php') ? $f
: (@is_readable($f = _DIR_RESTREINT . 'inc_connect.php3') ? $f
: false))));
if (!isset($GLOBALS['test_dirs']))
$GLOBALS['test_dirs'] = array($pa, $ti, $ta);
}
// http://doc.spip.org/@spip_initialisation
function spip_initialisation() {
// la taille maxi des logos (0 : pas de limite)
define('_LOGO_MAX_SIZE', 0); # poids en ko
define('_LOGO_MAX_WIDTH', 0); # largeur en pixels
@ -1005,21 +992,6 @@ function spip_initialisation() {
define('_IMG_GD_MAX_PIXELS', 0); # nombre de pixels maxi pour calcul de la vignette avec gd
# le chemin http (relatif) vers les bibliotheques JavaScript
define('_DIR_JAVASCRIPT', (_DIR_RACINE . 'dist/javascript/'));
// Icones
# le chemin http (relatif) vers les images standard
define('_DIR_IMG_PACK', (_DIR_RACINE . 'dist/images/'));
# le chemin des vignettes de type de document
define('_DIR_IMG_ICONES_DIST', _DIR_RACINE . "dist/vignettes/");
# le chemin des icones de la barre d'edition des formulaires
define('_DIR_IMG_ICONES_BARRE', _DIR_RACINE . "dist/icones_barre/");
# le chemin php (absolu) vers les images standard (pour hebergement centralise)
define('_ROOT_IMG_PACK', dirname(dirname(dirname(__FILE__))) . '/dist/images/');
define('_ROOT_IMG_ICONES_DIST', dirname(dirname(dirname(__FILE__))) . '/dist/vignettes/');
// Le charset par defaut lors de l'installation
define('_DEFAULT_CHARSET', 'utf-8');
@ -1036,6 +1008,8 @@ function spip_initialisation() {
// le script index.php
define('_SPIP_SCRIPT', 'spip.php');
// le nom du repertoire plugins/
define('_DIR_PLUGINS', _DIR_RACINE . "plugins/");
// *********** traiter les variables ************
@ -1175,7 +1149,7 @@ function spip_desinfecte(&$t) {
function verifier_visiteur() {
// Rq: pour que cette fonction marche depuis mes_options elle a besoin
// que les constantes principales soient initialisees
spip_initialisation_parametree(
spip_initialisation(
(_DIR_RACINE . _DIRNAME_PERMANENT_INACCESSIBLE),
(_DIR_RACINE . _DIRNAME_PERMANENT_ACCESSIBLE),
(_DIR_RACINE . _DIRNAME_TEMPORAIRE_INACCESSIBLE),

95
ecrire/inc_version.php

@ -31,19 +31,57 @@ define("_ECRIRE_INC_VERSION", "1");
// nombre de repertoires depuis la racine
$profondeur_url = _DIR_RESTREINT ? 0 : 1;
# le chemin http (relatif) vers les bibliotheques JavaScript
define('_DIR_JAVASCRIPT', (_DIR_RACINE . 'dist/javascript/'));
// Icones
# le chemin http (relatif) vers les images standard
define('_DIR_IMG_PACK', (_DIR_RACINE . 'dist/images/'));
# le chemin des vignettes de type de document
define('_DIR_IMG_ICONES_DIST', _DIR_RACINE . "dist/vignettes/");
# le chemin des icones de la barre d'edition des formulaires
define('_DIR_IMG_ICONES_BARRE', _DIR_RACINE . "dist/icones_barre/");
# le chemin php (absolu) vers les images standard (pour hebergement centralise)
define('_ROOT_IMG_PACK', dirname(dirname(dirname(__FILE__))) . '/dist/images/');
define('_ROOT_IMG_ICONES_DIST', dirname(dirname(dirname(__FILE__))) . '/dist/vignettes/');
# Le nom des 4 repertoires modifiables par les scripts lances par httpd
# Par defaut ces 4 noms seront suffixes par _DIR_RACINE (cf plus bas)
# mais on peut les mettre ailleurs et changer completement les noms
# le nom du repertoire des fichiers Temporaires Inaccessibles par http://
define('_NOM_TEMPORAIRES_INACCESSIBLES', "tmp/");
# le nom du repertoire des fichiers Temporaires Accessibles par http://
define('_NOM_TEMPORAIRES_ACCESSIBLES', "var/");
# le nom du repertoire des fichiers Permanents Inaccessibles par http://
define('_NOM_PERMANENTS_INACCESSIBLES', "etc/");
# le nom du repertoire des fichiers Permanents Accessibles par http://
define('_NOM_PERMANENTS_ACCESSIBLES', "IMG/");
// Le nom du fichier de personnalisation
define('_NOM_CONFIG', 'mes_options');
// Son emplacement absolu si on le trouve
if (@file_exists($f = _DIR_RESTREINT . _NOM_CONFIG . '.php')
OR (_EXTENSION_PHP
AND @file_exists($f = _DIR_RESTREINT . _NOM_CONFIG . _EXTENSION_PHP))
OR (@file_exists($f = _DIR_RACINE . _NOM_PERMANENTS_INACCESSIBLES . _NOM_CONFIG . '.php'))) {
define('_FILE_OPTIONS', $f);
} else define('_FILE_OPTIONS', '');
// *** Fin des define *** //
//
// *** Parametrage par defaut de SPIP ***
//
// Ces parametres d'ordre technique peuvent etre modifies
// dans config/mes_options (_FILE_OPTIONS) Les valeurs
// specifiees dans ce dernier fichier remplaceront automatiquement
// les valeurs ci-dessous.
//
// Pour creer config/mes_options : recopier simplement
// les lignes ci-dessous, et ajouter le marquage de debut et
// de fin de fichier PHP ("< ?php" et "? >", sans les espaces)
//
// Les globales qui suivent peuvent etre modifiees
// dans le fichier de personnalisation indique ci-dessus.
// Il suffit de copier les lignes ci-dessous, et ajouter le marquage de debut
// et fin de fichier PHP ("< ?php" et "? >", sans les espaces)
// Ne pas les rendre indefinies.
// Prefixe des tables dans la base de donnees
// (a modifier pour avoir plusieurs sites SPIP dans une seule base)
@ -254,47 +292,36 @@ $spip_version_code = 1.9203;
// ** Securite **
$auteur_session = $connect_statut = $connect_toutes_rubriques = $connect_id_rubrique = $hash_recherche = $hash_recherche_strict = '';
//
// Inclure le fichier config/mes_options (ou equivalent)
//
if (defined('_FILE_OPTIONS')
#OR @file_exists($f = _DIR_CONFIG.'mes_options.php') # _DIR_CONFIG pas defini!
OR @file_exists($f = _DIR_RESTREINT.'mes_options.php')
OR (_EXTENSION_PHP AND @file_exists($f = _DIR_RESTREINT.'mes_options.php3'))
OR !($f = false)) {
define('_FILE_OPTIONS', $f);
if ($f) { @include_once _FILE_OPTIONS; }
}
// *** Fin des globales *** //
//
// Definitions standards (charge aussi inc/flock)
// Definitions des fonctions (charge aussi inc/flock)
//
require_once(_DIR_RESTREINT . 'inc/utils.php');
// Definition personnelles eventuelles
//
// INITIALISER LES REPERTOIRES NON PARTAGEABLES
//
//
// mais cette fonction a peut-etre deja ete appelee par mes_options
spip_initialisation_parametree();
if (_FILE_OPTIONS) include_once _FILE_OPTIONS;
//
// INITIALISER LES CONSTANTES ET LES VARIABLES SYSTEMES DE SPIP
// INITIALISER LES REPERTOIRES NON PARTAGEABLES ET LES CONSTANTES
//
// mais l'inclusion precedente a peut-etre deja appelee cette fonction
// ou a defini certaines des constantes que cette fontion doit definir
// ===> on execute en neutralisant les messages d'erreur
spip_initialisation();
@spip_initialisation(
(_DIR_RACINE . _NOM_PERMANENTS_INACCESSIBLES),
(_DIR_RACINE . _NOM_PERMANENTS_ACCESSIBLES),
(_DIR_RACINE . _NOM_TEMPORAIRES_INACCESSIBLES),
(_DIR_RACINE . _NOM_TEMPORAIRES_ACCESSIBLES)
);
// chargement des plugins : doit arriver en dernier
// car dans les plugins on peut inclure inc-version
// qui ne sera pas execute car _ECRIRE_INC_VERSION est defini
// donc il faut avoir tout fini ici avant de charger les plugins
# le nom du repertoire plugins/
define('_DIR_PLUGINS', _DIR_RACINE . "plugins/");
if (@is_readable(_DIR_TMP."charger_plugins_options.php")){
// chargement optimise precompile

Loading…
Cancel
Save