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

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

Suite et (on espère) fin de r85946 et r86435 : autorisation à modifier des albums dans une zone wiki, cf. http://contrib.spip.net/Albums-3#forum478419
Faute de id_secteur pour l'objet lié, on essaie de récupérer cette info via id_rubrique.

  • Property svn:executable set to *
File size: 17.0 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')) return;
14
15
16/**
17 * Fonction d'appel pour le pipeline
18 * @pipeline autoriser */
19function albums_autoriser(){}
20
21
22/**
23 * Autorisation à afficher l'icone de création rapide.
24 *
25 * Il faut être autorisé à créer un album.
26 *
27 * @see autoriser_album_creer_dist()
28 *
29 * @param  string $faire Action demandée
30 * @param  string $type  Type d'objet sur lequel appliquer l'action
31 * @param  int    $id    Identifiant de l'objet
32 * @param  array  $qui   Description de l'auteur demandant l'autorisation
33 * @param  array  $opts  Options de cette autorisation
34 * @return bool          true s'il a le droit, false sinon
35 */
36function autoriser_albumcreer_menu_dist($faire, $type, $id, $qui, $opts){
37        return autoriser('creer','album',$id,$qui,$opts);
38}
39
40
41/**
42 * Autorisation de voir les albums dans le menu d'édition.
43 *
44 * Il faut être autorisé à administrer les albums.
45 *
46 * @see autoriser_albums_administrer_dist()
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  $opts  Options de cette autorisation
53 * @return bool          true s'il a le droit, false sinon
54 */
55function autoriser_albums_menu_dist($faire, $type, $id, $qui, $opts){
56        return autoriser('administrer','albumotheque',$id,$qui,$opts);
57}
58
59
60/**
61 * Autorisation de créer un album
62 *
63 * Il faut être admin ou rédacteur.
64 *
65 * @param  string $faire Action demandée
66 * @param  string $type  Type d'objet sur lequel appliquer l'action
67 * @param  int    $id    Identifiant de l'objet
68 * @param  array  $qui   Description de l'auteur demandant l'autorisation
69 * @param  array  $opts  Options de cette autorisation
70 * @return bool          true s'il a le droit, false sinon
71**/
72function autoriser_album_creer_dist($faire, $type, $id, $qui, $opts) {
73        $autoriser = (in_array($qui['statut'], array('0minirezo', '1comite'))) ? true : false;
74        return $autoriser;
75}
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 et utilisé une seule fois (plugin autorité).
195 *
196 * @note
197 * Hack pénible : quand on ajoute des documents à un nouvel album pas encore enregistré en base,
198 * Des liens temporaires sont créés dans la table spip_documents_liens.
199 * Ceux-ci seront modifiés une fois l'album inséré en base, via le pipeline «post_insertion» du plugin Médias.
200 * Il vérifie avant de procéder qu'il y ait l'autorisation de modifier l'album.
201 * Mais lorsque ce pipeline est appelé, aucun auteur n'a encore été lié à l'album.
202 * Pour ne pas renvoyer un faux négatif dans ce cas là, on vérifie si l'album
203 * vient juste d'être créé selon ces critères : âge, sans auteur et vide.
204 * cf. autorisation à ajouter un album : même combat.
205 *
206 * TODO
207 * Le problème du hack est réglé avec SPIP 3.1, n'y avoir recours que pour les versions antérieures.
208 *
209 * @param  string $faire Action demandée
210 * @param  string $type  Type d'objet sur lequel appliquer l'action
211 * @param  int    $id    Identifiant de l'objet
212 * @param  array  $qui   Description de l'auteur demandant l'autorisation
213 * @param  array  $opts  Options de cette autorisation
214 * @return bool          true s'il a le droit, false sinon
215 */
216function autoriser_album_modifier_dist($faire, $type, $id, $qui, $opts) {
217
218        $id = intval($id);
219        include_spip('action/editer_liens');
220
221        // être un des auteurs de l'album
222        $auteurs_album = array();
223        if (is_array($liens_auteurs = objet_trouver_liens(array('auteur'=>'*'),array('album'=>$id))))
224                foreach($liens_auteurs as $a)
225                        $auteurs_album[] = $a['id_auteur'];
226        $auteur_album = in_array($qui['id_auteur'],$auteurs_album) ? true : false;
227
228        // droit de modifier tous les objets auxquels l'album est lié
229        // l'album peut être lié à un nouvel objet pas encore enregistré en base,
230        // dans ce cas id_objet est négatif
231        $autoriser_modifier_objets_lies = true;
232        $liens_objets = objet_trouver_liens(array('album'=>$id),'*');
233        if (is_array($liens_objets) AND count($liens_objets)){
234                foreach($liens_objets as $l) {
235                        $objet = $l['objet'];
236                        $id_objet = $l['id_objet'];
237                        if (
238                                ($id_objet>0 AND !autoriser('modifier',$objet,$id_objet))
239                                OR ($id_objet<0 AND !autoriser('ecrire',$objet,$id_objet))
240                        ) {
241                                $autoriser_modifier_objets_lies = false;
242                                break;
243                        }
244                }
245        }
246
247        // cas d'un album tout juste inséré en base (cf. note)
248        // pas d'auteur, vide et créé il y a moins de 1 min
249        $nouvel_album =
250                (
251                        !count($auteurs_album)
252                        AND !sql_countsel("spip_documents_liens", "objet='album' AND id_objet=".$id) // vide
253                        AND ((time()-strtotime(sql_getfetsel("date","spip_albums","id_album=".$id))) < (60*1)) // age < 1 min
254                ) ?
255                true : false;
256
257        // les admins complets ont tous les droits !
258        $admin_complet = ($qui['statut'] == '0minirezo' AND !$qui['restreint']) ?
259                true : false;
260
261        // plugin autorité
262        // album utilisé une seule fois et situé dans un secteur wiki/ouvert.
263        // 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.
264        $album_wiki = false;
265        if (defined('_DIR_PLUGIN_AUTORITE')){
266                if (
267                        // album utilisé une seule fois...
268                        is_array($liens_objets)
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                                (
278                                isset($infos_objet['field']['id_secteur'])
279                                AND $id_secteur = sql_getfetsel('id_secteur',table_objet_sql($objet),id_table_objet($objet).'='.intval($id_objet))
280                                )
281                                OR
282                                (
283                                isset($infos_objet['field']['id_rubrique'])
284                                AND $id_rubrique = sql_getfetsel('id_rubrique',table_objet_sql($objet),id_table_objet($objet).'='.intval($id_objet))
285                                AND $id_secteur = sql_getfetsel('id_secteur',table_objet_sql('rubrique'),'id_rubrique='.intval($id_rubrique))
286                                )
287                        )
288                ) {
289                        // on cherche à savoir si le secteur est wiki/ouvert.
290                        // faute de fonction générique, on reprend une partie du code de l'autorisation 'rubrique_publierdans'.
291                        // cf. inc/autoriser.php L291 à 317
292                        if (
293                                (
294                                        $GLOBALS['autorite']['espace_publieur']
295                                        AND autorisation_publie_visiteur($qui, $id_secteur)
296                                        AND $qui['statut']
297                                )
298                                OR (
299                                        $GLOBALS['autorite']['espace_wiki']
300                                        AND autorisation_wiki_visiteur($qui, $id_secteur)
301                                        AND (
302                                                $GLOBALS['autorite']['espace_wiki_rubrique_anonyme']
303                                                OR $qui['statut']
304                                        )
305                                )
306                        ){
307                                $album_wiki = true;
308                        }
309                }
310        }
311
312        $autoriser = (
313                ($auteur_album AND $autoriser_modifier_objets_lies)
314                OR $nouvel_album
315                OR $admin_complet
316                OR $album_wiki
317        ) ? true : false;
318
319        return $autoriser;
320}
321
322
323/**
324 * Autorisation à supprimer définitivement un album.
325 *
326 * Il faut qu'il soit vide et inutilisé, + non publié si on est pas admin complet
327 *
328 * @param  string $faire Action demandée
329 * @param  string $type  Type d'objet sur lequel appliquer l'action
330 * @param  int    $id    Identifiant de l'objet
331 * @param  array  $qui   Description de l'auteur demandant l'autorisation
332 * @param  array  $opts  Options de cette autorisation
333 * @return bool          true s'il a le droit, false sinon
334 */
335function autoriser_album_supprimer_dist($faire, $type, $id, $qui, $opts) {
336
337        $id = intval($id);
338        $statut = sql_getfetsel("statut", "spip_albums", "id_album=$id");
339        $documents = sql_countsel("spip_documents_liens", "objet=".sql_quote($type)."AND id_objet=$id");
340        $liaisons = sql_countsel("spip_albums_liens", "id_album=$id");
341
342        $autoriser = (
343                !$liaisons # inutilisé
344                AND !$documents # vide
345                AND
346                (
347                        (
348                                ($statut != 'publie') #non publié
349                                AND (autoriser('modifier', $type, $id, $qui)) #auteur ou admin
350                        )
351                        OR
352                        (
353                                $qui['statut'] == '0minirezo' AND !$qui['restreint'] #admin complet
354                        )
355                )
356        ) ? true : false;
357
358        return $autoriser;
359}
360
361
362/**
363 * Autorisation à associer un album à un objet donné.
364 *
365 * Il faut pouvoir modifier l'objet
366 * ou être admin complet
367 *
368 * @note
369 * Les infos sur l'objet dont dans les options (5ème paramètre)
370 *
371 * @example
372 *     ```
373 *     #AUTORISER{associer,album,#ID_ALBUM,'',#ARRAY{objet,#OBJET,id_objet,#ID_OBJET}}
374 *     ```
375 *
376 * @param  string $faire Action demandée
377 * @param  string $type  Type d'objet auquel on veut associer ou dissocier un album
378 * @param  int    $id    Identifiant de l'objet auquel on veut associer ou dissocier un album
379 * @param  array  $qui   Description de l'auteur demandant l'autorisation
380 * @param  array  $opts  Options de cette autorisation
381 *                       Doit contenir les clés `objet` et `id_objet`
382 *                       pour rensigner le type et l'identifiant de l'objet
383 * @return bool          true s'il a le droit, false sinon
384 */
385function autoriser_album_associer_dist($faire, $type, $id, $qui, $opts) {
386
387        $autoriser = (
388                ($qui['statut'] == '0minirezo' AND !$qui['restreint'])
389                OR (autoriser('modifier', $opts['objet'], $opts['id_objet'], $qui))
390        ) ? true : false;
391
392        return $autoriser;
393}
394
395
396/**
397 * Autorisation à dissocier un album d'un objet donné.
398 *
399 * Il faut être autorisé à associer un album à l'objet,
400 * et qu'il ne soit pas inséré dans le texte.
401 *
402 * @note
403 * Les infos sur l'objet dont dans les options (5ème paramètre)
404 *
405 * @example
406 *     ```
407 *     #AUTORISER{dissocier,album,#ID_ALBUM,'',#ARRAY{objet,#OBJET,id_objet,#ID_OBJET}}
408 *     ```
409 *
410 * @param  string $faire Action demandée
411 * @param  string $type  Type d'objet sur lequel appliquer l'action
412 * @param  int    $id    Identifiant de l'objet
413 * @param  array  $qui   Description de l'auteur demandant l'autorisation
414 * @param  array  $opts  Options de cette autorisation
415 *                       Doit contenir les clés `objet` et `id_objet`
416 *                       pour rensigner le type et l'identifiant de l'objet
417 * @return bool          true s'il a le droit, false sinon
418 */
419function autoriser_album_dissocier_dist($faire, $type, $id, $qui, $opts) {
420
421        $autoriser = (
422                autoriser('associer', 'album', $id, $qui, $opts)
423                AND (sql_getfetsel('vu', "spip_albums_liens", "id_album=".intval($id)." AND objet=".sql_quote($opts['objet'])." AND id_objet=".intval($opts['id_objet']))=='non')
424        ) ? true : false;
425
426        return $autoriser;
427}
428
429
430/**
431 * Auto-association d'albums à du contenu éditorial qui le référence.
432 *
433 * Par défaut true pour tous les objets.
434 *
435 * @param  string $faire Action demandée
436 * @param  string $type  Type d'objet sur lequel appliquer l'action
437 * @param  int    $id    Identifiant de l'objet
438 * @param  array  $qui   Description de l'auteur demandant l'autorisation
439 * @param  array  $opts  Options de cette autorisation
440 * @return bool          true s'il a le droit, false sinon
441 */
442function autoriser_autoassocieralbum_dist($faire, $type, $id, $qui, $opts) {
443        return true;
444}
445
446
447/**
448 * Autorisation à déplacer des documents.
449 *
450 * Il faut que l'option soit activée, être admin complet,
451 * ou dans le contexte d'un objet, avoir le droit de modifier tous les albums liés.
452 *
453 * @param  string $faire Action demandée
454 * @param  string $type  Type d'objet sur lequel appliquer l'action
455 * @param  int    $id    Identifiant de l'objet
456 * @param  array  $qui   Description de l'auteur demandant l'autorisation
457 * @param  array  $opts  Options de cette autorisation
458 * @return bool          true s'il a le droit, false sinon
459 */
460function autoriser_deplacerdocumentsalbums_dist($faire, $type, $id, $qui, $opts) {
461
462        include_spip('inc/config');
463        // dans le contexte d'un objet, on doit pouvoir modifier tous les albums liés
464        if ($type AND intval($id)>0) {
465                $autoriser_modifier_albums = true;
466                include_spip('action/editer_liens');
467                if (is_array($liens_albums=objet_trouver_liens(array('album'=>'*'),array($type=>$id))) AND count($liens_albums)){
468                        foreach($liens_albums as $l) {
469                                if (!autoriser('modifier','album',$l['id_album'])) {
470                                        $autoriser_modifier_albums = false;
471                                        break;
472                                }
473                        }
474                }
475        }
476        // sinon, il faut qu'il y ait au moins 2 albums
477        else {
478                $autoriser_modifier_albums = sql_countsel('spip_albums')>1;
479        }
480
481        $autoriser = (
482                lire_config('albums/deplacer_documents','')=='on'
483                AND
484                (
485                        $qui['statut'] == '0minirezo' AND !$qui['restreint']
486                        OR $autoriser_modifier_albums
487                )
488        ) ? true : false;
489
490        return $autoriser;
491}
492
493
494/**
495 * Autorisation de vider un album
496 *
497 * Il faut qu'il y ait des documents, et être admin complet
498 *
499 * @param  string $faire Action demandée
500 * @param  string $type  Type d'objet sur lequel appliquer l'action
501 * @param  int    $id    Identifiant de l'objet
502 * @param  array  $qui   Description de l'auteur demandant l'autorisation
503 * @param  array  $opts  Options de cette autorisation
504 * @return bool          true s'il a le droit, false sinon
505**/
506function autoriser_album_vider_dist($faire, $type, $id, $qui, $opts) {
507        include_spip('action/editer_liens');
508        $rempli = count(objet_trouver_liens(array('document'=>'*'),array('album'=>$id)))>0;
509        $admin = $qui['statut']=='0minirezo' AND !$qui['restreint'];
510        $autoriser = ($admin AND $rempli) ? true : false;
511        return $autoriser;
512}
513
514
515?>
Note: See TracBrowser for help on using the repository browser.