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