source: spip-zone/_plugins_/acces_restreint/trunk/inc/accesrestreint.php @ 53633

Last change on this file since 53633 was 53633, checked in by cedric@…, 10 years ago

Passer en une table de lien unique spip_zones_liens

File size: 9.2 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// Liste des zones a laquelle appartient le visiteur, au format '1,2,3'
11// Cette fonction est appelee a chaque hit et peut etre completee (pipeline)
12/**
13 * Liste des zones a laquelle appartient le visiteur, au format '1,2,3'.
14 * Cette fonction est appelee a chaque hit et peut etre completee (pipeline)
15 *
16 * @param string $zones '1,2,3'
17 * @param int $id_auteur
18 * @return string '1,2,3'
19 */
20function accesrestreint_liste_zones_autorisees($zones='', $id_auteur=NULL) {
21        $id = NULL;
22        if (!is_null($id_auteur))
23                $id = $id_auteur;
24        elseif (isset($GLOBALS['visiteur_session']['id_auteur']) && $GLOBALS['visiteur_session']['id_auteur'])
25                $id = $GLOBALS['visiteur_session']['id_auteur'];
26        if (!is_null($id)) {
27                $new = accesrestreint_liste_zones_appartenance_auteur($id);
28                if ($zones AND $new) {
29                        $zones = array_unique(array_merge(split(',',$zones),$new));
30                        sort($zones);
31                        $zones = join(',', $zones);
32                } else if ($new) {
33                        $zones = join(',', $new);
34                }
35        }
36        return $zones;
37}
38
39/**
40 * liste des rubriques contenues dans une zone, directement.
41 * pour savoir quelles rubriques on peut decocher
42 * si id_zone = '' : toutes les rub en acces restreint
43 *
44 * @param int|string $id_zone
45 * @return array
46 */
47function accesrestreint_liste_contenu_zone_rub_direct($id_zone){
48        $liste_rubriques=array();
49        // liste des rubriques directement liees a la zone
50        $where = array();
51        if (is_numeric($id_zone))
52                $where[] = "z.id_zone=".intval($id_zone);
53        elseif ($id_zone)
54                $where = $id_zone;
55
56        if (is_array($where))
57                $where[] = "zr.objet='rubrique'";
58        else
59                $where = "($where) AND zr.objet='rubrique'";
60
61        include_spip('base/abstract_sql');
62        $liste_rubriques = sql_allfetsel('id_objet','spip_zones_liens AS zr INNER JOIN spip_zones AS z ON zr.id_zone=z.id_zone',$where);
63        $liste_rubriques = array_map('reset',$liste_rubriques);
64        $liste_rubriques = array_unique($liste_rubriques);
65        return $liste_rubriques;
66}
67
68/**
69 * liste des rubriques contenues dans une zone, directement ou par heritage.
70 *
71 * @param int/string $id_zone
72 * @return array
73 */
74function accesrestreint_liste_contenu_zone_rub($id_zone){
75        include_spip('inc/rubriques');
76        $liste_rubriques = accesrestreint_liste_contenu_zone_rub_direct($id_zone);
77        if (!count($liste_rubriques))
78                return $liste_rubriques;
79        $liste_rubriques = calcul_branche_in(join(',',$liste_rubriques));
80        if (!strlen($liste_rubriques))
81                return array();
82        $liste_rubriques = explode(',',$liste_rubriques);
83        return $liste_rubriques;
84}
85
86
87/**
88 * liste des rubriques d'une zone et leurs rubriques parentes.
89 *
90 * @param int/string $id_zone
91 * @return array
92 */
93function accesrestreint_liste_parentee_zone_rub($id_zone){
94        include_spip('inc/rubriques');
95        $liste_rubriques = accesrestreint_liste_contenu_zone_rub_direct($id_zone);
96        if (!count($liste_rubriques))
97                return $liste_rubriques;
98
99        $id = $liste_rubriques;
100        while ($parents = sql_allfetsel('id_parent', 'spip_rubriques',
101        sql_in('id_rubrique', $id))) {
102                $parents = array_map('array_shift', $parents);
103                $parents = array_diff($parents, array(0));
104                $id = $parents;
105                $liste_rubriques = array_merge($liste_rubriques, $parents);
106        }
107       
108        return $liste_rubriques;
109}
110
111/**
112 * Lister les zones auxquelles un auteur appartient
113 *
114 * @param int $id_auteur
115 * @return array
116 */
117function accesrestreint_liste_zones_appartenance_auteur($id_auteur){
118        static $liste_zones = array();
119        if (!isset($liste_zones[$id_auteur])){
120                include_spip('base/abstract_sql');
121                $liste_zones[$id_auteur] = sql_allfetsel("id_zone","spip_zones_liens","objet='auteur' AND id_objet=".intval($id_auteur));
122                $liste_zones[$id_auteur] = array_map('reset',$liste_zones[$id_auteur]);
123        }
124        return $liste_zones[$id_auteur];
125}
126
127/**
128 * Verifier si un auteur appartient a une zone.
129 * utilise la fonction precedente qui met en cache son resultat
130 * on optimise en fonction de l'hypothese que le nombre de zones est toujours reduit
131 *
132 * @param unknown_type $id_zone
133 * @param unknown_type $id_auteur
134 * @return unknown
135 */
136function accesrestreint_test_appartenance_zone_auteur($id_zone,$id_auteur){
137        return in_array($id_zone,accesrestreint_liste_zones_appartenance_auteur($id_auteur));
138}
139
140/**
141 * liste des auteurs contenus dans une zone
142 *
143 * @param int $id_zone
144 * @return array
145 */
146function accesrestreint_liste_contenu_zone_auteur($id_zone) {
147        $liste_auteurs=array();
148        include_spip('base/abstract_sql');
149        $liste_auteurs = sql_allfetsel("id_objet","spip_zones_liens","objet='auteur' AND id_zone=".intval($id_zone));
150        $liste_auteurs = array_map('reset',$liste_auteurs);
151        return $liste_auteurs;
152}
153
154/**
155 * fonctions de filtrage rubrique
156 * -> condition NOT IN
157 * Cette fonction renvoie la liste des rubriques interdites
158 * au visiteur courant
159 * d'ou le recours a $GLOBALS['accesrestreint_zones_autorisees']
160 *
161 * @param bool $publique Sélectionner les rubriques interdites dans l'espace public (true) ou privé (false)
162 * @param int $id_auteur Identifiant de l'auteur
163 * @param bool $quelquesoit_visibilite Si true, on ne s'occupe pas de savoir si une zone est restreinte sur le prive ou sur le public.
164 * @return array
165 */
166function accesrestreint_liste_rubriques_exclues($publique=true, $id_auteur=NULL, $quelquesoit_visibilite = false) {
167        // cache static
168        static $liste_rub_exclues = array();
169        static $liste_rub_inclues = array();
170        if ($quelquesoit_visibilite) { $publique = 'tout'; }
171       
172        $id_auteur = is_null($id_auteur)?$GLOBALS['visiteur_session']['id_auteur']:$id_auteur;
173        if (!isset($liste_rub_exclues[$id_auteur][$publique]) || !is_array($liste_rub_exclues[$id_auteur][$publique])) {
174
175                $where = array();
176                // Ne selectionner que les zones pertinentes
177                if (!$quelquesoit_visibilite) {
178                        if ($publique)
179                                $where[] = "publique='oui'";
180                        else
181                                $where[] = "privee='oui'";
182                }
183
184                // Si le visiteur est autorise sur certaines zones publiques,
185                // on selectionne les rubriques correspondant aux autres zones,
186                // sinon on selectionne toutes celles correspondant a une zone.
187                include_spip('base/abstract_sql');
188                if ($GLOBALS['accesrestreint_zones_autorisees']
189                  AND $id_auteur==$GLOBALS['visiteur_session']['id_auteur'])
190                        $where[] = sql_in('zr.id_zone',$GLOBALS['accesrestreint_zones_autorisees'],'NOT');
191                elseif ($id_auteur)
192                        $where[] = sql_in('zr.id_zone',accesrestreint_liste_zones_autorisees('',$id_auteur),'NOT');
193
194                // liste les rubriques (+branches) des zones dont ne fait pas parti l'auteur
195                $liste_rub_exclues[$id_auteur][$publique] = accesrestreint_liste_contenu_zone_rub($where);
196                #$liste_rub_exclues[$publique] = array_unique($liste_rub_exclues[$publique]);
197        }
198        $final_liste_rub_exclues = $liste_rub_exclues[$id_auteur][$publique];
199       
200        if (defined("AR_TYPE_RESTRICTION") AND AR_TYPE_RESTRICTION == "faible") {
201                // AR_TYPE_RESTRICTION définit le type de restriction pour traiter les elements communs à plusieurs zone
202                // Une restriction exclusive (ou forte) donne l'acces aux rubriques restreintes par
203                // plusieurs zone aux seuls membres de toutes les zones concernees.
204                // Une restriction faible donne acces à une rubrique, même restreinte par
205                // plusieurs zones, aux membres de chaque zone concernee.
206                // valeurs : 'faible', 'forte, ou 'exclusive'           
207
208                // Autrement dit, si une rubrique 2 est enfant d'une rubrique 1,
209                // et qu'il existe une zone 1 (rubrique 1) et une zone 2 (rubrique 2) :
210                // - un auteur present dans la zone 1 (uniquement) ne pourra pas voir la rubrique 2
211                //   lorsque la restriction est "forte". Il le pourra avec une restriction "faible"
212                //
213                // - A l'inverse, un auteur present uniquement dans la zone 2 ne pourra pas voir
214                //   la rubrique 1 meme si la restriction est "faible" car la parentee n'est pas concernee.
215                //   il faut (si souhaite) dans ce cas definir en plus AR_TYPE_RESTRICTION_PARENTEE a "faible"
216                //   pour l'autoriser.
217                if (!isset($liste_rub_inclues[$id_auteur][$publique]) OR !is_array($liste_rub_inclues[$id_auteur][$publique])) {
218
219                        $where = array();
220                        // Ne selectionner que les zones pertinentes
221                        if (!$quelquesoit_visibilite) {
222                                if ($publique)
223                                        $where[] = "publique='oui'";
224                                else
225                                        $where[] = "privee='oui'";
226                        }
227
228                        // Calcul des rubriques dans des zones autorisees
229                        include_spip('base/abstract_sql');
230                        if ($GLOBALS['accesrestreint_zones_autorisees']
231                          AND $id_auteur==$GLOBALS['visiteur_session']['id_auteur'])
232                                $where[] = sql_in('zr.id_zone',$GLOBALS['accesrestreint_zones_autorisees']);
233                        elseif ($id_auteur)
234                                $where[] = sql_in('zr.id_zone',accesrestreint_liste_zones_autorisees('',$id_auteur));
235
236                        // liste les rubriques (+branches) des zones de l'auteur
237                        $liste_rub_inclues[$id_auteur][$publique] = accesrestreint_liste_contenu_zone_rub($where);
238
239                        // pour autoriser la vue des rubriques parentes
240                        // memes si elles sont restreintes par une autre zone
241                        if (defined("AR_TYPE_RESTRICTION_PARENTEE") AND AR_TYPE_RESTRICTION_PARENTEE == "faible") {
242                                $liste_rub_inclues[$id_auteur][$publique] =
243                                        array_merge($liste_rub_inclues[$id_auteur][$publique],
244                                                accesrestreint_liste_parentee_zone_rub($where));
245                        }
246                }
247
248                // Ne pas exclure les elements qui sont autorises
249                $final_liste_rub_exclues = array_diff($final_liste_rub_exclues,
250                        array_intersect($final_liste_rub_exclues,$liste_rub_inclues[$id_auteur][$publique]));
251        }
252
253        return $final_liste_rub_exclues;
254}
255
256
257?>
Note: See TracBrowser for help on using the repository browser.