[SPIP][PLUGINS] v3.0-->v3.2
[lhc/web/www.git] / www / ecrire / plugins / get_infos.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2017 *
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
13 /**
14 * Obtention des description des plugins locaux
15 *
16 * @package SPIP\Core\Plugins
17 **/
18
19 if (!defined('_ECRIRE_INC_VERSION')) {
20 return;
21 }
22
23 /**
24 * Lecture du fichier de configuration d'un plugin
25 *
26 * @staticvar string $filecache
27 * @staticvar array $cache
28 *
29 * @param string|array|bool $plug
30 * @param bool $reload
31 * @param string $dir
32 * @param bool $clean_old
33 * @return array
34 */
35 function plugins_get_infos_dist($plug = false, $reload = false, $dir = _DIR_PLUGINS, $clean_old = false) {
36 static $cache = '';
37 static $filecache = '';
38
39 if ($cache === '') {
40 $filecache = _DIR_TMP . "plugin_xml_cache.gz";
41 if (is_file($filecache)) {
42 lire_fichier($filecache, $contenu);
43 $cache = unserialize($contenu);
44 }
45 if (!is_array($cache)) {
46 $cache = array();
47 }
48 }
49
50 if (defined('_VAR_MODE') and _VAR_MODE == 'recalcul') {
51 $reload = true;
52 }
53
54 if ($plug === false) {
55 ecrire_fichier($filecache, serialize($cache));
56
57 return $cache;
58 } elseif (is_string($plug)) {
59 $res = plugins_get_infos_un($plug, $reload, $dir, $cache);
60 } elseif (is_array($plug)) {
61 $res = false;
62 if (!$reload) {
63 $reload = -1;
64 }
65 foreach ($plug as $nom) {
66 $res |= plugins_get_infos_un($nom, $reload, $dir, $cache);
67 }
68
69 // Nettoyer le cache des vieux plugins qui ne sont plus la
70 if ($clean_old and isset($cache[$dir]) and count($cache[$dir])) {
71 foreach (array_keys($cache[$dir]) as $p) {
72 if (!in_array($p, $plug)) {
73 unset($cache[$dir][$p]);
74 }
75 }
76 }
77 }
78 if ($res) {
79 ecrire_fichier($filecache, serialize($cache));
80 }
81 if (!isset($cache[$dir])) {
82 return array();
83 }
84 if (is_string($plug)) {
85 return isset($cache[$dir][$plug]) ? $cache[$dir][$plug] : array();
86 } else {
87 return $cache[$dir];
88 }
89 }
90
91
92 function plugins_get_infos_un($plug, $reload, $dir, &$cache) {
93 if (!is_readable($file = "$dir$plug/" . ($desc = "paquet") . ".xml")) {
94 if (!is_readable($file = "$dir$plug/" . ($desc = "plugin") . ".xml")) {
95 return false;
96 }
97 }
98
99 if (($time = intval(@filemtime($file))) < 0) {
100 return false;
101 }
102 $md5 = md5_file($file);
103
104 $pcache = isset($cache[$dir][$plug])
105 ? $cache[$dir][$plug] : array('filemtime' => 0, 'md5_file' => '');
106
107 // si le cache est valide
108 if ((intval($reload) <= 0)
109 and ($time > 0)
110 and ($time <= $pcache['filemtime'])
111 and $md5 == $pcache['md5_file']
112 ) {
113 return false;
114 }
115
116 // si on arrive pas a lire le fichier, se contenter du cache
117 if (!($texte = spip_file_get_contents($file))) {
118 return false;
119 }
120
121 $f = charger_fonction('infos_' . $desc, 'plugins');
122 $ret = $f($texte, $plug, $dir);
123 $ret['filemtime'] = $time;
124 $ret['md5_file'] = $md5;
125 // Si on lit le paquet.xml de SPIP, on rajoute un procure php afin que les plugins puissent
126 // utiliser un necessite php. SPIP procure donc la version php courante du serveur.
127 // chaque librairie php est aussi procurée, par exemple 'php:curl'.
128 if (isset($ret['prefix']) and $ret['prefix'] == 'spip') {
129 $ret['procure']['php'] = array('nom' => 'php', 'version' => phpversion());
130 foreach (get_loaded_extensions() as $ext) {
131 $ret['procure']['php:' . $ext] = array('nom' => 'php:' . $ext, 'version' => phpversion($ext));
132 }
133 }
134 $diff = ($ret != $pcache);
135
136 if ($diff) {
137 $cache[$dir][$plug] = $ret;
138 # echo count($cache[$dir]), $dir,$plug, " $reloadc<br>";
139 }
140
141 return $diff;
142 }