source: spip-zone/_plugins_/acces_restreint/trunk/inc/accesrestreint_autoriser.php @ 81502

Last change on this file since 81502 was 81502, checked in by rastapopoulos@…, 7 years ago

Dans chacune des surcharges d'autorisation de voir, on ajoute un test au début qui dit que si le contenu est carrément exclus explicitement pour le visiteur en cours (= fait partie d'une zone que n'a pas le visiteur) : c'est non direct.

File size: 9.5 KB
Line 
1<?php
2/**
3 * Plugin Acces Restreint 3.0 pour Spip 2.0
4 * Licence GPL (c) 2006-2008 Cedric Morin
5 *
6 */
7
8if (!defined("_ECRIRE_INC_VERSION")) return;
9
10/* pour que le pipeline ne rale pas ! */
11function accesrestreint_autoriser(){}
12
13/**
14 * Autorisation a administrer les zones
15 *
16 * @param unknown_type $faire
17 * @param unknown_type $quoi
18 * @param unknown_type $id
19 * @param unknown_type $qui
20 * @param unknown_type $options
21 * @return unknown
22 */
23function autoriser_zone_administrer($faire, $quoi, $id, $qui, $options){
24        // Les admins complets uniquement
25        if ($qui['statut']=='0minirezo' AND !$qui['restreint']) {
26                return true;
27        }
28       
29        return false;
30}
31
32/**
33 * Autorisation a affecter les zones a un auteur
34 * si un id_zone passe dans options, cela concerne plus particulierement le droit d'affecter cette zone
35 *
36 * @param unknown_type $faire
37 * @param unknown_type $qui
38 * @param unknown_type $id
39 * @param unknown_type $qui
40 * @param unknown_type $options
41 * @return unknown
42 */
43function autoriser_auteur_affecterzones_dist($faire, $quoi, $id, $qui, $options){
44        // Si on ne peut pas modifier l'auteur, c'est fichu
45        if (!autoriser('modifier', 'auteur', $id)) {
46                return false;
47        }
48       
49        // Les admins complets
50        if ($qui['statut'] == '0minirezo' AND !$qui['restreint']) {
51                return true;
52        }
53       
54        // Les non-admins complets ne peuvent pas s'administrer eux-meme pour éviter les erreurs
55        if ($id == $qui['id_auteur']) {
56                return false;
57        }
58       
59        // Si on parle d'une zone précise,
60        // les non-admins complets ne peuvent affecter que les zones dont ils font partie
61        include_spip('inc/accesrestreint');
62        if (
63                $options['id_zone']
64                and accesrestreint_test_appartenance_zone_auteur($options['id_zone'], $qui['id_auteur'])
65        ) {
66                return true;
67        }
68       
69        return false;
70}
71
72/*
73 * Surcharge (sans _dist) de la fonction d'autorisation de vue d'une rubrique, si pas déjà définie
74 */
75if(!function_exists('autoriser_rubrique_voir')) {
76function autoriser_rubrique_voir($faire, $type, $id, $qui, $options) {
77        include_spip('inc/accesrestreint');
78        static $rub_exclues;
79       
80        $publique = isset($options['publique']) ? $options['publique'] : !test_espace_prive();
81        $id_auteur = isset($qui['id_auteur']) ? $qui['id_auteur'] : $GLOBALS['visiteur_session']['id_auteur'];
82       
83        if (!isset($rub_exclues[$id_auteur][$publique]) || !is_array($rub_exclues[$id_auteur][$publique])) {
84                $rub_exclues[$id_auteur][$publique] = accesrestreint_liste_rubriques_exclues($publique,$id_auteur);
85                $rub_exclues[$id_auteur][$publique] = array_flip($rub_exclues[$id_auteur][$publique]);
86        }
87       
88        return !isset($rub_exclues[$id_auteur][$publique][$id]);
89}
90}
91
92/*
93 * Surcharge (sans _dist) de la fonction d'autorisation de vue d'un article, si pas déjà définie
94 */
95if(!function_exists('autoriser_article_voir')) {
96function autoriser_article_voir($faire, $type, $id, $qui, $options) {
97        // Si on ne demande pas un article précis
98        if (!$id) {
99                // Les admins peuvent par défaut tout voir
100                if ($qui['statut'] == '0minirezo') {
101                        return true;
102                }
103                // Les autres peuvent voir ce qui est publié ou proposé
104                if (isset($options['statut'])) {
105                        $statut = $options['statut'];
106                        if (in_array($statut, array('prop', 'publie'))) {
107                                return true;
108                        }
109                }
110                return false;
111        }
112
113        include_spip('public/quete');
114        include_spip('inc/accesrestreint');
115       
116        $publique = isset($options['publique']) ? $options['publique'] : !test_espace_prive();
117        $id_auteur = isset($qui['id_auteur']) ? $qui['id_auteur'] : $GLOBALS['visiteur_session']['id_auteur'];
118       
119        // Si l'article fait partie des contenus restreints directement, c'est niet
120        if (in_array($id, accesrestreint_liste_objets_exclus('articles', $publique, $id_auteur))) {
121                return false;
122        }
123       
124        // Si on ne connait pas déjà la rubrique, on la cherche suivant l'article
125        if (!isset($options['id_rubrique']) or !$id_rubrique = $options['id_rubrique']) {
126                $article = quete_parent_lang('spip_articles', $id);
127                $id_rubrique = $article['id_rubrique'];
128        }
129       
130        // On ne continue que si on peut déjà voir la rubrique parente
131        if (autoriser_rubrique_voir('voir', 'rubrique', $id_rubrique, $qui, $options)){
132                // Si c'est bon, les admins peuvent tout voir
133                if ($qui['statut'] == '0minirezo'){
134                        return true;
135                }
136               
137                // Pour les autres, on ne peut pas voir un article 'prepa' ou 'poubelle' dont on n'est pas auteur
138                $r = sql_getfetsel('statut', 'spip_articles', 'id_article='.sql_quote($id));
139                include_spip('inc/auth'); // pour auteurs_article si espace public
140                return
141                        in_array($r, array('prop', 'publie'))
142                        or auteurs_article($id, "id_auteur=".$qui['id_auteur']);
143        }
144       
145        return false;
146}
147}
148
149/*
150 * Surcharge (sans _dist) de la fonction d'autorisation de vue d'une brève, si pas déjà définie
151 */
152if(!function_exists('autoriser_breve_voir')) {
153function autoriser_breve_voir($faire, $type, $id, $qui, $options) {
154        include_spip('public/quete');
155        include_spip('inc/accesrestreint');
156       
157        $publique = isset($options['publique']) ? $options['publique'] : !test_espace_prive();
158        $id_auteur = isset($qui['id_auteur']) ? $qui['id_auteur'] : $GLOBALS['visiteur_session']['id_auteur'];
159       
160        // Si la brève fait partie des contenus restreints directement, c'est niet
161        if (in_array($id, accesrestreint_liste_objets_exclus('breves', $publique, $id_auteur))) {
162                return false;
163        }
164       
165        if (!$id_rubrique = $options['id_rubrique']){
166                $breve = quete_parent_lang('spip_breves', $id);
167                $id_rubrique = $breve['id_rubrique'];
168        }
169       
170        return autoriser_rubrique_voir('voir', 'rubrique', $id_rubrique, $qui, $options);
171}
172}
173
174/*
175 * Surcharge (sans _dist) de la fonction d'autorisation de vue d'un site, si pas déjà définie
176 */
177if(!function_exists('autoriser_site_voir')) {
178function autoriser_site_voir($faire, $type, $id, $qui, $options) {
179        include_spip('public/quete');
180        include_spip('inc/accesrestreint');
181       
182        $publique = isset($options['publique']) ? $options['publique'] : !test_espace_prive();
183        $id_auteur = isset($qui['id_auteur']) ? $qui['id_auteur'] : $GLOBALS['visiteur_session']['id_auteur'];
184       
185        // Si le site fait partie des contenus restreints directement, c'est niet
186        if (in_array($id, accesrestreint_liste_objets_exclus('sites', $publique, $id_auteur))) {
187                return false;
188        }
189       
190        if (!$id_rubrique = $options['id_rubrique']){
191                $site = quete_parent_lang('spip_syndic', $id);
192                $id_rubrique = $site['id_rubrique'];
193        }
194       
195        return autoriser_rubrique_voir('voir', 'rubrique', $id_rubrique, $qui, $options);
196}
197}
198
199/*
200 * Surcharge (sans _dist) de la fonction d'autorisation de vue d'un événement, si pas déjà définie
201 */
202if(!function_exists('autoriser_evenement_voir')) {
203function autoriser_evenement_voir($faire, $type, $id, $qui, $options) {
204        include_spip('inc/accesrestreint');
205        static $evenements_statut;
206       
207        $publique = isset($options['publique']) ? $options['publique'] : !test_espace_prive();
208        $id_auteur = isset($qui['id_auteur']) ? $qui['id_auteur'] : $GLOBALS['visiteur_session']['id_auteur'];
209       
210        // Si l'événement fait partie des contenus restreints directement, c'est niet
211        if (in_array($id, accesrestreint_liste_objets_exclus('evenements', $publique, $id_auteur))) {
212                return false;
213        }
214       
215        if (!isset($evenements_statut[$id_auteur][$publique][$id])){
216                $id_article = sql_getfetsel('id_article', 'spip_evenements', 'id_evenement='.intval($id));
217                $evenements_statut[$id_auteur][$publique][$id] = autoriser_article_voir('voir', 'article', $id_article, $qui, $options);
218        }
219       
220        return $evenements_statut[$id_auteur][$publique][$id];
221}
222}
223
224/*
225 * Surcharge (sans _dist) de la fonction d'autorisation de vue d'un document, si pas déjà définie
226 */
227if(!function_exists('autoriser_document_voir')) {
228function autoriser_document_voir($faire, $type, $id, $qui, $options) {
229        include_spip('public/accesrestreint');
230        include_spip('inc/accesrestreint');
231        static $documents_statut = array();
232        static $where = array();
233       
234        $publique = isset($options['publique']) ? $options['publique'] : !test_espace_prive();
235        $id_auteur = isset($qui['id_auteur']) ? $qui['id_auteur'] : $GLOBALS['visiteur_session']['id_auteur'];
236       
237        // Si le document fait partie des contenus restreints directement, c'est niet
238        if (in_array($id, accesrestreint_liste_objets_exclus('documents', $publique, $id_auteur))) {
239                return false;
240        }
241       
242        if (!isset($documents_statut[$id_auteur][$publique][$id])){
243                // il faut hacker la meta "creer_htaccess" le temps du calcul de l'autorisation car le core
244                $clean_meta = false;
245                if (
246                        isset($GLOBALS['meta']["accesrestreint_proteger_documents"])
247                        and $GLOBALS['meta']["accesrestreint_proteger_documents"] == 'oui'
248                ) {
249                        if (!isset($GLOBALS['meta']["creer_htaccess"]) or $GLOBALS['meta']["creer_htaccess"] != 'oui') {
250                                $GLOBALS['meta']["creer_htaccess"] = 'oui';
251                                $clean_meta = true;
252                        }
253                }
254
255                if (!$id) {
256                        $documents_statut[$id_auteur][$publique][$id] = autoriser_document_voir_dist($faire, $type, $id, $qui, $options);
257                }
258                else {
259                        if (!isset($where[$publique])) {
260                                $where[$publique] = accesrestreint_documents_accessibles_where('id_document', $publique?"true":"false");
261                                // inclure avant le eval, pour que les fonctions soient bien definies
262                                include_spip('inc/accesrestreint');
263                                // eviter une notice sur $connect inexistant dans eval() qui suit
264                                $connect = '';
265
266                                $where[$publique] = eval("return ".$where[$publique].";");
267                        }
268                       
269                        $documents_statut[$id_auteur][$publique][$id] = sql_getfetsel('id_document','spip_documents',array('id_document='.intval($id),$where[$publique]));
270                       
271                        if ($documents_statut[$id_auteur][$publique][$id]) {
272                                $documents_statut[$id_auteur][$publique][$id] = autoriser_document_voir_dist($faire, $type, $id, $qui, $options);
273                        }
274                }
275
276                if ($clean_meta){
277                        unset($GLOBALS['meta']["creer_htaccess"]);
278                }
279        }
280       
281        return $documents_statut[$id_auteur][$publique][$id];
282}
283}
284
285?>
Note: See TracBrowser for help on using the repository browser.