diff --git a/ecrire/inc/autoriser.php b/ecrire/inc/autoriser.php index a49174f6d90d4752b367e25956e269575a6bfb99..10ede0c038ed0a4b6f5eed5e55cfa98a77bb1e26 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 a33d0e4fea6631962881ad714b342bae0f026c84..d5999759180ba9b71fae2241197870a2daf9eea7 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;