spip_nursit/ecrire/action/editer_logo.php
2023-06-01 17:30:12 +02:00

187 lines
5.5 KiB
PHP

<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2019 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
/**
* Gestion de l'API de modification/suppression des logos
*
* @package SPIP\Core\Logo\Edition
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Supprimer le logo d'un objet
*
* @param string $objet
* @param int $id_objet
* @param string $etat
* `on` ou `off`
*/
function logo_supprimer($objet, $id_objet, $etat) {
$chercher_logo = charger_fonction('chercher_logo', 'inc');
$objet = objet_type($objet);
$primary = id_table_objet($objet);
include_spip('inc/chercher_logo');
// existe-t-il deja un logo ?
$logo = $chercher_logo($id_objet, $primary, $etat);
if ($logo) {
spip_unlink($logo[0]);
}
}
/**
* Modifier le logo d'un objet
*
* @param string $objet
* @param int $id_objet
* @param string $etat
* `on` ou `off`
* @param string|array $source
* - array : sous tableau de `$_FILE` issu de l'upload
* - string : fichier source (chemin complet ou chemin relatif a `tmp/upload`)
* @return string
* Erreur, sinon ''
*/
function logo_modifier($objet, $id_objet, $etat, $source) {
$chercher_logo = charger_fonction('chercher_logo', 'inc');
$objet = objet_type($objet);
$primary = id_table_objet($objet);
include_spip('inc/chercher_logo');
$type = type_du_logo($primary);
// nom du logo
$nom = $type . $etat . $id_objet;
// supprimer le logo eventueel existant
logo_supprimer($objet, $id_objet, $etat);
include_spip('inc/documents');
$erreur = '';
if (!$source) {
spip_log('spip_image_ajouter : source inconnue');
$erreur = 'source inconnue';
return $erreur;
}
$file_tmp = _DIR_LOGOS . $nom . '.tmp';
$ok = false;
// fichier dans upload/
if (is_string($source)) {
if (file_exists($source)) {
$ok = @copy($source, $file_tmp);
} elseif (file_exists($f = determine_upload() . $source)) {
$ok = @copy($f, $file_tmp);
}
} elseif (!$erreur = check_upload_error($source['error'], '', true)) {
// Intercepter une erreur a l'envoi
// analyse le type de l'image (on ne fait pas confiance au nom de
// fichier envoye par le browser : pour les Macs c'est plus sur)
$ok = deplacer_fichier_upload($source['tmp_name'], $file_tmp);
}
if ($erreur) {
return $erreur;
}
if (!$ok or !file_exists($file_tmp)) {
spip_log($erreur = "probleme de copie pour $file_tmp ");
return $erreur;
}
$size = @getimagesize($file_tmp);
$extension = !$size ? '' : ($size[2] > 3 ? '' : $GLOBALS['formats_logos'][$size[2] - 1]);
if ($extension) {
@rename($file_tmp, $file_tmp . ".$extension");
$file_tmp = $file_tmp . ".$extension";
$poids = filesize($file_tmp);
if (defined('_LOGO_MAX_WIDTH') or defined('_LOGO_MAX_HEIGHT')) {
if ((defined('_LOGO_MAX_WIDTH') and _LOGO_MAX_WIDTH and $size[0] > _LOGO_MAX_WIDTH)
or (defined('_LOGO_MAX_HEIGHT') and _LOGO_MAX_HEIGHT and $size[1] > _LOGO_MAX_HEIGHT)
) {
$max_width = (defined('_LOGO_MAX_WIDTH') and _LOGO_MAX_WIDTH) ? _LOGO_MAX_WIDTH : '*';
$max_height = (defined('_LOGO_MAX_HEIGHT') and _LOGO_MAX_HEIGHT) ? _LOGO_MAX_HEIGHT : '*';
// pas la peine d'embeter le redacteur avec ca si on a active le calcul des miniatures
// on met directement a la taille maxi a la volee
if (isset($GLOBALS['meta']['creer_preview']) and $GLOBALS['meta']['creer_preview'] == 'oui') {
include_spip('inc/filtres');
$img = filtrer('image_reduire', $file_tmp, $max_width, $max_height);
$img = extraire_attribut($img, 'src');
$img = supprimer_timestamp($img);
if (@file_exists($img) and $img !== $file_tmp) {
spip_unlink($file_tmp);
@rename($img, $file_tmp);
$size = @getimagesize($file_tmp);
}
}
// verifier au cas ou image_reduire a echoue
if ((defined('_LOGO_MAX_WIDTH') and _LOGO_MAX_WIDTH and $size[0] > _LOGO_MAX_WIDTH)
or (defined('_LOGO_MAX_HEIGHT') and _LOGO_MAX_HEIGHT and $size[1] > _LOGO_MAX_HEIGHT)
) {
spip_unlink($file_tmp);
$erreur = _T(
'info_logo_max_poids',
array(
'maxi' =>
_T(
'info_largeur_vignette',
array(
'largeur_vignette' => $max_width,
'hauteur_vignette' => $max_height
)
),
'actuel' =>
_T(
'info_largeur_vignette',
array(
'largeur_vignette' => $size[0],
'hauteur_vignette' => $size[1]
)
)
)
);
}
}
}
if (!$erreur and defined('_LOGO_MAX_SIZE') and _LOGO_MAX_SIZE and $poids > _LOGO_MAX_SIZE * 1024) {
spip_unlink($file_tmp);
$erreur = _T(
'info_logo_max_poids',
array(
'maxi' => taille_en_octets(_LOGO_MAX_SIZE * 1024),
'actuel' => taille_en_octets($poids)
)
);
}
if (!$erreur) {
@rename($file_tmp, _DIR_LOGOS . $nom . ".$extension");
}
} else {
spip_unlink($file_tmp);
$erreur = _T(
'info_logo_format_interdit',
array('formats' => join(', ', $GLOBALS['formats_logos']))
);
}
return $erreur;
}