Plugin Massicot et gestion des autorisations

[email protected]
Newsgroups gmane.comp.web.spip.devel
Message-ID <[email protected]>
Bonjour à tou·tes,

J'ai l'impression qu'il y a un petit souci avec le plugin Massicot
dans sa version actuelle : aucune vérification d'autorisation n'est
effectuée, ce qui permet de recadrer des documents que l'on n'aurait
normalement pas le droit de modifier (logos d'autres articles que les
siens, logos d'autres utilisateur·trices, etc.).

J'ai bricolé le patch ci-joint pour rétablir un contrôle un peu plus
strict des autorisations, s'appuyant sur `autoriser('modifier', ...)`
pour savoir si un·e utilisateur·trice est autorisé·e à recadrer tel
ou tel logo ou document.

Je ne sais pas trop quelle est la meilleure manière de procéder, mais
si vous préférez, je peux aussi faire un pull request sur git.spip.net
(mais à ce moment-là, il me faudrait un compte sur ce site, s'il vous
plaît).

Merci beaucoup !

++
Glop
0001-Interdit-de-modifier-le-massicotage-si-non-autoris-e.patch (text/plain, 7 KB)
From 6556a7065a94ff4ca93b050983610dfeb5b0d42a Mon Sep 17 00:00:00 2001
From: Glop <[email protected]>
Date: Wed, 30 Dec 2020 15:32:09 +0000
Subject: [PATCH] =?UTF-8?q?Interdit=20de=20modifier=20le=20massicotage=20s?=
 =?UTF-8?q?i=20non=20autoris=C3=A9=C2=B7e=20=C3=A0=20modifier=20l'objet.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 formulaires/inc-apercu-logo-roles-documents.html | 10 ++++++----
 formulaires/inc-apercu-logo.html                 | 10 ++++++----
 lang/massicot_en.php                             |  3 +++
 lang/massicot_fr.php                             |  3 +++
 massicot_fonctions.php                           | 10 ++++++++++
 massicot_pipelines.php                           |  5 ++++-
 prive/squelettes/contenu/massicoter_image.html   |  1 +
 prive/squelettes/inclure/lien_recadre.html       | 14 ++++++++------
 8 files changed, 41 insertions(+), 15 deletions(-)

diff --git a/formulaires/inc-apercu-logo-roles-documents.html b/formulaires/inc-apercu-logo-roles-documents.html
index 9ef0795..2785acc 100644
--- a/formulaires/inc-apercu-logo-roles-documents.html
+++ b/formulaires/inc-apercu-logo-roles-documents.html
@@ -88,10 +88,12 @@
 			},
 			'ajax supprimer',
 		})]
-    <a href="[(#URL_ECRIRE{massicoter_image, objet=#ENV{objet}&id_objet=#ENV{id_objet}}|parametre_url{redirect,#SELF}|parametre_url{role, #GET{role}})]"
-       class="bouton">
-      <strong><:massicot:massicoter:></strong>
-    </a>
+    [(#AUTORISER{modifier,#ENV{objet},#ENV{id_objet}})
+      <a href="[(#URL_ECRIRE{massicoter_image, objet=#ENV{objet}&id_objet=#ENV{id_objet}}|parametre_url{redirect,#SELF}|parametre_url{role, #GET{role}})]"
+         class="bouton">
+        <strong><:massicot:massicoter:></strong>
+      </a>
+    ]
 	</div>
 	]
 
