source: spip-zone/_plugins_/_dev_/acces_groupes/inc/accesgroupes_fonctions.php @ 5862

Last change on this file since 5862 was 5862, checked in by cy_altern@…, 15 years ago

début du filtrage complet de l'espace privé par surcharge des requêtes SQL : plus de rubriques restreintes *presque partout*, reste les articles, les sites et les forums...

File size: 12.8 KB
Line 
1<?php
2//spip_log('inclusion accesgroupes_boucles = OK!');
3
4// fonctions utilisées pour la surcharge des BOUCLES
5//              merci à Cedric cedric.morin@yterium.com pour le code initial  (plugin acces_restreint)
6   include_spip('base/db_mysql');
7   include_spip('base/abstract_sql');
8   include_spip('inc/rubriques');
9
10
11// inclure le fichier de redéfinitions des BOUCLES
12         include_spip('inc/accesgroupes_boucles');
13         
14
15// fct pour construire et renvoyer le tableau des rubriques à accès restreint dans la partie PUBLIQUE
16//               boucler dans l'arborescence des rubriques en commençant par la racine (secteurs en 1ers)
17//               pour remplir le tableau des rubriques restreintes en utilisant le principe d'héritage des restrictions
18        function accesgroupes_liste_rubriques_restreintes($id_parent = 0, $prive_public = 'public'){
19//echo '<br>debut accesgroupes_liste_rubriques_restreintes $prive_public = '.$prive_public;
20                                 $id_parent = intval($id_parent); // securite                                   
21                                 static $Trub_restreintes; // nécessaire pour que la suite ne soit éxécutée qu'une fois par hit (même si on à n BOUCLES)
22                 if (!is_array($Trub_restreintes)) {
23                          $Trub_restreintes = array();
24                        // attaquer à la racine pour mettre tout de suite les éventuels secteurs restreints dans le tableau ce qui accélèrera la suite
25                                $sql1 = "SELECT id_rubrique, id_parent, id_secteur FROM spip_rubriques";       
26                                $result1 = spip_query($sql1);
27//echo '<br>mysql_error $sql1 = '.mysql_error();                                         
28                                while ($row1 = spip_fetch_array($result1)) {
29                                                         $rub_ec = $row1['id_rubrique'];
30                                                                 $parent_ec = $row1['id_parent'];
31                                                                 $sect_ec = $row1['id_secteur'];
32                                                // si le parent ou le secteur est déja dans le tableau : vu le principe d'héritage pas la peine d'aller plus loin :)
33                                                                        if (accesgroupes_verif_acces($rub_ec, $prive_public) == 1 OR accesgroupes_verif_acces($rub_ec, $prive_public) == 2) {
34                                                                                 $Trub_restreintes[] = $rub_ec;
35                                                                          }
36                                }
37                                         }
38//echo '<br>tableau des rubriques = ';
39//print_r($Trub_restreintes);
40                                         return $Trub_restreintes;
41        }
42
43//fct pour renvoyer le tableau des articles appartenant aux rubriques à accès restreint
44  function accesgroupes_liste_articles_restreints($prive_public = 'public') {
45                                 static $Tart_restreints; // ainsi la suite ne sera effectuée qu'une fois par hit
46                                 if (!is_array($Tart_restreints)) {
47                                                $Tart_restreints = array();
48                                  $Trub_rest = accesgroupes_liste_rubriques_restreintes('', $prive_public);
49                                  $result3 = spip_query("SELECT id_article, id_rubrique FROM spip_articles");
50                                  while ($row3 = spip_fetch_array($result3)) {
51                                                          if (in_array($row3['id_rubrique'], $Trub_rest)) {
52                                                                         $Tart_restreints[] = $row3['id_article'];
53                                                          }
54                                  }
55                                 }
56                                 return $Tart_restreints;
57  } 
58
59// fct pour renvoyer le tableau des brèves appartenant à des rubriques à accès restreint
60  function accesgroupes_liste_breves_restreintes($prive_public = 'public') {
61                                         static $Tbrev_restreintes;
62                                 if (!is_array($Tbrev_restreintes)) {
63                                                        $Tbrev_restreintes = array();
64                                                        $Trub_rest = accesgroupes_liste_rubriques_restreintes('', $prive_public);
65                                                        $result4 = spip_query("SELECT id_breve, id_rubrique FROM spip_breves");
66                                                        while ($row4 = spip_fetch_array($result4)) {
67                                                          if (in_array($row4['id_rubrique'], $Trub_rest)) {
68                                                                         $Tbrev_restreintes[] = $row4['id_breve'];
69                                                          }
70                                                        }
71                                         }
72                                 return $Tbrev_restreintes;
73        }
74
75// fct pour renvoyer le tableau des forums liés à un élément appartenant à une rubrique restreinte
76//               (puissant le Cedric pour maximiser ce qui est fait par la requete mySQL !)
77        function accesgroupes_liste_forums_restreints($prive_public = 'public') {
78                 static $Tforum_restreints;
79                 if (!is_array($Tforum_restreints)) {
80                                $Tforum_restreints = array();
81                                // rattaches aux rubriques
82                                $liste_rub = accesgroupes_liste_rubriques_restreintes('', $prive_public);
83                                $where = calcul_mysql_in('id_rubrique', join(",",$liste_rub));
84                                // rattaches aux articles
85                                $liste_art = accesgroupes_liste_articles_restreints($prive_public);
86                                $where .= " OR " . calcul_mysql_in('id_article', join(",",$liste_art));
87                                // rattaches aux breves
88                                $liste_breves = accesgroupes_liste_breves_restreintes($prive_public);
89                                $where .= " OR " . calcul_mysql_in('id_breve', join(",",$liste_art));
90       
91                                $s = spip_query("SELECT id_forum FROM spip_forum WHERE $where");
92                                while ($row = spip_fetch_array($s)){
93                                                        $Tforum_restreints[] = $row['id_forum'];
94                                }
95                 }
96                 return $Tforum_restreints;
97        }
98
99// fct pour renvoyer le tableau des signatures des articles appartenant à une rubrique restreinte
100  function accesgroupes_liste_signatures_restreintes($prive_public = 'public') {
101                 static $Tsignatures_restreintes;
102                 if (!is_array($Tsignatures_restreintes)){
103                                $Tsignatures_restreintes = array();
104                                // rattaches aux articles
105                                $liste_art = accesgroupes_liste_articles_restreints($prive_public);
106                                $where = calcul_mysql_in('id_article', join(",",$liste_art));
107                                $s = spip_query("SELECT id_signature FROM spip_signatures WHERE $where");
108                                while ($row = spip_fetch_array($s)){
109                                                        $Tsignatures_restreintes[] = $row['id_signature'];
110                                }
111                 }
112                 return $Tsignatures_restreintes;
113        }
114
115// fct pour renvoyer le tableau des documents liés à un élément appartenant à une rubrique restreinte
116//               subtil la méthode de stocker les valeurs comme clés d'un tableau pour ne pas doublonner les valeurs
117//               avec le petit array_keys() qui va bien pour récupérer le tableau de valeurs à la fin !
118  function accesgroupes_liste_documents_restreints($prive_public = 'public') {
119                 static $Tdocuments_restreints;
120                 if (!is_array($Tdocuments_restreints)){
121                                $Tdocuments_restreints = array();
122                                // rattaches aux articles
123                                $liste_art = accesgroupes_liste_articles_restreints($prive_public);
124                                $where = calcul_mysql_in('id_article', join(",",$liste_art));
125                                $s = spip_query("SELECT id_document FROM spip_documents_articles WHERE $where");
126                                while ($row = spip_fetch_array($s)){
127                                                        $Tdocuments_restreints[$row['id_document']]=1;
128                                }
129                                // rattaches aux rubriques
130                                $liste_rub = accesgroupes_liste_rubriques_restreintes('', $prive_public);
131                                $where = calcul_mysql_in('id_rubrique', join(",",$liste_rub));
132                                $s = spip_query("SELECT id_document FROM spip_documents_rubriques WHERE $where");
133                                while ($row = spip_fetch_array($s)){
134                                                        $Tdocuments_restreints[$row['id_document']]=1;
135                                }
136                                // rattaches aux breves
137                                $liste_breves = accesgroupes_liste_breves_restreintes($prive_public);
138                                $where = calcul_mysql_in('id_breve', join(",",$liste_breves));
139                                $s = spip_query("SELECT id_document FROM spip_documents_breves WHERE $where");
140                                while ($row = spip_fetch_array($s)){
141                                                        $Tdocuments_restreints[$row['id_document']]=1;
142                                }
143                                // rattaches aux syndic
144                                $liste_syn = accesgroupes_liste_syndics_restreints($prive_public);
145                                $where = calcul_mysql_in('id_syndic', join(",",$liste_syn));
146                                $s = spip_query("SELECT id_document FROM spip_documents_syndic WHERE $where");
147                                while ($row = spip_fetch_array($s)){
148                                                        $Tdocuments_restreints[$row['id_document']]=1;
149                                }
150                                $Tdocuments_restreints = array_keys($Tdocuments_restreints);
151                 }
152                 return $Tdocuments_restreints; 
153  } 
154
155// fct pour renvoyer le tableau des rubriques syndiquées appartenants à une rubrique restreinte
156  function accesgroupes_liste_syndics_restreints($prive_public = 'public') {
157                 static $Tsyndics_restreints;
158                 if (!is_array($Tsyndics_restreints)){
159                                $Tsyndics_restreints = array();
160                                $liste_rub = accesgroupes_liste_rubriques_restreintes('', $prive_public);
161                                $where = calcul_mysql_in('id_rubrique', join(",",$liste_rub));
162                                $s = spip_query("SELECT id_syndic FROM spip_syndic WHERE $where");
163                                while ($row = spip_fetch_array($s)){
164                                        $Tsyndics_restreints[] = $row['id_syndic'];
165                                }
166                 }
167                 return $Tsyndics_restreints;
168        }       
169
170// fct pour renvoyer le tableau des articles syndiqués appartenant à une rubrique restreinte
171  function accesgroupes_liste_syndic_articles_restreints($prive_public = 'public'){
172                 static $Tsyndic_articles_restreints;
173                 if (!is_array($Tsyndic_articles_restreints)){
174                                $Tsyndic_articles_restreints = array();
175                                $liste_syn = accesgroupes_liste_syndics_restreints($prive_public);
176                                $where = calcul_mysql_in('id_syndic', join(",",$liste_syn));
177                                $s = spip_query("SELECT id_syndic_article FROM spip_syndic_articles WHERE $where");
178                                while ($row = spip_fetch_array($s)){
179                                                        $Tsyndic_articles_restreints[] = $row['id_syndic_article'];
180                                }
181                 }
182                 return $Tsyndic_articles_restreints;
183        }
184       
185       
186// fonctions de filtrage :      plus performant à priori : liste des éléments restreints uniquement
187// -> condition NOT IN
188
189// filtrage RUBRIQUES
190        function accesgroupes_rubriques_accessibles_where($primary, $prive_public = 'public'){
191//echo '<br>accesgroupes_rubriques_accessibles_where => $prive_public = '.$prive_public;                         
192                                         $liste = accesgroupes_liste_rubriques_restreintes('', $prive_public);
193                                         return calcul_mysql_in($primary, join(",",$liste),"NOT");
194        }
195
196// filtrage ARTICLES
197  function accesgroupes_articles_accessibles_where($primary, $prive_public = 'public'){
198                                         $liste = accesgroupes_liste_articles_restreints($prive_public);
199                                         return calcul_mysql_in($primary, join(",",$liste),"NOT");
200        }
201
202// filtrage BREVES
203  function accesgroupes_breves_accessibles_where($primary, $prive_public = 'public'){
204                                         $liste = accesgroupes_liste_breves_restreintes($prive_public);
205                                         return calcul_mysql_in($primary, join(",",$liste),"NOT");
206        }
207       
208// filtrage FORUMS
209        function accesgroupes_forums_accessibles_where($primary, $prive_public = 'public'){
210                                         $liste = accesgroupes_liste_forums_restreints($prive_public);
211                                         return calcul_mysql_in($primary, join(",",$liste),"NOT");
212        }
213
214// filtrage SIGNATURES
215        function accesgroupes_signatures_accessibles_where($primary, $prive_public = 'public'){
216                                         $liste = accesgroupes_liste_signatures_restreintes($prive_public);
217                                         return calcul_mysql_in($primary, join(",",$liste),"NOT");
218        }
219
220// filtrage DOCUMENTS
221  function accesgroupes_documents_accessibles_where($primary, $prive_public = 'public'){
222                                         $liste = accesgroupes_liste_documents_restreints($prive_public);
223                                         return calcul_mysql_in($primary, join(",",$liste),"NOT");
224        }
225
226// filtrage SYNDICS
227  function accesgroupes_syndics_accessibles_where($primary, $prive_public = 'public'){
228                                         $liste = accesgroupes_liste_syndics_restreints($prive_public);
229                                         return calcul_mysql_in($primary, join(",",$liste),"NOT");
230        }
231
232// filtrage ARTICLES SYNDIQUES
233        function accesgroupes_syndic_articles_accessibles_where($primary, $prive_public = 'public'){
234                                         $liste = accesgroupes_liste_syndic_articles_restreints($prive_public);
235                                         return calcul_mysql_in($primary, join(",",$liste),"NOT");
236        }
237
238       
239// filtre de securisation des squelettes
240// utilise avec [(#REM|accesgroupes_securise_squelette)]
241// evite divulgation d'info si plugin desactive
242// par erreur fatale
243        function accesgroupes_securise_squelette($letexte){
244                                         return "!!! plantage du plugin accesgroupes !!!";
245        }
246 
247       
248// filtre de test pour savoir si l'acces à un article est restreint dans la partie PUBLIQUE
249        function accesgroupes_article_restreint($id_article) {
250                 if (@in_array($id_article, accesgroupes_liste_articles_restreints())) {
251                          return true; //; <INCLURE{fond=accesgroupes_login}{skel=#SQUELETTE}> '#LOGIN_PUBLIC '
252                 }
253                 else {
254                                  return false;
255                 }
256        }
257
258// filtre de test pour savoir si l'acces à une rubrique est restreint
259        function accesgroupes_rubrique_restreinte($id_rubrique) {
260                 if (@in_array($id_rubrique, accesgroupes_liste_rubriques_restreintes())) {
261                          return true; //;
262           }
263                 else {
264                                  return false;
265                 }
266        }
267       
268// filtre de test pour savoir si l'accès à une brève est restreint
269        function accesgroupes_breve_restreinte($id_breve) {
270                                         if (@in_array($id_breve, accesgroupes_liste_breves_restreintes())) {
271                                                        return ' #LOGIN_PUBLIC '; //true;
272                                         }
273                                         else {
274                                                                return false;
275                                         }
276        } 
277       
278?>
Note: See TracBrowser for help on using the repository browser.