source: spip-zone/_plugins_/formidable/trunk/formidable_pipelines.php @ 87484

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

ajouter la protection nospam de base aux formulaires formidables

File size: 5.5 KB
Line 
1<?php
2
3/**
4 * Utilisation de pipelines
5 *
6 * @package SPIP\Formidable\Pipelines
7**/
8
9// Sécurité
10if (!defined("_ECRIRE_INC_VERSION")) return;
11
12
13
14define('_RACCOURCI_MODELE_FORMIDABLE',
15         '(<(formulaire\|formidable|formidable|form)' # <modele
16        .'([0-9]*)\s*' # id
17        .'([|](?:<[^<>]*>|[^>])*)?' # |arguments (y compris des tags <...>)
18        .'>)' # fin du modele >
19        .'\s*(<\/a>)?' # eventuel </a>
20       );
21
22/**
23 * Ajouter la protection NoSpam de base a formidable (jeton)
24 *
25 * @param $formulaires
26 * @return array
27 */
28function formidable_nospam_lister_formulaires($formulaires){
29        $formulaires[] = 'formidable';
30        return $formulaires;
31}
32
33/**
34 * Trouver les liens <form
35 * @param $texte
36 * @return array
37 */
38function formidable_trouve_liens($texte){
39        $formulaires = array();
40        if (preg_match_all(','._RACCOURCI_MODELE_FORMIDABLE.',ims', $texte, $regs, PREG_SET_ORDER)){
41                foreach ($regs as $r) {
42                        $id_formulaire = 0;
43                        if ($r[2]=="formidable")
44                                $id_formulaire = $r[3];
45                        elseif ($r[2]=="form")
46                                $id_formulaire = sql_getfetsel("id_formulaire","spip_formulaires","identifiant=".sql_quote("form".$r[3]));
47                        elseif ($r[2]=="formulaire|formidable"){
48                                $args = ltrim($r[4],"|");
49                                $args = explode("=",$args);
50                                $args = $args[1];
51                                $args = explode("|",$args);
52                                $args = trim(reset($args));
53                                if (is_numeric($args))
54                                        $id_formulaire = intval($args);
55                                else
56                                        $id_formulaire = sql_getfetsel("id_formulaire","spip_formulaires","identifiant=".sql_quote($args));
57                        }
58                        if ($id_formulaire = intval($id_formulaire))
59                                $formulaires[$id_formulaire] = $id_formulaire;
60                }
61        }
62        return $formulaires;
63}
64
65/**
66 * Associer/dissocier les formulaires a un objet qui les utilise (ou ne les utilise plus)
67 * @param $flux
68 * @return mixed
69 */
70function formidable_post_edition($flux){
71        if ($table = $flux['args']['table']
72          AND $id_objet = intval($flux['args']['id_objet'])
73                AND $primary = id_table_objet($table)
74          AND $row = sql_fetsel("*",$table,"$primary=".intval($id_objet))){
75
76                $objet = objet_type($table);
77                $contenu = implode(' ',$row);
78                $formulaires = formidable_trouve_liens($contenu);
79                include_spip("action/editer_liens");
80                $deja = objet_trouver_liens(array("formulaire"=>"*"),array($objet=>$id_objet));
81                $del = array();
82                if (count($deja)){
83                        foreach($deja as $l){
84                                if (isset($formulaires[$l['id_formulaire']]))
85                                        unset($formulaires[$l['id_formulaire']]);
86                                else
87                                        $del[] = $l['id_formulaire'];
88                        }
89                }
90                if (count($formulaires)){
91                        objet_associer(array("formulaire"=>$formulaires),array($objet=>$id_objet));
92                }
93                if (count($del)){
94                        objet_dissocier(array("formulaire"=>$del),array($objet=>$id_objet));
95                }
96        }
97        return $flux;
98}
99
100/**
101 * Afficher les formulaires utilises par un objet
102 * @param $flux
103 * @return mixed
104 */
105function formidable_affiche_droite($flux){
106        if ($e = trouver_objet_exec($flux['args']['exec'])
107                AND isset($e['type'])
108                AND $objet = $e['type']
109                AND isset($flux['args'][$e['id_table_objet']])
110          AND $id = $flux['args'][$e['id_table_objet']]
111          AND sql_countsel("spip_formulaires_liens","objet=".sql_quote($objet)." AND id_objet=".intval($id))){
112
113                $flux['data'] .= recuperer_fond('prive/squelettes/inclure/formulaires_lies',array('objet'=>$objet,'id_objet'=>$id));
114        }
115        return $flux;
116}
117
118/**
119 * Optimiser la base de donnée en enlevant les liens de formulaires supprimés
120 *
121 * @pipeline optimiser_base_disparus
122 * @param array $flux
123 *     Données du pipeline
124 * @return array
125 *     Données du pipeline
126 */
127function formidable_optimiser_base_disparus($flux){
128        // Les formulaires qui sont à la poubelle
129        $res = sql_select(
130                'id_formulaire AS id',
131                'spip_formulaires',
132                'statut='.sql_quote('poubelle')
133        );
134
135        // On génère la suppression
136        $flux['data'] += optimiser_sansref('spip_formulaires', 'id_formulaire', $res);
137
138
139        # les reponses qui sont associees a un formulaire inexistant
140        $res = sql_select("R.id_formulaire AS id",
141                        "spip_formulaires_reponses AS R
142                        LEFT JOIN spip_formulaires AS F
143                          ON R.id_formulaire=F.id_formulaire",
144                         "R.id_formulaire > 0
145                         AND F.id_formulaire IS NULL");
146
147        $flux['data'] += optimiser_sansref('spip_formulaires_reponses', 'id_formulaire', $res);
148
149
150        // Les réponses qui sont à la poubelle
151        $res = sql_select(
152                'id_formulaires_reponse AS id',
153                'spip_formulaires_reponses',
154                sql_in('statut',array('refuse','poubelle'))
155        );
156       
157        // On génère la suppression
158        $flux['data'] += optimiser_sansref('spip_formulaires_reponses', 'id_formulaires_reponse', $res);
159
160
161        // les champs des reponses associes a une reponse inexistante
162        $res = sql_select("C.id_formulaires_reponse AS id",
163                        "spip_formulaires_reponses_champs AS C
164                        LEFT JOIN spip_formulaires_reponses AS R
165                          ON C.id_formulaires_reponse=R.id_formulaires_reponse",
166                         "C.id_formulaires_reponse > 0
167                         AND R.id_formulaires_reponse IS NULL");
168
169        $flux['data'] += optimiser_sansref('spip_formulaires_reponses_champs', 'id_formulaires_reponse', $res);
170
171        //
172        // CNIL -- Informatique et libertes
173        //
174        // masquer le numero IP des vieilles réponses
175        //
176        ## date de reference = 4 mois
177        ## definir a 0 pour desactiver
178        ## même constante que pour les forums
179        if (!defined('_CNIL_PERIODE')) {
180                define('_CNIL_PERIODE', 3600*24*31*4);
181        }
182       
183        if (_CNIL_PERIODE) {
184                $critere_cnil = 'date<"'.date('Y-m-d', time()-_CNIL_PERIODE).'"'
185                        . ' AND statut != "spam"'
186                        . ' AND (ip LIKE "%.%" OR ip LIKE "%:%")'; # ipv4 ou ipv6
187                $c = sql_countsel('spip_formulaires_reponses', $critere_cnil);
188                if ($c>0) {
189                        spip_log("CNIL: masquer IP de $c réponses anciennes à formidable");
190                        sql_update('spip_formulaires_reponses', array('ip' => 'MD5(ip)'), $critere_cnil);
191                }
192        }
193       
194        return $flux;
195}
196
197?>
Note: See TracBrowser for help on using the repository browser.