source: spip-zone/_plugins_/antispam/balise/formulaire_forum.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: 11.6 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;    #securite
14
15include_spip('inc/meta');
16include_spip('inc/acces');
17include_spip('inc/texte');
18include_spip('inc/lang');
19include_spip('inc/mail');
20include_spip('inc/forum');
21include_spip('base/abstract_sql');
22spip_connect();
23
24charger_generer_url();
25
26/*******************************/
27/* GESTION DU FORMULAIRE FORUM */
28/*******************************/
29
30// Contexte du formulaire
31// Mots-cles dans les forums :
32// Si la variable de personnalisation $afficher_groupe[] est definie
33// dans le fichier d'appel, et si la table de reference est OK, proposer
34// la liste des mots-cles
35
36// http://code.spip.net/@balise_FORMULAIRE_FORUM
37function balise_FORMULAIRE_FORUM ($p) {
38
39        $p = calculer_balise_dynamique($p,'FORMULAIRE_FORUM', array('id_rubrique', 'id_forum', 'id_article', 'id_breve', 'id_syndic', 'ajouter_mot', 'ajouter_groupe', 'afficher_texte'));
40
41        // Ajouter le code d'invalideur specifique aux forums
42        include_spip('inc/invalideur');
43        if (function_exists($i = 'code_invalideur_forums'))
44                $p->code = $i($p, $p->code);
45
46        return $p;
47}
48
49// verification des droits a faire du forum
50// http://code.spip.net/@balise_FORMULAIRE_FORUM_stat
51function balise_FORMULAIRE_FORUM_stat($args, $filtres) {
52
53        // Note : ceci n'est pas documente !!
54        // $filtres[0] peut contenir l'url sur lequel faire tourner le formulaire
55        // exemple dans un squelette article.html : [(#FORMULAIRE_FORUM|forum)]
56        // ou encore [(#FORMULAIRE_FORUM|forumspip.php)]
57
58        // le denier arg peut contenir l'url sur lequel faire le retour
59        // exemple dans un squelette article.html : [(#FORMULAIRE_FORUM{#SELF})]
60
61        // recuperer les donnees du forum auquel on repond, false = forum interdit
62        list ($idr, $idf, $ida, $idb, $ids, $am, $ag, $af, $url) = $args;
63        $idr = intval($idr);
64        $idf = intval($idf);
65        $ida = intval($ida);
66        $idb = intval($idb);
67        $ids = intval($ids);
68        if (!$r = sql_recherche_donnees_forum ($idr, $idf, $ida, $idb, $ids))
69                return '';
70
71        list ($titre, $table, $forums_publics) = $r;
72
73        if (($GLOBALS['meta']["mots_cles_forums"] != "oui"))
74                $table = '';
75
76        // Sur quelle adresse va-t-on "boucler" pour la previsualisation ?
77        if ($script = $filtres[0])
78                $script = preg_match(',[.]php3?$,', $script) ?
79                        $script : generer_url_public($script);
80        else
81                $script = self(); # sur soi-meme
82
83        return
84                array($titre, $table, $forums_publics, $script,
85                $idr, $idf, $ida, $idb, $ids, $am, $ag, $af, $url);
86}
87
88// http://code.spip.net/@balise_FORMULAIRE_FORUM_dyn
89function balise_FORMULAIRE_FORUM_dyn(
90$titre, $table, $type, $script,
91$id_rubrique, $id_forum, $id_article, $id_breve, $id_syndic,
92$ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour)
93{
94        // verifier l'identite des posteurs pour les forums sur abo
95        if ($type == "abo") {
96                if (!$GLOBALS["auteur_session"]) {
97                        return array('formulaires/login_forum', 0,
98                                array('inscription' => generer_url_public('spip_inscription'),
99                                        'oubli' => generer_url_public('spip_pass')));
100                } else {
101                // forcer ces valeur
102                        $auteur = $GLOBALS['auteur_session']['nom'];
103                        $email_auteur = $GLOBALS['auteur_session']['email'];
104                }
105        }
106        // Tableau des valeurs servant au calcul d'une signature de securite.
107        // Elles seront placees en Input Hidden pour que inc/forum_insert
108        // recalcule la meme chose et verifie l'identite des resultats.
109        // Donc ne pas changer la valeur de ce tableau entre le calcul de
110        // la signature et la fabrication des Hidden
111        // Faire attention aussi a 0 != ''
112
113        // id_rubrique est parfois passee pour les articles, on n'en veut pas
114        $ids = array();
115        if ($id_rubrique > 0 AND ($id_article OR $id_breve OR $id_syndic))
116                $id_rubrique = 0;
117        foreach (array('id_article', 'id_breve', 'id_forum', 'id_rubrique', 'id_syndic') as $o) {
118                $ids[$o] = ($x = intval($$o)) ? $x : '';
119        }
120
121
122        // ne pas mettre '', sinon le squelette n'affichera rien.
123        $previsu = ' ';
124
125        //$securiser_action = charger_fonction('securiser_action', 'inc');
126        include_spip('inc/securiser_action');
127        // on sait que cette fonction est dans le fichier associe
128        $hash = calculer_action_auteur("ajout_forum-$arg");
129
130        // au premier appel (pas de Post-var nommee "retour_forum")
131        // memoriser eventuellement l'URL de retour pour y revenir apres
132        // envoi du message ; aux appels suivants, reconduire la valeur.
133        // Initialiser aussi l'auteur
134        if (!$retour_forum = rawurldecode(_request('retour_forum'))) {
135                if ($retour_forum = rawurldecode(_request('retour')))
136                        $retour_forum = str_replace('&var_mode=recalcul','',$retour_forum);
137                else {
138                        // par defaut, on veut prendre url_forum(), mais elle ne sera connue
139                        // qu'en sortie, on inscrit donc une valeur absurde ("!")
140                        $retour_forum = "!";
141                        // sauf si on a passe un parametre en argument (exemple : {#SELF})
142                        if ($url_param_retour)
143                                $retour_forum = str_replace('&amp;', '&', $url_param_retour);
144                }
145                if (isset($_COOKIE['spip_forum_user'])
146                AND is_array($cookie_user = unserialize($_COOKIE['spip_forum_user']))) {
147                        $auteur = $cookie_user['nom'];
148                        $email_auteur = $cookie_user['email'];
149                } else {
150                        $auteur = $GLOBALS['auteur_session']['nom'];
151                        $email_auteur = $GLOBALS['auteur_session']['email'];
152                }
153
154        } else { // appels ulterieurs
155
156                // Recuperer le message a previsualiser
157                $titre = _request('titre');
158                $texte = _request('texte');
159                $auteur = _request('auteur');
160                $email_auteur = _request('email_auteur');
161                $nom_site = _request('nom_site');
162                $url_site = _request('url_site');
163                $ajouter_mot = _request('ajouter_mot');
164                $ajouter_groupe = _request('ajouter_groupe');
165
166                if ($afficher_texte != 'non') 
167                        $previsu = inclure_previsu($texte, $titre, $email_auteur, $auteur, $url_site, $nom_site, $ajouter_mot);
168
169                $arg = forum_fichier_tmp(join('', $ids));
170
171                // Poser un cookie pour ne pas retaper les infos invariables
172                include_spip('inc/cookie');
173                spip_setcookie('spip_forum_user',
174                        serialize(array('nom' => $auteur,
175                                'email' => $email_auteur)));
176        }
177
178        // pour la chaine de hidden
179        $script_hidden = $script = str_replace('&amp;', '&', $script);
180        foreach ($ids as $id => $v)
181                $script_hidden = parametre_url($script_hidden, $id, $v, '&');
182        return array('formulaires/forum', 0,
183        array(
184                'auteur' => $auteur,
185                'readonly' => ($type == "abo")? "readonly" : '',
186                'email_auteur' => $email_auteur,
187                'modere' => (($type != 'pri') ? '' : ' '),
188                'nom_site' => $nom_site,
189                'retour_forum' => $retour_forum,
190                'afficher_texte' => $afficher_texte,
191                'previsu' => $previsu,
192                'table' => $table,
193                'texte' => $texte,
194                'titre' => extraire_multi($titre),
195                'url' => $script, # ce sur quoi on fait le action='...'
196                'url_post' => $script_hidden, # pour les variables hidden
197                'url_site' => ($url_site ? $url_site : "http://"),
198                'arg' => $arg,
199                'hash' => $hash,
200                'nobot' => _request($hash),
201                'ajouter_groupe' => $ajouter_groupe,
202                'ajouter_mot' => (is_array($ajouter_mot) ? $ajouter_mot : array($ajouter_mot)),
203
204                ));
205}
206
207// http://code.spip.net/@inclure_previsu
208function inclure_previsu($texte,$titre, $email_auteur, $auteur, $url_site, $nom_site, $ajouter_mot)
209{
210        $erreur = $bouton = '';
211        if (strlen($texte) < 10 AND !$ajouter_mot)
212                $erreur = _T('forum_attention_dix_caracteres');
213        else if (strlen($titre) < 3)
214                $erreur = _T('forum_attention_trois_caracteres');
215        else if (defined('_FORUM_LONGUEUR_MAXI')
216        AND _FORUM_LONGUEUR_MAXI > 0
217        AND strlen($texte) > _FORUM_LONGUEUR_MAXI)
218                $erreur = _T('forum_attention_trop_caracteres',
219                        array(
220                                'compte' => strlen($texte),
221                                'max' => _FORUM_LONGUEUR_MAXI
222                        ));
223        else
224                $bouton = _T('forum_message_definitif');
225
226        // supprimer les <form> de la previsualisation
227        // (sinon on ne peut pas faire <cadre>...</cadre> dans les forums)
228        return preg_replace("@<(/?)f(orm[>[:space:]])@ism",
229                            "<\\1no-f\\2",
230                inclure_balise_dynamique(array('formulaires/forum_previsu',
231                      0,
232                      array(
233                        'titre' => safehtml(typo($titre)),
234                        'email_auteur' => safehtml($email_auteur),
235                        'auteur' => safehtml(typo($auteur)),
236                        'texte' => safehtml(propre($texte)),
237                        'url_site' => vider_url($url_site),
238                        'nom_site' => safehtml(typo($nom_site)),
239                        'ajouter_mot' => (is_array($ajouter_mot) ? $ajouter_mot : array($ajouter_mot)),
240                        'erreur' => $erreur,
241                        'bouton' => $bouton
242                        )
243                                               ),
244                                         false));
245}
246
247// Une securite qui nous protege contre :
248// - les doubles validations de forums (derapages humains ou des brouteurs)
249// - les abus visant a mettre des forums malgre nous sur un article (??)
250// On installe un fichier temporaire dans _DIR_TMP (et pas _DIR_CACHE
251// afin de ne pas bugguer quand on vide le cache)
252// Le lock est leve au moment de l'insertion en base (inc-messforum)
253// Ce systeme n'est pas fonctionnel pour les forums sans previsu (notamment
254// si $afficher_texte = 'non')
255
256// http://code.spip.net/@forum_fichier_tmp
257function forum_fichier_tmp($arg)
258{
259# astuce : mt_rand pour autoriser les hits simultanes
260        while (($alea = time() + @mt_rand()) + intval($arg)
261               AND @file_exists($f = _DIR_TMP."forum_$alea.lck"))
262          {};
263        spip_touch ($f);
264
265# et maintenant on purge les locks de forums ouverts depuis > 4 h
266
267        if ($dh = @opendir(_DIR_TMP))
268                while (($file = @readdir($dh)) !== false)
269                        if (preg_match('/^forum_([0-9]+)\.lck$/', $file)
270                        AND (time()-@filemtime(_DIR_TMP.$file) > 4*3600))
271                                @unlink(_DIR_TMP.$file);
272        return $alea;
273}
274
275
276/*******************************************************/
277/* FONCTIONS DE CALCUL DES DONNEES DU FORMULAIRE FORUM */
278/*******************************************************/
279
280//
281// Chercher le titre et la configuration du forum de l'element auquel on repond
282//
283
284// http://code.spip.net/@sql_recherche_donnees_forum
285function sql_recherche_donnees_forum ($idr, $idf, $ida, $idb, $ids) {
286
287        // changer la table de reference s'il y a lieu (pour afficher_groupes[] !!)
288        if ($ida) {
289                $titre = spip_abstract_fetsel('titre', 'spip_articles', "statut = 'publie' AND id_article = $ida");
290                $table = "articles";
291        } else if ($idb) {
292                $titre = spip_abstract_fetsel('titre', 'spip_breves', "statut = 'publie' AND id_breve = $idb");
293                $table = "breves";
294        } else if ($ids) {
295                $titre = spip_abstract_fetsel('nom_site AS titre', 'spip_syndic', "statut = 'publie' AND id_syndic = $ids");
296                $table = "syndic";
297        } else if ($idr) {
298                $titre = spip_abstract_fetsel('titre', 'spip_rubriques', "statut = 'publie' AND id_rubrique = $idr");
299                $table = "rubriques";
300        }
301
302        if ($idf AND $titre)
303                $titre = spip_abstract_fetsel('titre', 'spip_forum', "statut = 'publie' AND id_forum = $idf");
304
305        if ($titre) {
306                $titre = supprimer_numero($titre['titre']);
307        } else 
308                return false;
309
310        // quelle est la configuration du forum ?
311        $type = !$ida ? false : spip_abstract_fetsel('accepter_forum', 'spip_articles', "id_article=$ida");
312
313        if ($type) $type = $type['accepter_forum'];
314
315        if (!$type) $type = substr($GLOBALS['meta']["forums_publics"],0,3);
316
317        // valeurs possibles : 'pos'teriori, 'pri'ori, 'abo'nnement
318        if ($type == "non")
319                return false;
320
321        return array ($titre, $table, $type);
322}
323
324?>
Note: See TracBrowser for help on using the repository browser.