[PLUGINS] +acces restreint
[ptitvelo/web/www.git] / www / plugins / accesrestreint_3_5 / public / accesrestreint.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
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 */
17 if (!function_exists('critere_tout_voir_dist')){
18 function critere_tout_voir_dist($idb, &$boucles, $crit) {
19 $boucle = &$boucles[$idb];
20 $boucle->modificateur['tout_voir'] = true;
21 }
22 }
23 function accesrestreint_pre_boucle(&$boucle){
24 if (!isset($boucle->modificateur['tout_voir'])){
25 $securise = false;
26 switch ($boucle->type_requete){
27 case 'hierarchie':
28 case 'articles':
29 case 'breves':
30 case 'syndication':
31 $t = $boucle->id_table . '.id_rubrique';
32 $boucle->select = array_merge($boucle->select, array($t)); // pour postgres
33 $boucle->where[] = accesrestreint_rubriques_accessibles_where($t);
34 $securise = true;
35 break;
36 case 'evenements':
37 case 'petitions':
38 $t = $boucle->id_table . '.id_article';
39 $boucle->select = array_merge($boucle->select, array($t));
40 $boucle->where[] = accesrestreint_articles_accessibles_where($t);
41 $securise = true;
42 break;
43 case 'signatures':
44 // ajouter une jointure sur petitions si besoin
45 $t = array_search("spip_petitions", $boucle->from);
46 if (!$t) $t = trouver_jointure_champ("id_petition", $boucle);
47 $t = $t . '.id_article';
48 $boucle->select = array_merge($boucle->select, array($t));
49 $boucle->where[] = accesrestreint_articles_accessibles_where($t);
50 $securise = true;
51 break;
52 default :
53 if (function_exists($accessible_where = "accesrestreint_".$boucle->type_requete."_accessibles_where")){
54 $t = $boucle->id_table . '.' . $boucle->primary;
55 $boucle->select = array_merge($boucle->select, array($t));
56 $boucle->where[] = $accessible_where($t);
57 $securise = true;
58 }
59 break;
60 }
61 if ($securise){
62 $boucle->hash .= "if (!defined('_DIR_PLUGIN_ACCESRESTREINT')){
63 \$link_empty = generer_url_ecrire('admin_vider'); \$link_plugin = generer_url_ecrire('admin_plugin');
64 \$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.';
65 \$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.';
66 die(\$message_fr.'<br />'.\$message_en);
67 }";
68 }
69 }
70 return $boucle;
71 }
72
73
74 /**
75 * Renvoyer le code de la condition where pour la liste des rubriques accessibles
76 *
77 * @param string $primary
78 * @return string
79 */
80 function accesrestreint_rubriques_accessibles_where($primary,$not='NOT', $_publique=''){
81 if (!$_publique) $_publique = "!test_espace_prive()";
82 return "sql_in('$primary', accesrestreint_liste_rubriques_exclues($_publique), '$not')";
83 }
84
85 /**
86 * Renvoyer la condition where pour la liste des articles accessibles
87 *
88 * @param string $primary
89 * @return string
90 */
91 function accesrestreint_articles_accessibles_where($primary, $_publique=''){
92 # hack : on utilise zzz pour eviter que l'optimiseur ne confonde avec un morceau de la requete principale
93 return "array('NOT IN','$primary','('.sql_get_select('zzza.id_article','spip_articles as zzza',".accesrestreint_rubriques_accessibles_where('zzza.id_rubrique','',$_publique).",'','','','',\$connect).')')";
94 #return array('SUBSELECT','id_article','spip_articles',array(".accesrestreint_rubriques_accessibles_where('id_rubrique').")))";
95 }
96
97 /**
98 * Renvoyer la condition where pour la liste des breves accessibles
99 *
100 * @param string $primary
101 * @return string
102 */
103 function accesrestreint_breves_accessibles_where($primary, $_publique=''){
104 # hack : on utilise zzz pour eviter que l'optimiseur ne confonde avec un morceau de la requete principale
105 return "array('NOT IN','$primary','('.sql_get_select('zzzb.id_breve','spip_breves as zzzb',".accesrestreint_rubriques_accessibles_where('zzzb.id_rubrique','',$_publique).",'','','','',\$connect).')')";
106 #return "array('IN','$primary',array('SUBSELECT','id_breve','spip_breves',array(".accesrestreint_rubriques_accessibles_where('id_rubrique').")))";
107 }
108
109 /**
110 * Renvoyer le code de la condition where pour la liste des syndic articles accessibles
111 *
112 * @param string $primary
113 * @return string
114 */
115 function accesrestreint_syndic_articles_accessibles_where($primary, $_publique=''){
116 # hack : on utilise zzz pour eviter que l'optimiseur ne confonde avec un morceau de la requete principale
117 return "array('NOT IN','$primary','('.sql_get_select('zzzs.id_syndic','spip_syndic as zzzs',".accesrestreint_rubriques_accessibles_where('zzzs.id_rubrique','',$_publique).",'','','','',\$connect).')')";
118 #return "array('IN','$primary',array('SUBSELECT','id_syndic','spip_syndic',array(".accesrestreint_rubriques_accessibles_where('id_rubrique').")))";
119 }
120
121
122 /**
123 * Renvoyer le code de la condition where pour la liste des forums accessibles
124 * on ne rend visible que les forums qui sont lies a un article, une breve ou une rubrique visible
125 *
126 * @param string $primary
127 * @return string
128 */
129 function accesrestreint_forums_accessibles_where($primary, $_publique=''){
130 # hack : on utilise zzz pour eviter que l'optimiseur ne confonde avec un morceau de la requete principale
131 $where = "array('AND','zzzf.objet=\'rubrique\'',".accesrestreint_rubriques_accessibles_where('zzzf.id_objet','NOT',$_publique).")";
132 $where = "array('OR',$where,"
133 ."array('AND','zzzf.objet=\'article\'',".accesrestreint_articles_accessibles_where('zzzf.id_objet',$_publique).")"
134 .")";
135 $where = "array('OR',$where,"
136 ."array('AND','zzzf.objet=\'breve\'',".accesrestreint_breves_accessibles_where('zzzf.id_objet',$_publique).")"
137 .")";
138 $where = "array('OR',$where,sql_in('zzzf.objet',\"'rubrique','article','breve'\",'NOT',\$connect))";
139 return "array('IN','$primary','('.sql_get_select('zzzf.id_forum','spip_forum as zzzf',array($where),'','','','',\$connect).')')";
140 }
141
142
143 /**
144 * Renvoyer le code de la condition where pour la liste des documents accessibles
145 * on ne rend visible que les docs qui sont lies a un article, une breve ou une rubrique visible
146 *
147 * @param string $primary
148 * @return string
149 */
150 function accesrestreint_documents_accessibles_where($primary, $_publique=''){
151 # hack : on utilise zzz pour eviter que l'optimiseur ne confonde avec un morceau de la requete principale
152 $where = "array('AND','zzzd.objet=\'rubrique\'',".accesrestreint_rubriques_accessibles_where('zzzd.id_objet','NOT',$_publique).")";
153 $where = "array('OR',$where,array('AND','zzzd.objet=\'article\'',".accesrestreint_articles_accessibles_where('zzzd.id_objet',$_publique)."))";
154 $where = "array('OR',$where,array('AND','zzzd.objet=\'breve\'',".accesrestreint_breves_accessibles_where('zzzd.id_objet',$_publique)."))";
155 $where = "array('OR',$where,array('AND','zzzd.objet=\'forum\'',".accesrestreint_forums_accessibles_where('zzzd.id_objet',$_publique)."))";
156 $where = "array('OR',$where,sql_in('zzzd.objet',\"'rubrique','article','breve','forum'\",'NOT',\$connect))";
157
158 $where = "array('OR',
159 array('IN','$primary','('.sql_get_select('zzzd.id_document','spip_documents_liens as zzzd',array($where),'','','','',\$connect).')'),
160 array('NOT IN','$primary','('.sql_get_select('zzzd.id_document','spip_documents_liens as zzzd','','','','','',\$connect).')')
161 )";
162
163 return $where;
164 }
165
166
167 /* Champs declares pour la recherche */
168 function accesrestreint_rechercher_liste_des_champs($tables) {
169 $tables['zone']['titre'] = 8;
170 $tables['zone']['descriptif'] = 3;
171 return $tables;
172 }
173 ?>