source: spip-zone/_plugins_/albums/trunk/albums_autorisations.php @ 100679

Last change on this file since 100679 was 100679, checked in by kent1@…, 3 years ago

On sait que la table c'est spip_rubriques, pas la peine d'utiliser une fonction pour le savoir

Eviter de longues lignes

  • Property svn:executable set to *
File size: 18.4 KB
Line 
1<?php
2/**
3 * Définit les autorisations du plugin Albums
4 *
5 * @plugin     Albums
6 * @copyright  2014
7 * @author     Tetue, Charles Razack
8 * @licence    GNU/GPL
9 * @package    SPIP\Albums\Autorisations
10 */
11
12// Sécurité
13if (!defined('_ECRIRE_INC_VERSION')) {
14        return;
15}
16
17
18/**
19 * Fonction d'appel pour le pipeline
20 * @pipeline autoriser */
21function albums_autoriser() {
22}
23
24
25/**
26 * Autorisation à afficher l'icone de création rapide.
27 *
28 * Il faut être autorisé à créer un album.
29 *
30 * @see autoriser_album_creer_dist()
31 *
32 * @param  string $faire Action demandée
33 * @param  string $type  Type d'objet sur lequel appliquer l'action
34 * @param  int    $id    Identifiant de l'objet
35 * @param  array  $qui   Description de l'auteur demandant l'autorisation
36 * @param  array  $opts  Options de cette autorisation
37 * @return bool          true s'il a le droit, false sinon
38 */
39function autoriser_albumcreer_menu_dist($faire, $type, $id, $qui, $opts) {
40        return autoriser('creer', 'album', $id, $qui, $opts);
41}
42
43/**
44 * Autorisation de voir les albums dans le menu d'édition.
45 *
46 * Il faut être autorisé à administrer les albums.
47 *
48 * @see autoriser_albums_administrer_dist()
49 *
50 * @param  string $faire Action demandée
51 * @param  string $type  Type d'objet sur lequel appliquer l'action
52 * @param  int    $id    Identifiant de l'objet
53 * @param  array  $qui   Description de l'auteur demandant l'autorisation
54 * @param  array  $opts  Options de cette autorisation
55 * @return bool          true s'il a le droit, false sinon
56 */
57function autoriser_albums_menu_dist($faire, $type, $id, $qui, $opts) {
58        return autoriser('administrer', 'albumotheque', $id, $qui, $opts);
59}
60
61/**
62 * Autorisation de créer un album
63 *
64 * Il faut être admin ou rédacteur.
65 *
66 * @param  string $faire Action demandée
67 * @param  string $type  Type d'objet sur lequel appliquer l'action
68 * @param  int    $id    Identifiant de l'objet
69 * @param  array  $qui   Description de l'auteur demandant l'autorisation
70 * @param  array  $opts  Options de cette autorisation
71 * @return bool          true s'il a le droit, false sinon
72**/
73function autoriser_album_creer_dist($faire, $type, $id, $qui, $opts) {
74        $autoriser = (in_array($qui['statut'], array('0minirezo', '1comite'))) ? true : false;
75        return $autoriser;
76}
77
78/**
79 * Autorisation à voir les fiches complètes.
80 *
81 * Open bar pour tout le monde.
82 *
83 * @param  string $faire Action demandée
84 * @param  string $type  Type d'objet sur lequel appliquer l'action
85 * @param  int    $id    Identifiant de l'objet
86 * @param  array  $qui   Description de l'auteur demandant l'autorisation
87 * @param  array  $opts  Options de cette autorisation
88 * @return bool          true s'il a le droit, false sinon
89 */
90function autoriser_album_voir_dist($faire, $type, $id, $qui, $opts) {
91        return true;
92}
93
94
95/**
96 * Autorisation à accéder à l'albumothèque.
97 *
98 * Il faut être admin ou rédacteur.
99 *
100 * @param  string $faire Action demandée
101 * @param  string $type  Type d'objet sur lequel appliquer l'action
102 * @param  int    $id    Identifiant de l'objet
103 * @param  array  $qui   Description de l'auteur demandant l'autorisation
104 * @param  array  $opts  Options de cette autorisation
105 * @return bool          true s'il a le droit, false sinon
106 */
107function autoriser_albumotheque_administrer_dist($faire, $type, $id, $qui, $opts) {
108        $autoriser = (in_array($qui['statut'], array('0minirezo', '1comite'))) ? true : false;
109        return $autoriser;
110}
111
112
113/**
114 * Autorisation à ajouter un album à un objet.
115 *
116 * Il faut que l'ajout d'albums sur le type d'objet soit activé,
117 * et pouvoir modifier l'objet (ou l'éditer en cas de création par un rédacteur,
118 * qui correspond au hack id_objet = 0-id_auteur)
119 * ou être admin complet.
120 *
121 * @note
122 * Attention, les 2ème et 3ème arguments se réfèrent à l'objet, pas à l'album.
123 * Pour le hack de l'identifiant négatif, voir les notes du pipeline «affiche_gauche».
124 * Autre hack pénible : des fois l'autorisation à modifier un objet renvoie un faux négatif,
125 * c'est la cas dans un appel depuis le pipeline post_insertion, car l'auteur n'a pas encore été lié à l'objet.
126 * Dans ce cas il faut contourner le problème en vérifiant si l'objet vient juste d'être créé.
127 * cf. autorisation à modifier un album : même combat.
128 *
129 * TODO
130 * Le problème du hack est réglé avec SPIP 3.1, n'y avoir recours que pour les versions antérieures.
131 *
132 * @example
133 *     ```
134 *     #AUTORISER{ajouteralbum,#OBJET,#ID_OBJET}
135 *     ```
136 *
137 * @param  string $faire Action demandée
138 * @param  string $type  Type d'objet auquel on veut ajouter un album
139 * @param  int    $id    Identifiant de l'objet auquel on veut ajouter un album
140 * @param  array  $qui   Description de l'auteur demandant l'autorisation
141 * @param  array  $opts  Options de cette autorisation
142 * @return bool          true s'il a le droit, false sinon
143 */
144function autoriser_ajouteralbum_dist($faire, $type, $id, $qui, $opts) {
145
146        include_spip('inc/config');
147        $config = lire_config('albums/objets', array());
148        $autoriser = (
149                (
150                        // objet activé
151                        in_array(table_objet_sql($type), array_filter($config))
152                )
153                and
154                (
155                        // identifiant positif : cas «normal»
156                        (
157                                $id>0
158                                and
159                                (
160                                        ($qui['statut'] == '0minirezo' and !$qui['restreint'])
161                                        // il faut être autorisé à modifier l'objet...
162                                        or autoriser('modifier', $type, $id, $qui, $opts)
163                                        // ...mais ça donne un faux négatif depuis le pipeline «post_insertion» (cf. note),
164                                        // dans ce cas là on vérifie si l'objet est récent et qu'on a le droit d'écrire.
165                                        or (
166                                                (time()-strtotime(generer_info_entite($id, $type, 'date'))) < (60*1) // age < 1 min, cf. note
167                                                and autoriser('ecrire', $type, $id, $qui, $opts)
168                                        )
169                                )
170                        )
171                        // identifiant négatif : objet nouveau pas encore enregistré en base (cf. note)
172                        or
173                        (
174                                $id<0
175                                and
176                                (
177                                        abs($id) == $qui['id_auteur']
178                                        and autoriser('ecrire', $type, $id, $qui, $opts)
179                                )
180                        )
181                )
182        ) ? true : false;
183
184        return $autoriser;
185}
186
187
188/**
189 * Autorisation à modifier un album.
190 *
191 * Il faut être l'auteur et avoir le droit de modifier tous les objets auxquels l'album est lié,
192 * ou qu'il s'agisse d'un album en cours de création (vide, pas d'auteur et récent, cf. note),
193 * ou être admin complet,
194 * ou que l'album soit lié à une rubrique wiki/ouverte ou un de ses article
195 * et utilisé une seule fois (plugin autorité).
196 *
197 * @note
198 * Hack pénible : quand on ajoute des documents à un nouvel album pas encore enregistré en base,
199 * Des liens temporaires sont créés dans la table spip_documents_liens.
200 * Ceux-ci seront modifiés une fois l'album inséré en base, via le pipeline «post_insertion» du plugin Médias.
201 * Il vérifie avant de procéder qu'il y ait l'autorisation de modifier l'album.
202 * Mais lorsque ce pipeline est appelé, aucun auteur n'a encore été lié à l'album.
203 * Pour ne pas renvoyer un faux négatif dans ce cas là, on vérifie si l'album
204 * vient juste d'être créé selon ces critères : âge, sans auteur et vide.
205 * cf. autorisation à ajouter un album : même combat.
206 *
207 * TODO
208 * Le problème du hack est réglé avec SPIP 3.1, n'y avoir recours que pour les versions antérieures.
209 *
210 * @param  string $faire Action demandée
211 * @param  string $type  Type d'objet sur lequel appliquer l'action
212 * @param  int    $id    Identifiant de l'objet
213 * @param  array  $qui   Description de l'auteur demandant l'autorisation
214 * @param  array  $opts  Options de cette autorisation
215 * @return bool          true s'il a le droit, false sinon
216 */
217function autoriser_album_modifier_dist($faire, $type, $id, $qui, $opts) {
218
219        $id = intval($id);
220        include_spip('action/editer_liens');
221
222        // être un des auteurs de l'album
223        $auteurs_album = array();
224        if (is_array($liens_auteurs = objet_trouver_liens(array('auteur'=>'*'), array('album'=>$id)))) {
225                foreach ($liens_auteurs as $a) {
226                        $auteurs_album[] = $a['id_auteur'];
227                }
228        }
229        $auteur_album = in_array($qui['id_auteur'], $auteurs_album) ? true : false;
230
231        // droit de modifier tous les objets auxquels l'album est lié
232        // l'album peut être lié à un nouvel objet pas encore enregistré en base,
233        // dans ce cas id_objet est négatif
234        $autoriser_modifier_objets_lies = true;
235        $liens_objets = objet_trouver_liens(array('album'=>$id), '*');
236        if (is_array($liens_objets) and count($liens_objets)) {
237                foreach ($liens_objets as $l) {
238                        $objet = $l['objet'];
239                        $id_objet = $l['id_objet'];
240                        if (($id_objet > 0 and !autoriser('modifier', $objet, $id_objet))
241                                or ($id_objet < 0 and !autoriser('ecrire', $objet, $id_objet))
242                        ) {
243                                $autoriser_modifier_objets_lies = false;
244                                break;
245                        }
246                }
247        }
248
249        // cas d'un album tout juste inséré en base (cf. note)
250        // pas d'auteur, vide et créé il y a moins de 1 min
251        $nouvel_album =
252                (
253                        !count($auteurs_album)
254                        and !sql_countsel('spip_documents_liens', "objet='album' AND id_objet=".$id) // vide
255                        and ((time()-strtotime(sql_getfetsel('date', 'spip_albums', 'id_album='.$id))) < (60*1)) // age < 1 min
256                ) ?
257                true : false;
258
259        // les admins complets ont tous les droits !
260        $admin_complet = ($qui['statut'] == '0minirezo' and !$qui['restreint']) ?
261                true : false;
262
263        // plugin autorité
264        // album utilisé une seule fois et situé dans un secteur wiki/ouvert.
265        // on vérifie que l'objet auquel il est lié possède un champ `id_secteur`, et qu'on a le droit de publier dedans.
266        $album_wiki = false;
267        if (defined('_DIR_PLUGIN_AUTORITE')) {
268                if (is_array($liens_objets) // album utilisé une seule fois...
269                        and count($liens_objets) == 1
270                        // ...et lié à un objet...
271                        and $objet = $liens_objets[0]['objet']
272                        and $id_objet = $liens_objets[0]['id_objet']
273                        // ...qui possède un champ `id_secteur`
274                        and is_array($infos_objet = lister_tables_objets_sql(table_objet_sql($objet)))
275                        and
276                        ((
277                                isset($infos_objet['field']['id_secteur'])
278                                        and $id_secteur = sql_getfetsel('id_secteur', table_objet_sql($objet), id_table_objet($objet).'='.intval($id_objet)))
279                                or
280                                        (isset($infos_objet['field']['id_rubrique'])
281                                        and $id_rubrique = sql_getfetsel('id_rubrique', table_objet_sql($objet), id_table_objet($objet).'='.intval($id_objet))
282                                        and $id_secteur = sql_getfetsel('id_secteur', 'spip_rubriques', 'id_rubrique='.intval($id_rubrique))
283                        ))
284                ) {
285                        // on cherche à savoir si le secteur est wiki/ouvert.
286                        // faute de fonction générique, on reprend une partie du code de l'autorisation 'rubrique_publierdans'.
287                        // cf. inc/autoriser.php L291 à 317
288                        if ((
289                                        $GLOBALS['autorite']['espace_publieur']
290                                        and autorisation_publie_visiteur($qui, $id_secteur)
291                                        and $qui['statut']
292                                )
293                                or (
294                                        $GLOBALS['autorite']['espace_wiki']
295                                        and autorisation_wiki_visiteur($qui, $id_secteur)
296                                        and (
297                                                $GLOBALS['autorite']['espace_wiki_rubrique_anonyme']
298                                                or $qui['statut']
299                                        )
300                                )
301                        ) {
302                                $album_wiki = true;
303                        }
304                }
305        }
306
307        $autoriser = (
308                ($auteur_album and $autoriser_modifier_objets_lies)
309                or $nouvel_album
310                or $admin_complet
311                or $album_wiki
312        ) ? true : false;
313
314        return $autoriser;
315}
316
317
318/**
319 * Autorisation à supprimer définitivement un album.
320 *
321 * Il faut qu'il soit vide et inutilisé, et avoir le droit de le modifier ou être admin complet
322 *
323 * @param  string $faire Action demandée
324 * @param  string $type  Type d'objet sur lequel appliquer l'action
325 * @param  int    $id    Identifiant de l'objet
326 * @param  array  $qui   Description de l'auteur demandant l'autorisation
327 * @param  array  $opts  Options de cette autorisation
328 * @return bool          true s'il a le droit, false sinon
329 */
330function autoriser_album_supprimer_dist($faire, $type, $id, $qui, $opts) {
331
332        $id = intval($id);
333        $statut = sql_getfetsel('statut', 'spip_albums', "id_album=$id");
334        $documents = sql_countsel('spip_documents_liens', 'objet='.sql_quote($type)."AND id_objet=$id");
335        $liaisons = sql_countsel('spip_albums_liens', "id_album=$id");
336
337        $autoriser = (
338                !$liaisons # inutilisé
339                and !$documents # vide
340                and
341                (
342                        (
343                                ($statut != 'publie') #non publié
344                                and (autoriser('modifier', $type, $id, $qui)) #auteur ou admin
345                        )
346                        or
347                        (
348                                $qui['statut'] == '0minirezo' and !$qui['restreint'] #admin complet
349                        )
350                )
351        ) ? true : false;
352
353        return $autoriser;
354}
355
356
357/**
358 * Autorisation à associer un album à un objet donné.
359 *
360 * Il faut pouvoir modifier l'objet
361 * ou être admin complet
362 *
363 * @note
364 * Les infos sur l'objet dont dans les options (5ème paramètre)
365 *
366 * @example
367 *     ```
368 *     #AUTORISER{associer,album,#ID_ALBUM,'',#ARRAY{objet,#OBJET,id_objet,#ID_OBJET}}
369 *     ```
370 *
371 * @param  string $faire Action demandée
372 * @param  string $type  Type d'objet auquel on veut associer ou dissocier un album
373 * @param  int    $id    Identifiant de l'objet auquel on veut associer ou dissocier un album
374 * @param  array  $qui   Description de l'auteur demandant l'autorisation
375 * @param  array  $opts  Options de cette autorisation
376 *                       Doit contenir les clés `objet` et `id_objet`
377 *                       pour rensigner le type et l'identifiant de l'objet
378 * @return bool          true s'il a le droit, false sinon
379 */
380function autoriser_album_associer_dist($faire, $type, $id, $qui, $opts) {
381
382        $autoriser = (
383                ($qui['statut'] == '0minirezo' and !$qui['restreint'])
384                or (autoriser('modifier', $opts['objet'], $opts['id_objet'], $qui))
385        ) ? true : false;
386
387        return $autoriser;
388}
389
390
391/**
392 * Autorisation à dissocier un album d'un objet donné.
393 *
394 * Il faut être autorisé à associer un album à l'objet,
395 * et qu'il ne soit pas inséré dans le texte.
396 *
397 * @note
398 * Les infos sur l'objet dont dans les options (5ème paramètre)
399 *
400 * @example
401 *     ```
402 *     #AUTORISER{dissocier,album,#ID_ALBUM,'',#ARRAY{objet,#OBJET,id_objet,#ID_OBJET}}
403 *     ```
404 *
405 * @param  string $faire Action demandée
406 * @param  string $type  Type d'objet sur lequel appliquer l'action
407 * @param  int    $id    Identifiant de l'objet
408 * @param  array  $qui   Description de l'auteur demandant l'autorisation
409 * @param  array  $opts  Options de cette autorisation
410 *                       Doit contenir les clés `objet` et `id_objet`
411 *                       pour renseigner le type et l'identifiant de l'objet
412 * @return bool          true s'il a le droit, false sinon
413 */
414function autoriser_album_dissocier_dist($faire, $type, $id, $qui, $opts) {
415
416        $autoriser = (
417                autoriser('associer', 'album', $id, $qui, $opts)
418                and (sql_getfetsel('vu', 'spip_albums_liens', 'id_album='.intval($id).'
419                        AND objet='.sql_quote($opts['objet']).'
420                        AND id_objet='.intval($opts['id_objet']))=='non')
421        ) ? true : false;
422
423        return $autoriser;
424}
425
426
427/**
428 * Auto-association d'albums à du contenu éditorial qui le référence.
429 *
430 * Par défaut true pour tous les objets.
431 *
432 * @param  string $faire Action demandée
433 * @param  string $type  Type d'objet sur lequel appliquer l'action
434 * @param  int    $id    Identifiant de l'objet
435 * @param  array  $qui   Description de l'auteur demandant l'autorisation
436 * @param  array  $opts  Options de cette autorisation
437 * @return bool          true s'il a le droit, false sinon
438 */
439function autoriser_autoassocieralbum_dist($faire, $type, $id, $qui, $opts) {
440        return true;
441}
442
443
444/**
445 * Autorisation à déplacer des documents.
446 *
447 * Il faut que l'option soit activée, être admin complet,
448 * ou dans le contexte d'un objet, avoir le droit de modifier tous les albums liés.
449 *
450 * @param  string $faire Action demandée
451 * @param  string $type  Type d'objet sur lequel appliquer l'action
452 * @param  int    $id    Identifiant de l'objet
453 * @param  array  $qui   Description de l'auteur demandant l'autorisation
454 * @param  array  $opts  Options de cette autorisation
455 * @return bool          true s'il a le droit, false sinon
456 */
457function autoriser_deplacerdocumentsalbums_dist($faire, $type, $id, $qui, $opts) {
458
459        include_spip('inc/config');
460        // dans le contexte d'un objet, on doit pouvoir modifier tous les albums liés
461        if ($type and intval($id) > 0) {
462                $autoriser_modifier_albums = true;
463                include_spip('action/editer_liens');
464                if (is_array($liens_albums = objet_trouver_liens(array('album' => '*'), array($type => $id)))
465                        and count($liens_albums)) {
466                        foreach ($liens_albums as $l) {
467                                if (!autoriser('modifier', 'album', $l['id_album'])) {
468                                        $autoriser_modifier_albums = false;
469                                        break;
470                                }
471                        }
472                }
473        } else {
474                // sinon, il faut qu'il y ait au moins 2 albums
475                $autoriser_modifier_albums = sql_countsel('spip_albums') > 1;
476        }
477
478        $autoriser = (
479                lire_config('albums/deplacer_documents', '') == 'on'
480                and
481                (
482                        $qui['statut'] == '0minirezo' and !$qui['restreint']
483                        or $autoriser_modifier_albums
484                )
485        ) ? true : false;
486
487        return $autoriser;
488}
489
490
491/**
492 * Autorisation de vider un album
493 *
494 * Il faut qu'il y ait des documents, et être admin complet
495 *
496 * @param  string $faire Action demandée
497 * @param  string $type  Type d'objet sur lequel appliquer l'action
498 * @param  int    $id    Identifiant de l'objet
499 * @param  array  $qui   Description de l'auteur demandant l'autorisation
500 * @param  array  $opts  Options de cette autorisation
501 * @return bool          true s'il a le droit, false sinon
502**/
503function autoriser_album_vider_dist($faire, $type, $id, $qui, $opts) {
504
505        include_spip('action/editer_liens');
506        $rempli = count(objet_trouver_liens(array('document'=>'*'), array('album'=>$id))) > 0;
507        $admin = $qui['statut']=='0minirezo' and !$qui['restreint'];
508        $autoriser = ($admin and $rempli) ? true : false;
509
510        return $autoriser;
511}
512
513
514/**
515 * Autorisation de transvaser les documents d'un album
516 *
517 * Il faut que l'album soit lié à l'objet et
518 * avoir le droit de modifier l'album et d'ajouter des documents ou être admin complet.
519 *
520 * @param  string $faire Action demandée
521 * @param  string $type  Type d'objet sur lequel appliquer l'action
522 * @param  int    $id    Identifiant de l'objet
523 * @param  array  $qui   Description de l'auteur demandant l'autorisation
524 * @param  array  $opts  Options de cette autorisation
525 *                       Doit contenir les clés `objet` et `id_objet`
526 *                       pour renseigner le type et l'identifiant de l'objet
527 * @return bool          true s'il a le droit, false sinon
528**/
529function autoriser_album_transvaser_dist($faire, $type, $id, $qui, $opts) {
530
531        include_spip('action/editer_liens');
532        $objet = $opts['objet'];
533        $id_objet = $opts['id_objet'];
534        $liaison = (count(objet_trouver_liens(array('album'=>$id), array($objet=>$id_objet))) > 0) ? true : false;
535        $autoriser_modifier = autoriser('modifier', 'album', $id);
536        $autoriser_joindredocument = autoriser('joindredocument', $objet, $id_objet);
537        $admin = $qui['statut']=='0minirezo' and !$qui['restreint'];
538
539        $autoriser = (
540                $liaison
541                and
542                (
543                        (
544                        $autoriser_modifier
545                        and $autoriser_joindredocument
546                        )
547                        or
548                        $admin
549                )
550        ) ? true : false;
551
552        return $autoriser;
553}
Note: See TracBrowser for help on using the repository browser.