source: spip-zone/_plugins_/_stable_/forms/forms_et_tables_1_9_1/inc/autoriser_compat.php @ 7915

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

eviter l'erreur mysql sur la verif des admin restreints en 1.9.1

File size: 7.8 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2006                                                *
7 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
8 *                                                                         *
9 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
10 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
11\***************************************************************************/
12
13if (!defined("_ECRIRE_INC_VERSION")) return;
14
15
16define ('_DEBUG_AUTORISER', false);
17
18// surcharge possible de autoriser(), sinon autoriser_dist()
19// http://doc.spip.org/@autoriser
20if (!function_exists('autoriser')) {
21// http://doc.spip.org/@autoriser
22        function autoriser() {
23                $args = func_get_args(); 
24                return call_user_func_array('autoriser_dist', $args);
25        }
26}
27function auth_rubrique_compat($id_auteur, $statut)
28{
29        if ($statut != '0minirezo') return $statut;
30
31        $result = spip_query("SELECT id_rubrique FROM spip_auteurs_rubriques WHERE id_auteur=$id_auteur AND id_rubrique!='0'");
32
33        if (!spip_num_rows($result)) {
34                $GLOBALS['connect_toutes_rubriques'] = true;
35                return 0;
36        }
37
38        $rubriques = array();
39        for (;;) {
40                $r = array();
41                while ($row = spip_fetch_array($result)) {
42                        $id_rubrique = $row['id_rubrique'];
43                        $r[]= $rubriques[$id_rubrique] = $id_rubrique;
44                }
45                if (!$r) return $rubriques;
46                $r = join(',', $r);
47
48                $result = spip_query("SELECT id_rubrique FROM spip_rubriques WHERE id_parent IN ($r) AND id_rubrique NOT IN ($r)");
49        }
50}
51
52// API pour une fonction generique d'autorisation :
53// $qui est : vide (on prend alors auteur_session)
54//            un id_auteur (on regarde dans la base)
55//            un tableau auteur complet, y compris [restreint]
56// $faire est une action ('modifier', 'publier'...)
57// $type est un type d'objet ou nom de table ('article')
58// $id est l'id de l'objet sur lequel on veut agir
59// $opt (inutilise pour le moment) = options sous forme de tableau associatif
60// (par exemple pour preciser si l'autorisation concerne tel ou tel champ)
61//
62// Seul le premier argument est obligatoire
63//
64// http://doc.spip.org/@autoriser_dist
65function autoriser_dist($faire, $type='', $id=0, $qui = NULL, $opt = NULL) {
66        static $restreint = array();
67
68        // Qui ? auteur_session ?
69        if (!is_array($qui)) {
70                if (is_int($qui)) {
71                        $qui = spip_fetch_array(spip_query(
72                        "SELECT * FROM spip_auteurs WHERE id_auteur=".$qui));
73                } else {
74                        $qui = $GLOBALS['auteur_session'];
75                }
76        }
77
78        // Admins restreints, les verifier ici (pas generique mais...)
79        // Par convention $restreint est un array des rubriques autorisees
80        // (y compris leurs sous-rubriques), ou 0 si admin complet
81        if (is_array($qui)
82        AND $qui['statut'] == '0minirezo'
83        AND !isset($qui['restreint'])) {
84                if (!isset($restreint[$qui['id_auteur']])) {
85                        include_spip('inc/auth'); # pour auth_rubrique
86                        $restreint[$qui['id_auteur']] = auth_rubrique_compat($qui['id_auteur'], $qui['statut']);
87                }
88                $qui['restreint'] = $restreint[$qui['id_auteur']];
89        }
90
91        if (_DEBUG_AUTORISER) spip_log("autoriser $faire $type $id ?");
92
93        // Chercher une fonction d'autorisation explicite
94        if (
95        // 1. Sous la forme "autoriser_type_faire"
96                (
97                $type
98                AND $f = 'autoriser_'.$type.'_'.$faire
99                AND (function_exists($f) OR function_exists($f.='_dist'))
100                )
101
102        // 2. Sous la forme "autoriser_type"
103        // ne pas tester si $type est vide
104        OR (
105                $type
106                AND $f = 'autoriser_'.$type
107                AND (function_exists($f) OR function_exists($f.='_dist'))
108        )
109
110        // 3. Sous la forme "autoriser_faire"
111        OR (
112                $f = 'autoriser_'.$faire
113                AND (function_exists($f) OR function_exists($f.='_dist'))
114        )
115
116        // 4. Sinon autorisation generique
117        OR (
118                $f = 'autoriser_defaut'
119                AND (function_exists($f) OR function_exists($f.='_dist'))
120        )
121
122        )
123                $a = $f($faire,$type,intval($id),$qui,$opt);
124
125        if (_DEBUG_AUTORISER) spip_log("$f($faire,$type,$id): ".($a?'OK':'niet'));
126
127        return $a;
128}
129
130// Autorisation par defaut : les admins complets OK, les autres non
131// http://doc.spip.org/@autoriser_defaut_dist
132function autoriser_defaut_dist($faire, $type, $id, $qui, $opt) {
133        return
134                $qui['statut'] == '0minirezo'
135                AND !$qui['restreint'];
136}
137
138// Autoriser a publier dans la rubrique $id
139// http://doc.spip.org/@autoriser_rubrique_publierdans_dist
140function autoriser_rubrique_publierdans_dist($faire, $type, $id, $qui, $opt) {
141        return
142                ($qui['statut'] == '0minirezo')
143                AND (!$qui['restreint']
144                        ? true
145                        : in_array($id, $qui['restreint'])
146                );
147}
148
149// Autoriser a modifier la rubrique $id
150// = publierdans rubrique $id
151// http://doc.spip.org/@autoriser_rubrique_modifier_dist
152function autoriser_rubrique_modifier_dist($faire, $type, $id, $qui, $opt) {
153        return
154                autoriser('publierdans', 'rubrique', $id, $qui, $opt);
155}
156
157// Autoriser a modifier la breve $id
158// = admins & redac si la breve n'est pas publiee
159// = admins de rubrique parente si publiee
160// http://doc.spip.org/@autoriser_breve_modifier_dist
161function autoriser_breve_modifier_dist($faire, $type, $id, $qui, $opt) {
162        $s = spip_query(
163        "SELECT id_rubrique,statut FROM spip_breves WHERE id_breve="._q($id));
164        $r = spip_fetch_array($s);
165        return
166                ($r['statut'] == 'publie')
167                        ? autoriser('publierdans', 'rubrique', $r['id_rubrique'], $qui, $opt)
168                        : in_array($qui['statut'], array('0minirezo', '1comite'));
169}
170
171// Autoriser a modifier l'article $id
172// = publierdans rubrique parente
173// = ou statut 'prop,prepa' et $qui est auteur
174// http://doc.spip.org/@autoriser_article_modifier_dist
175function autoriser_article_modifier_dist($faire, $type, $id, $qui, $opt) {
176        $s = spip_query(
177        "SELECT id_rubrique,statut FROM spip_articles WHERE id_article="._q($id));
178        $r = spip_fetch_array($s);
179        return
180                autoriser('publierdans', 'rubrique', $r['id_rubrique'], $qui, $opt)
181                OR (
182                        in_array($qui['statut'], array('0minirezo', '1comite'))
183                        AND in_array($r['statut'], array('prop','prepa', 'poubelle'))
184                        AND spip_num_rows(auteurs_article($id, "id_auteur=".$qui['id_auteur']))
185                );
186}
187
188// Lire les stats ?
189// = tous les admins
190// http://doc.spip.org/@autoriser_voirstats_dist
191function autoriser_voirstats_dist($faire, $type, $id, $qui, $opt) {
192        return
193                $qui['statut'] == '0minirezo';
194}
195
196
197// Voir un objet
198// http://doc.spip.org/@autoriser_voir_dist
199function autoriser_voir_dist($faire, $type, $id, $qui, $opt) {
200        if (
201                ($qui['statut'] == '0minirezo')
202                OR ($type != 'article')
203        )
204                return true;
205
206        // un article 'prepa' ou 'poubelle' dont on n'est pas auteur : interdit
207        $s = spip_query(
208        "SELECT statut FROM spip_articles WHERE id_article="._q($id));
209        $r = spip_fetch_array($s);
210        return
211                in_array($r['statut'], array('prop', 'publie'))
212                OR spip_num_rows(auteurs_article($id, "id_auteur=".$qui['id_auteur']));
213}
214
215// Voir les revisions ?
216// = voir l'objet
217// http://doc.spip.org/@autoriser_voirrevisions_dist
218function autoriser_voirrevisions_dist($faire, $type, $id, $qui, $opt) {
219        return
220                autoriser('voir', $type, $id, $qui, $opt);
221}
222
223// Moderer le forum ?
224// = modifier l'objet correspondant (si forum attache a un objet)
225// = droits par defaut sinon (admin complet pour moderation complete)
226// http://doc.spip.org/@autoriser_modererforum_dist
227function autoriser_modererforum_dist($faire, $type, $id, $qui, $opt) {
228        return
229                autoriser('modifier', $type, $id, $qui, $opt);
230}
231
232// Modifier un forum ?
233// = jamais !
234// http://doc.spip.org/@autoriser_modifier_forum_dist
235function autoriser_modifier_forum_dist($faire, $type, $id, $qui, $opt) {
236        return
237                false;
238}
239
240
241// Moderer la petition ?
242// = modifier l'article correspondant
243// = droits par defaut sinon (admin complet pour moderation de tout)
244// http://doc.spip.org/@autoriser_moderer_petition_dist
245function autoriser_moderer_petition_dist($faire, $type, $id, $qui, $opt) {
246        return
247                autoriser('modifier', $type, $id, $qui, $opt);
248}
249
250?>
Note: See TracBrowser for help on using the repository browser.