source: spip-zone/_plugins_/acces_restreint/trunk/accesrestreint_fonctions.php @ 86731

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

Pour les articles, on doit aussi tester si ça fait partie des objets restreints un par un (et non juste par le parent).

File size: 8.3 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;
9include_spip('public/accesrestreint');
10include_spip('inc/accesrestreint');
11
12/**
13 * filtre de securisation des squelettes
14 * utilise avec [(#REM|accesrestreint_securise_squelette)]
15 * evite divulgation d'info si plugin desactive
16 * par erreur fatale
17 *
18 * @param unknown_type $letexte
19 * @return unknown
20 */
21function accesrestreint_securise_squelette($letexte){
22        return "";
23}
24
25
26/**
27 * filtre de test pour savoir si l'acces a un article est restreint
28 *
29 * @param int $id_article
30 * @param int $id_auteur
31 * @return bool
32 */
33function accesrestreint_article_restreint($id_article, $id_auteur=null){
34        include_spip('public/quete');
35        include_spip('inc/accesrestreint');
36        $article = quete_parent_lang('spip_articles',$id_article);
37        return
38                @in_array($article['id_rubrique'],
39                        accesrestreint_liste_rubriques_exclues(!test_espace_prive(), $id_auteur)
40                )
41                or @in_array($id_article, accesrestreint_liste_objets_exclus('article', !test_espace_prive(), $id_parent));
42}
43
44
45/**
46 * filtre de test pour savoir si l'acces a une rubrique est restreinte
47 *
48 * @param int $id_rubrique
49 * @param int $id_auteur
50 * @return bool
51 */
52function accesrestreint_rubrique_restreinte($id_rubrique, $id_auteur=null){
53        include_spip('inc/accesrestreint');
54        return
55                @in_array($id_rubrique,
56                        accesrestreint_liste_rubriques_exclues(!test_espace_prive(), $id_auteur)
57                );
58}
59
60/**
61 * Filtre pour tester l'appartenance d'un auteur a une zone
62 *
63 * @param int $id_zone
64 * @param int $id_auteur
65 * @return bool
66 */
67function accesrestreint_acces_zone($id_zone,$id_auteur=null){
68        static $liste_zones = array();
69        if (is_null($id_auteur)) $id_auteur=$GLOBALS['visiteur_session']['id_auteur'];
70        if (!isset($liste_zones[$id_auteur])){
71                if ($GLOBALS['accesrestreint_zones_autorisees']
72                  AND ($id_auteur==$GLOBALS['visiteur_session']['id_auteur']))
73                        $liste_zones[$id_auteur] = explode(',',$GLOBALS['accesrestreint_zones_autorisees']);
74                elseif (!is_null($id_auteur)){
75                        include_spip('inc/accesrestreint');
76                        $liste_zones[$id_auteur] = explode(',',accesrestreint_liste_zones_autorisees('',$id_auteur));
77                }
78        }
79       
80        return in_array($id_zone,$liste_zones[$id_auteur]);
81}
82
83/**
84 * fonction pour afficher une icone 12px selon le statut de l'auteur
85 *
86 * @param string $statut
87 * @return string
88 */
89function icone_auteur_12($statut){
90        if ($statut=='0minirezo') return _DIR_IMG_PACK . 'admin-12.gif';
91        if ($statut=='1comite') return _DIR_IMG_PACK . 'redac-12.gif';
92        return _DIR_IMG_PACK . 'visit-12.gif';
93}
94
95
96
97
98
99/**
100 * Retroune les identifiants des zones a laquelle appartient une rubrique
101 * et ses rubriques parentes
102 * (quelquesoit la visibilité de la zone (publique, prive, les 2 ou aucun)
103 *
104 * @param int $id_rubrique
105 * @return array identifiants des zones
106 */
107function accesrestreint_zones_rubrique_et_hierarchie($id_rubrique) {
108        static $zones = array();
109       
110        if (!$id_rubrique) {
111                return array();
112        }
113       
114        if (isset($zones[$id_rubrique])) {
115                return $zones[$id_rubrique];
116        }
117
118        // on teste notre rubrique deja
119        $idz = accesrestreint_zones_rubrique($id_rubrique);
120       
121        // on parcours toute l'arborescence jusqu'a la racine en testant les zones
122        // pour completer les zones deja trouvees
123        if ($id_parent = sql_getfetsel('id_parent', 'spip_rubriques', 'id_rubrique='.intval($id_rubrique))) {
124                // on teste notre parent
125                $idz_parent = accesrestreint_zones_rubrique_et_hierarchie($id_parent);
126                $idz = array_merge($idz, $idz_parent);
127        }
128
129        // on renvoie la rubrique
130        return $zones[$id_rubrique] = $idz;
131}
132
133
134/**
135 * Retroune les identifiants des zones a laquelle appartient une rubrique
136 * (quelquesoit la visibilité de la zone (publique, prive, les 2 ou aucun)
137 *
138 * @param int $id_rubrique
139 * @return array identifiants des zones
140 */
141function accesrestreint_zones_rubrique($id_rubrique) {
142        // on teste notre rubrique deja
143        $idz = sql_allfetsel('id_zone', 'spip_zones_liens', "objet='rubrique' AND id_objet=". intval($id_rubrique));
144        if (is_array($idz)) {
145                $idz = array_map('reset', $idz);
146                return $idz;
147        }
148        return array();
149}
150
151/**
152 * Cherche si la rubrique donnée est inclue dans une zone d'accès restreinte.
153 *
154 * [(#ID_RUBRIQUE|accesrestreint_rubrique_zone_restreinte|oui) Rubrique non visible dans une zone]
155 * [(#ID_RUBRIQUE|accesrestreint_rubrique_zone_restreinte{tout}) Rubrique dans une zone ]
156 *
157 * @param int $id_rubrique : identifiant de la rubrique
158 * @param null|bool|string $_publique
159 *   Sélectionner les rubriques
160 *   cachées dans le public (true),
161 *   le privé (false),
162 *   selon le contexte privé ou public (null),
163 *   cachées ou non quelque soit le contexte ('tout')
164 * @return bool La rubrique est présente dans une zone
165 */
166function accesrestreint_rubrique_zone_restreinte($id_rubrique, $_publique=null) {
167        return
168                @in_array($id_rubrique,
169                        accesrestreint_liste_rubriques_restreintes_et_enfants($_publique)
170                );
171}
172
173/**
174 * Retourne la liste de toutes les rubriques sélectionnées dans des zones
175 *
176 * @param null|bool|string      $_publique
177 *   Sélectionner les rubriques
178 *   cachées dans le public (true),
179 *   le privé (false),
180 *   selon le contexte privé ou public (null),
181 *   cachées ou non quelque soit le contexte ('tout')
182 * @return Array liste d'identifiants de rubriques
183 */
184function accesrestreint_liste_rubriques_restreintes($_publique = null) {
185        static $rubs = array();
186
187        // $_publique : null, true, false, 'tout'
188        $tout = false;
189        if (is_null($_publique)) {
190                $_publique = !test_espace_prive();
191        } elseif ($_publique === 'tout') {
192                $tout = true;
193        }
194
195        if (isset($rubs[$_publique])) {
196                return $rubs[$_publique];
197        }
198
199        $where = array("zr.objet='rubrique'");
200        if (!$tout) {
201                if ($_publique) {
202                        $where[] = 'z.publique=' . sql_quote('oui');
203                } else {
204                        $where[] = 'z.privee=' . sql_quote('oui');
205                }
206        }
207       
208        $idz = sql_allfetsel('DISTINCT(zr.id_objet)', 'spip_zones_liens AS zr JOIN spip_zones AS z ON z.id_zone = zr.id_zone', $where);
209       
210        if (is_array($idz)) {
211                $idz = array_map('reset', $idz);
212                return $rubs[$_publique] = $idz;
213        }
214       
215        return $rubs[$_publique] = array();
216}
217
218
219/**
220 * Retourne la liste de toutes les rubriques sélectionnées dans des zones
221 *
222 * @example
223 *   accesrestreint_liste_rubriques_restreintes_et_enfants(false)
224 *   retourne les id des rubriques et leurs enfants restreints
225 *   dans le privé
226 *   
227 *   accesrestreint_liste_rubriques_restreintes_et_enfants(true)
228 *   retourne les id des rubriques et leurs enfants restreints
229 *   dans le public
230 *   
231 *   accesrestreint_liste_rubriques_restreintes_et_enfants('tout')
232 *   retourne les id des rubriques et leurs enfants restreints
233 *   dans le privé et dans le public
234 *
235 * @param null|bool|string $_publique
236 *   Sélectionner les rubriques
237 *   cachées dans le public (true),
238 *   le privé (false),
239 *   selon le contexte privé ou public (null),
240 *   cachées ou non quelque soit le contexte ('tout')
241 * @return Array liste d'identifiants de rubriques
242 */
243function accesrestreint_liste_rubriques_restreintes_et_enfants($_publique = null) {
244        static $rubs = array();
245
246        if (is_null($_publique)) {
247                $_publique = !test_espace_prive();
248        }
249
250        if (isset($rubs[$_publique])) {
251                return $rubs[$_publique];
252        }
253       
254        $parents = accesrestreint_liste_rubriques_restreintes($_publique);
255
256        if ($parents) {
257                include_spip('inc/rubriques');
258                $branches = explode(',', calcul_branche_in($parents));
259                return $rubs[$_publique] = $branches;
260        }
261       
262        return $rubs[$_publique] = array();
263}
264
265/**
266 * Un auteur donné fait il partie d'une zone permettant de voir telle rubrique.
267 * Renvoie true, si l'auteur peut voir la rubrique,
268 * quelquesoit la visibilité des rubriques de la zone
269 *
270 * @param int $id_auteur        Identifiant de l'auteur
271 * @param int $id_rubrique      Identifiant de la rubrique
272 * @return bool L'auteur fait partie de la rubrique.
273 */
274function accesrestreint_auteur_lie_a_rubrique($id_auteur, $id_rubrique) {
275        if (!$id_auteur)   return false;
276        if (!$id_rubrique) return false;
277        // $auteur[3][8] : l'auteur 3 ne peut pas voir la rubrique 8
278        static $auteurs = array();
279        if (!isset($auteurs[$id_auteur])) {
280                $auteurs[$id_auteur] = array();
281
282                include_spip('inc/accesrestreint');
283                $auteurs[$id_auteur] = array_flip(accesrestreint_liste_rubriques_exclues(true, $id_auteur, true));
284        }
285       
286        // si la rubrique est presente, c'est qu'on ne peut pas la voir !
287        if (isset($auteurs[$id_auteur][$id_rubrique])) {
288                return false;
289        }
290       
291        return true;
292       
293}
294
295
296?>
Note: See TracBrowser for help on using the repository browser.