source: spip-zone/_plugins_/acces_restreint/trunk/public/accesrestreint.php @ 54015

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

bug sur les requetes des forums

File size: 8.0 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/**
11 * Critere {tout_voir} permet de deverouiller l'acces restreint sur une boucle
12 *
13 * @param unknown_type $idb
14 * @param unknown_type $boucles
15 * @param unknown_type $crit
16 */
17if (!function_exists('critere_tout_voir_dist')){
18function critere_tout_voir_dist($idb, &$boucles, $crit) {
19        $boucle = &$boucles[$idb];
20        $boucle->modificateur['tout_voir'] = true;
21}
22}
23function accesrestreint_pre_boucle(&$boucle){
24        if (!isset($boucle->modificateur['tout_voir'])){
25                $securise = false;
26                switch ($boucle->type_requete){
27                        case 'hierarchie':
28                        case 'rubriques':
29                        case 'articles':
30                        case 'breves':
31                        case 'syndication':
32                                $t = $boucle->id_table . '.id_rubrique';
33                                $boucle->select = array_merge($boucle->select, array($t)); // pour postgres
34                                $boucle->where[] = accesrestreint_rubriques_accessibles_where($t);
35                                $securise = true;
36                                break;
37                        case 'forums':
38                                $t = $boucle->id_table . '.id_rubrique';
39                                $boucle->select = array_merge($boucle->select, array($t)); // pour postgres
40                                $where = accesrestreint_rubriques_accessibles_where($t);
41               
42                                $t = $boucle->id_table . '.id_article';
43                                $boucle->select = array_merge($boucle->select, array($t)); // pour postgres
44                                $where = "array('OR',$where,".accesrestreint_articles_accessibles_where($t).")";
45               
46                                $t = $boucle->id_table . '.id_breve';
47                                $boucle->select = array_merge($boucle->select, array($t)); // pour postgres
48                                $boucle->where[] = "array('OR',$where,".accesrestreint_breves_accessibles_where($t).")";
49                                $securise = true;
50                                break;
51                        case 'evenements':
52                        case 'signatures':
53                                $t = $boucle->id_table . '.id_article';
54                                $boucle->select = array_merge($boucle->select, array($t));
55                                $boucle->where[] = accesrestreint_articles_accessibles_where($t);
56                                $securise = true;
57                                break;
58                        case 'syndic_articles':
59                                $t = $boucle->id_table . '.' . $boucle->primary;
60                                $boucle->select = array_merge($boucle->select, array($t));
61                                $boucle->where[] = accesrestreint_syndic_articles_accessibles_where($t);
62                                $securise = true;
63                                break;
64                        case 'documents':
65                                $t = $boucle->id_table . '.' . $boucle->primary;
66                                $boucle->select = array_merge($boucle->select, array($t));
67                                $boucle->where[] = accesrestreint_documents_accessibles_where($t);
68                                $securise = true;
69                                break;
70                }
71                if ($securise){
72                        $boucle->hash .= "if (!defined('_DIR_PLUGIN_ACCESRESTREINT')){
73                        \$link_empty = generer_url_ecrire('admin_vider'); \$link_plugin = generer_url_ecrire('admin_plugin');
74                        \$message_fr = 'La restriction d\'acc&egrave;s a ete desactiv&eacute;e. <a href=\"'.\$link_plugin.'\">Corriger le probl&egrave;me</a> ou <a href=\"'.\$link_empty.'\">vider le cache</a> pour supprimer les restrictions.';
75                        \$message_en = 'Acces Restriction is now unusable. <a href=\"'.\$link_plugin.'\">Correct this trouble</a> or <a href=\"'.generer_url_ecrire('admin_vider').'\">empty the cache</a> to finish restriction removal.';
76                        die(\$message_fr.'<br />'.\$message_en);
77                        }";
78                }
79        }
80        return $boucle;
81}
82
83
84/**
85 * Renvoyer le code de la condition where pour la liste des rubriques accessibles
86 *
87 * @param string $primary
88 * @return string
89 */
90function accesrestreint_rubriques_accessibles_where($primary,$not='NOT', $_publique=''){
91        if (!$_publique) $_publique = "!test_espace_prive()";
92        return "sql_in('$primary', accesrestreint_liste_rubriques_exclues($_publique), '$not')";
93}
94
95/**
96 * Renvoyer la condition where pour la liste des articles accessibles
97 *
98 * @param string $primary
99 * @return string
100 */
101function accesrestreint_articles_accessibles_where($primary, $_publique=''){
102        # hack : on utilise zzz pour eviter que l'optimiseur ne confonde avec un morceau de la requete principale
103        return "array('NOT IN','$primary','('.sql_get_select('zzza.id_article','spip_articles as zzza',".accesrestreint_rubriques_accessibles_where('zzza.id_rubrique','',$_publique).",'','','','',\$connect).')')";
104        #return array('SUBSELECT','id_article','spip_articles',array(".accesrestreint_rubriques_accessibles_where('id_rubrique').")))";
105}
106
107/**
108 * Renvoyer la condition where pour la liste des breves accessibles
109 *
110 * @param string $primary
111 * @return string
112 */
113function accesrestreint_breves_accessibles_where($primary, $_publique=''){
114        # hack : on utilise zzz pour eviter que l'optimiseur ne confonde avec un morceau de la requete principale
115        return "array('NOT IN','$primary','('.sql_get_select('zzzb.id_breve','spip_breves as zzzb',".accesrestreint_rubriques_accessibles_where('zzzb.id_rubrique','',$_publique).",'','','','',\$connect).')')";
116        #return "array('IN','$primary',array('SUBSELECT','id_breve','spip_breves',array(".accesrestreint_rubriques_accessibles_where('id_rubrique').")))";
117}
118
119/**
120 * Renvoyer le code de la condition where pour la liste des syndic articles accessibles
121 *
122 * @param string $primary
123 * @return string
124 */
125function accesrestreint_syndic_articles_accessibles_where($primary, $_publique=''){
126        # hack : on utilise zzz pour eviter que l'optimiseur ne confonde avec un morceau de la requete principale
127        return "array('NOT IN','$primary','('.sql_get_select('zzzs.id_syndic','spip_syndic as zzzs',".accesrestreint_rubriques_accessibles_where('zzzs.id_rubrique','',$_publique).",'','','','',\$connect).')')";
128        #return "array('IN','$primary',array('SUBSELECT','id_syndic','spip_syndic',array(".accesrestreint_rubriques_accessibles_where('id_rubrique').")))";
129}
130
131
132/**
133 * Renvoyer le code de la condition where pour la liste des forums accessibles
134 * on ne rend visible que les forums qui sont lies a un article, une breve ou une rubrique visible
135 *
136 * @param string $primary
137 * @return string
138 */
139function accesrestreint_forums_accessibles_where($primary, $_publique=''){
140        # hack : on utilise zzz pour eviter que l'optimiseur ne confonde avec un morceau de la requete principale
141        $where = "array('AND','zzzf.objet=\'rubrique\'',".accesrestreint_rubriques_accessibles_where('zzzf.id_objet','NOT',$_publique).")";
142        $where = "array('OR',$where,"
143                 ."array('AND','zzzf.objet=\'article\'',".accesrestreint_articles_accessibles_where('zzzf.id_objet',$_publique).")"
144                 .")";
145        $where = "array('OR',$where,"
146                 ."array('AND','zzzf.objet=\'breve\'',".accesrestreint_breves_accessibles_where('zzzf.id_objet',$_publique).")"
147                 .")";
148        $where = "array('OR',$where,sql_in('zzzf.objet',\"'rubrique','article','breve'\",'NOT',\$connect))";
149        return "array('IN','$primary','('.sql_get_select('zzzf.id_forum','spip_forum as zzzf',array($where),'','','','',\$connect).')')";
150}
151
152
153/**
154 * Renvoyer le code de la condition where pour la liste des documents accessibles
155 * on ne rend visible que les docs qui sont lies a un article, une breve ou une rubrique visible
156 *
157 * @param string $primary
158 * @return string
159 */
160function accesrestreint_documents_accessibles_where($primary, $_publique=''){
161        # hack : on utilise zzz pour eviter que l'optimiseur ne confonde avec un morceau de la requete principale
162        $where = "array('AND','zzzd.objet=\'rubrique\'',".accesrestreint_rubriques_accessibles_where('zzzd.id_objet','NOT',$_publique).")";
163        $where = "array('OR',$where,array('AND','zzzd.objet=\'article\'',".accesrestreint_articles_accessibles_where('zzzd.id_objet',$_publique)."))";
164        $where = "array('OR',$where,array('AND','zzzd.objet=\'breve\'',".accesrestreint_breves_accessibles_where('zzzd.id_objet',$_publique)."))";
165        $where = "array('OR',$where,array('AND','zzzd.objet=\'forum\'',".accesrestreint_forums_accessibles_where('zzzd.id_objet',$_publique)."))";
166        $where = "array('OR',$where,sql_in('zzzd.objet',\"'rubrique','article','breve','forum'\",'NOT',\$connect))";
167       
168        $where = "array('OR',
169        array('IN','$primary','('.sql_get_select('zzzd.id_document','spip_documents_liens as zzzd',array($where),'','','','',\$connect).')'),
170        array('NOT IN','$primary','('.sql_get_select('zzzd.id_document','spip_documents_liens as zzzd','','','','','',\$connect).')')
171        )";
172       
173        return $where;
174}
175
176
177/*      Champs declares pour la recherche */
178function accesrestreint_rechercher_liste_des_champs($tables) {
179        $tables['zone']['titre'] = 8;
180        $tables['zone']['descriptif'] = 3;
181        return $tables;
182}
183?>
Note: See TracBrowser for help on using the repository browser.