source: spip-zone/_plugins_/macrosession/trunk/inc/_autoriser.php @ 113654

Last change on this file since 113654 was 113654, checked in by jluc@…, 5 months ago

Refactoring du calcul des arguments calculés pour #_AUTORISER et aussi désormais pour #_SESSION
Les arguments des filtres utilisés par #_SESSION peuvent être des valeurs de l'environnement, des #GET{variable} et des #CHAMPS de la boucle courante.
Si un post-traitements est associé à un #CHAMP de boucle, il faut l'enlever avec une étoile #CHAMP* (le traitement de sécu reste). S'il y a besoin du traitement, il faut faire un #SET préalable, puis utiliser le #GET.
( Maieul : on peut surement faire #_SESSION_SI{id_auteur,==,#ID_AUTEUR} ... #_SESSION_FIN )

File size: 4.0 KB
Line 
1<?php
2if (!defined('_ECRIRE_INC_VERSION')) {
3        return;
4}
5
6function autoriser_testotor_dist($action, $type, $id) {
7        echo "<span style='color:mediumblue; background-color:lightblue'>autoriser($action, $type, $id)</span><br>";
8        return true;
9}
10
11function compile_appel_macro_autoriser ($p) {
12        if (!existe_argument_balise(1, $p)) {
13                erreur_squelette ("Il faut au moins un argument à la balise #_AUTORISER", $p);
14                return "''";
15        };
16        $autorisation = interprete_argument_balise(1, $p);
17
18        if (erreur_argument_macro ('#_AUTORISER_SI', 'autorisation', $autorisation, $p))
19                return "''";
20
21        // l'autorisation peut être appelé avec 0, un ou 2 arguments
22        if (!existe_argument_balise(2, $p))
23                return "autoriser('.\"$autorisation\".')";
24
25        $type = trim_quote(interprete_argument_balise (2, $p));
26        if (erreur_argument_macro ("#_AUTORISER_SI{ $autorisation,...}", 'type', $type, $p))
27                return "''";
28
29        if (!existe_argument_balise(3, $p))
30                return "autoriser('.\"$autorisation\".', '.\"$type\".')";
31
32        // Le 3eme argument peut être une constante ou un argument calculé
33        // Il y a 4 possibilités de passer des id calculées à #_AUTORISER_SI :
34        // - Appels directs de #BALISE ou #GET{variable} (non recommandé)
35        // - Passer 'env', 'boucle' et 'url' pour chercher l'id_ associé au type dans l'env reçu, dans la boucle immédiatement englobante ou dans l'url
36        // Ex : #_AUTORISER{modifier,article,env} ou #_AUTORISER{modifier,article,boucle} ou #_AUTORISER{modifier,article,url}
37        //
38
39        $id = trim_quote(interprete_argument_balise (3, $p));
40
41        if (!existe_argument_balise(4, $p)) {
42                $id_type = "'id_".substr($type,1);                      //      TODO : utiliser API spip pour les cas spéciaux
43
44                // Gérer la présence de motclés env, boucle, url : désormais obsolète ?
45                switch($id) {
46                        case "'env'" :
47                                $ret = "autoriser('.\"$autorisation\".', '.\"$type\".', '.\"macrosession_pipe({\$Pile[0][$id_type]})\".')";
48                                if (isset($_GET['debug']))
49                                        echo "Avec 'env' : compile appel autoriser donne <pre>$ret</pre><br>";
50                                return $ret;
51
52                        case "'boucle'" :
53                                $ret = "autoriser('.\"$autorisation\".', '.\"$type\".', '.\"macrosession_pipe({\$Pile[\$SP][$id_type]})\".')";
54                                if (isset($_GET['debug']))
55                                        echo "Avec 'boucle' : compile appel autoriser donne <pre>$ret</pre><br>";
56                                return $ret;
57
58                        case "'url'" :
59                                if (isset($_GET['debug']))
60                                        echo "Avec 'url' : compile appel autoriser($autorisation, $type, _request($id_type)<br>";
61                                $ret = "autoriser('.\"$autorisation\".', '.\"$type\".', '.\"macrosession_pipe(_request($id_type))\".')";
62                                return $ret;
63
64                        default :
65                                // préparer l'expression compilée à être réinjectée (code introspectivement modifié)
66                                $id = reinjecte_expression_compilee($id);
67
68                                // TODO : Récupérer les erreurs de syntaxe
69                                // Avant on avait une reconnaissance plus ciblée (décompilation de #UNE_BALISE et #GET{unevariable}) suivis de :
70                                // if (erreur_argument_macro ("#_AUTORISER_SI{ $autorisation, $type, ...}", 'id', $id, $p, 'contexte_ok') return "''";
71
72                                return "autoriser('.\"$autorisation\".', '.\"$type\".', '.\"$id\".')";
73
74                }
75        };
76
77        // ATTENTION : Les appels à #_AUTORISER_SI avec arguments $qui et $opt n'ont jamais été testés
78        $qui = trim_quote(interprete_argument_balise (4, $p));
79        if (erreur_argument_macro ("#_AUTORISER_SI{ $autorisation, $type, $id, ...}", 'qui', $qui, $p))
80                return "''";
81        if (!existe_argument_balise(5, $p))
82                return "autoriser('.\"$autorisation\".', ' .\"$type\" .', ' .\"$id\" .', ' .\"$qui\" .')";
83
84        $opt = trim_quote(interprete_argument_balise (5, $p));
85        if (erreur_argument_macro ('#_AUTORISER_SI', 'opt', $opt, $p))
86                return "''";
87        return "autoriser('.\"$autorisation\".', '.\"$type\" .', ' .\"$id\" .', ' .\"$qui\" .', ' .\"$opt\" .')";
88}
89
90function balise__AUTORISER_SI_dist($p) {
91        $p->interdire_scripts = false;
92
93        // Appelé uniquement au recalcul
94        $p->code = V_OUVRE_PHP . 'if ('.compile_appel_macro_autoriser ($p).') { ' . V_FERME_PHP;
95        return $p;
96}
97
98function balise__AUTORISER_SINON_dist($p) {
99        return balise__SESSION_SINON_dist($p);
100}
101
102function balise__AUTORISER_FIN_dist($p) {
103        return balise__SESSION_FIN_dist($p);
104}
105
Note: See TracBrowser for help on using the repository browser.