Dépôt officiel du core SPIP * Anciennement présent sur svn://trac.rezo.net/spip * Les plugins-dist faisant partie de la distribution SPIP sont présents dans https://git.spip.net/SPIP/[nom du plugin dist] https://www.spip.net
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

328 lines
9.2 KiB

17 years ago
17 years ago
15 years ago
15 years ago
16 years ago
15 years ago
14 years ago
15 years ago
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).
15 years ago
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).
15 years ago
  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Systeme de publication pour l'internet *
  4. * *
  5. * Copyright (c) 2001-2007 *
  6. * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
  7. * *
  8. * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
  9. * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
  10. \***************************************************************************/
  11. if (!defined("_ECRIRE_INC_VERSION")) return;
  12. #define('_SPIP_LOCK_MODE',0); // ne pas utiliser de lock (deconseille)
  13. #define('_SPIP_LOCK_MODE',1); // utiliser le flock php
  14. #define('_SPIP_LOCK_MODE',2); // utiliser le nfslock de spip
  15. if (_SPIP_LOCK_MODE==2)
  16. include_spip('inc/nfslock');
  17. $GLOBALS['liste_verrous'] = array();
  18. // http://doc.spip.org/@spip_fopen_lock
  19. function spip_fopen_lock($fichier,$mode,$verrou){
  20. if (_SPIP_LOCK_MODE==1){
  21. if ($fl = @fopen($fichier,$mode))
  22. // verrou
  23. @flock($fl, $verrou);
  24. return $fl;
  25. }
  26. elseif(_SPIP_LOCK_MODE==2) {
  27. if (($verrou = spip_nfslock($fichier)) && ($fl = @fopen($fichier,$mode))){
  28. $GLOBALS['liste_verrous'][$fl] = array($fichier,$verrou);
  29. return $fl;
  30. }
  31. else return false;
  32. }
  33. return @fopen($fichier,$mode);
  34. }
  35. // http://doc.spip.org/@spip_fclose_unlock
  36. function spip_fclose_unlock($handle){
  37. if (_SPIP_LOCK_MODE==1){
  38. @flock($handle, LOCK_UN);
  39. }
  40. elseif(_SPIP_LOCK_MODE==2) {
  41. spip_nfsunlock(reset($GLOBALS['liste_verrous'][$handle]),end($GLOBALS['liste_verrous'][$handle]));
  42. unset($GLOBALS['liste_verrous'][$handle]);
  43. }
  44. return @fclose($handle);
  45. }
  46. // http://doc.spip.org/@spip_file_get_contents
  47. function spip_file_get_contents ($fichier) {
  48. if (substr($fichier, -3) != '.gz') {
  49. if (function_exists('file_get_contents')
  50. AND (
  51. ($contenu = @file_get_contents ($fichier)) # windows retourne '' ?
  52. OR $os_serveur != 'windows')
  53. )
  54. return $contenu;
  55. else
  56. return join('', @file($fichier));
  57. } else
  58. return join('', @gzfile($fichier));
  59. }
  60. // options = array(
  61. // 'phpcheck' => 'oui' # verifier qu'on a bien du php
  62. // dezippe automatiquement les fichiers .gz
  63. // http://doc.spip.org/@lire_fichier
  64. function lire_fichier ($fichier, &$contenu, $options=false) {
  65. $contenu = '';
  66. if (!@file_exists($fichier))
  67. return false;
  68. #spip_timer('lire_fichier');
  69. if ($fl = @spip_fopen_lock($fichier, 'r', LOCK_SH)) {
  70. // a-t-il ete supprime par le locker ?
  71. if (!@file_exists($fichier)) {
  72. spip_fclose_unlock($fl);
  73. return false;
  74. }
  75. // lire le fichier
  76. $contenu = spip_file_get_contents($fichier);
  77. // liberer le verrou
  78. spip_fclose_unlock($fl);
  79. // Verifications
  80. $ok = true;
  81. if ($options['phpcheck'] == 'oui')
  82. $ok &= (preg_match(",[?]>\n?$,", $contenu));
  83. #spip_log("$fread $fichier ".spip_timer('lire_fichier'));
  84. if (!$ok)
  85. spip_log("echec lecture $fichier");
  86. return $ok;
  87. }
  88. }
  89. //
  90. // Ecrire un fichier de maniere un peu sure
  91. //
  92. // zippe les fichiers .gz
  93. // http://doc.spip.org/@ecrire_fichier
  94. function ecrire_fichier ($fichier, $contenu, $ecrire_quand_meme = false, $truncate=true) {
  95. // Ne rien faire si on est en preview, debug, ou si une erreur
  96. // grave s'est presentee (compilation du squelette, MySQL, etc)
  97. if ((
  98. (isset($GLOBALS['var_preview'])&&$GLOBALS['var_preview'])
  99. OR (isset($GLOBALS['var_mode'])&&($GLOBALS['var_mode'] == 'debug'))
  100. OR defined('spip_interdire_cache'))
  101. AND !$ecrire_quand_meme)
  102. return;
  103. #spip_timer('ecrire_fichier');
  104. // verrouiller le fichier destination
  105. if ($fp = spip_fopen_lock($fichier, 'a',LOCK_EX)) {
  106. // ecrire les donnees, compressees le cas echeant
  107. // (on ouvre un nouveau pointeur sur le fichier, ce qui a l'avantage
  108. // de le recreer si le locker qui nous precede l'avait supprime...)
  109. if (substr($fichier, -3) == '.gz')
  110. $contenu = gzencode($contenu);
  111. if ($truncate)
  112. @ftruncate($fp,0);
  113. $s = @fputs($fp, $contenu, $a = strlen($contenu));
  114. $ok = ($s == $a);
  115. // liberer le verrou et fermer le fichier
  116. spip_fclose_unlock($fp);
  117. @chmod($fichier, _SPIP_CHMOD & 0666);
  118. if ($ok) return $ok;
  119. }
  120. include_spip('inc/autoriser');
  121. if (autoriser('chargerftp'))
  122. raler_fichier($fichier);
  123. spip_unlink($fichier);
  124. return false;
  125. }
  126. // http://doc.spip.org/@raler_fichier
  127. function raler_fichier($fichier)
  128. {
  129. include_spip('inc/minipres');
  130. $dir = dirname($fichier);
  131. http_status(401);
  132. echo minipres(_T('texte_inc_meta_2'), "<h4 style='color: red'>"
  133. . _T('texte_inc_meta_1', array('fichier' => $fichier))
  134. . " <a href='"
  135. . generer_url_ecrire('install', "etape=chmod&test_dir=$dir")
  136. . "'>"
  137. . _T('texte_inc_meta_2')
  138. . "</a> "
  139. . _T('texte_inc_meta_3',
  140. array('repertoire' => joli_repertoire($dir)))
  141. . "</h4>\n");
  142. exit;
  143. }
  144. //
  145. // Retourne Vrai si son premier argument a ete cree il y a moins de N secondes
  146. //
  147. // http://doc.spip.org/@jeune_fichier
  148. function jeune_fichier($fichier, $n)
  149. {
  150. if (!file_exists($fichier)) return false;
  151. if (!$c = @filemtime($fichier)) return false;
  152. return (time()-$n <= $c);
  153. }
  154. //
  155. // Supprimer le fichier de maniere sympa (flock)
  156. //
  157. // http://doc.spip.org/@supprimer_fichier
  158. function supprimer_fichier($fichier, $lock=true) {
  159. if (!@file_exists($fichier))
  160. return true;
  161. if ($lock) {
  162. // verrouiller le fichier destination
  163. if (!$fp = spip_fopen_lock($fichier, 'a', LOCK_EX))
  164. return false;
  165. // liberer le verrou
  166. spip_fclose_unlock($fp);
  167. }
  168. // supprimer
  169. return @unlink($fichier);
  170. }
  171. // Supprimer brutalement, si le fichier existe
  172. // http://doc.spip.org/@spip_unlink
  173. function spip_unlink($f) {
  174. if (!is_dir($f))
  175. supprimer_fichier($f,false);
  176. else {
  177. @unlink("$f/.ok");
  178. @rmdir($f);
  179. }
  180. }
  181. //
  182. // Retourne $base/${subdir}/ si le sous-repertoire peut etre cree,
  183. // $base/${subdir}_ sinon ; $nobase signale qu'on ne veut pas de $base/
  184. // On peut aussi ne donner qu'un seul argument,
  185. // subdir valant alors ce qui suit le dernier / dans $base
  186. //
  187. // http://doc.spip.org/@sous_repertoire
  188. function sous_repertoire($base, $subdir='', $nobase = false, $tantpis=false) {
  189. $base = str_replace("//", "/", $base);
  190. if (preg_match(',[/_]$,', $base)) $base = substr($base,0,-1);
  191. if (!strlen($subdir)) {
  192. $n = strrpos($base, "/");
  193. if ($n === false) return $nobase ? '' : ($base .'/');
  194. $subdir = substr($base, $n+1);
  195. $base = substr($base, 0, $n+1);
  196. } else {
  197. $base .= '/';
  198. $subdir = str_replace("/", "", "$subdir");
  199. }
  200. $baseaff = $nobase ? '' : $base;
  201. if (@file_exists("$base${subdir}.plat"))
  202. return "$baseaff${subdir}_";;
  203. $path = $base.$subdir; # $path = 'IMG/distant/pdf' ou 'IMG/distant_pdf'
  204. if (file_exists("$path/.ok"))
  205. return "$baseaff$subdir/";
  206. @mkdir($path, _SPIP_CHMOD);
  207. @chmod($path, _SPIP_CHMOD);
  208. $ok = false;
  209. if ($test = @fopen("$path/dir_test.php", "w")) {
  210. @fputs($test, '<'.'?php $ok = true; ?'.'>');
  211. @fclose($test);
  212. @include("$path/dir_test.php");
  213. spip_unlink("$path/dir_test.php");
  214. }
  215. if ($ok) {
  216. @touch ("$path/.ok");
  217. spip_log("creation $base$subdir/");
  218. return "$baseaff$subdir/";
  219. }
  220. $f = @fopen("$base${subdir}.plat", "w");
  221. if ($f)
  222. fclose($f);
  223. else {
  224. spip_log("echec creation $base${subdir}");
  225. if ($tantpis) return '';
  226. if (!_DIR_RESTREINT)
  227. $base = preg_replace(',^' . _DIR_RACINE .',', '',$base);
  228. if ($test) $base .= $subdir;
  229. raler_fichier($base . '/.ok');
  230. }
  231. spip_log("faux sous-repertoire $base${subdir}");
  232. return "$baseaff${subdir}";
  233. }
  234. //
  235. // Cette fonction parcourt recursivement le repertoire $dir, et renvoie les
  236. // fichiers dont le chemin verifie le pattern (preg) donne en argument.
  237. // En cas d'echec retourne un array() vide
  238. //
  239. // Usage: array preg_files('ecrire/data/', '[.]lock$');
  240. //
  241. // Attention, afin de conserver la compatibilite avec les repertoires '.plat'
  242. // si $dir = 'rep/sous_rep_' au lieu de 'rep/sous_rep/' on scanne 'rep/' et on
  243. // applique un pattern '^rep/sous_rep_'
  244. // si $recurs vaut false, la fonction ne descend pas dans les sus repertoires
  245. //
  246. // http://doc.spip.org/@preg_files
  247. function preg_files($dir, $pattern=-1 /* AUTO */, $maxfiles = 10000, $recurs=array()) {
  248. $nbfiles = 0;
  249. if ($pattern == -1)
  250. $pattern = "^$dir";
  251. $fichiers = array();
  252. // revenir au repertoire racine si on a recu dossier/truc
  253. // pour regarder dossier/truc/ ne pas oublier le / final
  254. $dir = preg_replace(',/[^/]*$,', '', $dir);
  255. if ($dir == '') $dir = '.';
  256. if (@is_dir($dir) AND is_readable($dir) AND $d = @opendir($dir)) {
  257. while (($f = readdir($d)) !== false && ($nbfiles<$maxfiles)) {
  258. if ($f[0] != '.' # ignorer . .. .svn etc
  259. AND $f != 'CVS'
  260. AND $f != 'remove.txt'
  261. AND is_readable($f = "$dir/$f")) {
  262. if (is_file($f)) {
  263. if (preg_match(";$pattern;iS", $f))
  264. {
  265. $fichiers[] = $f;
  266. $nbfiles++;
  267. }
  268. }
  269. else if (is_dir($f) AND is_array($recurs)){
  270. $rp = @realpath($f);
  271. if (!is_string($rp) OR !strlen($rp)) $rp=$f; # realpath n'est peut etre pas autorise
  272. if (!isset($recurs[$rp])) {
  273. $recurs[$rp] = true;
  274. $beginning = $fichiers;
  275. $end = preg_files("$f/", $pattern,
  276. $maxfiles-$nbfiles, $recurs);
  277. $fichiers = array_merge((array)$beginning, (array)$end);
  278. $nbfiles = count($fichiers);
  279. }
  280. }
  281. }
  282. }
  283. closedir($d);
  284. }
  285. sort($fichiers);
  286. return $fichiers;
  287. }
  288. ?>