3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2014 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
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 \***************************************************************************/
13 if (!defined('_ECRIRE_INC_VERSION')) return;
15 include_spip('inc/xml');
16 include_spip('inc/plugin');
18 // http://doc.spip.org/@plugin_verifie_conformite
19 function plugins_verifie_conformite_dist($plug, &$arbre, $dir_plugins = _DIR_PLUGINS
){
20 static $etats = array('dev','experimental','test', 'stable');
25 // chercher la declaration <plugin spip='...'> a prendre pour cette version de SPIP
26 if ($n = spip_xml_match_nodes(",^plugin(\s|$),", $arbre, $matches)){
28 $vspip = $GLOBALS['spip_version_branche'];
29 foreach($matches as $tag=>$sous){
30 list($tagname,$atts) = spip_xml_decompose_tag($tag);
31 if ($tagname=='plugin' AND is_array($sous)){
32 if (!isset($atts['spip'])
33 OR plugin_version_compatible($atts['spip'],$vspip)) {
34 // on prend la derniere declaration avec ce nom
36 $compat_spip = isset($atts['spip']) ?
$atts['spip'] : '';
42 $arbre = array('erreur' => array(_T('erreur_plugin_tag_plugin_absent')." : $plug"));
47 if (!is_array($arbre)) $arbre = array();
48 // verification de la conformite du plugin avec quelques
49 // precautions elementaires
50 if (!isset($arbre['nom'])){
52 $arbre['erreur'][] = _T('erreur_plugin_nom_manquant');
53 $arbre['nom'] = array("");
55 if (!isset($arbre['version'])){
57 $arbre['erreur'][] = _T('erreur_plugin_version_manquant');
58 $arbre['version'] = array("");
60 if (!isset($arbre['prefix'])){
62 $arbre['erreur'][] = _T('erreur_plugin_prefix_manquant');
63 $arbre['prefix'] = array("");
65 $prefix = trim(end($arbre['prefix']));
66 if (strtoupper($prefix)=='SPIP'){
67 $arbre['erreur'][] = _T('erreur_plugin_prefix_interdit');
69 if (isset($arbre['etat'])){
70 $etat = trim(end($arbre['etat']));
71 if (!in_array($etat, $etats))
72 $arbre['erreur'][] = _T('erreur_plugin_etat_inconnu')." : '$etat'";
74 if (isset($arbre['options'])){
75 foreach($arbre['options'] as $optfile){
76 $optfile = trim($optfile);
77 if (!@is_readable
($dir_plugins."$plug/$optfile"))
79 $arbre['erreur'][] = _T('erreur_plugin_fichier_absent')." : $optfile";
82 if (isset($arbre['fonctions'])){
83 foreach($arbre['fonctions'] as $optfile){
84 $optfile = trim($optfile);
85 if (!@is_readable
($dir_plugins."$plug/$optfile"))
87 $arbre['erreur'][] = _T('erreur_plugin_fichier_absent')." : $optfile";
91 if (isset($arbre['fonctions']))
92 $fonctions = $arbre['fonctions'];
93 $liste_methodes_reservees = array('__construct','__destruct','plugin','install','uninstall',strtolower($prefix));
95 $extraire_pipelines = charger_fonction("extraire_pipelines","plugins");
96 $arbre['pipeline'] = $extraire_pipelines($arbre);
97 foreach($arbre['pipeline'] as $pipe){
98 if (!isset($pipe['nom']))
100 $arbre['erreur'][] = _T("erreur_plugin_nom_pipeline_non_defini");
101 if (isset($pipe['action'])) $action = $pipe['action'];
102 else $action = $pipe['nom'];
103 // verif que la methode a un nom autorise
104 if (in_array(strtolower($action),$liste_methodes_reservees)){
106 $arbre['erreur'][] = _T("erreur_plugin_nom_fonction_interdit")." : $action";
108 if (isset($pipe['inclure'])) {
109 $inclure = $dir_plugins."$plug/".$pipe['inclure'];
110 if (!@is_readable
($inclure))
112 $arbre['erreur'][] = _T('erreur_plugin_fichier_absent')." : $inclure";
115 $necessite = array();
116 $spip_trouve = false;
117 if (spip_xml_match_nodes(',^necessite,',$arbre,$needs)){
118 foreach(array_keys($needs) as $tag){
119 list($tag,$att) = spip_xml_decompose_tag($tag);
121 if (strtolower($att['id']) == 'spip')
125 if ($compat_spip AND !$spip_trouve)
126 $necessite[] = array('id' => 'spip', 'version' => $compat_spip);
127 $arbre['necessite'] = $necessite;
129 if (spip_xml_match_nodes(',^utilise,',$arbre,$uses)){
130 foreach(array_keys($uses) as $tag){
131 list($tag,$att) = spip_xml_decompose_tag($tag);
135 $arbre['utilise'] = $utilise;
137 if (spip_xml_match_nodes(',^chemin,',$arbre,$paths)){
138 foreach(array_keys($paths) as $tag){
139 list($tag,$att) = spip_xml_decompose_tag($tag);
144 $path = array(array('dir'=>'')); // initialiser par defaut
145 $arbre['path'] = $path;
146 // exposer les noisettes
147 if (isset($arbre['noisette'])){
148 foreach($arbre['noisette'] as $k=>$nut){
149 $nut = preg_replace(',[.]html$,uims','',trim($nut));
150 $arbre['noisette'][$k] = $nut;
151 if (!@is_readable
($dir_plugins."$plug/$nut.html"))
153 $arbre['erreur'][] = _T('erreur_plugin_fichier_absent')." : $nut";
157 if (spip_xml_match_nodes(',^traduire,',$arbre,$trads)){
158 foreach(array_keys($trads) as $tag){
159 list($tag,$att) = spip_xml_decompose_tag($tag);
163 $arbre['traduire'] = $traduire;