From f766a4ced0d78e19b94d6ebf2059773ece837f1e Mon Sep 17 00:00:00 2001
From: Fil <fil@rezo.net>
Date: Sun, 15 Jul 2007 18:43:25 +0000
Subject: [PATCH] l'autorisation d'editer un document, c'est un beau melange de
 choses compliquees... si on n'avait deja qu'une seule et unique table de
 jointure pour trouver nos liens on gagnerait du temps, a revoir

---
 ecrire/inc/autoriser.php | 41 ++++++++++++++++++++++++++++++++++++++++
 ecrire/inc/utils.php     |  2 ++
 2 files changed, 43 insertions(+)

diff --git a/ecrire/inc/autoriser.php b/ecrire/inc/autoriser.php
index a49174f6d9..10ede0c038 100644
--- a/ecrire/inc/autoriser.php
+++ b/ecrire/inc/autoriser.php
@@ -213,6 +213,47 @@ function autoriser_joindredocument_dist($faire, $type, $id, $qui, $opt){
 			AND autoriser('ecrire', $type, $id, $qui, $opt)
 		);
 }
+
+// On ne peut modifier un document que s'il est lie a un objet qu'on a le droit
+// d'editer *et* qu'il n'est pas lie a un objet qu'on n'a pas le droit d'editer
+// http://doc.spip.org/@autoriser_document_modifier_dist
+function autoriser_document_modifier_dist($faire, $type, $id, $qui, $opt){
+	static $m = array();
+
+	if ($qui['statut'] == '0minirezo'
+	AND !$qui['restreint'])
+		return true;
+
+	if (!isset($m[$id])) {
+		$interdit = false;
+		$vu = true;
+		include_spip('public/interfaces');
+		$jointures = array_diff(
+			$GLOBALS['tables_jointures']['spip_documents'],
+			array('types_documents', 'mots')
+		);
+		foreach($jointures as $j) {
+			$type = preg_replace(',s?_?documents?_?|s$,', '', $j);
+			$id_table = id_table_objet($type);
+			$s = spip_query("SELECT $id_table FROM spip_$j WHERE id_document="._q($id));
+			while ($t = spip_fetch_array($s)) {
+				spip_log($t);
+				if (autoriser('modifier', $type, $t[$id_table], $qui, $opt)) {
+					$vu = true;
+				}
+				else {
+					$interdit = true;
+					break 2;
+				}
+			}
+		}
+		$m[$id] = ($vu && !$interdit);
+	}
+
+	return $m[$id];
+}
+
+
 // Autoriser a modifier la breve $id
 // = admins & redac si la breve n'est pas publiee
 // = admins de rubrique parente si publiee
diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php
index a33d0e4fea..d599975918 100644
--- a/ecrire/inc/utils.php
+++ b/ecrire/inc/utils.php
@@ -489,6 +489,8 @@ function id_table_objet($type) {
 		return 'id_document';
 	else if ($type == 'petition')
 		return 'id_article';
+	else if ($type == 'type')
+		return 'extension';
 	else {
 		$t = "spip_".table_objet($type);
 		global $tables_principales;
-- 
GitLab