[SPIP] v3.2.1-->v3.2.3
[lhc/web/www.git] / www / plugins-dist / medias / medias_autoriser.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2019 *
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
13 /**
14 * Définit les autorisations du plugin Médias
15 *
16 * @package SPIP\Medias\Autorisations
17 **/
18
19 if (!defined('_ECRIRE_INC_VERSION')) {
20 return;
21 }
22
23 /**
24 * Fonction d'appel pour le pipeline
25 *
26 * @pipeline autoriser
27 */
28 function medias_autoriser() {
29 }
30
31 /**
32 * Autorisation d'administrer la médiathèque
33 *
34 * @param string $faire Action demandée
35 * @param string $type Type d'objet sur lequel appliquer l'action
36 * @param int $id Identifiant de l'objet
37 * @param array $qui Description de l'auteur demandant l'autorisation
38 * @param array $opt Options de cette autorisation
39 * @return bool true s'il a le droit, false sinon
40 **/
41 function autoriser_mediatheque_administrer_dist($faire, $type, $id, $qui, $opt) {
42 return $qui['statut'] == '0minirezo';
43 }
44
45 /**
46 * Autorisation de voir le bouton Documents dans le menu
47 *
48 * @param string $faire Action demandée
49 * @param string $type Type d'objet sur lequel appliquer l'action
50 * @param int $id Identifiant de l'objet
51 * @param array $qui Description de l'auteur demandant l'autorisation
52 * @param array $opt Options de cette autorisation
53 * @return bool true s'il a le droit, false sinon
54 **/
55 function autoriser_documents_menu_dist($faire, $type, $id, $qui, $opt) {
56 return autoriser('administrer', 'mediatheque', $id, $qui, $opt);
57 }
58
59 /**
60 * Autoriser le changement des dimensions sur un document
61 *
62 * @param string $faire Action demandée
63 * @param string $type Type d'objet sur lequel appliquer l'action
64 * @param int $id Identifiant de l'objet
65 * @param array $qui Description de l'auteur demandant l'autorisation
66 * @param array $options Options de cette autorisation
67 * @return bool true s'il a le droit, false sinon
68 */
69 function autoriser_document_tailler_dist($faire, $type, $id, $qui, $options) {
70
71 if (!$id_document = intval($id)) {
72 return false;
73 }
74 if (!autoriser('modifier', 'document', $id, $qui, $options)) {
75 return false;
76 }
77
78 if (!isset($options['document']) or !$document = $options['document']) {
79 $document = sql_fetsel('*', 'spip_documents', 'id_document=' . intval($id_document));
80 }
81
82 // (on ne le propose pas pour les images qu'on sait
83 // lire : gif jpg png), sauf bug, ou document distant
84 if (in_array($document['extension'], array('gif', 'jpg', 'png'))
85 and $document['hauteur']
86 and $document['largeur']
87 and $document['distant'] != 'oui'
88 ) {
89 return false;
90 }
91
92 // Donnees sur le type de document
93 $extension = $document['extension'];
94 $type_inclus = sql_getfetsel('inclus', 'spip_types_documents', 'extension=' . sql_quote($extension));
95
96 if (($type_inclus == 'embed' or $type_inclus == 'image')
97 and (
98 // documents dont la taille est definie
99 ($document['largeur'] * $document['hauteur'])
100 // ou distants
101 or $document['distant'] == 'oui'
102 // ou tous les formats qui s'affichent en embed
103 or $type_inclus == 'embed'
104 )
105 ) {
106 return true;
107 }
108 }
109
110 /**
111 * Autorisation de joindre un document
112 *
113 * On ne peut joindre un document qu'a un objet qu'on a le droit d'editer
114 * mais il faut prevoir le cas d'une *creation* par un redacteur, qui correspond
115 * au hack id_objet = 0-id_auteur
116 *
117 * Il faut aussi que les documents aient ete actives sur les objets concernes
118 * ou que ce soit un article, sur lequel on peut toujours uploader des images
119 *
120 * @param string $faire Action demandée
121 * @param string $type Type d'objet sur lequel appliquer l'action
122 * @param int $id Identifiant de l'objet
123 * @param array $qui Description de l'auteur demandant l'autorisation
124 * @param array $opt Options de cette autorisation
125 * @return bool true s'il a le droit, false sinon
126 */
127 function autoriser_joindredocument_dist($faire, $type, $id, $qui, $opt) {
128 include_spip('inc/config');
129
130 // objet autorisé en upload ?
131 if ($type == 'article' or in_array(table_objet_sql($type), explode(',', lire_config('documents_objets', '')))) {
132 // sur un objet existant
133 if ($id > 0) {
134 return autoriser('modifier', $type, $id, $qui, $opt);
135 } // sur un nouvel objet
136 elseif ($id < 0 and (abs($id) == $qui['id_auteur'])) {
137 return autoriser('ecrire', $type, $id, $qui, $opt);
138 }
139 }
140
141 return false;
142 }
143
144
145 /**
146 * Autorisation de modifier un document
147 *
148 * 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
149 *
150 * @staticvar <type> $m
151 * @param string $faire Action demandée
152 * @param string $type Type d'objet sur lequel appliquer l'action
153 * @param int $id Identifiant de l'objet
154 * @param array $qui Description de l'auteur demandant l'autorisation
155 * @param array $opt Options de cette autorisation
156 * @return bool true s'il a le droit, false sinon
157 */
158 function autoriser_document_modifier_dist($faire, $type, $id, $qui, $opt) {
159 static $m = array();
160
161 $q = $qui['id_auteur'];
162 if (isset($m[$q][$id])) {
163 return $m[$q][$id];
164 }
165
166 $s = sql_getfetsel('statut', 'spip_documents', 'id_document=' . intval($id));
167 // les admins ont le droit de modifier tous les documents existants
168 if ($qui['statut'] == '0minirezo'
169 and !$qui['restreint']
170 ) {
171 return is_string($s) ? true : false;
172 }
173
174 if (!isset($m[$q][$id])) {
175 // un document non publie peut etre modifie par tout le monde (... ?)
176 if ($s and $s !== 'publie' and ($qui['id_auteur'] > 0)) {
177 $m[$q][$id] = true;
178 }
179 }
180
181 if (!isset($m[$q][$id])) {
182 $interdit = false;
183
184 $s = sql_select('id_objet,objet', 'spip_documents_liens', 'id_document=' . intval($id));
185 while ($t = sql_fetch($s)) {
186 if (!autoriser('modifier', $t['objet'], $t['id_objet'], $qui, $opt)) {
187 $interdit = true;
188 break;
189 }
190 }
191
192 $m[$q][$id] = ($interdit ? false : true);
193 }
194
195 return $m[$q][$id];
196 }
197
198
199 /**
200 * Autorisation de supprimer un document
201 *
202 * On ne peut supprimer un document que s'il n'est lie a aucun objet
203 * ET qu'on a le droit de le modifier !
204 *
205 * @param string $faire Action demandée
206 * @param string $type Type d'objet sur lequel appliquer l'action
207 * @param int $id Identifiant de l'objet
208 * @param array $qui Description de l'auteur demandant l'autorisation
209 * @param array $opt Options de cette autorisation
210 * @return bool true s'il a le droit, false sinon
211 */
212 function autoriser_document_supprimer_dist($faire, $type, $id, $qui, $opt) {
213 if (!intval($id)
214 or !$qui['id_auteur']
215 or !autoriser('ecrire', '', '', $qui)
216 ) {
217 return false;
218 }
219
220 // ne pas considerer les document parent
221 // (cas des vignettes ou autre document annexe rattache a un document)
222 if (sql_countsel('spip_documents_liens', "objet!='document' AND id_document=" . intval($id))) {
223 return false;
224 }
225
226 // si c'est une vignette, se ramener a l'autorisation de son parent
227 if (sql_getfetsel('mode', 'spip_documents', 'id_document=' . intval($id)) == 'vignette') {
228 $id_document = sql_getfetsel('id_document', 'spip_documents', 'id_vignette=' . intval($id));
229
230 return !$id_document or autoriser('modifier', 'document', $id_document);
231 }
232 // si c'est un document annexe, se ramener a l'autorisation de son parent
233 if ($id_document = sql_getfetsel(
234 'id_objet',
235 'spip_documents_liens',
236 "objet='document' AND id_document=" . intval($id)
237 )) {
238 return autoriser('modifier', 'document', $id_document);
239 }
240
241 return autoriser('modifier', 'document', $id, $qui, $opt);
242 }
243
244
245 /**
246 * Autorisation de voir un document
247 *
248 * Peut-on voir un document dans _DIR_IMG ?
249 *
250 * Tout le monde (y compris les visiteurs non enregistrés), puisque par
251 * défaut ce repertoire n'est pas protégé ; si une extension comme
252 * acces_restreint a positionné creer_htaccess, on regarde
253 * si le document est lié à un élément publié.
254 *
255 * @todo
256 * À revoir car c'est dommage de sortir de l'API true/false
257 *
258 * @param string $faire Action demandée
259 * @param string $type Type d'objet sur lequel appliquer l'action
260 * @param int $id Identifiant de l'objet
261 * @param array $qui Description de l'auteur demandant l'autorisation
262 * @param array $opt Options de cette autorisation
263 * @return bool true s'il a le droit, false sinon
264 **/
265 function autoriser_document_voir_dist($faire, $type, $id, $qui, $opt) {
266
267 if (!isset($GLOBALS['meta']['creer_htaccess'])
268 or $GLOBALS['meta']['creer_htaccess'] != 'oui'
269 ) {
270 return true;
271 }
272
273 if ((!is_numeric($id)) or $id < 0) {
274 return false;
275 }
276
277 if (in_array($qui['statut'], array('0minirezo', '1comite'))) {
278 return 'htaccess';
279 }
280
281 if ($liens = sql_allfetsel('objet,id_objet', 'spip_documents_liens', 'id_document=' . intval($id))) {
282 foreach ($liens as $l) {
283 $table_sql = table_objet_sql($l['objet']);
284 $id_table = id_table_objet($l['objet']);
285 if (sql_countsel(
286 $table_sql,
287 "$id_table = " . intval($l['id_objet'])
288 . (in_array($l['objet'], array('article', 'rubrique', 'breve'))
289 ? " AND statut = 'publie'"
290 : '')
291 ) > 0) {
292 return 'htaccess';
293 }
294 }
295 }
296
297 return false;
298 }
299
300
301 /**
302 * Autorisation d'auto-association de documents à du contenu editorial qui le référence
303 *
304 * Par defaut true pour tous les objets
305 *
306 * @param string $faire Action demandée
307 * @param string $type Type d'objet sur lequel appliquer l'action
308 * @param int $id Identifiant de l'objet
309 * @param array $qui Description de l'auteur demandant l'autorisation
310 * @param array $opt Options de cette autorisation
311 * @return bool true s'il a le droit, false sinon
312 */
313 function autoriser_autoassocierdocument_dist($faire, $type, $id, $qui, $opt) {
314 return true;
315 }
316
317 /**
318 * Autoriser à nettoyer les orphelins de la base des documents
319 *
320 * Réservé aux admins complets.
321 *
322 * @param string $faire Action demandée
323 * @param string $type Type d'objet sur lequel appliquer l'action
324 * @param int $id Identifiant de l'objet
325 * @param array $qui Description de l'auteur demandant l'autorisation
326 * @param array $opt Options de cette autorisation
327 * @return bool true s'il a le droit, false sinon
328 */
329 function autoriser_orphelins_supprimer_dist($faire, $type, $id, $qui, $opt) {
330 if ($qui['statut'] == '0minirezo'
331 and !$qui['restreint']
332 ) {
333 return true;
334 }
335 }
336
337
338 /**
339 * Autoriser a associer des documents a un objet :
340 * il faut avoir le droit de modifier cet objet
341 *
342 * @param $faire
343 * @param $type
344 * @param $id
345 * @param $qui
346 * @param $opt
347 * @return bool
348 */
349 function autoriser_associerdocuments_dist($faire, $type, $id, $qui, $opt) {
350 // cas particulier (hack nouvel objet)
351 if (intval($id) < 0 and $id == -$qui['id_auteur']) {
352 return true;
353 }
354
355 return autoriser('modifier', $type, $id, $qui, $opt);
356 }
357
358 /**
359 * Autoriser a dissocier des documents a un objet :
360 * il faut avoir le droit de modifier cet objet
361 *
362 * @param $faire
363 * @param $type
364 * @param $id
365 * @param $qui
366 * @param $opt
367 * @return bool
368 */
369 function autoriser_dissocierdocuments_dist($faire, $type, $id, $qui, $opt) {
370 // cas particulier (hack nouvel objet)
371 if (intval($id) < 0 and $id == -$qui['id_auteur']) {
372 return true;
373 }
374
375 return autoriser('modifier', $type, $id, $qui, $opt);
376 }