source: spip-zone/_plugins_/motus/trunk/motus_autorisations.php @ 87620

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

Commit oublié : si le plugin mots ne donne pas l'autorisation de voir le sélecteur, pas la peine d'aller plus loin.

File size: 7.8 KB
Line 
1<?php
2
3/**
4 * Définition d'autorisations
5 *
6 * Essentiellement des surcharges d'autorisations du plugin mots
7 *
8 * @package Motus\Autorisations
9**/
10
11/** Fonction d'appel du pipeline **/
12function motus_autoriser(){}
13
14/**
15 * Autorisation de voir le champs extra rubriques_on sur les groupes
16 *
17 * Il est hérité du parent. Toujours vrai
18 *
19 * @param  string $faire Action demandée
20 * @param  string $type  Type d'objet sur lequel appliquer l'action
21 * @param  int    $id    Identifiant de l'objet
22 * @param  array  $qui   Description de l'auteur demandant l'autorisation
23 * @param  array  $opt   Options de cette autorisation
24 * @return bool          true s'il a le droit, false sinon
25 */
26function autoriser_spip_groupes_mots_voirextra_rubriques_on_dist($faire,$type,$id,$qui,$opt) {
27        return true;
28}
29
30/**
31 * Autorisation de voir le champs extra rubriques_on sur les groupes
32 *
33 * On le limite aux groupes racine (si plugin gma - groupes mots arborescents)
34 *
35 * @param  string $faire Action demandée
36 * @param  string $type  Type d'objet sur lequel appliquer l'action
37 * @param  int    $id    Identifiant de l'objet
38 * @param  array  $qui   Description de l'auteur demandant l'autorisation
39 * @param  array  $opt   Options de cette autorisation
40 * @return bool          true s'il a le droit, false sinon
41 */
42function autoriser_spip_groupes_mots_modifierextra_rubriques_on_dist($faire,$type,$id,$qui,$opt) {
43        $trouver_table = charger_fonction('trouver_table', 'base');
44        $desc = $trouver_table('spip_groupes_mots');
45        if (!isset($desc['field']['id_groupe_racine'])) {
46                return true;
47        }
48
49        // si c'est une creation de groupe
50        // on retourne false si on crée un goupe dans un parent connu
51        if ($id == 'oui'){
52                return (bool)!_request('id_parent');
53        }
54
55        // sinon on cherche la racine du groupe
56        $id_racine = sql_getfetsel('id_groupe_racine', 'spip_groupes_mots', 'id_groupe=' . sql_quote($id));
57        // vrai si la racine est notre groupe
58        return ($id_racine == $id);
59}
60
61/**
62 * Autorisation d'associer des mots à un objet
63 *
64 * Si l'affichage est autorisé par la fonction mère,
65 * On teste que les restrictions eventuelles sur le groupe
66 * ne viennent pas faire qu'il n'y aurait aucun groupe d'affiché ensuite
67 *
68 * @param  string $faire Action demandée
69 * @param  string $type  Type d'objet sur lequel appliquer l'action
70 * @param  int    $id    Identifiant de l'objet
71 * @param  array  $qui   Description de l'auteur demandant l'autorisation
72 * @param  array  $opt   Options de cette autorisation
73 * @return bool          true s'il a le droit, false sinon
74 */
75function autoriser_associermots($faire,$type,$id,$qui,$opt) {
76        if (!autoriser_associermots_dist($faire,$type,$id,$qui,$opt)) {
77                return false;
78        }
79
80        // il existe des groupes pour l'objet en question.
81        // on ne s'occupe que du cas ou nous ne connaissons pas de groupe precis d'association
82        if (isset($opt['groupe_champs']) OR isset($opt['id_groupe'])){
83                return true;
84        }
85
86        // chercher si un groupe est autorise pour mon statut
87        // et pour la table demandee
88        $table = addslashes(table_objet($type));
89        $droit = substr($qui['statut'],1);
90        $restrictions = sql_allfetsel('rubriques_on', 'spip_groupes_mots',"tables_liees REGEXP '(^|,)$table($|,)' AND ".addslashes($droit)."='oui'");
91        $restrictions = array_map('array_shift', $restrictions);
92
93        // pour chaque resultat, on teste si on peut l'associer ou non...
94        // deja, un des groupes est sans restriction : c'est OK !
95        foreach ($restrictions as $r) {
96                if (!$r) return true;
97        }
98
99        // puis via l'autorisation...
100        foreach ($restrictions as $r) {
101                if (motus_autoriser_groupe_si_selection_rubrique($r, $type, $id, $qui))
102                        return true;
103        }
104
105        // tout est interdit d'affichage !
106        return false;
107}
108
109
110/**
111 * Autorisation d'afficher le selecteur de mots
112 *
113 * Autorisation pour un groupe de mot donné, dans un objet / id_objet donne
114 *
115 * @param  string $faire Action demandée
116 * @param  string $type  Type d'objet sur lequel appliquer l'action
117 * @param  int    $id    Identifiant de l'objet
118 * @param  array  $qui   Description de l'auteur demandant l'autorisation
119 * @param  array  $opt   Options de cette autorisation
120 * @return bool          true s'il a le droit, false sinon
121 */
122function autoriser_groupemots_afficherselecteurmots($faire, $type, $id, $qui, $opt){
123
124        static $groupes = array();
125
126        if (!autoriser_groupemots_afficherselecteurmots_dist($faire, $type, $id, $qui, $opt)) {
127                return false;
128        }
129
130        $objet    = $opt['objet'];
131        $id_objet = $opt['id_objet'];
132
133        if (!$objet) return true;
134
135        // premier tri
136        if (!autoriser_associermots_dist($faire,$objet,$id_objet,$qui,$opt))
137                return false;
138
139        // liste des rubriques autorisées pour le groupe donné
140        if (!isset($groupes[$id])) {
141                $groupes[$id] = sql_getfetsel('rubriques_on', 'spip_groupes_mots', 'id_groupe='.$id);
142        }
143
144        // pas de restriction, on s'en va
145        if (!$groupes[$id]) {
146                return true;
147        }
148
149        // si restriction a une rubrique...
150        // on passe la liste des rubriques concerné et on regarde si l'objet à lier est dedans ou non
151        return motus_autoriser_groupe_si_selection_rubrique($groupes[$id], $objet, $id_objet, $qui);
152}
153
154
155/**
156 * Retourne vrai si une selection de rubrique s'applique à cet objet
157 *
158 * Autrement dit, si l'objet appartient à une des rubriques données
159 * 
160 * @param string $restriction
161 *     Liste des restrictions issues d'une selection avec le selecteur generique (rubrique|3)
162 * @param string $objet
163 *     Objet sur lequel on teste l'appartenance a une des rubriques (article)
164 * @param int $id_objet
165 *     Identifiant de l'objet.
166 * @param int $qui
167 *     De qui teste t'on l'autorisation.
168 * @return bool
169**/
170function motus_autoriser_groupe_si_selection_rubrique($restrictions, $objet, $id_objet, $qui) {
171        // si restriction a une rubrique...
172        include_spip('formulaires/selecteur/generique_fonctions');
173        if ($rubs = picker_selected($restrictions, 'rubrique')) {
174               
175                // trouver la rubrique de l'objet en question
176                if ($objet != 'rubrique') {
177
178                        $trouver_table = charger_fonction('trouver_table', 'base');
179                        $desc = $trouver_table( table_objet($objet) );
180
181                        if ($desc and isset($desc['field']['id_rubrique'])) {
182                                $table = table_objet_sql($objet);
183                                $id_rub = sql_getfetsel('id_rubrique', $table, id_table_objet($table) . '=' . intval($id_objet));
184                        }
185                } else {
186                        $id_rub = $id_objet;
187                }
188                $opt = array();
189                $opt['rubriques_on'] = $rubs;
190                // ici on sait dans quelle rubriuqe est notre objet ($id_rub)
191                // et on connait la liste des rubriques acceptées ($opt['rubriques_on'])
192                return autoriser('dansrubrique', 'groupemots', $id_rub, $qui, $opt);
193        }
194
195        return false;
196}
197
198
199
200/**
201 * Retourne vrai si la rubrique $id fait partie d'une des branches de $opt['rubriques_on']
202 *
203 * Autrement dit, si la rubrique appartient à une des rubriques données
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**/
212function autoriser_groupemots_dansrubrique_dist($faire,$type,$id,$qui,$opt){
213        static $rubriques = array();
214
215        if (!isset($opt['rubriques_on'])
216        or !$rubs = $opt['rubriques_on']  // pas de liste de rubriques ?
217        or !$id  // pas d'info de rubrique... on autorise par defaut...
218        or in_array($id, $rubs)) // la rubrique est dedans
219                return true;
220
221        // la ca se complique...
222        // si deja calcule... on le retourne.
223        $hash = md5(implode('',$rubs));
224        if (isset($rubriques[$id][$hash]))
225                return $rubriques[$id][$hash];
226       
227        // remonter recursivement les rubriques...
228        $id_parent = sql_getfetsel('id_parent','spip_rubriques', 'id_rubrique = '. sql_quote($id));
229
230        // si racine... pas de chance
231        if (!$id_parent) {
232                $rubriques[$id][$hash] = false;
233        } else {
234                $rubriques[$id][$hash] = autoriser('dansrubrique','groupemots',$id_parent,$qui,$opt);
235        }
236
237        return $rubriques[$id][$hash];
238}
239
240
241
242?>
Note: See TracBrowser for help on using the repository browser.