diff --git a/formulaires/inc-apercu-logo.html b/formulaires/inc-apercu-logo.html
index 92669bf..94bbc90 100644
--- a/formulaires/inc-apercu-logo.html
+++ b/formulaires/inc-apercu-logo.html
@@ -27,10 +27,12 @@
   #SET{hauteur,#GET{logo_recadre}|hauteur}
   [<div class="titre">(#ENV{titre,''})</div>]
   <div class="taille"><:info_largeur_vignette{largeur_vignette=#GET{largeur},hauteur_vignette=#GET{hauteur}}:></div>
-  <a href="[(#URL_ECRIRE{massicoter_image, objet=#ENV{objet}&id_objet=#ENV{id_objet}}|parametre_url{redirect,#SELF}|parametre_url{role, #GET{role}})]"
-     class="bouton">
-    <strong><:massicot:massicoter:></strong>
-  </a>
+  [(#AUTORISER{modifier,#ENV{objet},#ENV{id_objet}})
+    <a href="[(#URL_ECRIRE{massicoter_image, objet=#ENV{objet}&id_objet=#ENV{id_objet}}|parametre_url{redirect,#SELF}|parametre_url{role, #GET{role}})]"
+       class="bouton">
+      <strong><:massicot:massicoter:></strong>
+    </a>
+  ]
   [(#ENV{editable}|oui)
   <input type='submit' class='submit supprimer' id="supprimer_#ENV{quoi,logo_on}_#ENV{objet}_#ENV{id_objet}" name="supprimer_#ENV{quoi,logo_on}" value='<:lien_supprimer|ucfirst|attribut_html:>' />
   ]
diff --git a/lang/massicot_en.php b/lang/massicot_en.php
index 1d107d6..e444bf1 100644
--- a/lang/massicot_en.php
+++ b/lang/massicot_en.php
@@ -22,6 +22,9 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
 	'massicot_titre' => 'Image cropper',
 	'massicoter' => 'Crop the image',
 
+	// O
+	'operation_non_autorisee' => 'This operation is not authorized.',
+
 	// R
 	'reinitialiser' => 'Reset',
 
diff --git a/lang/massicot_fr.php b/lang/massicot_fr.php
index fd472e2..29f1ed6 100644
--- a/lang/massicot_fr.php
+++ b/lang/massicot_fr.php
@@ -20,6 +20,9 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
 	'massicot_titre' => 'Massicot',
 	'massicoter' => 'Recadrer l’image',
 
+	// O
+	'operation_non_autorisee' => 'Opération non autorisée.',
+
 	// R
 	'reinitialiser' => 'Réinitialiser',
 
diff --git a/massicot_fonctions.php b/massicot_fonctions.php
index 3c0cb9f..fa15c5e 100644
--- a/massicot_fonctions.php
+++ b/massicot_fonctions.php
@@ -64,6 +64,11 @@ function massicot_chemin_image($objet, $id_objet, $role = null) {
  */
 function massicot_enregistrer($objet, $id_objet, $parametres) {
 
+	include_spip('inc/autoriser');
+	if (!autoriser('modifier', $objet, $id_objet)) {
+		return _T('massicot:operation_non_autorisee');
+	}
+
 	include_spip('action/editer_objet');
 	include_spip('action/editer_liens');
 
@@ -144,6 +149,11 @@ function massicot_enregistrer($objet, $id_objet, $parametres) {
  */
 function massicot_supprimer($objet, $id_objet, $role='') {
 
+	include_spip('inc/autoriser');
+	if (!autoriser('modifier', $objet, $id_objet)) {
+		return _T('massicot:operation_non_autorisee');
+	}
+
 	include_spip('base/abstract_sql');
 
 	$id_massicotage = massicot_get_id($objet, $id_objet, $role);
diff --git a/massicot_pipelines.php b/massicot_pipelines.php
index 2be9aa5..4891679 100644
--- a/massicot_pipelines.php
+++ b/massicot_pipelines.php
@@ -171,12 +171,15 @@ function massicot_editer_contenu_objet($flux) {
 
 	if ($args['type'] === 'illustrer_document') {
 		include_spip('base/abstract_sql');
+		include_spip('inc/autoriser');
 
 		if ($id_vignette = sql_getfetsel(
 			'id_vignette',
 			'spip_documents',
 			'id_document='.intval($args['id'])
-		)) {
+		)
+		and autoriser('modifier', 'document', $args['id'])
+		and autoriser('modifier', 'document', $id_vignette)) {
 			$href = generer_url_ecrire(
 				'massicoter_image',
 				'objet=document&id_objet=' . $id_vignette . '&redirect=' . urlencode(self())
diff --git a/prive/squelettes/contenu/massicoter_image.html b/prive/squelettes/contenu/massicoter_image.html
index 8442cca..b5201f1 100644
--- a/prive/squelettes/contenu/massicoter_image.html
+++ b/prive/squelettes/contenu/massicoter_image.html
@@ -1,3 +1,4 @@
+[(#AUTORISER{modifier,#ENV{objet},#ENV{id_objet}}|sinon_interdire_acces)]
 <h1><:massicot:massicoter:> &laquo;[(#ENV{objet}|=={document}|?{#INFO_TITRE{document, #ENV{id_objet}}|sinon{Document #ENV{id_objet}}, Logo #INFO_TITRE{#ENV{objet}, #ENV{id_objet}}|sinon{#ENV{objet} #ENV{id_objet}}})]&raquo;</h1>
 
 #FORMULAIRE_MASSICOTER_IMAGE{#OBJET, #ID_OBJET, #ENV{redirect}, #ENV{format}, #ENV{role}}
diff --git a/prive/squelettes/inclure/lien_recadre.html b/prive/squelettes/inclure/lien_recadre.html
index a6aaf45..0d52d89 100644
--- a/prive/squelettes/inclure/lien_recadre.html
+++ b/prive/squelettes/inclure/lien_recadre.html
@@ -12,10 +12,12 @@
   #ENV{id_document}}})]
 
 <BOUCLE_document(DOCUMENTS) {id_document}{media=image}{tout}{distant=non}>
-  <a class="bouton" role="button"
-     href="[(#URL_ECRIRE{massicoter_image,
-            objet=#GET{objet_lien}&id_objet=#GET{id_objet_lien}}
-              |parametre_url{redirect,#SELF\#doc#ID_DOCUMENT})]">
-    <strong><:massicot:massicoter:></strong>
-  </a>
+  [(#AUTORISER{modifier,document,#ENV{id_document}}|et{#AUTORISER{modifier,#GET{objet_lien},#GET{id_objet_lien}}})
+    <a class="bouton" role="button"
+       href="[(#URL_ECRIRE{massicoter_image,
+              objet=#GET{objet_lien}&id_objet=#GET{id_objet_lien}}
+                |parametre_url{redirect,#SELF\#doc#ID_DOCUMENT})]">
+      <strong><:massicot:massicoter:></strong>
+    </a>
+  ]
 </BOUCLE_document>
-- 
2.20.1
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.