source: spip-zone/_core_/branches/spip-3.0/plugins/medias/medias_autoriser.php @ 94397

Last change on this file since 94397 was 94397, checked in by denisb@…, 4 years ago

bonne année.

File size: 8.2 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2016                                                *
7 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
8 *                                                                         *
9 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
10 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
11\***************************************************************************/
12
13if (!defined('_ECRIRE_INC_VERSION')) return;
14
15/* Pour que le pipeline de rale pas ! */
16function medias_autoriser(){}
17
18
19function autoriser_mediatheque_administrer_dist($faire,$quoi,$id,$qui,$options) {
20        return $qui['statut'] == '0minirezo';
21}
22
23function autoriser_documents_menu_dist($faire,$quoi,$id,$qui,$options) {
24        return autoriser('administrer','mediatheque',$id,$qui,$options);
25}
26
27/**
28 * Autoriser le changement des dimensions sur un document
29 * @param <type> $faire
30 * @param <type> $quoi
31 * @param <type> $id
32 * @param <type> $qui
33 * @param <type> $options
34 * @return <type>
35 */
36function autoriser_document_tailler_dist($faire,$quoi,$id,$qui,$options) {
37
38        if (!$id_document=intval($id))
39                return false;
40        if (!autoriser('modifier','document',$id,$qui,$options))
41                return false;
42       
43        if (!isset($options['document']) OR !$document = $options['document'])
44                $document = sql_fetsel('*','spip_documents','id_document='.intval($id_document));
45       
46        // (on ne le propose pas pour les images qu'on sait
47        // lire : gif jpg png), sauf bug, ou document distant
48        if (in_array($document['extension'], array('gif','jpg','png'))
49                AND $document['hauteur']
50                AND $document['largeur']
51                AND $document['distant']!='oui')
52                return false;
53       
54        // Donnees sur le type de document
55        $extension = $document['extension'];
56        $type_inclus = sql_getfetsel('inclus','spip_types_documents', "extension=".sql_quote($extension));
57
58        if (($type_inclus == "embed" OR $type_inclus == "image")
59        AND (
60                // documents dont la taille est definie
61                ($document['largeur'] * $document['hauteur'])
62                // ou distants
63                OR $document['distant'] == 'oui'
64                // ou tous les formats qui s'affichent en embed
65                OR $type_inclus == "embed"
66        ))
67                return true;
68}
69
70/**
71 * On ne peut joindre un document qu'a un objet qu'on a le droit d'editer
72 * mais il faut prevoir le cas d'une *creation* par un redacteur, qui correspond
73 * au hack id_objet = 0-id_auteur
74 * Il faut aussi que les documents aient ete actives sur les objets concernes
75 * ou que ce soit un article, sur lequel on peut toujours uploader des images
76 *
77 * http://code.spip.net/@autoriser_joindredocument_dist
78 *
79 * @return bool
80 */
81function autoriser_joindredocument_dist($faire, $type, $id, $qui, $opt){
82        include_spip('inc/config');
83        return
84                (
85                        $type=='article'
86                        OR in_array(table_objet_sql($type),explode(',',lire_config('documents_objets', '')))
87                )
88                AND (
89                  (
90                          $id>0
91                    AND autoriser('modifier', $type, $id, $qui, $opt)
92                  )
93                        OR (
94                                $id<0
95                                AND abs($id) == $qui['id_auteur']
96                                AND autoriser('ecrire', $type, $id, $qui, $opt)
97                        )
98                );
99}
100
101
102/**
103 * On ne peut modifier un document que s'il n'est pas lie a un objet qu'on n'a pas le droit d'editer
104 *
105 * @staticvar <type> $m
106 * @param <type> $faire
107 * @param <type> $type
108 * @param <type> $id
109 * @param <type> $qui
110 * @param <type> $opt
111 * @return <type>
112 */
113function autoriser_document_modifier_dist($faire, $type, $id, $qui, $opt){
114        static $m = array();
115
116        $q=$qui['id_auteur'];
117        if (isset($m[$q][$id]))
118                return $m[$q][$id];
119       
120        $s = sql_getfetsel("statut", "spip_documents", "id_document=".intval($id));
121        // les admins ont le droit de modifier tous les documents existants
122        if ($qui['statut'] == '0minirezo'
123        AND !$qui['restreint'])
124                return is_string($s)?true:false;
125
126        if (!isset($m[$q][$id])) {
127                // un document non publie peut etre modifie par tout le monde (... ?)
128                if ($s AND $s!=='publie' AND ($qui['id_auteur'] > 0))
129                        $m[$q][$id] = true;
130        }
131
132        if (!isset($m[$q][$id])) {
133                $interdit = false;
134
135                $s = sql_select("id_objet,objet", "spip_documents_liens", "id_document=".intval($id));
136                while ($t = sql_fetch($s)) {
137                        if (!autoriser('modifier', $t['objet'], $t['id_objet'], $qui, $opt)) {
138                                $interdit = true;
139                                break;
140                        }
141                }
142
143                $m[$q][$id] = ($interdit?false:true);
144        }
145
146        return $m[$q][$id];
147}
148
149
150/**
151 * On ne peut supprimer un document que s'il n'est lie a aucun objet
152 * ET qu'on a le droit de le modifier !
153 *
154 * @param <type> $faire
155 * @param <type> $type
156 * @param <type> $id
157 * @param <type> $qui
158 * @param <type> $opt
159 * @return <type>
160 */
161function autoriser_document_supprimer_dist($faire, $type, $id, $qui, $opt){
162        if (!intval($id)
163                OR !$qui['id_auteur']
164                OR !autoriser('ecrire','','',$qui))
165                return false;
166
167        // ne pas considerer les document parent
168        // (cas des vignettes ou autre document annexe rattache a un document)
169        if (sql_countsel('spip_documents_liens', "objet!='document' AND id_document=".intval($id)))
170                return false;
171
172        // si c'est une vignette, se ramener a l'autorisation de son parent
173        if (sql_getfetsel('mode','spip_documents','id_document='.intval($id))=='vignette'){
174                $id_document = sql_getfetsel('id_document','spip_documents','id_vignette='.intval($id));
175                return !$id_document OR autoriser('modifier','document',$id_document);
176        }
177        // si c'est un document annexe, se ramener a l'autorisation de son parent
178        if ($id_document=sql_getfetsel('id_objet','spip_documents_liens',"objet='document' AND id_document=".intval($id))){
179                return autoriser('modifier','document',$id_document);
180        }
181
182        return autoriser('modifier','document',$id,$qui,$opt);
183}
184
185
186//
187// Peut-on voir un document dans _DIR_IMG ?
188// Tout le monde (y compris les visiteurs non enregistres), puisque par
189// defaut ce repertoire n'est pas protege ; si une extension comme
190// acces_restreint a positionne creer_htaccess, on regarde
191// si le document est lie a un element publie
192// (TODO: a revoir car c'est dommage de sortir de l'API true/false)
193//
194// http://code.spip.net/@autoriser_document_voir_dist
195function autoriser_document_voir_dist($faire, $type, $id, $qui, $opt) {
196
197        if (!isset($GLOBALS['meta']["creer_htaccess"])
198        OR $GLOBALS['meta']["creer_htaccess"] != 'oui')
199                return true;
200
201        if ((!is_numeric($id)) OR $id < 0) return false;
202
203        if (in_array($qui['statut'], array('0minirezo', '1comite')))
204                return 'htaccess';
205
206        if ($liens = sql_allfetsel('objet,id_objet', 'spip_documents_liens', 'id_document='.intval($id)))
207        foreach ($liens as $l) {
208                $table_sql = table_objet_sql($l['objet']);
209                $id_table = id_table_objet($l['objet']);
210                if (sql_countsel($table_sql, "$id_table = ". intval($l['id_objet'])
211                . (in_array($l['objet'], array('article', 'rubrique', 'breve'))
212                        ? " AND statut = 'publie'"
213                        : '')
214                ) > 0)
215                        return 'htaccess';
216        }
217        return false;
218}
219
220
221/**
222 * Auto-association de documents a du contenu editorial qui le reference
223 * par defaut true pour tous les objets
224 */
225function autoriser_autoassocierdocument_dist($faire, $type, $id, $qui, $opts) {
226        return true;
227}
228
229/**
230 * Autoriser a nettoyer les orphelins de la base des documents
231 * reserve aux admins complets
232 *
233 * @param  $faire
234 * @param  $type
235 * @param  $id
236 * @param  $qui
237 * @param  $opt
238 * @return bool
239 */
240function autoriser_orphelins_supprimer_dist($faire, $type, $id, $qui, $opt){
241        if ($qui['statut'] == '0minirezo'
242        AND !$qui['restreint'])
243                return true;
244}
245
246
247/**
248 * Autoriser a associer des documents a un objet :
249 * il faut avoir le droit de modifier cet objet
250 * @param $faire
251 * @param $type
252 * @param $id
253 * @param $qui
254 * @param $opt
255 * @return bool
256 */
257function autoriser_associerdocuments_dist($faire, $type, $id, $qui, $opt){
258        // cas particulier (hack nouvel objet)
259        if (intval($id)<0 AND $id==-$qui['id_auteur']){
260                return true;
261        }
262        return autoriser('modifier',$type,$id,$qui,$opt);
263}
264
265/**
266 * Autoriser a dissocier des documents a un objet :
267 * il faut avoir le droit de modifier cet objet
268 * @param $faire
269 * @param $type
270 * @param $id
271 * @param $qui
272 * @param $opt
273 * @return bool
274 */
275function autoriser_dissocierdocuments_dist($faire, $type, $id, $qui, $opt){
276        // cas particulier (hack nouvel objet)
277        if (intval($id)<0 AND $id==-$qui['id_auteur']){
278                return true;
279        }
280        return autoriser('modifier',$type,$id,$qui,$opt);
281}
Note: See TracBrowser for help on using the repository browser.