[SPIP] +2.1.12
[velocampus/web/www.git] / www / ecrire / inc / autoriser.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2011 *
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 if (!defined('_ECRIRE_INC_VERSION')) return;
14
15 include_spip('base/abstract_sql');
16
17 # faut-il tracer les autorisations dans tmp/spip.log ?
18 define ('_DEBUG_AUTORISER', false);
19
20 // Constantes surchargeables, cf. plugin autorite
21 // false pour ignorer la notion d'admin restreint # todo: une option a activer
22 define('_ADMINS_RESTREINTS', true);
23 // statut par defaut a la creation
24 define('_STATUT_AUTEUR_CREATION', '1comite');
25 // statuts associables a des rubriques (separes par des virgules)
26 define('_STATUT_AUTEUR_RUBRIQUE', _ADMINS_RESTREINTS ? '0minirezo' : '');
27
28
29 // mes_fonctions peut aussi declarer des autorisations, donc il faut donc le charger
30 if ($f = find_in_path('mes_fonctions.php')) {
31 global $dossier_squelettes;
32 include_once(_ROOT_CWD . $f);
33 }
34
35
36 // surcharge possible de autoriser(), sinon autoriser_dist()
37 if (!function_exists('autoriser')) {
38 // http://doc.spip.org/@autoriser
39 function autoriser() {
40 // Charger les fonctions d'autorisation supplementaires
41 static $pipe;
42 if (!isset($pipe)) { $pipe = 1; pipeline('autoriser'); }
43
44 $args = func_get_args();
45 return call_user_func_array('autoriser_dist', $args);
46 }
47 }
48
49
50 // API pour une fonction generique d'autorisation :
51 // $qui est : vide (on prend alors visiteur_session)
52 // un id_auteur (on regarde dans la base)
53 // un tableau auteur complet, y compris [restreint]
54 // $faire est une action ('modifier', 'publier'...)
55 // $type est un type d'objet ou nom de table ('article')
56 // $id est l'id de l'objet sur lequel on veut agir
57 // $opt (inutilise pour le moment) = options sous forme de tableau associatif
58 // (par exemple pour preciser si l'autorisation concerne tel ou tel champ)
59 //
60 // Seul le premier argument est obligatoire
61 //
62 // http://doc.spip.org/@autoriser_dist
63 function autoriser_dist($faire, $type='', $id=0, $qui = NULL, $opt = NULL) {
64
65 // Qui ? visiteur_session ?
66 // si null ou '' (appel depuis #AUTORISER) on prend l'auteur loge
67 if ($qui === NULL OR $qui==='')
68 $qui = $GLOBALS['visiteur_session'] ? $GLOBALS['visiteur_session'] : array('statut' => '', 'id_auteur' =>0, 'webmestre' => 'non');
69 elseif (is_numeric($qui)) {
70 $qui = sql_fetsel("*", "spip_auteurs", "id_auteur=".$qui);
71 }
72
73 // Admins restreints, on construit ici (pas generique mais...)
74 // le tableau de toutes leurs rubriques (y compris les sous-rubriques)
75 if (_ADMINS_RESTREINTS AND is_array($qui))
76 $qui['restreint'] = liste_rubriques_auteur($qui['id_auteur']);
77
78 if (_DEBUG_AUTORISER) spip_log("autoriser $faire $type $id ($qui[nom]) ?");
79
80 // Aliases pour les types pas generiques (a etendre et ameliorer)
81 if ($type == 'groupes_mot') $type = 'groupemots';
82 #if ($type == 'syndic_article') $type = 'syndicarticle';
83
84 // Si une exception a ete decretee plus haut dans le code, l'appliquer
85 if (isset($GLOBALS['autoriser_exception'][$faire][$type][$id])
86 AND autoriser_exception($faire,$type,$id,'verifier'))
87 return true;
88
89 // Chercher une fonction d'autorisation
90 // Dans l'ordre on va chercher autoriser_type_faire[_dist], autoriser_type[_dist],
91 // autoriser_faire[_dist], autoriser_defaut[_dist]
92 $fonctions = $type
93 ? array (
94 'autoriser_'.$type.'_'.$faire,
95 'autoriser_'.$type.'_'.$faire.'_dist',
96 'autoriser_'.$type,
97 'autoriser_'.$type.'_dist',
98 'autoriser_'.$faire,
99 'autoriser_'.$faire.'_dist',
100 'autoriser_defaut',
101 'autoriser_defaut_dist'
102 )
103 : array (
104 'autoriser_'.$faire,
105 'autoriser_'.$faire.'_dist',
106 'autoriser_defaut',
107 'autoriser_defaut_dist'
108 );
109
110 foreach ($fonctions as $f) {
111 if (function_exists($f)) {
112 $a = $f($faire,$type,$id,$qui,$opt);
113 break;
114 }
115 }
116
117 if (_DEBUG_AUTORISER) spip_log("$f($faire,$type,$id,$qui[nom]): ".($a?'OK':'niet'));
118
119 return $a;
120 }
121
122 // une globale pour aller au plus vite dans la fonction generique ci dessus
123 $GLOBALS['autoriser_exception']=array();
124 // http://doc.spip.org/@autoriser_exception
125 function autoriser_exception($faire,$type,$id,$autoriser=true){
126 // une static innaccessible par url pour verifier que la globale est positionnee a bon escient
127 static $autorisation;
128 if ($autoriser==='verifier')
129 return isset($autorisation[$faire][$type][$id]);
130 if ($autoriser===true)
131 $GLOBALS['autoriser_exception'][$faire][$type][$id] = $autorisation[$faire][$type][$id] = true;
132 if ($autoriser===false) {
133 unset($GLOBALS['autoriser_exception'][$faire][$type][$id]);
134 unset($autorisation[$faire][$type][$id]);
135 }
136 return false;
137 }
138
139 // Autorisation par defaut : les admins complets OK, les autres non
140 // http://doc.spip.org/@autoriser_defaut_dist
141 function autoriser_defaut_dist($faire, $type, $id, $qui, $opt) {
142 return
143 $qui['statut'] == '0minirezo'
144 AND !$qui['restreint'];
145 }
146
147 // A-t-on acces a l'espace prive ?
148 // http://doc.spip.org/@autoriser_ecrire_dist
149 function autoriser_ecrire_dist($faire, $type, $id, $qui, $opt) {
150 return in_array($qui['statut'], array('0minirezo', '1comite'));
151 }
152
153 // http://doc.spip.org/@autoriser_previsualiser_dist
154 function autoriser_previsualiser_dist($faire, $type, $id, $qui, $opt) {
155 return strpos($GLOBALS['meta']['preview'], ",". $qui['statut'] .",")
156 !==false;
157 }
158
159 function autoriser_dater_dist($faire, $type, $id, $qui, $opt) {
160 if (!isset($opt['statut'])){
161 $table = table_objet($type);
162 $trouver_table = charger_fonction('trouver_table','base');
163 $desc = $trouver_table($table);
164 if (!$desc)
165 return false;
166 if (isset($desc['field']['statut'])){
167 $statut = sql_getfetsel("statut", $desc['table'], id_table_objet($type)."=".intval($id));
168 }
169 else
170 $statut = 'publie'; // pas de statut => publie
171 }
172 else
173 $statut = $opt['statut'];
174
175 if ($statut == 'publie'
176 OR ($statut == 'prop' AND $type=='article' AND $GLOBALS['meta']["post_dates"] == "non"))
177 return autoriser('modifier', $type, $id);
178 return false;
179 }
180 // Autoriser a publier dans la rubrique $id
181 // http://doc.spip.org/@autoriser_rubrique_publierdans_dist
182 function autoriser_rubrique_publierdans_dist($faire, $type, $id, $qui, $opt) {
183 return
184 ($qui['statut'] == '0minirezo')
185 AND (
186 !$qui['restreint'] OR !$id
187 OR in_array($id, $qui['restreint'])
188 );
189 }
190
191 // Autoriser a creer une rubrique dans la rubrique $id
192 // http://doc.spip.org/@autoriser_rubrique_creerrubriquedans_dist
193 function autoriser_rubrique_creerrubriquedans_dist($faire, $type, $id, $qui, $opt) {
194 return
195 ($id OR ($qui['statut'] == '0minirezo' AND !$qui['restreint']))
196 AND autoriser('voir','rubrique',$id)
197 AND autoriser('publierdans','rubrique',$id);
198 }
199
200 // Autoriser a creer un article dans la rubrique $id
201 // http://doc.spip.org/@autoriser_rubrique_creerarticledans_dist
202 function autoriser_rubrique_creerarticledans_dist($faire, $type, $id, $qui, $opt) {
203 return
204 $id
205 AND autoriser('voir','rubrique',$id);
206 }
207
208 // Autoriser a creer une breve dans la rubrique $id
209 // http://doc.spip.org/@autoriser_rubrique_creerbrevedans_dist
210 function autoriser_rubrique_creerbrevedans_dist($faire, $type, $id, $qui, $opt) {
211 $r = sql_fetsel("id_parent", "spip_rubriques", "id_rubrique=".sql_quote($id));
212 return
213 $id
214 AND ($r['id_parent']==0)
215 AND ($GLOBALS['meta']["activer_breves"]!="non")
216 AND autoriser('voir','rubrique',$id);
217 }
218
219 // Autoriser a creer un site dans la rubrique $id
220 // http://doc.spip.org/@autoriser_rubrique_creersitedans_dist
221 function autoriser_rubrique_creersitedans_dist($faire, $type, $id, $qui, $opt) {
222 return
223 $id
224 AND autoriser('voir','rubrique',$id)
225 AND $GLOBALS['meta']['activer_sites'] != 'non'
226 AND (
227 $qui['statut']=='0minirezo'
228 OR ($GLOBALS['meta']["proposer_sites"] >=
229 ($qui['statut']=='1comite' ? 1 : 2)));
230 }
231
232 // Autoriser a modifier un site
233 // http://doc.spip.org/@autoriser_site_modifier_dist
234 function autoriser_site_modifier_dist($faire, $type, $id, $qui, $opt) {
235 if ($qui['statut'] == '0minirezo' AND !$qui['restreint'])
236 return true;
237
238 $t = sql_fetsel("id_rubrique,statut", "spip_syndic", "id_syndic=".sql_quote($id));
239 return ($t
240 AND autoriser('voir','rubrique',$t['id_rubrique'])
241 AND ($t['statut'] == 'prop'
242 OR autoriser('modifier', 'rubrique', $t['id_rubrique'])
243 )
244 );
245 }
246 // Autoriser a voir un site $id_syndic
247 // http://doc.spip.org/@autoriser_site_voir_dist
248 function autoriser_site_voir_dist($faire, $type, $id, $qui, $opt) {
249 return autoriser_site_modifier_dist($faire, $type, $id, $qui, $opt);
250 }
251
252 // Autoriser a modifier la rubrique $id
253 // = publierdans rubrique $id
254 // http://doc.spip.org/@autoriser_rubrique_modifier_dist
255 function autoriser_rubrique_modifier_dist($faire, $type, $id, $qui, $opt) {
256 return
257 autoriser('publierdans', 'rubrique', $id, $qui, $opt);
258 }
259
260 // On ne peut joindre un document qu'a un article qu'on a le droit d'editer
261 // mais il faut prevoir le cas d'une *creation* par un redacteur, qui correspond
262 // au hack id_article = 0-id_auteur
263 // http://doc.spip.org/@autoriser_joindredocument_dist
264 function autoriser_joindredocument_dist($faire, $type, $id, $qui, $opt){
265 return
266 autoriser('modifier', $type, $id, $qui, $opt)
267 OR (
268 $type == 'article'
269 AND $id<0
270 AND abs($id) == $qui['id_auteur']
271 AND autoriser('ecrire', $type, $id, $qui, $opt)
272 );
273 }
274
275 // On ne peut modifier un document que s'il est lie a un objet qu'on a le droit
276 // d'editer *et* qu'il n'est pas lie a un objet qu'on n'a pas le droit d'editer
277 // http://doc.spip.org/@autoriser_document_modifier_dist
278 function autoriser_document_modifier_dist($faire, $type, $id, $qui, $opt){
279 static $m = array();
280
281 if ($qui['statut'] == '0minirezo'
282 AND !$qui['restreint'])
283 return true;
284
285 if (!isset($m[$id])) {
286 $vu = false;
287 $interdit = false;
288
289 $s = sql_select("id_objet,objet", "spip_documents_liens", "id_document=".sql_quote($id));
290 while ($t = sql_fetch($s)) {
291 if (autoriser('modifier', $t['objet'], $t['id_objet'], $qui, $opt)) {
292 $vu = true;
293 }
294 else {
295 $interdit = true;
296 break;
297 }
298 }
299 $m[$id] = ($vu && !$interdit);
300 }
301
302 return $m[$id];
303 }
304
305
306 // On ne peut supprimer un document que s'il n'est lie a aucun objet
307 // c'est autorise pour tout auteur ayant acces a ecrire
308 // http://doc.spip.org/@autoriser_document_modifier_dist
309 function autoriser_document_supprimer_dist($faire, $type, $id, $qui, $opt){
310 if (!intval($id)
311 OR !$qui['id_auteur']
312 OR !autoriser('ecrire','','',$qui))
313 return false;
314 if (sql_countsel('spip_documents_liens', 'id_document='.intval($id)))
315 return false;
316
317 return true;
318 }
319
320 // Autoriser a modifier la breve $id
321 // = admins & redac si la breve n'est pas publiee
322 // = admins de rubrique parente si publiee
323 // http://doc.spip.org/@autoriser_breve_modifier_dist
324 function autoriser_breve_modifier_dist($faire, $type, $id, $qui, $opt) {
325 $r = sql_fetsel("id_rubrique,statut", "spip_breves", "id_breve=".sql_quote($id));
326 return
327 ($r['statut'] == 'publie')
328 ? autoriser('publierdans', 'rubrique', $r['id_rubrique'], $qui, $opt)
329 : in_array($qui['statut'], array('0minirezo', '1comite'));
330 }
331
332 // Autoriser a modifier l'article $id
333 // = publierdans rubrique parente
334 // = ou statut 'prop,prepa' et $qui est auteur
335 // http://doc.spip.org/@autoriser_article_modifier_dist
336 function autoriser_article_modifier_dist($faire, $type, $id, $qui, $opt) {
337 $r = sql_fetsel("id_rubrique,statut", "spip_articles", "id_article=".sql_quote($id));
338
339 include_spip('inc/auth'); // pour auteurs_article si espace public
340
341 return
342 autoriser('publierdans', 'rubrique', $r['id_rubrique'], $qui, $opt)
343 OR (
344 in_array($qui['statut'], array('0minirezo', '1comite'))
345 AND in_array($r['statut'], array('prop','prepa', 'poubelle'))
346 AND auteurs_article($id, "id_auteur=".$qui['id_auteur'])
347 );
348 }
349
350
351 // Autoriser a creer un groupe de mots
352 // http://doc.spip.org/@autoriser_groupemots_creer_dist
353 function autoriser_groupemots_creer_dist($faire, $type, $id, $qui, $opt) {
354 return
355 $qui['statut'] == '0minirezo'
356 AND !$qui['restreint'];
357 }
358
359 // Autoriser a modifier un groupe de mots $id
360 // y compris en ajoutant/modifiant les mots lui appartenant
361 // http://doc.spip.org/@autoriser_groupemots_modifier_dist
362 function autoriser_groupemots_modifier_dist($faire, $type, $id, $qui, $opt) {
363 return
364 $qui['statut'] == '0minirezo'
365 AND !$qui['restreint'];
366 }
367
368 // Autoriser a modifier un mot $id ; note : si on passe l'id_groupe
369 // dans les options, on gagne du CPU (c'est ce que fait l'espace prive)
370 // http://doc.spip.org/@autoriser_mot_modifier_dist
371 function autoriser_mot_modifier_dist($faire, $type, $id, $qui, $opt) {
372 return
373 isset($opt['id_groupe'])
374 ? autoriser('modifier', 'groupemots', $opt['id_groupe'], $qui, $opt)
375 : (
376 $t = sql_getfetsel("id_groupe", "spip_mots", "id_mot=".sql_quote($id))
377 AND autoriser('modifier', 'groupemots', $t, $qui, $opt)
378 );
379 }
380
381 // Lire les stats ?
382 // = tous les admins
383 // http://doc.spip.org/@autoriser_voirstats_dist
384 function autoriser_voirstats_dist($faire, $type, $id, $qui, $opt) {
385 return
386 $qui['statut'] == '0minirezo';
387 }
388
389
390 // Voir un objet
391 // http://doc.spip.org/@autoriser_voir_dist
392 function autoriser_voir_dist($faire, $type, $id, $qui, $opt) {
393 if ($type == 'document')
394 return autoriser_document_voir_dist($faire, $type, $id, $qui, $opt);
395 if ($qui['statut'] == '0minirezo') return true;
396 if ($type == 'auteur') return false;
397 if ($type == 'groupemots') {
398 $acces = sql_fetsel("comite,forum", "spip_groupes_mots", "id_groupe=".intval($id));
399 if ($qui['statut']=='1comite' AND ($acces['comite'] == 'oui' OR $acces['forum'] == 'oui'))
400 return true;
401 if ($qui['statut']=='6forum' AND $acces['forum'] == 'oui')
402 return true;
403 return false;
404 }
405 if ($type != 'article') return true;
406 if (!$id) return false;
407
408 // un article 'prepa' ou 'poubelle' dont on n'est pas auteur : interdit
409 $r = sql_getfetsel("statut", "spip_articles", "id_article=".sql_quote($id));
410 include_spip('inc/auth'); // pour auteurs_article si espace public
411 return
412 in_array($r, array('prop', 'publie'))
413 OR auteurs_article($id, "id_auteur=".$qui['id_auteur']);
414 }
415
416 // Voir les revisions ?
417 // = voir l'objet
418 // http://doc.spip.org/@autoriser_voirrevisions_dist
419 function autoriser_voirrevisions_dist($faire, $type, $id, $qui, $opt) {
420 return
421 autoriser('voir', $type, $id, $qui, $opt);
422 }
423
424 // Moderer le forum ?
425 // = modifier l'objet correspondant (si forum attache a un objet)
426 // = droits par defaut sinon (admin complet pour moderation complete)
427 // http://doc.spip.org/@autoriser_modererforum_dist
428 function autoriser_modererforum_dist($faire, $type, $id, $qui, $opt) {
429 return
430 autoriser('modifier', $type, $id, $qui, $opt);
431 }
432
433 // Modifier un forum ?
434 // = jamais !
435 // http://doc.spip.org/@autoriser_forum_modifier_dist
436 function autoriser_forum_modifier_dist($faire, $type, $id, $qui, $opt) {
437 return
438 false;
439 }
440
441 // Modifier une signature ?
442 // = jamais !
443 // http://doc.spip.org/@autoriser_signature_modifier_dist
444 function autoriser_signature_modifier_dist($faire, $type, $id, $qui, $opt) {
445 return
446 false;
447 }
448
449 // Moderer la petition ?
450 // = modifier l'article correspondant
451 // = droits par defaut sinon (admin complet pour moderation de tout)
452 // http://doc.spip.org/@autoriser_modererpetition_dist
453 function autoriser_modererpetition_dist($faire, $type, $id, $qui, $opt) {
454 return
455 autoriser('modifier', $type, $id, $qui, $opt);
456 }
457
458 // Est-on webmestre ? Signifie qu'on n'a meme pas besoin de passer par ftp
459 // pour modifier les fichiers, cf. notamment inc/admin
460 // = rien ni personne sauf definition de
461 // a l'avenir peut-etre autoriser "admin numero 1" ou une interface de selection
462 // http://doc.spip.org/@autoriser_webmestre_dist
463 function autoriser_webmestre_dist($faire, $type, $id, $qui, $opt) {
464 return
465 (defined('_ID_WEBMESTRES')?
466 in_array($qui['id_auteur'], explode(':', _ID_WEBMESTRES))
467 :$qui['webmestre']=='oui')
468 AND $qui['statut'] == '0minirezo'
469 AND !$qui['restreint']
470 ;
471 }
472
473 // Configurer le site => idem autorisation par defaut
474 // http://doc.spip.org/@autoriser_configurer_dist
475 function autoriser_configurer_dist($faire, $type, $id, $qui, $opt) {
476 return
477 $qui['statut'] == '0minirezo'
478 AND !$qui['restreint']
479 ;
480 }
481
482 // Effectuer un backup ?
483 // admins y compris restreints
484 // http://doc.spip.org/@autoriser_sauvegarder_dist
485 function autoriser_sauvegarder_dist($faire, $type, $id, $qui, $opt) {
486 return
487 $qui['statut'] == '0minirezo'
488 ;
489 }
490
491 // Effacer la base de donnees ?
492 // webmestres seulement
493 // http://doc.spip.org/@autoriser_detruire_dist
494 function autoriser_detruire_dist($faire, $type, $id, $qui, $opt) {
495 return
496 autoriser('webmestre', null, null, $qui, $opt);
497 }
498
499 // Consulter le forum des admins ?
500 // admins y compris restreints
501 // http://doc.spip.org/@autoriser_forum_admin_dist
502 function autoriser_forum_admin_dist($faire, $type, $id, $qui, $opt) {
503 return
504 $qui['statut'] == '0minirezo'
505 ;
506 }
507
508 //
509 // http://doc.spip.org/@autoriser_auteur_previsualiser_dist
510 function autoriser_auteur_previsualiser_dist($faire, $type, $id, $qui, $opt) {
511 // les admins peuvent "previsualiser" une page auteur
512 if ($qui['statut'] == '0minirezo'
513 AND !$qui['restreint']) return true;
514 // "Voir en ligne" si l'auteur a un article publie
515 $n = sql_fetsel('A.id_article', 'spip_auteurs_articles AS L LEFT JOIN spip_articles AS A ON L.id_article=A.id_article', "A.statut='publie' AND L.id_auteur=".sql_quote($id));
516 return $n ? true : false;
517 }
518
519 // Modifier un auteur ?
520 // Attention tout depend de ce qu'on veut modifier
521 // http://doc.spip.org/@autoriser_auteur_modifier_dist
522 function autoriser_auteur_modifier_dist($faire, $type, $id, $qui, $opt) {
523
524 // Ni admin ni redacteur => non
525 if (!in_array($qui['statut'], array('0minirezo', '1comite')))
526 return false;
527
528 // Un redacteur peut modifier ses propres donnees mais ni son login/email
529 // ni son statut (qui sont le cas echeant passes comme option)
530 if ($qui['statut'] == '1comite') {
531 if ($opt['webmestre'])
532 return false;
533 elseif ($opt['statut'] OR $opt['restreintes'] OR $opt['email'])
534 return false;
535 elseif ($id == $qui['id_auteur'])
536 return true;
537 else
538 return false;
539 }
540
541 // Un admin restreint peut modifier/creer un auteur non-admin mais il
542 // n'a le droit ni de le promouvoir admin, ni de changer les rubriques
543 if ($qui['restreint']) {
544 if ($opt['webmestre'])
545 return false;
546 elseif ($opt['statut'] == '0minirezo' OR $opt['restreintes'])
547 return false;
548 else {
549 if ($id == $qui['id_auteur']) {
550 if ($opt['statut'])
551 return false;
552 else
553 return true;
554 }
555 else if ($id_auteur = intval($id)) {
556 $t = sql_fetsel("statut", "spip_auteurs", "id_auteur=$id_auteur");
557 if ($t AND $t['statut'] != '0minirezo')
558 return true;
559 else
560 return false;
561 }
562 // id = 0 => creation
563 else
564 return true;
565 }
566 }
567
568 // Un admin complet fait ce qu'elle veut
569 // sauf se degrader
570 if ($id == $qui['id_auteur'] && $opt['statut'])
571 return false;
572 // et toucher au statut webmestre si il ne l'est pas lui meme
573 // ou si les webmestres sont fixes par constante (securite)
574 elseif ($opt['webmestre'] AND (defined('_ID_WEBMESTRES') OR !autoriser('webmestre')))
575 return false;
576 // et toucher au statut d'un webmestre si il ne l'est pas lui meme
577 elseif ($opt['statut'] AND autoriser('webmestre','',0,$id) AND !autoriser('webmestre'))
578 return false;
579 else
580 return true;
581 }
582
583
584 //
585 // Peut-on faire de l'upload ftp ?
586 // par defaut, les administrateurs
587 //
588 // http://doc.spip.org/@autoriser_chargerftp_dist
589 function autoriser_chargerftp_dist($faire, $type, $id, $qui, $opt) {
590 return $qui['statut'] == '0minirezo';
591 }
592
593
594 //
595 // Peut-on voir un document dans _DIR_IMG ?
596 // Tout le monde (y compris les visiteurs non enregistres), puisque par
597 // defaut ce repertoire n'est pas protege ; si une extension comme
598 // acces_restreint a positionne creer_htaccess, on regarde
599 // si le document est lie a un element publie
600 // (TODO: a revoir car c'est dommage de sortir de l'API true/false)
601 //
602 // http://doc.spip.org/@autoriser_document_voir_dist
603 function autoriser_document_voir_dist($faire, $type, $id, $qui, $opt) {
604
605 if (!isset($GLOBALS['meta']["creer_htaccess"])
606 OR $GLOBALS['meta']["creer_htaccess"] != 'oui')
607 return true;
608
609 if ((!is_numeric($id)) OR $id < 0) return false;
610
611 if (in_array($qui['statut'], array('0minirezo', '1comite')))
612 return 'htaccess';
613
614 if ($liens = sql_allfetsel('objet,id_objet', 'spip_documents_liens', 'id_document='.intval($id)))
615 foreach ($liens as $l) {
616 $table_sql = table_objet_sql($l['objet']);
617 $id_table = id_table_objet($l['objet']);
618 if (sql_countsel($table_sql, "$id_table = ". intval($l['id_objet'])
619 . (in_array($l['objet'], array('article', 'rubrique', 'breve'))
620 ? " AND statut = 'publie'"
621 : '')
622 ) > 0)
623 return 'htaccess';
624 }
625 return false;
626 }
627
628 // Qui peut activer le debugueur ?
629 // http://doc.spip.org/@autoriser_debug_dist
630 function autoriser_debug_dist($faire, $type, $id, $qui, $opt) {
631 return $qui['statut'] == '0minirezo';
632 }
633
634 // Renvoie la liste des rubriques liees a cet auteur, independamment de son
635 // statut (pour les admins restreints, il faut donc aussi verifier statut)
636 // Memorise le resultat dans un tableau statique indexe par les id_auteur.
637 // On peut reinitialiser un element en passant un 2e argument non vide
638 // http://doc.spip.org/@liste_rubriques_auteur
639 function liste_rubriques_auteur($id_auteur, $raz=false) {
640 static $restreint = array();
641
642 if (!$id_auteur = intval($id_auteur)) return array();
643 if ($raz) unset($restreint[$id_auteur]);
644 elseif (isset($restreint[$id_auteur])) return $restreint[$id_auteur];
645
646 $where = "id_auteur=$id_auteur AND id_rubrique!=0";
647 $table = "spip_auteurs_rubriques";
648 // Recurrence sur les sous-rubriques
649 $rubriques = array();
650 while (true) {
651 $q = sql_select("id_rubrique", $table, $where);
652 $r = array();
653 while ($row = sql_fetch($q)) {
654 $id_rubrique = $row['id_rubrique'];
655 $r[]= $rubriques[$id_rubrique] = $id_rubrique;
656 }
657
658 // Fin de la recurrence : $rubriques est complet
659 if (!$r) break;
660 $table = 'spip_rubriques';
661 $where = sql_in('id_parent', $r) . ' AND ' .
662 sql_in('id_rubrique', $r, 'NOT');
663 }
664
665 // Affecter l'auteur session le cas echeant
666 if ($GLOBALS['visiteur_session']['id_auteur'] == $id_auteur)
667 $GLOBALS['visiteur_session']['restreint'] = $rubriques;
668
669
670 return $restreint[$id_auteur] = $rubriques;
671 }
672
673 // Autoriser a modifier l'URL d'un objet (cf. action=redirect)
674 // http://doc.spip.org/@autoriser_modifierurl_dist
675 function autoriser_modifierurl_dist($faire, $quoi, $id, $qui, $opt) {
676 return autoriser('modifier', $quoi, $id, $qui, $opt);
677 }
678
679 // http://doc.spip.org/@autoriser_rubrique_editermots_dist
680 function autoriser_rubrique_editermots_dist($faire,$quoi,$id,$qui,$opts){
681 // on recupere les champs du groupe s'ils ne sont pas passes en opt
682 $droit = substr($GLOBALS['visiteur_session']['statut'],1);
683 if (!isset($opts['groupe_champs'])){
684 if (!$id_groupe = $opts['id_groupe'])
685 return false;
686 include_spip('base/abstract_sql');
687 $opts['groupe_champs'] = sql_fetsel("*", "spip_groupes_mots", "id_groupe=".intval($id_groupe));
688 }
689 $droit = $opts['groupe_champs'][$droit];
690
691 return
692 ($droit == 'oui')
693 AND
694 // on verifie que l'objet demande est bien dans les tables liees
695 in_array(
696 table_objet($quoi),
697 explode(',', $opts['groupe_champs']['tables_liees'])
698 );
699 }
700 // http://doc.spip.org/@autoriser_article_editermots_dist
701 function autoriser_article_editermots_dist($faire,$quoi,$id,$qui,$opts){
702 return autoriser_rubrique_editermots_dist($faire,'article',0,$qui,$opts);
703 }
704 // http://doc.spip.org/@autoriser_breve_editermots_dist
705 function autoriser_breve_editermots_dist($faire,$quoi,$id,$qui,$opts){
706 return autoriser_rubrique_editermots_dist($faire,'breve',0,$qui,$opts);
707 }
708 // http://doc.spip.org/@autoriser_syndic_editermots_dist
709 function autoriser_syndic_editermots_dist($faire,$quoi,$id,$qui,$opts){
710 return autoriser_rubrique_editermots_dist($faire,'syndic',0,$qui,$opts);
711 }
712
713 // http://doc.spip.org/@autoriser_rubrique_iconifier_dist
714 function autoriser_rubrique_iconifier_dist($faire,$quoi,$id,$qui,$opts){
715 return autoriser('publierdans', 'rubrique', $id, $qui, $opt);
716 }
717 // http://doc.spip.org/@autoriser_auteur_iconifier_dist
718 function autoriser_auteur_iconifier_dist($faire,$quoi,$id,$qui,$opts){
719 return (($id == $qui['id_auteur']) OR
720 (($qui['statut'] == '0minirezo') AND !$qui['restreint']));
721 }
722 // http://doc.spip.org/@autoriser_mot_iconifier_dist
723 function autoriser_mot_iconifier_dist($faire,$quoi,$id,$qui,$opts){
724 return (($qui['statut'] == '0minirezo') AND !$qui['restreint']);
725 }
726 // http://doc.spip.org/@autoriser_article_iconifier_dist
727 function autoriser_iconifier_dist($faire,$quoi,$id,$qui,$opts){
728 // On reprend le code de l'ancien iconifier pour definir les autorisations pour les autres
729 // objets SPIP. De ce fait meme de nouveaux objets bases sur cet algorithme peuvent continuer
730 // a fonctionner. Cependant il est recommander de leur definir une autorisation specifique
731 $table = table_objet_sql($quoi);
732 $id_objet = id_table_objet($quoi);
733 $row = sql_fetsel("id_rubrique, statut", $table, "$id_objet=$id");
734 $droit = autoriser('publierdans','rubrique',$row['id_rubrique']);
735
736 if (!$droit AND ($row['statut'] == 'prepa' OR $row['statut'] == 'prop' OR $row['statut'] == 'poubelle')) {
737 $jointure = table_jointure('auteur', 'article');
738 if ($droit = sql_fetsel("id_auteur", "spip_$jointure", "id_article=".sql_quote($id) . " AND id_auteur=$connect_id_auteur"))
739 $droit = true;
740 }
741
742 return $droit;
743 }
744
745 // Deux fonctions sans surprise pour permettre les tests
746 // Dire toujours OK
747 // http://doc.spip.org/@autoriser_ok_dist
748 function autoriser_ok_dist($faire, $type, $id, $qui, $opt) { return true; }
749 // Dire toujours niet
750 // http://doc.spip.org/@autoriser_niet_dist
751 function autoriser_niet_dist($faire, $type, $id, $qui, $opt) { return false; }
752
753 ?>