[SPIP] v3.2.1-->v3.2.3
[lhc/web/www.git] / www / plugins-dist / mots / mots_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 mots
15 *
16 * @package SPIP\Mots\Autorisations
17 **/
18 if (!defined('_ECRIRE_INC_VERSION')) {
19 return;
20 }
21
22 /**
23 * Fonction d'appel pour le pipeline
24 *
25 * @pipeline autoriser
26 */
27 function mots_autoriser() {
28 }
29
30 /**
31 * Autorisation de voir un élément de menu
32 *
33 * @param string $faire Action demandée
34 * @param string $type Type d'objet sur lequel appliquer l'action
35 * @param int $id Identifiant de l'objet
36 * @param array $qui Description de l'auteur demandant l'autorisation
37 * @param array $opt Options de cette autorisation
38 * @return bool true s'il a le droit, false sinon
39 **/
40 function autoriser_mots_menu_dist($faire, $type, $id, $qui, $opt) {
41 if ($qui['statut'] == '0minirezo') {
42 return ($GLOBALS['meta']['articles_mots'] != 'non' or sql_countsel('spip_groupes_mots'));
43 }
44 $where = '';
45 if ($qui['statut'] == '1comite') {
46 $where = "comite='oui' OR forum='oui'";
47 }
48 if ($qui['statut'] == '6forum') {
49 $where = "forum='oui'";
50 }
51
52 return ($where
53 and $GLOBALS['meta']['articles_mots'] != 'non'
54 and sql_countsel('spip_groupes_mots', $where));
55 }
56
57 /**
58 * Autorisation de voir le bouton d'accès rapide à la création d'un mot clé
59 *
60 * @param string $faire Action demandée
61 * @param string $type Type d'objet sur lequel appliquer l'action
62 * @param int $id Identifiant de l'objet
63 * @param array $qui Description de l'auteur demandant l'autorisation
64 * @param array $opt Options de cette autorisation
65 * @return bool true s'il a le droit, false sinon
66 **/
67 function autoriser_motcreer_menu_dist($faire, $type, $id, $qui, $opt) {
68 // [fixme] Meta 'article_mots' mal nommée maintenant
69 // car elle désigne l'activation ou non des mots clés, quelque soit l'objet.
70 return ($GLOBALS['meta']['articles_mots'] != 'non'
71 and sql_countsel('spip_groupes_mots')
72 and autoriser('creer', 'mot', null, $qui, $opt));
73 }
74
75
76 /**
77 * Autorisation de voir un groupe de mots
78 *
79 * L'autorisation est donnée selon la configuration du groupe
80 * qui gère cela par type d'auteur (administrateur, rédacteurs, visiteurs)
81 *
82 * @param string $faire Action demandée
83 * @param string $type Type d'objet sur lequel appliquer l'action
84 * @param int $id Identifiant de l'objet
85 * @param array $qui Description de l'auteur demandant l'autorisation
86 * @param array $opt Options de cette autorisation
87 * @return bool true s'il a le droit, false sinon
88 **/
89 function autoriser_groupemots_voir_dist($faire, $type, $id, $qui, $opt) {
90 if ($qui['statut'] == '0minirezo') {
91 return true;
92 }
93 $acces = sql_fetsel('comite,forum', 'spip_groupes_mots', 'id_groupe=' . intval($id));
94 if ($qui['statut'] == '1comite' and ($acces['comite'] == 'oui' or $acces['forum'] == 'oui')) {
95 return true;
96 }
97 if ($qui['statut'] == '6forum' and $acces['forum'] == 'oui') {
98 return true;
99 }
100
101 return false;
102 }
103
104 /**
105 * Autorisation de créer un groupe de mots
106 *
107 * @param string $faire Action demandée
108 * @param string $type Type d'objet sur lequel appliquer l'action
109 * @param int $id Identifiant de l'objet
110 * @param array $qui Description de l'auteur demandant l'autorisation
111 * @param array $opt Options de cette autorisation
112 * @return bool true s'il a le droit, false sinon
113 **/
114 function autoriser_groupemots_creer_dist($faire, $type, $id, $qui, $opt) {
115 return
116 $qui['statut'] == '0minirezo'
117 and !$qui['restreint'];
118 }
119
120
121 /**
122 * Autorisation de modifier un groupe de mots
123 *
124 * Cela inclut également l'ajout ou modification des mots lui appartenant
125 *
126 * @param string $faire Action demandée
127 * @param string $type Type d'objet sur lequel appliquer l'action
128 * @param int $id Identifiant de l'objet
129 * @param array $qui Description de l'auteur demandant l'autorisation
130 * @param array $opt Options de cette autorisation
131 * @return bool true s'il a le droit, false sinon
132 **/
133 function autoriser_groupemots_modifier_dist($faire, $type, $id, $qui, $opt) {
134 return
135 $qui['statut'] == '0minirezo' and !$qui['restreint']
136 and autoriser('voir', 'groupemots', $id, $qui, $opt);
137 }
138
139
140 /**
141 * Autorisation de supprimer un groupe de mots
142 *
143 * @param string $faire Action demandée
144 * @param string $type Type d'objet sur lequel appliquer l'action
145 * @param int $id Identifiant de l'objet
146 * @param array $qui Description de l'auteur demandant l'autorisation
147 * @param array $opt Options de cette autorisation
148 * @return bool true s'il a le droit, false sinon
149 **/
150 function autoriser_groupemots_supprimer_dist($faire, $type, $id, $qui, $opt) {
151 if (!autoriser('modifier', 'groupemots', $id)) {
152 return false;
153 }
154
155 return sql_countsel('spip_mots', 'id_groupe=' . intval($id)) ? false : true;
156 }
157
158 /**
159 * Autorisation de modifier un mot
160 *
161 * Il faut avoir le droit de modifier le groupe parent
162 *
163 * Note : passer l'id_groupe dans le tableau d'option
164 * permet de gagner du CPU et une requête SQL (c'est ce que fait l'espace privé)
165 *
166 * @param string $faire Action demandée
167 * @param string $type Type d'objet sur lequel appliquer l'action
168 * @param int $id Identifiant de l'objet
169 * @param array $qui Description de l'auteur demandant l'autorisation
170 * @param array $opt Options de cette autorisation
171 * @return bool true s'il a le droit, false sinon
172 **/
173 function autoriser_mot_modifier_dist($faire, $type, $id, $qui, $opt) {
174 return
175 isset($opt['id_groupe'])
176 ? autoriser('modifier', 'groupemots', $opt['id_groupe'], $qui, $opt)
177 : (
178 $t = sql_getfetsel('id_groupe', 'spip_mots', 'id_mot=' . intval($id))
179 and autoriser('modifier', 'groupemots', $t, $qui, $opt)
180 );
181 }
182
183 /**
184 * Autorisation de créer un mot
185 *
186 * Vérifie si une association est demandée en option, qu'elle est possible dans un des groupes,
187 * c'est à dire qu'une liaison est possible entre un groupe et l'objet lié
188 *
189 * Si l'id_groupe est passé en option,
190 * vérifie également que l'auteur a le droit de modifier ce groupe
191 *
192 * @param string $faire Action demandée
193 * @param string $type Type d'objet sur lequel appliquer l'action
194 * @param int $id Identifiant de l'objet
195 * @param array $qui Description de l'auteur demandant l'autorisation
196 * @param array $opt Options de cette autorisation
197 * @return bool true s'il a le droit, false sinon
198 **/
199 function autoriser_mot_creer_dist($faire, $type, $id, $qui, $opt) {
200 if ($qui['statut'] != '0minirezo' or $qui['restreint']) {
201 return false;
202 }
203
204 $where = '';
205 // si objet associe, verifier qu'un groupe peut etre associe
206 // a la table correspondante
207 if (isset($opt['associer_objet'])
208 and $associer_objet = $opt['associer_objet']
209 ) {
210 if (!preg_match(',^(\w+)\|[0-9]+$,', $associer_objet, $match)) {
211 return false;
212 }
213 $where = "tables_liees REGEXP '(^|,)" . addslashes(table_objet($match[1])) . "($|,)'";
214 }
215 // si pas de groupe de mot qui colle, pas le droit
216 if (!sql_countsel('spip_groupes_mots', $where)) {
217 return false;
218 }
219
220 if (isset($opt['id_groupe'])) {
221 return autoriser('modifier', 'groupemots', $opt['id_groupe']);
222 }
223
224 return true;
225 }
226
227 /**
228 * Autorisation de supprimer un mot
229 *
230 * Par défaut : pouvoir créer un mot dans le groupe
231 *
232 * @param string $faire Action demandée
233 * @param string $type Type d'objet sur lequel appliquer l'action
234 * @param int $id Identifiant de l'objet
235 * @param array $qui Description de l'auteur demandant l'autorisation
236 * @param array $opt Options de cette autorisation
237 * @return bool true s'il a le droit, false sinon
238 **/
239 function autoriser_mot_supprimer_dist($faire, $type, $id, $qui, $opt) {
240 // On cherche le groupe du mot
241 $id_groupe = $opt['id_groupe'] ?
242 $opt['id_groupe'] : sql_getfetsel('id_groupe', 'spip_mots', 'id_mot = ' . intval($id));
243
244 return autoriser('creer', 'mot', $id, $qui, array('id_groupe' => $id_groupe));
245 }
246
247
248 /**
249 * Autorisation d'associer des mots à un objet
250 *
251 * Si groupe_champ ou id_groupe est fourni dans le tableau d'options,
252 * on regarde les droits pour ce groupe en particulier
253 *
254 * On interdit aussi d'associer des mots à d'autres mots ou groupes de mots
255 *
256 * @param string $faire Action demandée
257 * @param string $type Type d'objet sur lequel appliquer l'action
258 * @param int $id Identifiant de l'objet
259 * @param array $qui Description de l'auteur demandant l'autorisation
260 * @param array $opt Options de cette autorisation
261 * @return bool true s'il a le droit, false sinon
262 */
263 function autoriser_associermots_dist($faire, $type, $id, $qui, $opt) {
264 // jamais de mots sur des mots
265 if ($type == 'mot') {
266 return false;
267 }
268 if ($type == 'groupemots') {
269 return false;
270 }
271 $droit = substr($qui['statut'], 1);
272
273 if (!isset($opt['groupe_champs']) and !isset($opt['id_groupe'])) {
274 // chercher si un groupe est autorise pour mon statut
275 // et pour la table demandee
276 $table = addslashes(table_objet($type));
277 if (sql_countsel('spip_groupes_mots', "tables_liees REGEXP '(^|,)$table($|,)' AND " . addslashes($droit) . "='oui'")) {
278 return true;
279 }
280 } // cas d'un groupe en particulier
281 else {
282 // on recupere les champs du groupe s'ils ne sont pas passes en opt
283 if (!isset($opt['groupe_champs'])) {
284 if (!$id_groupe = $opt['id_groupe']) {
285 return false;
286 }
287 include_spip('base/abstract_sql');
288 $opt['groupe_champs'] = sql_fetsel('*', 'spip_groupes_mots', 'id_groupe=' . intval($id_groupe));
289 }
290 $droit = $opt['groupe_champs'][$droit];
291
292 return
293 ($droit == 'oui')
294 and
295 // on verifie que l'objet demande est bien dans les tables liees
296 in_array(
297 table_objet($type),
298 explode(',', $opt['groupe_champs']['tables_liees'])
299 );
300 }
301
302 return false;
303 }
304
305
306 /**
307 * Autorisation d'affichier le sélecteur de mots
308 *
309 * Vérifie le droit d'afficher le selecteur de mots
310 * pour un groupe de mot donné, dans un objet / id_objet donné
311 *
312 * C'est fonction de la configuration du groupe de mots.
313 *
314 * @param string $faire Action demandée
315 * @param string $type Type d'objet sur lequel appliquer l'action
316 * @param int $id Identifiant de l'objet
317 * @param array $qui Description de l'auteur demandant l'autorisation
318 * @param array $opt Options de cette autorisation
319 * @return bool true s'il a le droit, false sinon
320 */
321 function autoriser_groupemots_afficherselecteurmots_dist($faire, $type, $id, $qui, $opt) {
322 if (!isset($opt['minirezo']) || !isset($opt['comite'])) {
323 $i = sql_fetsel(
324 array('minirezo', 'comite'),
325 'spip_groupes_mots',
326 'id_groupe=' . intval($id)
327 );
328 if (!$i) {
329 return false;
330 } # le groupe n'existe pas
331 $admin = $i['minirezo'];
332 $redac = $i['comite'];
333 } else {
334 $admin = $opt['minirezo'];
335 $redac = $opt['comite'];
336 }
337 $statuts = array();
338 if ($admin == 'oui') {
339 $statuts[] = '0minirezo';
340 }
341 if ($redac == 'oui') {
342 $statuts[] = '1comite';
343 }
344
345 return in_array($qui['statut'], $statuts);
346 }
347
348
349 /**
350 * Autorisation d'affichier le formulaire de logo
351 *
352 * @param string $faire Action demandée
353 * @param string $type Type d'objet sur lequel appliquer l'action
354 * @param int $id Identifiant de l'objet
355 * @param array $qui Description de l'auteur demandant l'autorisation
356 * @param array $opt Options de cette autorisation
357 * @return bool true s'il a le droit, false sinon
358 */
359 function autoriser_mot_iconifier_dist($faire, $type, $id, $qui, $opt) {
360 return (($qui['statut'] == '0minirezo') and !$qui['restreint']);
361 }
362
363 /**
364 * Autorisation d'affichier le formulaire de logo
365 *
366 * @param string $faire Action demandée
367 * @param string $type Type d'objet sur lequel appliquer l'action
368 * @param int $id Identifiant de l'objet
369 * @param array $qui Description de l'auteur demandant l'autorisation
370 * @param array $opt Options de cette autorisation
371 * @return bool true s'il a le droit, false sinon
372 */
373 function autoriser_groupemots_iconifier_dist($faire, $type, $id, $qui, $opt) {
374 return (($qui['statut'] == '0minirezo') and !$qui['restreint']);
375 }