[PLUGINS] +acces restreint
[ptitvelo/web/www.git] / www / plugins / accesrestreint_3_5 / accesrestreint_fonctions.php
1 <?php
2 /**
3 * Plugin Acces Restreint 3.0 pour Spip 2.0
4 * Licence GPL (c) 2006-2008 Cedric Morin
5 *
6 */
7
8 if (!defined("_ECRIRE_INC_VERSION")) return;
9 include_spip('public/accesrestreint');
10 include_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 */
21 function 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 */
33 function 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 }
42
43
44 /**
45 * filtre de test pour savoir si l'acces a une rubrique est restreinte
46 *
47 * @param int $id_rubrique
48 * @param int $id_auteur
49 * @return bool
50 */
51 function accesrestreint_rubrique_restreinte($id_rubrique, $id_auteur=null){
52 include_spip('inc/accesrestreint');
53 return
54 @in_array($id_rubrique,
55 accesrestreint_liste_rubriques_exclues(!test_espace_prive(), $id_auteur)
56 );
57 }
58
59 /**
60 * Filtre pour tester l'appartenance d'un auteur a une zone
61 *
62 * @param int $id_zone
63 * @param int $id_auteur
64 * @return bool
65 */
66 function accesrestreint_acces_zone($id_zone,$id_auteur=null){
67 static $liste_zones = array();
68 if (is_null($id_auteur)) $id_auteur=$GLOBALS['visiteur_session']['id_auteur'];
69 if (!isset($liste_zones[$id_auteur])){
70 if ($GLOBALS['accesrestreint_zones_autorisees']
71 AND ($id_auteur==$GLOBALS['visiteur_session']['id_auteur']))
72 $liste_zones[$id_auteur] = explode(',',$GLOBALS['accesrestreint_zones_autorisees']);
73 elseif (!is_null($id_auteur)){
74 include_spip('inc/accesrestreint');
75 $liste_zones[$id_auteur] = explode(',',accesrestreint_liste_zones_autorisees('',$id_auteur));
76 }
77 }
78
79 return in_array($id_zone,$liste_zones[$id_auteur]);
80 }
81
82 /**
83 * fonction pour afficher une icone 12px selon le statut de l'auteur
84 *
85 * @param string $statut
86 * @return string
87 */
88 function icone_auteur_12($statut){
89 if ($statut=='0minirezo') return _DIR_IMG_PACK . 'admin-12.gif';
90 if ($statut=='1comite') return _DIR_IMG_PACK . 'redac-12.gif';
91 return _DIR_IMG_PACK . 'visit-12.gif';
92 }
93
94
95
96
97
98 /**
99 * Retroune les identifiants des zones a laquelle appartient une rubrique
100 * et ses rubriques parentes
101 * (quelquesoit la visibilité de la zone (publique, prive, les 2 ou aucun)
102 *
103 * @param int $id_rubrique
104 * @return array identifiants des zones
105 */
106 function accesrestreint_zones_rubrique_et_hierarchie($id_rubrique) {
107 static $zones = array();
108
109 if (!$id_rubrique) {
110 return array();
111 }
112
113 if (isset($zones[$id_rubrique])) {
114 return $zones[$id_rubrique];
115 }
116
117 // on teste notre rubrique deja
118 $idz = accesrestreint_zones_rubrique($id_rubrique);
119
120 // on parcours toute l'arborescence jusqu'a la racine en testant les zones
121 // pour completer les zones deja trouvees
122 if ($id_parent = sql_getfetsel('id_parent', 'spip_rubriques', 'id_rubrique='.intval($id_rubrique))) {
123 // on teste notre parent
124 $idz_parent = accesrestreint_zones_rubrique_et_hierarchie($id_parent);
125 $idz = array_merge($idz, $idz_parent);
126 }
127
128 // on renvoie la rubrique
129 return $zones[$id_rubrique] = $idz;
130 }
131
132
133 /**
134 * Retroune les identifiants des zones a laquelle appartient une rubrique
135 * (quelquesoit la visibilité de la zone (publique, prive, les 2 ou aucun)
136 *
137 * @param int $id_rubrique
138 * @return array identifiants des zones
139 */
140 function accesrestreint_zones_rubrique($id_rubrique) {
141 // on teste notre rubrique deja
142 $idz = sql_allfetsel('id_zone', 'spip_zones_liens', "objet='rubrique' AND id_objet=". intval($id_rubrique));
143 if (is_array($idz)) {
144 $idz = array_map('reset', $idz);
145 return $idz;
146 }
147 return array();
148 }
149
150 /**
151 * Cherche si la rubrique donnée est inclue dans une zone d'accès restreinte.
152 *
153 * [(#ID_RUBRIQUE|accesrestreint_rubrique_zone_restreinte|oui) Rubrique non visible dans une zone]
154 * [(#ID_RUBRIQUE|accesrestreint_rubrique_zone_restreinte{tout}) Rubrique dans une zone ]
155 *
156 * @param int $id_rubrique : identifiant de la rubrique
157 * @param null|bool|string $_publique
158 * Sélectionner les rubriques
159 * cachées dans le public (true),
160 * le privé (false),
161 * selon le contexte privé ou public (null),
162 * cachées ou non quelque soit le contexte ('tout')
163 * @return bool La rubrique est présente dans une zone
164 */
165 function accesrestreint_rubrique_zone_restreinte($id_rubrique, $_publique=null) {
166 return
167 @in_array($id_rubrique,
168 accesrestreint_liste_rubriques_restreintes_et_enfants($_publique)
169 );
170 }
171
172 /**
173 * Retourne la liste de toutes les rubriques sélectionnées dans des zones
174 *
175 * @param null|bool|string $_publique
176 * Sélectionner les rubriques
177 * cachées dans le public (true),
178 * le privé (false),
179 * selon le contexte privé ou public (null),
180 * cachées ou non quelque soit le contexte ('tout')
181 * @return Array liste d'identifiants de rubriques
182 */
183 function accesrestreint_liste_rubriques_restreintes($_publique = null) {
184 static $rubs = array();
185
186 // $_publique : null, true, false, 'tout'
187 $tout = false;
188 if (is_null($_publique)) {
189 $_publique = !test_espace_prive();
190 } elseif ($_publique === 'tout') {
191 $tout = true;
192 }
193
194 if (isset($rubs[$_publique])) {
195 return $rubs[$_publique];
196 }
197
198 $where = array("zr.objet='rubrique'");
199 if (!$tout) {
200 if ($_publique) {
201 $where[] = 'z.publique=' . sql_quote('oui');
202 } else {
203 $where[] = 'z.privee=' . sql_quote('oui');
204 }
205 }
206
207 $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);
208
209 if (is_array($idz)) {
210 $idz = array_map('reset', $idz);
211 return $rubs[$_publique] = $idz;
212 }
213
214 return $rubs[$_publique] = array();
215 }
216
217
218 /**
219 * Retourne la liste de toutes les rubriques sélectionnées dans des zones
220 *
221 * @param null|bool|string $_publique
222 * Sélectionner les rubriques
223 * cachées dans le public (true),
224 * le privé (false),
225 * selon le contexte privé ou public (null),
226 * cachées ou non quelque soit le contexte ('tout')
227 * @return Array liste d'identifiants de rubriques
228 */
229 function accesrestreint_liste_rubriques_restreintes_et_enfants($_publique = null) {
230 static $rubs = array();
231
232 if (is_null($_publique)) {
233 $_publique = !test_espace_prive();
234 }
235
236 if (isset($rubs[$_publique])) {
237 return $rubs[$_publique];
238 }
239
240 $parents = accesrestreint_liste_rubriques_restreintes($_publique);
241
242 if ($parents) {
243 include_spip('inc/rubriques');
244 $branches = explode(',', calcul_branche_in($parents));
245 return $rubs[$_publique] = $branches;
246 }
247
248 return $rubs[$_publique] = array();
249 }
250
251 /**
252 * Un auteur donné fait il partie d'une zone permettant de voir telle rubrique.
253 * Renvoie true, si l'auteur peut voir la rubrique,
254 * quelquesoit la visibilité des rubriques de la zone
255 *
256 * @param int $id_auteur Identifiant de l'auteur
257 * @param int $id_rubrique Identifiant de la rubrique
258 * @return bool L'auteur fait partie de la rubrique.
259 */
260 function accesrestreint_auteur_lie_a_rubrique($id_auteur, $id_rubrique) {
261 if (!$id_auteur) return false;
262 if (!$id_rubrique) return false;
263 // $auteur[3][8] : l'auteur 3 ne peut pas voir la rubrique 8
264 static $auteurs = array();
265 if (!isset($auteurs[$id_auteur])) {
266 $auteurs[$id_auteur] = array();
267
268 include_spip('inc/accesrestreint');
269 $auteurs[$id_auteur] = array_flip(accesrestreint_liste_rubriques_exclues(true, $id_auteur, true));
270 }
271
272 // si la rubrique est presente, c'est qu'on ne peut pas la voir !
273 if (isset($auteurs[$id_auteur][$id_rubrique])) {
274 return false;
275 }
276
277 return true;
278
279 }
280
281
282 ?>