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

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

Dans le filtre accesrestreint_acces_zone, [] doit toujours être un tableau, qu'on soit connecté ou pas, et qu'on ait accès à des zones ou pas, sinon ça Warning sur le in_array().

File size: 8.4 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        include_spip('inc/session');
69        static $liste_zones = array();
70        $id_visiteur = session_get('id_auteur');
71       
72        if (is_null($id_auteur)) {
73                $id_auteur = $id_visiteur;
74        }
75       
76        if (!isset($liste_zones[$id_auteur])) {
77                if (
78                        $GLOBALS['accesrestreint_zones_autorisees']
79                        and ($id_auteur == $id_visiteur)
80                ) {
81                        $liste_zones[$id_auteur] = explode(',', $GLOBALS['accesrestreint_zones_autorisees']);
82                }
83                elseif (!is_null($id_auteur)) {
84                        include_spip('inc/accesrestreint');
85                        $liste_zones[$id_auteur] = explode(',', accesrestreint_liste_zones_autorisees('', $id_auteur));
86                }
87                else {
88                        $liste_zones[$id_auteur] = array();
89                }
90        }
91       
92        return in_array($id_zone,$liste_zones[$id_auteur]);
93}
94
95/**
96 * fonction pour afficher une icone 12px selon le statut de l'auteur
97 *
98 * @param string $statut
99 * @return string
100 */
101function icone_auteur_12($statut){
102        if ($statut=='0minirezo') return _DIR_IMG_PACK . 'admin-12.gif';
103        if ($statut=='1comite') return _DIR_IMG_PACK . 'redac-12.gif';
104        return _DIR_IMG_PACK . 'visit-12.gif';
105}
106
107
108
109
110
111/**
112 * Retroune les identifiants des zones a laquelle appartient une rubrique
113 * et ses rubriques parentes
114 * (quelquesoit la visibilité de la zone (publique, prive, les 2 ou aucun)
115 *
116 * @param int $id_rubrique
117 * @return array identifiants des zones
118 */
119function accesrestreint_zones_rubrique_et_hierarchie($id_rubrique) {
120        static $zones = array();
121       
122        if (!$id_rubrique) {
123                return array();
124        }
125       
126        if (isset($zones[$id_rubrique])) {
127                return $zones[$id_rubrique];
128        }
129
130        // on teste notre rubrique deja
131        $idz = accesrestreint_zones_rubrique($id_rubrique);
132       
133        // on parcours toute l'arborescence jusqu'a la racine en testant les zones
134        // pour completer les zones deja trouvees
135        if ($id_parent = sql_getfetsel('id_parent', 'spip_rubriques', 'id_rubrique='.intval($id_rubrique))) {
136                // on teste notre parent
137                $idz_parent = accesrestreint_zones_rubrique_et_hierarchie($id_parent);
138                $idz = array_merge($idz, $idz_parent);
139        }
140
141        // on renvoie la rubrique
142        return $zones[$id_rubrique] = $idz;
143}
144
145
146/**
147 * Retroune les identifiants des zones a laquelle appartient une rubrique
148 * (quelquesoit la visibilité de la zone (publique, prive, les 2 ou aucun)
149 *
150 * @param int $id_rubrique
151 * @return array identifiants des zones
152 */
153function accesrestreint_zones_rubrique($id_rubrique) {
154        // on teste notre rubrique deja
155        $idz = sql_allfetsel('id_zone', 'spip_zones_liens', "objet='rubrique' AND id_objet=". intval($id_rubrique));
156        if (is_array($idz)) {
157                $idz = array_map('reset', $idz);
158                return $idz;
159        }
160        return array();
161}
162
163/**
164 * Cherche si la rubrique donnée est inclue dans une zone d'accès restreinte.
165 *
166 * [(#ID_RUBRIQUE|accesrestreint_rubrique_zone_restreinte|oui) Rubrique non visible dans une zone]
167 * [(#ID_RUBRIQUE|accesrestreint_rubrique_zone_restreinte{tout}) Rubrique dans une zone ]
168 *
169 * @param int $id_rubrique : identifiant de la rubrique
170 * @param null|bool|string $_publique
171 *   Sélectionner les rubriques
172 *   cachées dans le public (true),
173 *   le privé (false),
174 *   selon le contexte privé ou public (null),
175 *   cachées ou non quelque soit le contexte ('tout')
176 * @return bool La rubrique est présente dans une zone
177 */
178function accesrestreint_rubrique_zone_restreinte($id_rubrique, $_publique=null) {
179        return
180                @in_array($id_rubrique,
181                        accesrestreint_liste_rubriques_restreintes_et_enfants($_publique)
182                );
183}
184
185/**
186 * Retourne la liste de toutes les rubriques sélectionnées dans des zones
187 *
188 * @param null|bool|string      $_publique
189 *   Sélectionner les rubriques
190 *   cachées dans le public (true),
191 *   le privé (false),
192 *   selon le contexte privé ou public (null),
193 *   cachées ou non quelque soit le contexte ('tout')
194 * @return Array liste d'identifiants de rubriques
195 */
196function accesrestreint_liste_rubriques_restreintes($_publique = null) {
197        static $rubs = array();
198
199        // $_publique : null, true, false, 'tout'
200        $tout = false;
201        if (is_null($_publique)) {
202                $_publique = !test_espace_prive();
203        } elseif ($_publique === 'tout') {
204                $tout = true;
205        }
206
207        if (isset($rubs[$_publique])) {
208                return $rubs[$_publique];
209        }
210
211        $where = array("zr.objet='rubrique'");
212        if (!$tout) {
213                if ($_publique) {
214                        $where[] = 'z.publique=' . sql_quote('oui');
215                } else {
216                        $where[] = 'z.privee=' . sql_quote('oui');
217                }
218        }
219       
220        $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);
221       
222        if (is_array($idz)) {
223                $idz = array_map('reset', $idz);
224                return $rubs[$_publique] = $idz;
225        }
226       
227        return $rubs[$_publique] = array();
228}
229
230
231/**
232 * Retourne la liste de toutes les rubriques sélectionnées dans des zones
233 *
234 * @example
235 *   accesrestreint_liste_rubriques_restreintes_et_enfants(false)
236 *   retourne les id des rubriques et leurs enfants restreints
237 *   dans le privé
238 *   
239 *   accesrestreint_liste_rubriques_restreintes_et_enfants(true)
240 *   retourne les id des rubriques et leurs enfants restreints
241 *   dans le public
242 *   
243 *   accesrestreint_liste_rubriques_restreintes_et_enfants('tout')
244 *   retourne les id des rubriques et leurs enfants restreints
245 *   dans le privé et dans le public
246 *
247 * @param null|bool|string $_publique
248 *   Sélectionner les rubriques
249 *   cachées dans le public (true),
250 *   le privé (false),
251 *   selon le contexte privé ou public (null),
252 *   cachées ou non quelque soit le contexte ('tout')
253 * @return Array liste d'identifiants de rubriques
254 */
255function accesrestreint_liste_rubriques_restreintes_et_enfants($_publique = null) {
256        static $rubs = array();
257
258        if (is_null($_publique)) {
259                $_publique = !test_espace_prive();
260        }
261
262        if (isset($rubs[$_publique])) {
263                return $rubs[$_publique];
264        }
265       
266        $parents = accesrestreint_liste_rubriques_restreintes($_publique);
267
268        if ($parents) {
269                include_spip('inc/rubriques');
270                $branches = explode(',', calcul_branche_in($parents));
271                return $rubs[$_publique] = $branches;
272        }
273       
274        return $rubs[$_publique] = array();
275}
276
277/**
278 * Un auteur donné fait il partie d'une zone permettant de voir telle rubrique.
279 * Renvoie true, si l'auteur peut voir la rubrique,
280 * quelquesoit la visibilité des rubriques de la zone
281 *
282 * @param int $id_auteur        Identifiant de l'auteur
283 * @param int $id_rubrique      Identifiant de la rubrique
284 * @return bool L'auteur fait partie de la rubrique.
285 */
286function accesrestreint_auteur_lie_a_rubrique($id_auteur, $id_rubrique) {
287        if (!$id_auteur)   return false;
288        if (!$id_rubrique) return false;
289        // $auteur[3][8] : l'auteur 3 ne peut pas voir la rubrique 8
290        static $auteurs = array();
291        if (!isset($auteurs[$id_auteur])) {
292                $auteurs[$id_auteur] = array();
293
294                include_spip('inc/accesrestreint');
295                $auteurs[$id_auteur] = array_flip(accesrestreint_liste_rubriques_exclues(true, $id_auteur, true));
296        }
297       
298        // si la rubrique est presente, c'est qu'on ne peut pas la voir !
299        if (isset($auteurs[$id_auteur][$id_rubrique])) {
300                return false;
301        }
302       
303        return true;
304       
305}
306
307
308?>
Note: See TracBrowser for help on using the repository browser.