Skip to content
Extraits de code Groupes Projets

Comparer les révisions

Les modifications sont affichées comme si la révision source était fusionnée avec la révision cible. En savoir plus sur la comparaison des révisions.

Source

Sélectionner le projet cible
No results found

Cible

Sélectionner le projet cible
  • spip/medias
  • pierre.laszczak/medias
  • cy.altern/medias
  • MathieuAlphamosa/medias
  • taffit/medias
  • RealET/medias
  • johan/medias
  • Yohooo/medias
  • pierretux/medias
  • placido/medias
  • JLuc/medias
11 résultats
Afficher les modifications
Validations sur la source (50)
Affichage de
avec 826 ajouts et 275 suppressions
/.editorconfig export-ignore
/.gitattributes export-ignore
/.gitignore export-ignore
/phpcs.xml.dist export-ignore
/phpstan.neon.dist export-ignore
/phpstan-baseline.neon export-ignore
/rector.php export-ignore
/ecs.php export-ignore
/tests export-ignore
/vendor/
/composer.phar
/composer.lock
/phpcs.xml
/phpstan.neon
/.php_cs.cache
/.php_cs.txt
# Changelog
## Unreleased
### Added
- spip/spip#5775 Intégration dans médias de fonctions relatives aux logos & documents, qui étaient dans spip/ecrire
### Changed
- #5008 `inc_vignette_dist()` prend un media en second argument, pour décliner la vignette selon le type de fichier
### Fixed
- #5008 Calcul dynamique de `#MIME_TYPE` (qui peut varier par exemple pour les mp4 selon le media de type video, audio, ...)
- #5016 La navigation dans la médiathèque peut recevoir n'importe quel id d'objet
## 5.0.1 - 2025-12-21
### Added
- require `spip/archiviste=^3.0`
### Changed
- spip/spip#5566 / !5018 Animations de sélection/ajout/retrait de documents sans jQuery
## 5.0.0 - 2025-11-27
### Added
......
......@@ -25,18 +25,17 @@ function action_acceder_document_dist() {
include_spip('inc/documents');
// $file exige pour eviter le scan id_document par id_document
$f = rawurldecode(_request('file'));
$f = rawurldecode((string) _request('file'));
$file = get_spip_doc($f);
$arg = rawurldecode(_request('arg'));
$arg = rawurldecode((string) _request('arg'));
$status = false;
if (
strpos($f, '../') !== false
or preg_match(',^\w+://,', $f)
str_contains($f, '../') || preg_match(',^\w+://,', $f)
) {
$status = 403;
} else {
if (!file_exists($file) or !is_readable($file)) {
if (!file_exists($file) || !is_readable($file)) {
$status = 404;
} else {
$where = 'D.fichier=' . sql_quote(set_spip_doc($file))
......@@ -53,14 +52,12 @@ function action_acceder_document_dist() {
// ETag pour gerer le status 304
$ETag = md5($file . ': ' . filemtime($file));
if (
isset($_SERVER['HTTP_IF_NONE_MATCH'])
and $_SERVER['HTTP_IF_NONE_MATCH'] == $ETag
isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == $ETag
) {
http_response_code(304); // Not modified
exit;
} else {
header('ETag: ' . $ETag);
}
header('ETag: ' . $ETag);
//
// Verifier les droits de lecture du document
......@@ -98,8 +95,7 @@ function action_acceder_document_dist() {
// ou si c'est un nom bien connu d'Unix, le prendre
// sinon l'ignorer car certains navigateurs pataugent
if (
isset($doc['titre'])
and (preg_match('/^\w+[.]\w+$/', $doc['titre']) or $doc['titre'] == 'Makefile')
isset($doc['titre']) && (preg_match('/^\w+[.]\w+$/', (string) $doc['titre']) || $doc['titre'] == 'Makefile')
) {
$options['attachment'] = $doc['titre'];
}
......
......@@ -83,7 +83,6 @@ function action_ajouter_documents_dist($id_document, $files, $objet, $id_objet,
*
* - int : l'id_document ajouté (opération réussie)
* - string : une erreur s'est produit, la chaine est le message d'erreur
*
*/
function action_ajouter_un_document_dist($id_document, $file, $objet, $id_objet, $mode) {
......@@ -96,15 +95,14 @@ function action_ajouter_un_document_dist($id_document, $file, $objet, $id_objet,
// et on aura une collision en cas de changement de file system
$file['name'] = strtolower(translitteration($file['name']));
// Sécurité : si jamais il existe deja une entrée dans la BDD avec ce chemin de document, remettre le document dans tmp, ce qui permettra ensuite qu'il soit dupliqué, et qu'il n'y ait pas deux entrées en base avec la même ligne 'fichier'.
// Cela n'arrive que si $file indique un document qui se trouve déjà dans IMG.
while (sql_getfetsel('fichier', 'spip_documents', 'fichier='.sql_quote(set_spip_doc($file['tmp_name'])))) {
while (sql_getfetsel('fichier', 'spip_documents', 'fichier=' . sql_quote(set_spip_doc($file['tmp_name'])))) {
$tmp = tempnam(is_dir(_DIR_TRANSFERT) ? _DIR_TRANSFERT : _DIR_TMP, $file['tmp_name']);
if (deplacer_fichier_upload($file['tmp_name'], $tmp)) {
$file['tmp_name'] = $tmp;
} else {
spip_log('Erreur lors de la tenative de copie de '.$file['tmp_name'].' en '.$tmp, 'medias' . _LOG_ERREUR);
spip_log('Erreur lors de la tenative de copie de ' . $file['tmp_name'] . ' en ' . $tmp, 'medias' . _LOG_ERREUR);
break;
}
}
......@@ -115,12 +113,11 @@ function action_ajouter_un_document_dist($id_document, $file, $objet, $id_objet,
}
$titrer = $file['titrer'] ?? _TITRER_DOCUMENTS;
$mode = ((isset($file['mode']) and $file['mode']) ? $file['mode'] : $mode);
$mode = ((isset($file['mode']) && $file['mode']) ? $file['mode'] : $mode);
include_spip('inc/modifier');
if (
isset($file['distant']) and $file['distant']
and !in_array($mode, ['choix', 'auto', 'image', 'document'])
isset($file['distant']) && $file['distant'] && !in_array($mode, ['choix', 'auto', 'image', 'document'])
) {
spip_log("document distant $source accepte sans verification, mode=$mode", 'medias' . _LOG_INFO_IMPORTANTE);
include_spip('inc/distant');
......@@ -132,30 +129,29 @@ function action_ajouter_un_document_dist($id_document, $file, $objet, $id_objet,
// Documents distants : pas trop de verifications bloquantes, mais un test
// via une requete HEAD pour savoir si la ressource existe (non 404), si le
// content-type est connu, et si possible recuperer la taille, voire plus.
if (isset($file['distant']) and $file['distant']) {
if (isset($file['distant']) && $file['distant']) {
if (!tester_url_absolue($source)) {
return _T('medias:erreur_chemin_distant', ['nom' => $source]);
}
include_spip('inc/distant');
$source = str_replace(["'",'"','<'], ['%27','%22','%3C'], $source);
$source = str_replace(["'", '"', '<'], ['%27', '%22', '%3C'], $source);
if (is_array($a = renseigner_source_distante($source))) {
$champs = $a;
# NB: dans les bonnes conditions (fichier autorise et pas trop gros)
# $a['copie_locale'] est une copie locale du fichier
// voir si le document a besoin d'un nettoyage et le cas echeant relire ses infos apres
if (!empty($champs['copie_locale']) and file_exists($champs['copie_locale'])) {
if (!empty($champs['copie_locale']) && file_exists($champs['copie_locale'])) {
$res_sanitize = sanitizer_document($champs['copie_locale'], $champs['extension']);
$infos = renseigner_taille_dimension_image($champs['copie_locale'], $champs['extension']);
}
else {
} else {
$infos = renseigner_taille_dimension_image($champs['fichier'], $champs['extension'], true);
}
// on ignore erreur eventuelle sur $infos car on est distant, ca ne marche pas forcement
if (is_array($infos)) {
foreach ($infos as $k => $v) {
if (!empty($v) or empty($champs[$k])) {
if (!empty($v) || empty($champs[$k])) {
$champs[$k] = $v;
}
}
......@@ -170,18 +166,21 @@ function action_ajouter_un_document_dist($id_document, $file, $objet, $id_objet,
}
} else { // pas distant
$champs = [
'distant' => 'non'
'distant' => 'non',
];
$champs['titre'] = '';
if ($titrer) {
if ($titrer_document = charger_fonction('titrer_document', 'inc', true)) {
$champs['titre'] = $titrer_document($nom_envoye);
}
else {
$titre = substr($nom_envoye, 0, strrpos($nom_envoye, '.')); // Enlever l'extension du nom du fichier
} else {
$titre = substr(
(string) $nom_envoye,
0,
strrpos((string) $nom_envoye, '.')
); // Enlever l'extension du nom du fichier
$titre = preg_replace(',[[:punct:][:space:]]+,u', ' ', $titre);
$champs['titre'] = preg_replace(',\.([^.]+)$,', '', $titre);
$champs['titre'] = preg_replace(',\.([^.]+)$,', '', (string) $titre);
}
}
......@@ -210,10 +209,18 @@ function action_ajouter_un_document_dist($id_document, $file, $objet, $id_objet,
// lorsqu’une image arrive avec une mauvaise extension par rapport au mime type, adapter.
// Exemple : si extension .jpg mais le contenu est un png
if (!empty($infos['type_image']) and $infos['type_image'] !== $champs['extension']) {
spip_log('Image `' . $file['name'] . '` mauvaise extension. Correcte : ' . $infos['type_image'], 'medias' . _LOG_INFO);
if (!empty($infos['type_image']) && $infos['type_image'] !== $champs['extension']) {
spip_log(
'Image `' . $file['name'] . '` mauvaise extension. Correcte : ' . $infos['type_image'],
'medias' . _LOG_INFO
);
$subdir = determiner_sous_dossier_document($infos['type_image'], $file['name'] . '.' . $infos['type_image'], $mode);
$new = copier_document($infos['type_image'], $file['name'] . '.' . $infos['type_image'], $champs['fichier'], $subdir);
$new = copier_document(
$infos['type_image'],
$file['name'] . '.' . $infos['type_image'],
$champs['fichier'],
$subdir
);
if ($new) {
supprimer_fichier($champs['fichier']);
$champs['fichier'] = $new;
......@@ -225,7 +232,10 @@ function action_ajouter_un_document_dist($id_document, $file, $objet, $id_objet,
}
spip_log('> Image `' . $file['name'] . '` renommée en : ' . basename($champs['fichier']), 'medias' . _LOG_INFO);
} else {
spip_log('! Image `' . $file['name'] . '` non renommée en extension : ' . $champs['extension'], 'medias' . _LOG_INFO_IMPORTANTE);
spip_log(
'! Image `' . $file['name'] . '` non renommée en extension : ' . $champs['extension'],
'medias' . _LOG_INFO_IMPORTANTE
);
}
}
......@@ -269,7 +279,7 @@ function action_ajouter_un_document_dist($id_document, $file, $objet, $id_objet,
// lier le parent si necessaire
// attention au cas particulier du site 0 utilisé pour le logo du site
if ($objet and (($id_objet = intval($id_objet)) or in_array($objet, ['site', 'rubrique']))) {
if ($objet && (($id_objet = intval($id_objet)) || in_array($objet, ['site', 'rubrique']))) {
$champs['parents'][] = "$objet|$id_objet";
}
......@@ -321,7 +331,7 @@ function action_ajouter_un_document_dist($id_document, $file, $objet, $id_objet,
'action' => 'ajouter_document',
'operation' => 'ajouter_document', // compat <= v2.0
],
'data' => $champs
'data' => $champs,
]
);
......@@ -331,15 +341,12 @@ function action_ajouter_un_document_dist($id_document, $file, $objet, $id_objet,
/**
* Sous-repertoire dans lequel on stocke le document
* en regle general $ext/ sauf pour les logo
* @param $ext
* @param $fichier
* @param $mode
* @return mixed
*/
function determiner_sous_dossier_document($ext, $fichier, $mode) {
// si mode un logoxx on met dans logo/
if (strncmp($mode, 'logo', 4) === 0) {
if (str_starts_with((string) $mode, 'logo')) {
return 'logo';
}
......@@ -367,7 +374,7 @@ function verifier_upload_autorise($source, $mode = '') {
$res = false;
if (
preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $source, $match)
and $ext = $match[1]
&& ($ext = $match[1])
) {
$ext = corriger_extension(strtolower($ext));
if (
......@@ -392,7 +399,7 @@ function verifier_upload_autorise($source, $mode = '') {
$res['autozip'] = true;
}
}
if ($mode and $res) {
if ($mode && $res) {
// verifier en fonction du mode si une fonction est proposee
if ($verifier_document_mode = charger_fonction('verifier_document_mode_' . $mode, 'inc', true)) {
$check = $verifier_document_mode($infos); // true ou message d'erreur sous forme de chaine
......@@ -402,14 +409,13 @@ function verifier_upload_autorise($source, $mode = '') {
}
}
if (!$res or is_string($res)) {
if (!$res || is_string($res)) {
spip_log("Upload $source interdit ($res)", _LOG_INFO_IMPORTANTE);
}
return $res;
}
/**
* Tester le type de document
*
......@@ -442,60 +448,59 @@ function fixer_fichier_upload($file, $mode = '') {
spip_log('Echec copie du fichier ' . $file['tmp_name'] . ' (taille de fichier indéfinie)');
spip_unlink(get_spip_doc($row['fichier']));
return _T('medias:erreur_copie_fichier', ['nom' => $file['tmp_name']]);
} else {
return $row;
}
} else {
// creer un zip comme demande
// pour encapsuler un fichier dont l'extension n'est pas supportee
unset($row['autozip']);
return $row;
$ext = 'zip';
if (!$tmp_dir = tempnam(_DIR_TMP, 'tmp_upload')) {
return false;
}
}
// creer un zip comme demande
// pour encapsuler un fichier dont l'extension n'est pas supportee
unset($row['autozip']);
spip_unlink($tmp_dir);
@mkdir($tmp_dir);
$ext = 'zip';
if (!$tmp_dir = tempnam(_DIR_TMP, 'tmp_upload')) {
return false;
}
include_spip('inc/charsets');
$tmp = $tmp_dir . '/' . translitteration($file['name']);
spip_unlink($tmp_dir);
@mkdir($tmp_dir);
// conserver l'extension dans le nom de fichier, par exemple toto.js => toto.js.zip
$file['name'] .= '.' . $ext;
include_spip('inc/charsets');
$tmp = $tmp_dir . '/' . translitteration($file['name']);
// deplacer le fichier tmp_name dans le dossier tmp
deplacer_fichier_upload($file['tmp_name'], $tmp, true);
// conserver l'extension dans le nom de fichier, par exemple toto.js => toto.js.zip
$file['name'] .= '.' . $ext;
$source = _DIR_TMP . basename($tmp_dir) . '.' . $ext;
// deplacer le fichier tmp_name dans le dossier tmp
deplacer_fichier_upload($file['tmp_name'], $tmp, true);
$archive = new SpipArchiver($source);
$res = $archive->emballer([$tmp]);
$source = _DIR_TMP . basename($tmp_dir) . '.' . $ext;
effacer_repertoire_temporaire($tmp_dir);
if (!$res) {
spip_log("Echec creation du zip $source", 'medias' . _LOG_ERREUR);
return _T('medias:erreur_ecriture_fichier');
}
$archive = new SpipArchiver($source);
$res = $archive->emballer([$tmp]);
$row['fichier'] = copier_document($row['extension'], $file['name'], $source, $subdir);
spip_unlink($source);
/**
* On vérifie que le fichier a une taille
* si non, on le supprime et on affiche une erreur
*/
if ($row['fichier'] && (!$taille = @intval(filesize(get_spip_doc($row['fichier']))))) {
spip_log('Echec copie du fichier ' . $file['tmp_name'] . ' (taille de fichier indéfinie)');
spip_unlink(get_spip_doc($row['fichier']));
effacer_repertoire_temporaire($tmp_dir);
if (!$res) {
spip_log("Echec creation du zip $source", 'medias' . _LOG_ERREUR);
return _T('medias:erreur_ecriture_fichier');
}
return _T('medias:erreur_copie_fichier', ['nom' => $file['tmp_name']]);
} else {
return $row;
}
$row['fichier'] = copier_document($row['extension'], $file['name'], $source, $subdir);
spip_unlink($source);
/**
* On vérifie que le fichier a une taille
* si non, on le supprime et on affiche une erreur
*/
if ($row['fichier'] && (!$taille = @intval(filesize(get_spip_doc($row['fichier']))))) {
spip_log('Echec copie du fichier ' . $file['tmp_name'] . ' (taille de fichier indéfinie)');
spip_unlink(get_spip_doc($row['fichier']));
return _T('medias:erreur_copie_fichier', ['nom' => $file['tmp_name']]);
}
} else {
return $row;
} // retourner le message d'erreur
}
return $row;
// retourner le message d'erreur
}
/**
......
......@@ -13,20 +13,18 @@ if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Cette action permet de basculer du mode image au mode document et vice versa
*
* @param int $id_document
* @param string $mode
* @return void
*/
function action_changer_mode_document_dist($id_document = null, $mode = null) {
if (is_null($id_document) or is_null($mode)) {
if ($id_document === null || $mode === null) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
if (!preg_match(',^(\d+)\W(\w+)$,', $arg, $r)) {
if (!preg_match(',^(\d+)\W(\w+)$,', (string) $arg, $r)) {
spip_log("action_changer_mode_document $arg pas compris");
} else {
array_shift($r);
......@@ -35,9 +33,7 @@ function action_changer_mode_document_dist($id_document = null, $mode = null) {
}
if (
$id_document
and include_spip('inc/autoriser')
and autoriser('modifier', 'document', $id_document)
$id_document && include_spip('inc/autoriser') && autoriser('modifier', 'document', $id_document)
) {
action_changer_mode_document_post($id_document, $mode);
}
......@@ -47,8 +43,8 @@ function action_changer_mode_document_post($id_document, $mode) {
// - id_document le doc a modifier
// - mode le mode a lui donner
if (
$id_document = intval($id_document)
and in_array($mode, ['vignette', 'image', 'document'])
($id_document = intval($id_document))
&& in_array($mode, ['vignette', 'image', 'document'])
) {
include_spip('action/editer_document');
document_modifier($id_document, ['mode' => $mode]);
......
......@@ -36,14 +36,13 @@ function action_copier_local_dist($id_document = null) {
spip_log("action_copier_local_dist $arg pas compris");
return false;
} else {
// arguments recuperes, on peut maintenant appeler la fonction.
return action_copier_local_post($id_document);
}
// arguments recuperes, on peut maintenant appeler la fonction.
return action_copier_local_post($id_document);
}
/**
* @param $id_document
* @return bool|mixed|string
*/
function action_copier_local_post($id_document) {
......@@ -56,15 +55,13 @@ function action_copier_local_post($id_document) {
// sinon c'est une donnee moisie, on ne fait rien
include_spip('inc/distant');
if (
tester_url_absolue($source)
and valider_url_distante($source)
tester_url_absolue($source) && valider_url_distante($source)
) {
// on fait une copie locale en verifiant aussi l'URL finale qui a été récupérée
$fichier = copie_locale($source, 'auto', null, null, 'valider_url_distante');
// on revalide la source *apres* copie car si elle est controlee par un serveur dns malicieux elle peut etre changeante
if (
$fichier
and valider_url_distante($source)
$fichier && valider_url_distante($source)
) {
$fichier = _DIR_RACINE . $fichier;
$files = [];
......@@ -78,18 +75,15 @@ function action_copier_local_post($id_document) {
// ajouter l'origine du document aux credits
include_spip('action/editer_document');
document_modifier(
$id_document,
['credits' => ($row['credits'] ? $row['credits'] . ', ' : '') . $source]
);
document_modifier($id_document, ['credits' => ($row['credits'] ? $row['credits'] . ', ' : '') . $source]);
return true;
} else {
spip_log("echec copie locale $source", 'medias' . _LOG_ERREUR);
if ($fichier) {
@unlink(_DIR_RACINE . $fichier);
}
}
spip_log("echec copie locale $source", 'medias' . _LOG_ERREUR);
if ($fichier) {
@unlink(_DIR_RACINE . $fichier);
}
} else {
spip_log("echec copie locale $source n'est pas une URL distante", 'medias' . _LOG_ERREUR);
}
......
......@@ -18,7 +18,6 @@ if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Désordonner des documents
*
......@@ -28,25 +27,22 @@ if (!defined('_ECRIRE_INC_VERSION')) {
*
* - 4eme arg : suppr = true, false sinon
* - 5eme arg : safe = true, false sinon
*
* @return void
*/
function action_desordonner_liens_documents_dist($arg = null) {
if (is_null($arg)) {
if ($arg === null) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
}
$arg = explode('-', $arg);
$arg = explode('-', (string) $arg);
[$id_objet, $objet, $document] = $arg;
if (
$id_objet = intval($id_objet)
and autoriser('desordonnerdocuments', $objet, $id_objet)
($id_objet = intval($id_objet)) && autoriser('desordonnerdocuments', $objet, $id_objet)
) {
desordonner_liens_documents($document, $objet, $id_objet);
} else {
spip_log("Interdit de désordonner les documents sur : $objet $id_objet", 'spip');
spip_logger()->info("Interdit de désordonner les documents sur : $objet $id_objet");
}
}
......@@ -62,7 +58,6 @@ function action_desordonner_liens_documents_dist($arg = null) {
* objet duquel dissocier
* @param $id_objet
* id_objet duquel dissocier
* @return void
*/
function desordonner_liens_documents($document, $objet, $id_objet) {
include_spip('action/editer_liens');
......@@ -96,12 +91,7 @@ function desordonner_liens_documents($document, $objet, $id_objet) {
* objet duquel dissocier
* @param $id_objet
* id_objet duquel dissocier
* @return void
*/
function desordonner_liens_document($id_document, $objet, $id_objet) {
objet_qualifier_liens(
['document' => $id_document],
[$objet => $id_objet],
['rang_lien' => 0]
);
objet_qualifier_liens(['document' => $id_document], [$objet => $id_objet], ['rang_lien' => 0]);
}
......@@ -18,7 +18,6 @@ if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Dissocier un document
*
......@@ -28,42 +27,40 @@ if (!defined('_ECRIRE_INC_VERSION')) {
*
* - 4eme arg : suppr = true, false sinon
* - 5eme arg : safe = true, false sinon
*
* @return void
*/
function action_dissocier_document_dist($arg = null) {
if (is_null($arg)) {
if ($arg === null) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
}
// attention au cas ou id_objet est negatif !
if (strncmp($arg, '-', 1) == 0) {
$arg = explode('-', substr($arg, 1));
if (str_starts_with((string) $arg, '-')) {
$arg = explode('-', substr((string) $arg, 1));
[$id_objet, $objet, $document] = $arg;
$id_objet = -$id_objet;
} else {
$arg = explode('-', $arg);
$arg = explode('-', (string) $arg);
[$id_objet, $objet, $document] = $arg;
}
$suppr = $check = false;
if (count($arg) > 3 and $arg[3] == 'suppr') {
if (count($arg) > 3 && $arg[3] == 'suppr') {
$suppr = true;
}
if (count($arg) > 4 and $arg[4] == 'safe') {
if (count($arg) > 4 && $arg[4] == 'safe') {
$check = true;
}
if (
$id_objet = intval($id_objet)
and (
($id_objet < 0 and $id_objet == -$GLOBALS['visiteur_session']['id_auteur'])
or autoriser('dissocierdocuments', $objet, $id_objet)
($id_objet = intval($id_objet))
&& (
($id_objet < 0 && $id_objet == -$GLOBALS['visiteur_session']['id_auteur'])
|| autoriser('dissocierdocuments', $objet, $id_objet)
)
) {
dissocier_document($document, $objet, $id_objet, $suppr, $check);
} else {
spip_log("Interdit de modifier $objet $id_objet", 'spip');
spip_logger()->info("Interdit de modifier $objet $id_objet");
}
}
......@@ -81,7 +78,7 @@ function action_dissocier_document_dist($arg = null) {
* @return bool
*/
function supprimer_lien_document($id_document, $objet, $id_objet, $supprime = false, $check = false) {
if (!$id_document = intval($id_document)) {
if (!($id_document = intval($id_document))) {
return false;
}
......@@ -113,9 +110,9 @@ function supprimer_lien_document($id_document, $objet, $id_objet, $supprime = fa
'table' => 'spip_documents',
'id_objet' => $id_document,
'objet' => $objet,
'id' => $id_objet
'id' => $id_objet,
],
'data' => null
'data' => null,
]
);
......@@ -124,7 +121,7 @@ function supprimer_lien_document($id_document, $objet, $id_objet, $supprime = fa
$spip_table_objet = table_objet_sql($objet);
$table_objet = table_objet($objet);
$id_table_objet = id_table_objet($objet, $serveur);
$champs = sql_fetsel('*', $spip_table_objet, addslashes($id_table_objet) . '=' . intval($id_objet));
$champs = sql_fetsel('*', $spip_table_objet, addslashes((string) $id_table_objet) . '=' . intval($id_objet));
$marquer_doublons_doc = charger_fonction('marquer_doublons_doc', 'inc');
$marquer_doublons_doc($champs, $id_objet, $objet, $id_table_objet, $table_objet, $spip_table_objet, '', $serveur);
......@@ -133,11 +130,13 @@ function supprimer_lien_document($id_document, $objet, $id_objet, $supprime = fa
// On supprime ensuite s'il est orphelin
// et si demande
// ici on ne bloque pas la suppression d'un document rattache a un autre
if ($supprime and !sql_countsel('spip_documents_liens', "objet!='document' AND id_document=" . $id_document)) {
if ($supprime && !sql_countsel('spip_documents_liens', "objet!='document' AND id_document=" . $id_document)) {
$supprimer_document = charger_fonction('supprimer_document', 'action');
return $supprimer_document($id_document);
}
return true;
}
/**
......@@ -156,7 +155,6 @@ function supprimer_lien_document($id_document, $objet, $id_objet, $supprime = fa
* supprimer les documents orphelins apres dissociation
* @param bool $check
* verifier le texte des documents et relier les documents references dans l'objet
* @return void
*/
function dissocier_document($document, $objet, $id_objet, $supprime = false, $check = false) {
if ($id_document = intval($document)) {
......
......@@ -13,7 +13,6 @@ if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Action editer_document
*
......@@ -22,7 +21,7 @@ if (!defined('_ECRIRE_INC_VERSION')) {
*/
function action_editer_document_dist($arg = null) {
if (is_null($arg)) {
if ($arg === null) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
}
......@@ -61,31 +60,27 @@ function document_inserer($id_parent = null, $set = null) {
}
// Envoyer aux plugins
$champs = pipeline(
'pre_insertion',
[
'args' => [
'table' => 'spip_documents',
],
'data' => $champs
]
);
$champs = pipeline('pre_insertion', [
'args' => [
'table' => 'spip_documents',
],
'data' => $champs,
]);
$id_document = sql_insertq('spip_documents', $champs);
pipeline(
'post_insertion',
[
'args' => [
'table' => 'spip_documents',
'id_objet' => $id_document
'id_objet' => $id_document,
],
'data' => $champs
'data' => $champs,
]
);
return $id_document;
}
/**
* Enregistre une revision de document.
* $set est un contenu (par defaut on prend le contenu via _request())
......@@ -109,7 +104,6 @@ function document_modifier($id_document, $set = null) {
$set
);
$invalideur = '';
$indexation = false;
......@@ -131,9 +125,9 @@ function document_modifier($id_document, $set = null) {
'document',
$id_document,
[
'data' => $set,
'invalideur' => $invalideur,
'indexation' => $indexation
'data' => $set,
'invalideur' => $invalideur,
'indexation' => $indexation,
],
$champs
)
......@@ -143,12 +137,12 @@ function document_modifier($id_document, $set = null) {
// nettoyer l'ancien fichier si necessaire
if (
isset($champs['fichier']) // un plugin a pu interdire la modif du fichier en virant le champ
and $champs['fichier']
and $ancien_fichier // on avait bien note le nom du fichier avant la modif
and $ancien_fichier !== $champs['fichier'] // et il a ete modifie
and !tester_url_absolue($ancien_fichier)
and @file_exists($f = get_spip_doc($ancien_fichier))
isset($champs['fichier'])
&& $champs['fichier']
&& $ancien_fichier
&& $ancien_fichier !== $champs['fichier']
&& !tester_url_absolue($ancien_fichier)
&& @file_exists($f = get_spip_doc($ancien_fichier))
) {
spip_unlink($f);
}
......@@ -167,7 +161,6 @@ function document_modifier($id_document, $set = null) {
}
}
/**
* determiner le statut d'un document : prepa/publie
* si on trouve un element joint sans champ statut ou avec un statut='publie' alors le doc est publie aussi
......@@ -194,7 +187,7 @@ function document_instituer($id_document, $champs = []) {
$champs = [];
/* Autodetermination du statut si non fourni */
if (is_null($statut)) {
if ($statut === null) {
$determiner_statut_document = charger_fonction('determiner_statut_document', 'inc');
$champs = $determiner_statut_document($id_document, $statut_ancien, $date_publication_ancienne);
......@@ -202,17 +195,14 @@ function document_instituer($id_document, $champs = []) {
if ($champs === false) {
return false;
}
}
else {
} else {
if ($statut !== $statut_ancien) {
$champs['statut'] = $statut;
}
}
if (
!is_null($date_publication)
and empty($champs['date_publication'])
and $date_publication != $date_publication_ancienne
$date_publication !== null && empty($champs['date_publication']) && $date_publication != $date_publication_ancienne
) {
$champs['date_publication'] = $date_publication;
}
......@@ -228,7 +218,7 @@ function document_instituer($id_document, $champs = []) {
'statut_ancien' => $statut_ancien,
'date_ancienne' => $date_publication_ancienne,
],
'data' => $champs
'data' => $champs,
]
);
......@@ -265,14 +255,13 @@ function document_instituer($id_document, $champs = []) {
'statut_ancien' => $statut_ancien,
'date_ancienne' => $date_publication_ancienne,
],
'data' => $champs
'data' => $champs,
]
);
return true;
}
/**
* Revision des parents d'un document
* chaque parent est liste au format objet|id_objet
......@@ -293,10 +282,13 @@ function medias_revision_document_parents($id_document, $parents = null, $ajout
// au format objet|id_objet
foreach ($parents as $p) {
$p = explode('|', $p);
$p = explode('|', (string) $p);
if (
preg_match('/^[a-z0-9_]+$/i', $objet = $p[0])
and (($p[1] = intval($p[1])) or in_array($objet, ['site', 'rubrique']))
&& (
($p[1] = intval($p[1]))
|| in_array($objet, ['site', 'rubrique'])
)
) { // securite
$objets_parents[$p[0]][] = $p[1];
}
......@@ -309,7 +301,7 @@ function medias_revision_document_parents($id_document, $parents = null, $ajout
// si ce n'est pas un ajout, il faut supprimer les liens actuels qui ne sont pas dans $objets_parents
if (!$ajout) {
foreach ($liens as $k => $lien) {
if (!isset($objets_parents[$lien['objet']]) or !in_array($lien['id_objet'], $objets_parents[$lien['objet']])) {
if (!isset($objets_parents[$lien['objet']]) || !in_array($lien['id_objet'], $objets_parents[$lien['objet']])) {
if (autoriser('dissocierdocuments', $lien['objet'], $lien['id_objet'])) {
objet_dissocier(['document' => $id_document], [$lien['objet'] => $lien['id_objet']]);
}
......@@ -324,11 +316,7 @@ function medias_revision_document_parents($id_document, $parents = null, $ajout
foreach ($objets_parents as $objet => $ids) {
foreach ($ids as $k => $id) {
if (
(
isset($deja_parents[$objet])
and in_array($id, $deja_parents[$objet])
)
or !autoriser('associerdocuments', $objet, $id)
isset($deja_parents[$objet]) && in_array($id, $deja_parents[$objet]) || !autoriser('associerdocuments', $objet, $id)
) {
unset($objets_parents[$objet][$k]);
}
......
<?php
/**
* SPIP, Système de publication pour l'internet
*
* Copyright © avec tendresse depuis 2001
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
*
* Ce programme est un logiciel libre distribué sous licence GNU/GPL.
*/
/**
* 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) {
# TODO : deprecated, a supprimer -> anciens logos IMG/artonxx.png pas en base
if ((is_countable($logo) ? count($logo) : 0) < 6) {
spip_logger('logo')->info('Supprimer ancien logo ' . json_encode($logo, JSON_THROW_ON_ERROR));
spip_unlink($logo[0]);
} elseif (
($doc = $logo[5])
&& isset($doc['id_document'])
&& ($id_document = $doc['id_document'])
) {
include_spip('action/editer_liens');
// supprimer le lien dans la base
objet_dissocier(['document' => $id_document], [$objet => $id_objet], ['role' => '*']);
// verifier si il reste des liens avec d'autres objets et sinon supprimer
$liens = objet_trouver_liens(['document' => $id_document], '*');
if ($liens === []) {
$supprimer_document = charger_fonction('supprimer_document', 'action');
$supprimer_document($doc['id_document']);
}
}
}
}
/**
* 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');
$mode = preg_replace(',\W,', '', $etat);
if (!$mode) {
spip_logger('logo')->info("logo_modifier : etat $etat invalide");
return 'etat invalide';
}
// chercher dans la base
$mode_document = 'logo' . $mode;
include_spip('inc/documents');
$erreur = '';
if (!$source) {
spip_logger('logo')->info('spip_image_ajouter : source inconnue');
return 'source inconnue';
}
// fichier dans upload/
if (is_string($source)) {
$tmp_name = false;
if (file_exists($source)) {
$tmp_name = $source;
} elseif (file_exists($f = determine_upload() . $source)) {
$tmp_name = $f;
}
if (!$tmp_name) {
spip_logger('logo')->info('spip_image_ajouter : source inconnue');
return 'source inconnue';
}
$source = [
'tmp_name' => $tmp_name,
'name' => basename($tmp_name),
];
} elseif ($erreur = check_upload_error($source['error'], '', true)) {
return $erreur;
}
// supprimer le logo éventuel existant
// TODO : si un logo existe, le modifier plutot que supprimer + reinserer
// (mais il faut gerer le cas ou il est utilise par plusieurs objets, donc pas si simple)
// mais de toute facon l'interface actuelle oblige a supprimer + reinserer
// @see medias_upgrade_logo_objet()
if (empty($GLOBALS['logo_migrer_en_base'])) {
logo_supprimer($objet, $id_objet, $etat);
}
include_spip('inc/autoriser');
$source['mode'] = $mode_document;
$ajouter_documents = charger_fonction('ajouter_documents', 'action');
autoriser_exception('associerdocuments', $objet, $id_objet);
$ajoutes = $ajouter_documents('new', [$source], $objet, $id_objet, $mode_document);
autoriser_exception('associerdocuments', $objet, $id_objet, false);
$id_document = reset($ajoutes);
if (!is_numeric($id_document)) {
$erreur = ($id_document ?: 'Erreur inconnue');
spip_logger('logo')
->info("Erreur ajout logo : $erreur pour source=" . json_encode($source, JSON_THROW_ON_ERROR));
return $erreur;
}
return ''; // tout est bon, pas d'erreur
}
/**
* Migration des logos en documents.
*
* - avant dans IMG/artonXX.png
* - après dans IMG/logo/... + enregistrés en document dans spip_documents
*
* Cette migration est effectuée à partir de SPIP 4.0
* et la fonction doit être appelée pour chaque plugin qui aurait utilisé des logos
* sur des objets éditoriaux.
*
* @since 4.0
* @deprecated 5.0 Migrer le site & les logos / tables dans un SPIP 4.x ou 5.x
* @param string $objet Type d’objet spip, tel que 'article'
* @param int $time_limit
*/
function logo_migrer_en_base($objet, $time_limit) {
$dir_logos_erreurs = sous_repertoire(_DIR_IMG, 'logo_erreurs');
$dir_logos = sous_repertoire(_DIR_IMG, 'logo');
include_spip('inc/filtres_images_lib_mini');
$formats_logos = _image_extensions_logos(['objet' => $objet]);
$trouver_table = charger_fonction('trouver_table', 'base');
$chercher_logo = charger_fonction('chercher_logo', 'inc');
include_spip('inc/chercher_logo');
$_id_objet = id_table_objet($objet);
$table = table_objet_sql($objet);
$type = type_du_logo($_id_objet);
$desc = $trouver_table($table);
// on desactive les revisions
$liste_objets_versionnes = $GLOBALS['meta']['objets_versions'] ?? '';
unset($GLOBALS['meta']['objets_versions']);
// et le signalement des editions
$articles_modif = $GLOBALS['meta']['articles_modif'] ?? '';
$GLOBALS['meta']['articles_modif'] = 'non';
foreach (['on', 'off'] as $mode) {
$nom_base = $type . $mode;
$dir = (defined('_DIR_LOGOS') ? _DIR_LOGOS : _DIR_IMG);
$files = glob($dir . $nom_base . '*');
// est-ce que c'est une nouvelle tentative de migration ?
// dans ce cas les logos sont deja dans IMG/logo/
if (!(is_countable($files) ? count($files) : 0)) {
$files = glob($dir_logos . $nom_base . '*');
if (is_countable($files) ? count($files) : 0) {
// mais il faut verifier si ils ont pas deja ete migres pour tout ou partie
$filescheck = [];
foreach ($files as $file) {
$short = basename(dirname((string) $file)) . DIRECTORY_SEPARATOR . basename((string) $file);
$filescheck[$short] = $file;
}
// trouver ceux deja migres
$deja = sql_allfetsel(
'fichier',
'spip_documents',
sql_in('fichier', array_keys($filescheck)) . " AND mode LIKE 'logo%'"
);
if (is_countable($deja) ? count($deja) : 0) {
$deja = array_column($deja, 'fichier');
$restant = array_diff(array_keys($filescheck), $deja);
$files = [];
if ($restant !== []) {
foreach ($restant as $r) {
$files[] = $filescheck[$r];
}
}
}
// et si il en reste on peut y aller...
// mais il faut modifier $dir qui sert de base dans la suite
if (is_countable($files) ? count($files) : 0) {
$dir = $dir_logos;
}
}
}
$count = (is_countable($files) ? count($files) : 0);
spip_logger('maj')
->notice("logo_migrer_en_base $objet $mode : " . $count . ' logos restant');
$deja = [];
foreach ($files as $file) {
$logo = substr((string) $file, strlen($dir . $nom_base));
$logo = explode('.', $logo);
if (
is_numeric($logo[0])
&& (($id_objet = (int) $logo[0]) || in_array($objet, ['site', 'rubrique']))
&& !isset($deja[$id_objet])
) {
$logo = $chercher_logo($id_objet, $_id_objet, $mode);
// if no logo in base
if (!$logo || (is_countable($logo) ? count($logo) : 0) < 6) {
foreach ($formats_logos as $format) {
if (@file_exists($d = ($dir . ($nom = $nom_base . (int) $id_objet . '.' . $format)))) {
if (isset($desc['field']['date_modif'])) {
$date_modif = sql_getfetsel('date_modif', $table, "$_id_objet=$id_objet");
} else {
$date_modif = null;
}
// s'assurer que le logo a les bon droits au passage (evite un echec en cas de sanitization d'un svg)
@chmod($d, _SPIP_CHMOD & 0666);
// logo_modifier commence par supprimer le logo existant, donc on le deplace pour pas le perdre
@rename($d, $dir_logos . $nom);
// et on le declare comme nouveau logo
logo_modifier($objet, $id_objet, $mode, $dir_logos . $nom);
if ($date_modif) {
sql_updateq($table, ['date_modif' => $date_modif], "$_id_objet=$id_objet");
}
break;
}
}
}
$deja[$id_objet] = true;
}
// si le fichier est encore la on le move : rien a faire ici
// (sauf si c'est une re-migration : il est deja dans logo/ donc il bouge pas)
if ($dir !== $dir_logos && file_exists($file)) {
@rename($file, $dir_logos_erreurs . basename((string) $file));
}
$count--;
if ($count % 250 === 0) {
spip_logger('maj')->notice("logo_migrer_en_base $objet $mode : " . $count . ' logos restant');
}
if ($time_limit && time() > $time_limit) {
effacer_meta('drapeau_edition');
return;
}
}
}
if ($liste_objets_versionnes) {
$GLOBALS['meta']['objets_versions'] = $liste_objets_versionnes;
}
$GLOBALS['meta']['articles_modif'] = $articles_modif;
effacer_meta('drapeau_edition');
}
/**
* Retourne le type de logo tel que `art` depuis le nom de clé primaire
* de l'objet
*
* C'est par défaut le type d'objet, mais il existe des exceptions historiques
* déclarées par la globale `$table_logos`
*
* @see logo_migrer_en_base()
* @see medias_upgrade_logo_objet()
*
* @param string $_id_objet
* Nom de la clé primaire de l'objet
* @return string
* Type du logo
* @deprecated 4.0 MAIS NE PAS SUPPRIMER CAR SERT POUR L'UPGRADE des logos et leur mise en base
*/
function type_du_logo($_id_objet) {
if ((debug_backtrace(0, 2)[1]['function'] ?? '') !== 'logo_migrer_en_base') {
trigger_deprecation('spip', '4.0', 'Using "%s" is deprecated', __FUNCTION__);
}
$legacy_tables_logos = [
'id_article' => 'art',
'id_auteur' => 'aut',
'id_rubrique' => 'rub',
'id_groupe' => 'groupe',
];
return $legacy_tables_logos[$_id_objet] ?? objet_type(preg_replace(',^id_,', '', $_id_objet));
}
......@@ -18,7 +18,6 @@ function action_ordonner_liens_documents_dist() {
action_ordonner_liens_dist();
}
function action_ordonner_liens_dist() {
include_spip('inc/autoriser');
include_spip('base/objets');
......@@ -34,7 +33,7 @@ function action_ordonner_liens_dist() {
// ordre des éléments
$ordre = _request('ordre');
if (!$objet or !$objet_lie or !$id_objet_lie or !$ordre or !is_array($ordre) or !objet_associable($objet)) {
if (!$objet || !$objet_lie || !$id_objet_lie || !$ordre || !is_array($ordre) || !objet_associable($objet)) {
return envoyer_json_erreur(_T('medias:erreur_objet_absent') . ' ' . _T('medias:erreur_deplacement_impossible'));
}
......@@ -49,17 +48,13 @@ function action_ordonner_liens_dist() {
$actuels = sql_allfetsel(
[$_id_objet . ' AS id', 'rang_lien'],
$table_liens,
[
sql_in($_id_objet, $ordre),
'objet = ' . sql_quote($objet_lie),
'id_objet = ' . sql_quote($id_objet_lie)
]
[sql_in($_id_objet, $ordre), 'objet = ' . sql_quote($objet_lie), 'id_objet = ' . sql_quote($id_objet_lie)]
);
$futurs = array_flip($ordre);
// ordre de 1 à n (pas de 0 à n).
array_walk($futurs, function (&$v) {
$v++;
$v++;
});
$updates = [];
......@@ -75,11 +70,7 @@ function action_ordonner_liens_dist() {
sql_updateq(
$table_liens,
['rang_lien' => $ordre],
[
$_id_objet . ' = ' . $id,
'objet = ' . sql_quote($objet_lie),
'id_objet = ' . sql_quote($id_objet_lie)
]
[$_id_objet . ' = ' . $id, 'objet = ' . sql_quote($objet_lie), 'id_objet = ' . sql_quote($id_objet_lie)]
);
}
}
......@@ -100,6 +91,6 @@ function envoyer_json_erreur($msg) {
return envoyer_json_envoi([
'done' => false,
'success' => [],
'errors' => [$msg]
'errors' => [$msg],
]);
}
......@@ -60,7 +60,6 @@ function action_supprimer_document_dist($id_document = 0) {
objet_dissocier(['document' => $id_document], '*', ['role' => '*']);
sql_delete('spip_documents', 'id_document=' . intval($id_document));
// Supprimer le fichier si le doc est local,
// et la copie locale si le doc est distant
if ($doc['distant'] == 'oui') {
......@@ -82,7 +81,7 @@ function action_supprimer_document_dist($id_document = 0) {
'id_objet' => $id_document,
'document' => $doc,
],
'data' => null
'data' => null,
]
);
......
......@@ -21,7 +21,7 @@ function action_supprimer_tous_orphelins() {
$arg = $securiser_action();
//on recupere le contexte pour ne supprimer les orphelins que de ce dernier
[$media, $distant, $statut, $sanstitre] = explode('/', $arg);
[$media, $distant, $statut, $sanstitre] = explode('/', (string) $arg);
$where = [];
//critere sur le media
......
......@@ -22,21 +22,20 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* @param int $id_document
* @param int $angle
* angle de rotation en degre>0
* @return void
*/
function action_tourner_dist($id_document = null, $angle = null) {
if (is_null($id_document) or is_null($angle)) {
if ($id_document === null || $angle === null) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
if (!preg_match(',^\W*(\d+)\W?(-?\d+)$,', $arg, $r)) {
if (!preg_match(',^\W*(\d+)\W?(-?\d+)$,', (string) $arg, $r)) {
spip_log("action_tourner_dist $arg pas compris");
} else {
array_shift($r);
[$id_document, $angle] = $r;
}
}
if ($id_document and autoriser('modifier', 'document', $id_document)) {
if ($id_document && autoriser('modifier', 'document', $id_document)) {
action_tourner_post($id_document, $angle);
}
}
......@@ -47,7 +46,6 @@ function action_tourner_dist($id_document = null, $angle = null) {
* @param int $id_document
* @param int $angle
* angle de rotation en degre>0
* @return
*/
function action_tourner_post($id_document, $angle) {
$row = sql_fetsel('fichier,extension', 'spip_documents', 'id_document=' . intval($id_document));
......@@ -98,12 +96,12 @@ function action_tourner_post($id_document, $angle) {
}
// succes !
if ($largeur > 0 and $hauteur > 0) {
if ($largeur > 0 && $hauteur > 0) {
$set = [
'fichier' => set_spip_doc($dest),
'largeur' => $largeur,
'hauteur' => $hauteur,
'distant' => 'non' // le document n'est plus distant apres une transformation
'distant' => 'non', // le document n'est plus distant apres une transformation
];
if ($taille = @filesize($dest)) {
$set['taille'] = $taille;
......@@ -123,41 +121,15 @@ function action_tourner_post($id_document, $angle) {
'spip_table_objet' => 'spip_documents',
'type' => 'document',
'id_objet' => $id_document,
'champs' => ['rotation' => $angle, 'orientation' => $var_rot, 'fichier' => $row['fichier']],
'champs' => [
'rotation' => $angle,
'orientation' => $var_rot,
'fichier' => $row['fichier'],
],
'action' => 'tourner',
],
'data' => $set
'data' => $set,
]
);
}
}
// Appliquer l'EXIF orientation
// cf. http://trac.rezo.net/trac/spip/ticket/1494
function tourner_selon_exif_orientation($id_document, $fichier) {
if (
function_exists('exif_read_data')
&& ($exif = @exif_read_data($fichier))
&& (
($ort = $exif['IFD0']['Orientation'])
|| ($ort = $exif['Orientation'])
)
) {
spip_log("rotation: $ort");
$rot = null;
switch ($ort) {
case 3:
$rot = 180;
// rotation à 180
case 6:
$rot = 90;
// rotation à 90
case 8:
$rot = -90;
}
if ($rot) {
action_tourner_post([null, $id_document, $rot]);
}
}
}
......@@ -27,7 +27,7 @@ if (!defined('_ECRIRE_INC_VERSION')) {
*/
function action_verifier_documents_liens_dist($id_document = null) {
if (is_null($id_document)) {
if ($id_document === null) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$id_document = $securiser_action();
}
......
<?php
/**
* SPIP, Système de publication pour l'internet
*
* Copyright © avec tendresse depuis 2001
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
*
* Ce programme est un logiciel libre distribué sous licence GNU/GPL.
*/
/**
* Fonctions génériques pour les balises `#LOGO_XXXX`
*
* @package SPIP\Core\Compilateur\Balises
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Compile la balise dynamique `#ID_LOGO_xx` qui retourne l'identifiant du document utilisé comme logo
* pour un objet éditorial de SPIP.
*
* Le type d'objet est récupéré dans le nom de la balise, tel que
* `ID_LOGO_ARTICLE` ou `ID_LOGO_SITE`.
*
* Ces balises ont quelques options :
*
* - La balise peut aussi demander explicitement le logo normal ou de survol,
* avec `ID_LOGO_ARTICLE_NORMAL` ou `ID_LOGO_ARTICLE_SURVOL`.
* - On peut demander un logo de rubrique en absence de logo sur l'objet éditorial
* demandé avec `ID_LOGO_ARTICLE_RUBRIQUE`
*
* @balise
* @uses generer_code_logo()
* @example
* ```
* #ID_LOGO_ARTICLE
* ```
*
* @param Spip\Compilateur\Noeud\Champ $p
* Pile au niveau de la balise
* @return Spip\Compilateur\Noeud\Champ
* Pile complétée par le code à générer
*/
function balise_ID_LOGO__dist($p) {
preg_match(',^ID_LOGO_([A-Z_]+?)(|_NORMAL|_SURVOL|_RUBRIQUE)$,i', $p->nom_champ, $regs);
$type = strtolower($regs[1]);
$suite_logo = $regs[2];
// cas de #ID_LOGO_SITE_SPIP
if ($type == 'site_spip') {
$type = 'site';
$_id_objet = "\"'0'\"";
}
$id_objet = id_table_objet($type);
if (!isset($_id_objet)) {
$_id_objet = champ_sql($id_objet, $p);
}
$connect = $p->id_boucle ? $p->boucles[$p->id_boucle]->sql_serveur : '';
if ($type == 'document') {
$qconnect = _q($connect);
$doc = "quete_document($_id_objet, $qconnect)";
$code = "table_valeur($doc, 'id_vignette')";
} elseif ($connect) {
$code = "''";
spip_logger()
->info('Les logos distants ne sont pas prevus');
} else {
$champ_logo = 'id';
$code = generer_code_logo($id_objet, $_id_objet, $type, '', "''", $p, $suite_logo, $champ_logo);
}
$p->code = $code;
$p->interdire_scripts = false;
return $p;
}
/**
* Calcule le code HTML pour l'image ou l'information sur un logo
*
* @uses quete_logo()
* @uses quete_html_logo()
*
* @param string $id_objet
* Nom de la clé primaire de l'objet (id_article, ...)
* @param string $_id_objet
* Code pour la compilation permettant de récupérer la valeur de l'identifiant
* @param string $type
* Type d'objet
* @param string $align
* Alignement demandé du logo
* @param Spip\Compilateur\Noeud\Champ $p
* Pile au niveau de la balise
* @param string $suite
* Suite éventuelle de la balise logo, telle que `_SURVOL`, `_NORMAL` ou `_RUBRIQUE`.
* @param string $champ
* Indique un type de champ à retourner (fichier, src, titre, descriptif, credits, id, alt)
* @return string
* Code compilé retournant le chemin du logo ou le code HTML du logo.
*/
function generer_code_logo($id_objet, $_id_objet, $type, $align, $_lien, $p, $suite, string $champ = ''): string {
$onoff = 'ON';
$_id_rubrique = "''";
if ($type === 'rubrique') {
$_id_rubrique = "quete_parent($_id_objet)";
}
if ($suite === '_SURVOL') {
$onoff = 'off';
} elseif ($suite === '_NORMAL') {
$onoff = 'on';
} elseif ($suite === '_RUBRIQUE') {
$_id_rubrique = champ_sql('id_rubrique', $p);
}
$code = "quete_logo('$id_objet', '$onoff', $_id_objet, $_id_rubrique)";
if ($champ) {
return "table_valeur($code, '" . addslashes($champ) . "')";
}
$align = preg_replace(',\W,', '', $align);
return "quete_html_logo($code, '$align', " . ($_lien ?: "''") . ')';
}
<?php
/**
* SPIP, Système de publication pour l'internet
*
* Copyright © avec tendresse depuis 2001
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
*
* Ce programme est un logiciel libre distribué sous licence GNU/GPL.
*/
/**
* Fonctions génériques pour les balises `#LOGO_XXXX`
*
* @package SPIP\Core\Compilateur\Balises
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Compile la balise dynamique `#LOGO_xx` qui retourne le code HTML
* pour afficher l'image de logo d'un objet éditorial de SPIP.
*
* Le type d'objet est récupéré dans le nom de la balise, tel que
* `LOGO_ARTICLE` ou `LOGO_SITE`.
*
* Ces balises ont quelques options :
*
* - La balise peut aussi demander explicitement le logo normal ou de survol,
* avec `LOGO_ARTICLE_NORMAL` ou `LOGO_ARTICLE_SURVOL`.
* - On peut demander un logo de rubrique en absence de logo sur l'objet éditorial
* demandé avec `LOGO_ARTICLE_RUBRIQUE`
* - `LOGO_ARTICLE*` ajoute un lien sur l'image du logo vers l'objet éditorial
* - `LOGO_ARTICLE**` retourne le nom du fichier de logo.
* - `LOGO_ARTICLE{right}`. Valeurs possibles : top left right center bottom
* - `LOGO_DOCUMENT{icone}`. Valeurs possibles : auto icone apercu vignette
* - `LOGO_ARTICLE{200, 0}`. Redimensionnement indiqué
*
* Pour récupérer l’identifiant du document sous-jacent voir la balise `ID_LOGO_...`
*
* @balise
* @uses generer_code_logo()
* @example
* ```
* #LOGO_ARTICLE
* ```
*
* @param Spip\Compilateur\Noeud\Champ $p
* Pile au niveau de la balise
* @return Spip\Compilateur\Noeud\Champ
* Pile complétée par le code à générer
*/
function balise_LOGO__dist($p) {
preg_match(',^LOGO_([A-Z_]+?)(|_NORMAL|_SURVOL|_RUBRIQUE)$,i', $p->nom_champ, $regs);
$type = strtolower($regs[1]);
$suite_logo = $regs[2];
// cas de #LOGO_SITE_SPIP
if ($type == 'site_spip') {
$type = 'site';
$_id_objet = "\"'0'\"";
}
$id_objet = id_table_objet($type);
if (!isset($_id_objet)) {
$_id_objet = champ_sql($id_objet, $p);
}
$fichier = ($p->etoile === '**') ? -1 : 0;
$coord = [];
$align = $lien = '';
$mode_logo = '';
if ($p->param && !$p->param[0][0]) {
$params = $p->param[0];
array_shift($params);
foreach ($params as $a) {
if ($a[0]->type === 'texte') {
$n = $a[0]->texte;
if (is_numeric($n)) {
$coord[] = $n;
} elseif (in_array($n, ['top', 'left', 'right', 'center', 'bottom'])) {
$align = $n;
} elseif (in_array($n, ['auto', 'icone', 'apercu', 'vignette'])) {
$mode_logo = $n;
}
} else {
$lien = calculer_liste($a, $p->descr, $p->boucles, $p->id_boucle);
}
}
}
$coord_x = $coord ? (int) array_shift($coord) : 0;
$coord_y = $coord ? (int) array_shift($coord) : 0;
if ($p->etoile === '*') {
include_spip('balise/url_');
$lien = generer_generer_url_arg($type, $p, $_id_objet);
}
$connect = $p->id_boucle ? $p->boucles[$p->id_boucle]->sql_serveur : '';
if ($type == 'document') {
$qconnect = _q($connect);
$doc = "quete_document($_id_objet, $qconnect)";
if ($fichier) {
$code = "quete_logo_file($doc, $qconnect)";
} else {
$code = "quete_logo_document($doc, " . ($lien ?: "''") . ", '$align', '$mode_logo', $coord_x, $coord_y, $qconnect)";
}
// (x=non-faux ? y : '') pour affecter x en retournant y
if ($p->descr['documents']) {
$code = '(($doublons["documents"] .= ",". '
. $_id_objet
. ") ? $code : '')";
}
} elseif ($connect) {
$code = "''";
spip_logger()
->info('Les logos distants ne sont pas prevus');
} else {
// pour generer_code_logo
include_spip('balise/id_logo_');
$champ_logo = '';
if ($fichier) {
$champ_logo = 'fichier';
}
$code = generer_code_logo($id_objet, $_id_objet, $type, $align, $lien, $p, $suite_logo, $champ_logo);
}
// demande de reduction sur logo avec ecriture spip 2.1 : #LOGO_xxx{200, 0}
if ($coord_x || $coord_y) {
$code = "filtrer('image_graver',filtrer('image_reduire'," . $code . ", '$coord_x', '$coord_y'))";
}
$p->code = $code;
$p->interdire_scripts = false;
return $p;
}
......@@ -30,8 +30,8 @@ function medias_declarer_tables_interfaces($interfaces) {
$interfaces['exceptions_des_tables']['documents']['type_document'] = ['types_documents', 'titre'];
$interfaces['exceptions_des_tables']['documents']['extension_document'] = ['types_documents', 'extension'];
$interfaces['exceptions_des_tables']['documents']['mime_type'] = ['types_documents', 'mime_type'];
$interfaces['exceptions_des_tables']['documents']['media_document'] = ['types_documents', 'media'];
$interfaces['exceptions_des_tables']['documents']['mime_type_extension'] = ['types_documents', 'mime_type'];
$interfaces['exceptions_des_tables']['documents']['media_document'] = ['types_documents', 'media_defaut'];
$interfaces['exceptions_des_jointures']['spip_documents']['id_forum'] = ['spip_documents_liens', 'id_forum'];
$interfaces['exceptions_des_jointures']['spip_documents']['vu'] = ['spip_documents_liens', 'vu'];
......@@ -42,7 +42,6 @@ function medias_declarer_tables_interfaces($interfaces) {
return $interfaces;
}
/**
* Table principale spip_documents et spip_types_documents
*
......@@ -59,12 +58,12 @@ function medias_declarer_tables_principales($tables_principales) {
'inclus' => "ENUM('non', 'image', 'embed') DEFAULT 'non' NOT NULL",
'upload' => "ENUM('oui', 'non') DEFAULT 'oui' NOT NULL",
'media_defaut' => "varchar(10) DEFAULT 'file' NOT NULL",
'maj' => 'TIMESTAMP'
'maj' => 'TIMESTAMP',
];
$spip_types_documents_key = [
'PRIMARY KEY' => 'extension',
'KEY inclus' => 'inclus'
'KEY inclus' => 'inclus',
];
$tables_principales['spip_types_documents'] =
......@@ -86,7 +85,7 @@ function medias_declarer_tables_auxiliaires($tables_auxiliaires) {
'id_objet' => "bigint(21) DEFAULT '0' NOT NULL",
'objet' => "VARCHAR (25) DEFAULT '' NOT NULL",
'vu' => "ENUM('non', 'oui') DEFAULT 'non' NOT NULL",
'rang_lien' => "int(4) DEFAULT '0' NOT NULL"
'rang_lien' => "int(4) DEFAULT '0' NOT NULL",
];
$spip_documents_liens_key = [
......@@ -98,7 +97,7 @@ function medias_declarer_tables_auxiliaires($tables_auxiliaires) {
$tables_auxiliaires['spip_documents_liens'] = [
'field' => &$spip_documents_liens,
'key' => &$spip_documents_liens_key
'key' => &$spip_documents_liens_key,
];
return $tables_auxiliaires;
......@@ -155,17 +154,17 @@ function medias_declarer_tables_objets_sql($tables) {
'alt' => "text DEFAULT '' NOT NULL",
'date_publication' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
'brise' => 'tinyint DEFAULT 0',
'maj' => 'TIMESTAMP'
'maj' => 'TIMESTAMP',
],
'key' => [
'PRIMARY KEY' => 'id_document',
'KEY id_vignette' => 'id_vignette',
'KEY mode' => 'mode',
'KEY extension' => 'extension'
'KEY extension' => 'extension',
],
'join' => [
'id_document' => 'id_document',
'extension' => 'extension'
'extension' => 'extension',
],
'statut' => [
[
......@@ -173,8 +172,8 @@ function medias_declarer_tables_objets_sql($tables) {
'publie' => 'publie',
'previsu' => 'publie,prop,prepa',
'post_date' => 'date_publication',
'exception' => ['statut', 'tout']
]
'exception' => ['statut', 'tout'],
],
],
'tables_jointures' => ['types_documents'],
'rechercher_champs' => [
......@@ -198,7 +197,7 @@ function medias_declarer_tables_objets_sql($tables) {
'distant',
'extension',
'id_vignette',
'media'
'media',
],
'champs_versionnes' => [
'id_vignette',
......@@ -211,7 +210,7 @@ function medias_declarer_tables_objets_sql($tables) {
'mode',
'credits',
'fichier',
'distant'
'distant',
],
'modeles' => ['document', 'doc', 'img', 'emb', 'image', 'video', 'audio', 'file'],
'modeles_styliser' => 'medias_modeles_styliser',
......@@ -232,7 +231,6 @@ function medias_declarer_tables_objets_sql($tables) {
*
* @param string $serveur
* @param string $champ_media
* @return void
*/
function creer_base_types_doc($serveur = '', $champ_media = 'media_defaut') {
global $tables_images, $tables_sequences, $tables_documents, $tables_mime;
......@@ -240,7 +238,16 @@ function creer_base_types_doc($serveur = '', $champ_media = 'media_defaut') {
include_spip('base/abstract_sql');
// charger en memoire tous les types deja definis pour limiter les requettes
$rows = sql_allfetsel('mime_type,titre,inclus,extension,' . $champ_media . ',upload,descriptif', 'spip_types_documents', '', '', '', '', '', $serveur);
$rows = sql_allfetsel(
'mime_type,titre,inclus,extension,' . $champ_media . ',upload,descriptif',
'spip_types_documents',
'',
'',
'',
'',
'',
$serveur
);
$deja = [];
foreach ($rows as $k => $row) {
$deja[$row['extension']] = &$rows[$k];
......@@ -267,14 +274,14 @@ function creer_base_types_doc($serveur = '', $champ_media = 'media_defaut') {
}
}
// type de media
// type de media (par defaut)
$media = 'file';
if (preg_match(',^image/,', $type_mime) or in_array($type_mime, ['application/illustrator'])) {
if (preg_match(',^image/,', (string) $type_mime) || in_array($type_mime, ['application/illustrator'])) {
$media = 'image';
} elseif (preg_match(',^audio/,', $type_mime)) {
} elseif (preg_match(',^audio/,', (string) $type_mime)) {
$media = 'audio';
} elseif (
preg_match(',^video/,', $type_mime) or in_array(
preg_match(',^video/,', (string) $type_mime) || in_array(
$type_mime,
['application/ogg', 'application/x-shockwave-flash', 'application/mp4']
)
......@@ -309,7 +316,6 @@ function creer_base_types_doc($serveur = '', $champ_media = 'media_defaut') {
}
}
/**
* Optimiser la base de données en supprimant les liens orphelins
*
......@@ -336,6 +342,7 @@ function medias_optimiser_base_disparus($flux) {
$supprimer_document = charger_fonction('supprimer_document', 'action');
while ($row = sql_fetch($res)) {
autoriser_exception('supprimer', 'document', $row['id_document']);
$supprimer_document($row['id_document']);
$flux['data']++;
}
......
......@@ -21,6 +21,7 @@ $tables_images = [
'png' => 'PNG',
'gif' => 'GIF',
'webp' => 'WEBP',
'avif' => 'AVIF',
// Autres images (peuvent utiliser le tag <img>)
'bmp' => 'BMP',
......@@ -84,7 +85,7 @@ $tables_sequences = [
'wmv' => 'Windows Media Video',
'y4m' => 'YUV4MPEG2',
'3ga' => '3GP Audio File',
'3gp' => '3rd Generation Partnership Project'
'3gp' => '3rd Generation Partnership Project',
];
// Documents varies
......@@ -189,7 +190,6 @@ $tables_documents = [
'ots' => 'OpenDocument Spreadsheet-template',
'ott' => 'OpenDocument Text-template',
// Open XML File Formats
'docm' => 'Word',
'docx' => 'Word',
......@@ -209,7 +209,7 @@ $tables_documents = [
'xlsm' => 'Excel',
'xlsx' => 'Excel',
'xltm' => 'Excel template',
'xltx' => 'Excel template'
'xltx' => 'Excel template',
];
$tables_mime = [
......@@ -218,6 +218,7 @@ $tables_mime = [
'png' => 'image/png',
'gif' => 'image/gif',
'webp' => 'image/webp',
'avif' => 'image/avif',
// Autres images (peuvent utiliser le tag <img>)
'bmp' => 'image/x-ms-bmp', // pas enregistre par IANA, variante: image/bmp
......@@ -399,17 +400,18 @@ $tables_mime = [
'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12',
'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'xltm' => 'application/vnd.ms-excel.template.macroEnabled.12',
'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template'
'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
];
$mime_alias = [
'application/x-ogg' => 'application/ogg',
'audio/3gpp' => 'video/3gpp',
'audio/x-m4a' => 'audio/mp4a-latm',
'audio/x-mpeg' => 'audio/mpeg',
'audio/x-musepack' => 'audio/musepack',
'audio/webm' => 'video/webm',
'video/flv' => 'video/x-flv',
'video/mp4' => 'application/mp4',
'image/jpg' => 'image/jpeg'
'audio/mp4' => 'application/mp4',
'image/jpg' => 'image/jpeg',
];