source: spip-zone/_plugins_/antispam/inc/forum_insert.php @ 103920

Last change on this file since 103920 was 103920, checked in by spip.franck@…, 3 years ago

Mise à jour d'url, exemple http://doc.spip.org est devenu http://code.spip.net

File size: 8.1 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2007                                                *
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;
14include_spip('inc/meta');
15include_spip('inc/forum');
16include_spip('inc/filtres');
17include_spip('base/abstract_sql');
18include_spip('inc/actions');
19
20spip_connect();
21
22// Ce fichier est inclus lorsqu'on appelle un script de l'espace public
23// avec une variable d'URL nommee confirmer_forum
24// Voir commentaires dans balise/formulaire_forum
25
26
27// http://code.spip.net/@controler_forum_abo
28function controler_forum_abo($retour)
29{
30        global $auteur_session;
31        if ($auteur_session) {
32                        $statut = $auteur_session['statut'];
33                        if (!$statut OR $statut == '5poubelle') {
34                                ask_php_auth(_T('forum_acces_refuse'),
35                                             _T('forum_cliquer_retour',
36                                                array('retour_forum' => $retour)));
37                                exit;
38                        }
39        } else {
40                        ask_php_auth(_T('forum_non_inscrit'),
41                                     _T('forum_cliquer_retour',
42                                        array('retour_forum' => $retour)));
43                        exit;
44                }
45}
46
47// http://code.spip.net/@controler_forum
48function controler_forum($id) {
49
50        // Reglage forums d'article
51        if ($id) {
52                $q = spip_query("SELECT accepter_forum FROM spip_articles WHERE id_article=$id");
53                if ($r = spip_fetch_array($q)) 
54                        $id = $r['accepter_forum'];
55        }
56
57        // Valeur par defaut
58        return $id ? $id: substr($GLOBALS['meta']["forums_publics"],0,3);
59
60
61}
62
63// http://code.spip.net/@mots_du_forum
64function mots_du_forum($ajouter_mot, $id_message)
65{
66        foreach ($ajouter_mot as $id_mot)
67                if ($id_mot = intval($id_mot))
68                  spip_abstract_insert('spip_mots_forum', '(id_mot, id_forum)', "($id_mot, $id_message)");
69}
70
71
72// http://code.spip.net/@reduce_strlen
73function reduce_strlen($n, $c) 
74{
75  return $n - strlen($c);
76}
77
78
79// http://code.spip.net/@tracer_erreur_forum
80function tracer_erreur_forum($type='') {
81        spip_log("erreur forum ($type): ".print_r($_POST, true));
82
83        define('_TRACER_ERREUR_FORUM', false);
84        if (_TRACER_ERREUR_FORUM) {
85                include_spip('inc/mail');
86                envoyer_mail($GLOBALS['meta']['email_webmaster'], "erreur forum ($type)",
87                        "erreur sur le forum ($type) :\n\n".
88                        '$_POST = '.print_r($_POST, true)."\n\n".
89                        '$_SERVER = '.print_r($_SERVER, true));
90        }
91}
92
93// http://code.spip.net/@inc_forum_insert_dist
94function inc_forum_insert_dist() {
95
96        // Ne pas se laisser polluer par les pollueurs de globales
97        $id_article = intval(_request('id_article'));
98        $id_breve = intval(_request('id_breve'));
99        $id_forum = intval(_request('id_forum'));
100        $id_rubrique = intval(_request('id_rubrique'));
101        $id_syndic = intval(_request('id_syndic'));
102        $afficher_texte = _request('afficher_texte');
103        $ajouter_mot = _request('ajouter_mot');
104        $retour_forum = _request('retour_forum');
105
106        $retour_forum = rawurldecode($retour_forum);
107
108        # retour a calculer (cf. inc-formulaire_forum)
109        if ($retour_forum == '!') {
110                // on calcule a priori l'adresse de retour {en cas d'echec du POST}
111                charger_generer_url();
112                if ($id_forum)
113                        $retour_forum = generer_url_forum($id_forum);
114                elseif ($id_article)
115                        $retour_forum = generer_url_article($id_article);
116                elseif ($id_breve)
117                        $retour_forum = generer_url_breve($id_breve);
118                elseif ($id_syndic)
119                        $retour_forum = generer_url_syndic($id_syndic);
120                elseif ($id_rubrique) # toujours en dernier
121                        $retour_forum = generer_url_rubrique($id_rubrique);
122                $retour_forum = str_replace('&amp;','&',$retour_forum);
123
124                // mais la veritable adresse de retour sera calculee apres insertion
125                $calculer_retour = true;
126        }
127
128        if (array_reduce($_POST, 'reduce_strlen', (20 * 1024)) < 0) {
129                ask_php_auth(_T('forum_message_trop_long'),
130                        _T('forum_cliquer_retour',
131                                array('retour_forum' => $retour_forum)));
132                exit;
133        }
134
135        // Verifier hash securite pour les forums avec previsu
136        if ($afficher_texte <> 'non') {
137
138                // simuler une action venant de l'espace public
139                // pour se conformer au a general.
140                set_request('action', 'ajout_forum');
141                $securiser_action = charger_fonction('securiser_action', 'inc');
142                $arg = $securiser_action();
143
144                $file = _DIR_TMP ."forum_" . preg_replace('/[^0-9]/', '', $arg) .".lck";
145                if (!file_exists($file)) {
146                        # ne pas tracer cette erreur, peut etre due a un double POST
147                        # tracer_erreur_forum('session absente');
148                        return $retour_forum; # echec silencieux du POST
149                }
150                unlink($file);
151
152                // antispam : si le champ au nom aleatoire verif_$hash n'est pas 'ok'
153                // on meurt
154                if (_request('verif_'._request('hash')) != 'ok') {
155                        tracer_erreur_forum('champ verif manquant');
156                        return $retour_forum;
157                }
158                $antispam=unserialize($GLOBALS['meta']["antispam"]);
159                if (count($antispam)) {
160                        $separateur=trim($antispam['separateur'])?trim($antispam['separateur']):';';
161                        foreach($antispam as $key => $value){
162                                if ($key!='separateur'){
163                                        $val=explode("\n",$value);
164                                        foreach ($val as $v){
165                                                $c=0;
166                                                $v=trim($v);
167                                                $va=explode($separateur,$v);
168                                                if (count($va)) {$v=trim($va[0]);$c=intval($va[1]);}
169                                                if ($v && substr_count(strtolower(_request($key)),$v)>$c){
170                                                        tracer_erreur_forum('antispam : plus de '.$c.' occurrences ('.substr_count(strtolower($test[$key]),$v).') de '.$v.' dans '.$key);
171                                                        return $retour_forum;
172                                                }
173                                        }
174                                }
175                        }
176                }
177               
178        }
179
180        // id_rubrique est parfois passee pour les articles, on n'en veut pas
181        if ($id_rubrique > 0 AND ($id_article OR $id_breve OR $id_syndic))
182                $id_rubrique = 0;
183
184        $statut = controler_forum($id_article);
185       
186        // Ne pas autoriser de changement de nom si forum sur abonnement
187        if ($statut == 'abo') {
188                controler_forum_abo($retour_forum);
189                set_request('auteur', $GLOBALS['auteur_session']['nom']);
190                set_request('email_auteur', $GLOBALS['auteur_session']['email']);
191        }
192
193        $statut = ($statut == 'non') ? 'off' : (($statut == 'prive') ? 'prive' :
194                                                (($statut == 'pri') ? 'prop' :
195                                                'publie'));
196
197        // Antispam : si 'nobot' a ete renseigne, ca ne peut etre qu'un bot
198        if (strlen(_request(_request('hash')))) {
199                tracer_erreur_forum('champ interdit (nobot) rempli');
200                return $retour_forum; # echec silencieux du POST
201        }
202
203        // Entrer le message dans la base
204        $id_message = spip_abstract_insert('spip_forum', '(date_heure)', '(NOW())');
205
206        if ($id_forum) {
207                $id_thread = spip_fetch_array(spip_query("SELECT id_thread FROM spip_forum WHERE id_forum = $id_forum"));
208                $id_thread = $id_thread['id_thread'];
209        }
210        else
211                $id_thread = $id_message; # id_thread oblige INSERT puis UPDATE.
212
213        spip_query("UPDATE spip_forum SET id_parent = $id_forum, id_rubrique = $id_rubrique, id_article = $id_article, id_breve = $id_breve, id_syndic = $id_syndic, id_thread = $id_thread, statut = '$statut' WHERE id_forum = $id_message");
214
215        // Entrer les mots-cles associes
216        if (is_array($ajouter_mot)) mots_du_forum($ajouter_mot, $id_message);
217
218        //
219        // Entree du contenu et invalidation des caches
220        //
221        include_spip('inc/modifier');
222        revision_forum($id_message);
223
224        // Notification
225        if ($notifications = charger_fonction('notifications', 'inc'))
226                $notifications('forumposte', $id_message);
227
228        // En cas de retour sur (par exemple) {#SELF}, on ajoute quand
229        // meme #forum12 a la fin de l'url, sauf si un #ancre est explicite
230        if (!$calculer_retour)
231                return strstr('#', $retour_forum) ?
232                        $retour_forum
233                        : $retour_forum.'#forum'.$id_message;
234
235        // le retour automatique envoie sur le thread, ce qui permet
236        // de traiter elegamment le cas des forums moderes a priori.
237        // Cela assure aussi qu'on retrouve son message dans le thread
238        // dans le cas des forums moderes a posteriori, ce qui n'est
239        // pas plus mal.
240
241        charger_generer_url();
242        return generer_url_forum($id_message);
243}
244?>
Note: See TracBrowser for help on using the repository browser.