Valider aba087b3 rédigé par cerdic's avatar cerdic
Parcourir les fichiers

Fix : quand on essaye d'activer un plugin qui n'est pas compatible avec la...

Fix : quand on essaye d'activer un plugin qui n'est pas compatible avec la version de SPIP, il faut remonter une erreur d'activation
On modifie pour cela les fonctions
* plugin_valide_resume() pour qu'elle renvoie le prefixe du plugin accepte ou la description short du plugin refuse pour incompatibilite ou erreur
* liste_plugin_valides() pour qu'elle renvoie en plus la liste des plugins invalides qu'on voulait
* plugins_erreurs() pour gerer le cas xml en erreur ou incompatibilite avec la version de SPIP
* plugin_message_incompatibilite() pour generer un message d'erreur approprie quand il s'agit de SPIP et pas d'un plugin

Aucune rupture de compat, ce ne sont que des ajouts : du code qui utilisait les anciennes signatures de fonction continue a fonctionner sans probleme
(Dans l'interface on ne peut pas cocher un plugin non compatible avec la version de SPIP, mais en spip-cli on peut le faire et ca echouait silencieusement)
parent 06f92024
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+43 −18
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -269,6 +269,7 @@ function liste_plugin_valides($liste_plug, $force = false) {
		)
	);

	$invalides = array();
	foreach ($liste_ext as $plug) {
		if (isset($infos['_DIR_PLUGINS_DIST'][$plug])) {
			plugin_valide_resume($liste_non_classee, $plug, $infos, '_DIR_PLUGINS_DIST');
@@ -276,7 +277,10 @@ function liste_plugin_valides($liste_plug, $force = false) {
	}
	foreach ($liste_plug as $plug) {
		if (isset($infos['_DIR_PLUGINS'][$plug])) {
			plugin_valide_resume($liste_non_classee, $plug, $infos, '_DIR_PLUGINS');
			$r = plugin_valide_resume($liste_non_classee, $plug, $infos, '_DIR_PLUGINS');
			if (is_array($r)) {
				$invalides = array_merge($invalides, $r);
			}
		}
	}

@@ -284,14 +288,20 @@ function liste_plugin_valides($liste_plug, $force = false) {
		$infos['_DIR_PLUGINS_SUPPL'] = $get_infos($liste_plug, false, _DIR_PLUGINS_SUPPL);
		foreach ($liste_plug as $plug) {
			if (isset($infos['_DIR_PLUGINS_SUPPL'][$plug])) {
				plugin_valide_resume($liste_non_classee, $plug, $infos, '_DIR_PLUGINS_SUPPL');
				$r = plugin_valide_resume($liste_non_classee, $plug, $infos, '_DIR_PLUGINS_SUPPL');
				if (is_array($r)) {
					$invalides = array_merge($invalides, $r);
				}
			}
		}
	}

	plugin_fixer_procure($liste_non_classee, $infos);

	return array($infos, $liste_non_classee);
	// les plugins qui sont dans $liste_non_classee ne sont pas invalides (on a trouve un autre version valide)
	$invalides = array_diff_key($invalides, $liste_non_classee);

	return array($infos, $liste_non_classee, $invalides);
}

/**
@@ -306,27 +316,34 @@ function liste_plugin_valides($liste_plug, $force = false) {
 * @param string $plug
 * @param array $infos
 * @param string $dir_type
 * @return string|array
 *   string prefixe dans $liste si on a accepte le plugin
 *   array description short si on ne le retient pas (pour memorisation dans une table des erreurs)
 */
function plugin_valide_resume(&$liste, $plug, $infos, $dir_type) {
	$i = $infos[$dir_type][$plug];
	if (isset($i['erreur']) and $i['erreur']) {
		return;
	}
	if (!plugin_version_compatible($i['compatibilite'], $GLOBALS['spip_version_branche'], 'spip')) {
		return;
	}
	$p = strtoupper($i['prefix']);
	if (!isset($liste[$p])
		or spip_version_compare($i['version'], $liste[$p]['version'], '>')
	) {
		$liste[$p] = array(
	$short_desc = array(
		'nom' => $i['nom'],
		'etat' => $i['etat'],
		'version' => $i['version'],
		'dir' => $plug,
		'dir_type' => $dir_type
	);
	if (isset($i['erreur']) and $i['erreur']) {
		$short_desc['erreur'] = $i['erreur'];
		return array($p=>$short_desc);
	}
	if (!plugin_version_compatible($i['compatibilite'], $GLOBALS['spip_version_branche'], 'spip')) {
		return array($p=>$short_desc);
	}
	if (!isset($liste[$p])
		or spip_version_compare($i['version'], $liste[$p]['version'], '>')
	) {
		$liste[$p] = $short_desc;
	}
	// ok le plugin etait deja dans la liste ou on a choisi une version plus recente
	return $p;
}

/**
@@ -534,7 +551,13 @@ function plugins_erreurs($liste_non_classee, $liste, $infos, $msg = array()) {

		$plug = constant($dir_type) . $plug;
		if (!isset($msg[$p])) {
			if (!$msg[$p] = plugin_necessite($k['necessite'], $liste, 'necessite')) {
			if (isset($resume['erreur']) and $resume['erreur']) {
				$msg[$p] = $resume['erreur'];
			}
			elseif (!plugin_version_compatible($k['compatibilite'], $GLOBALS['spip_version_branche'], 'spip')) {
				$msg[$p] = plugin_message_incompatibilite($k['compatibilite'], $GLOBALS['spip_version_branche'], 'SPIP', 'necessite');
			}
			elseif (!$msg[$p] = plugin_necessite($k['necessite'], $liste, 'necessite')) {
				$msg[$p] = plugin_necessite($k['utilise'], $liste, 'utilise');
			}
		} else {
@@ -663,7 +686,9 @@ function plugin_message_incompatibilite($intervalle, $version, $nom, $balise) {
	// prendre en compte les erreurs de dépendances à PHP
	// ou à une extension PHP avec des messages d'erreurs dédiés.
	$type = 'plugin';
	if ($nom === 'PHP') {
	if ($nom === 'SPIP') {
		$type = 'spip';
	} elseif ($nom === 'PHP') {
		$type = 'php';
	} elseif (strncmp($nom, 'PHP:', 4) === 0) {
		$type = 'extension_php';
@@ -807,11 +832,11 @@ function ecrire_plugin_actifs($plugin, $pipe_recherche = false, $operation = 'ra
	// pour ne pas rater l'ajout ou la suppression d'un fichier fonctions/options/administrations
	// pourra etre evite quand on ne supportera plus les plugin.xml
	// en deplacant la detection de ces fichiers dans la compilation ci dessous
	list($infos, $liste) = liste_plugin_valides($plugin, true);
	list($infos, $liste, $invalides) = liste_plugin_valides($plugin, true);
	// trouver l'ordre d'activation
	list($plugin_valides, $ordre, $reste) = plugin_trier($infos, $liste);
	if ($reste) {
		plugins_erreurs($reste, $liste, $infos);
	if ($invalides or $reste) {
		plugins_erreurs(array_merge($invalides, $reste), $liste, $infos);
	}

	// Ignorer les plugins necessitant une lib absente