Valider 86ed55c6 rédigé par marcimat@rezo.net's avatar marcimat@rezo.net
Parcourir les fichiers

Ticket #2667 : Lorsqu’une image est déjà présente (dans IMG/) avec une...

Ticket #2667 : Lorsqu’une image est déjà présente (dans IMG/) avec une extension ne correspondant pas réellement à son contenu, la librairie GD récente de traitement d’image génère une erreur fatale.
On évite ce petit souci en vérifiant le contenu de l’image (via le mime type retourné par getimagesize).

parent 2867a8ea
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+73 −14
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -180,15 +180,11 @@ function _image_valeurs_trans($img, $effet, $forcer_format = false, $fonction_cr
		$fichier = $source;
	}

	$terminaison = $terminaison_dest = "";
	if (preg_match(",\.(gif|jpe?g|png)($|[?]),i", $fichier, $regs)) {
		$terminaison = strtolower($regs[1]);
		$terminaison_dest = $terminaison;

		if ($terminaison == "gif") {
			$terminaison_dest = "png";
		}
	$terminaison_dest = "";
	if ($terminaison = _image_trouver_extension($fichier)) {
		$terminaison_dest = ($terminaison == 'gif') ? 'png' : $terminaison;
	}

	if ($forcer_format !== false) {
		$terminaison_dest = $forcer_format;
	}
@@ -197,11 +193,6 @@ function _image_valeurs_trans($img, $effet, $forcer_format = false, $fonction_cr
		return false;
	}

	$term_fonction = $terminaison;
	if ($term_fonction == "jpg") {
		$term_fonction = "jpeg";
	}

	$nom_fichier = substr($fichier, 0, strlen($fichier) - (strlen($terminaison) + 1));
	$fichier_dest = $nom_fichier;
	if (($find_in_path and $f = find_in_path($fichier) and $fichier = $f)
@@ -314,7 +305,7 @@ function _image_valeurs_trans($img, $effet, $forcer_format = false, $fonction_cr
			"images" . _LOG_DEBUG);
	}

	// TODO: si une image png est nommee .jpg, le reconnaitre avec le bon $f
	$term_fonction = _image_trouver_extension_pertinente($fichier);
	$ret["fonction_imagecreatefrom"] = "_imagecreatefrom" . $term_fonction;
	$ret["fichier"] = $fichier;
	$ret["fonction_image"] = "_image_image" . $terminaison_dest;
@@ -357,6 +348,74 @@ function _image_valeurs_trans($img, $effet, $forcer_format = false, $fonction_cr
	return $ret;
}

/**
 * Retourne la terminaison d’un fichier image
 * @param string $path
 * @return string
 */
function _image_trouver_extension($path) {
	if (preg_match(",\.(gif|jpe?g|png)($|[?]),i", $path, $regs)) {
		$terminaison = strtolower($regs[1]);
		return $terminaison;
	}
	return '';
}

/**
 * Tente de trouver le véritable type d’une image,
 * même si une image est d’extension .jpg alors que son contenu est autre chose (gif ou png)
 *
 * @param string $path
 * @return string Extension, dans le format attendu par les fonctions 'gd' ('jpeg' pour les .jpg par exemple)
 */
function _image_trouver_extension_pertinente($path) {
	$path = supprimer_timestamp($path);
	$terminaison = _image_trouver_extension($path);
	if ($terminaison == 'jpg') {
		$terminaison = 'jpeg';
	}

	if (!file_exists($path)) {
		return $terminaison;
	}

	if (!$info = @getimagesize($path)) {
		return $terminaison;
	}

	$mime = image_type_to_mime_type($info[2]);

	switch (strtolower($mime)) {
		case 'image/png':
		case 'image/x-png':
			$_terminaison = 'png';
			break;

		case 'image/jpg':
		case 'image/jpeg':
		case 'image/pjpeg':
			$_terminaison = 'jpeg';
			break;

		case 'image/gif':
			$_terminaison = 'gif';
			break;

		case 'image/webp':
		case 'image/x-webp':
			$_terminaison = 'webp';
			break;

		default:
			$_terminaison = '';
	}
	if ($_terminaison !== $terminaison) {
		spip_log("Mauvaise extension du fichier : $path . Son type mime est : $mime", "images." . _LOG_INFO_IMPORTANTE);
		$terminaison = $_terminaison;
	}
	return $terminaison;
}

/**
 * Crée une image depuis un fichier ou une URL
 *
+1 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -84,6 +84,7 @@ function suivre_lien($url, $lien) {

	# lien relatif, il faut verifier l'url de base
	# commencer par virer la chaine de get de l'url de base
	$dir = '/';
	if (preg_match(';^((?:[a-z]{3,7}:)?//[^/]+)(/.*?/?)?([^/#?]*)([?][^#]*)?(#.*)?$;S', $url, $regs)) {
		$debut = $regs[1];
		$dir = !strlen($regs[2]) ? '/' : $regs[2];