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

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

Fonction pour "transvaser" les documents entre un album et le portfolio d'un objet (portfolio = tous les docs liés à l'objet, pas juste le groupe "porfolio". On se comprend.).
Autrement dit, ça permet de "transformer" un portfolio en album et inversement.
Pour l'instant, les boutons d'action correspondant ne sont pas intégrés dans l'interface, le temps de trouver comment faire ça proprement.
Il faut un libellé clair et pas trop long pour ces boutons (albumiser / désalbumiser ? transvaser ?...).
Quand les afficher : pour les admins, les rédacteurs ?
Que de questions.

  • Property svn:executable set to *
File size: 18.3 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é, et avoir le droit de le modifier ou être 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 renseigner 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
508        include_spip('action/editer_liens');
509        $rempli = count(objet_trouver_liens(array('document'=>'*'),array('album'=>$id)))>0;
510        $admin = $qui['statut']=='0minirezo' AND !$qui['restreint'];
511        $autoriser = ($admin AND $rempli) ? true : false;
512
513        return $autoriser;
514}
515
516
517/**
518 * Autorisation de transvaser les documents d'un album
519 *
520 * Il faut que l'album soit lié à l'objet et
521 * avoir le droit de modifier l'album et d'ajouter des documents ou être admin complet.
522 *
523 * @param  string $faire Action demandée
524 * @param  string $type  Type d'objet sur lequel appliquer l'action
525 * @param  int    $id    Identifiant de l'objet
526 * @param  array  $qui   Description de l'auteur demandant l'autorisation
527 * @param  array  $opts  Options de cette autorisation
528 *                       Doit contenir les clés `objet` et `id_objet`
529 *                       pour renseigner le type et l'identifiant de l'objet
530 * @return bool          true s'il a le droit, false sinon
531**/
532function autoriser_album_transvaser_dist($faire, $type, $id, $qui, $opts) {
533
534        include_spip('action/editer_liens');
535        $objet = $opts['objet'];
536        $id_objet = $opts['id_objet'];
537        $liaison = (count(objet_trouver_liens(array('album'=>$id),array($objet=>$id_objet)))>0) ? true : false;
538        $autoriser_modifier = autoriser('modifier','album',$id);
539        $autoriser_joindredocument = autoriser('joindredocument',$objet,$id_objet);
540        $admin = $qui['statut']=='0minirezo' AND !$qui['restreint'];
541
542        $autoriser = (
543                $liaison
544                AND
545                (
546                        (
547                        $autoriser_modifier
548                        AND $autoriser_joindredocument
549                        )
550                        OR
551                        $admin
552                )
553        ) ? true : false;
554
555        return $autoriser;
556}
557
558
559?>
Note: See TracBrowser for help on using the repository browser.