source: spip-zone/_core_/plugins/forum/formulaires/forum.php @ 53166

Last change on this file since 53166 was 53166, checked in by kent1@…, 8 years ago

Montrons le bon exemple :

if (!defined('_ECRIRE_INC_VERSION')) return; partout

File size: 14.9 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2011                                                *
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
15include_spip('inc/forum');
16
17/**
18 * Charger l'env du squelette de #FORMULAIRE_FORUM
19 * @param string $objet
20 * @param int $id_objet
21 * @param int $id_forum
22 * @param int|array $ajouter_mot
23 *   mots ajoutés cochés par defaut
24 * @param $ajouter_groupe
25 *   groupes ajoutables
26 * @param $afficher_previsu
27 *   previsu oui ou non
28 * @param $retour
29 *   url de retour
30 * @return array|bool
31 */
32function formulaires_forum_charger_dist($objet,$id_objet, $id_forum,
33  $ajouter_mot, $ajouter_groupe, $afficher_previsu, $retour) {
34
35        if (!$titre = forum_recuperer_titre($objet,$id_objet,$id_forum))
36                return false;
37
38        // ca s'apparenterait presque a une autorisation...
39        // si on n'avait pas a envoyer la valeur $accepter_forum au formulaire
40        $accepter_forum = controler_forum($objet, $id_objet);
41        if ($accepter_forum == 'non') {
42                return false;
43        }
44
45        $primary = id_table_objet($objet);
46
47        // table a laquelle sont associ�s les mots :
48        if ($GLOBALS['meta']["mots_cles_forums"] != "oui")
49                $table = '';
50        else
51                $table = table_objet($objet);
52
53        // exiger l'authentification des posteurs pour les forums sur abo
54        if ($accepter_forum == "abo") {
55                if (!$GLOBALS["visiteur_session"]['statut']) {
56                        return array(
57                                'action' => '', #ne sert pas dans ce cas, on la vide pour mutualiser le cache
58                                'editable'=>false,
59                                'login_forum_abo'=>' ',
60                                'inscription' => generer_url_public('identifiants', 'lang='.$GLOBALS['spip_lang']),
61                                'oubli' => generer_url_public('spip_pass','lang='.$GLOBALS['spip_lang'],true),
62                                );
63                }
64        }
65
66
67        // Tableau des valeurs servant au calcul d'une signature de securite.
68        // Elles seront placees en Input Hidden pour que inc/forum_insert
69        // recalcule la meme chose et verifie l'identite des resultats.
70        // Donc ne pas changer la valeur de ce tableau entre le calcul de
71        // la signature et la fabrication des Hidden
72        // Faire attention aussi a 0 != ''
73        $ids = array();
74        $ids[$primary] = ($x = intval($id_objet)) ? $x : '';
75        $ids['id_objet'] = ($x = intval($id_objet)) ? $x : '';
76        $ids['objet'] = $objet;
77        $ids['id_forum'] = ($x = intval($id_forum)) ? $x : '';
78
79        // ne pas mettre '', sinon le squelette n'affichera rien.
80        $previsu = ' ';
81
82        if (_request('formulaire_action')){
83                $arg = forum_fichier_tmp(join('', $ids));
84
85                $securiser_action = charger_fonction('securiser_action', 'inc');
86                // on sait que cette fonction est dans le fichier associe
87                $hash = calculer_action_auteur("ajout_forum-$arg");
88        }
89
90        // pour les hidden
91        $script_hidden = "";
92        foreach ($ids as $id => $v)
93                $script_hidden .= "<input type='hidden' name='$id' value='$v' />";
94
95        $script_hidden .= "<input type='hidden' name='arg' value='$arg' />";
96        $script_hidden .= "<input type='hidden' name='hash' value='$hash' />";
97        $script_hidden .= "<input type='hidden' name='verif_$hash' value='ok' />";
98
99        if ($formats = forum_documents_acceptes()) {
100                include_spip('inc/securiser_action');
101                $cle = calculer_cle_action('ajouter-document-'.$objet.'-'.$id_objet);
102        }
103        // Valeurs par defaut du formulaire
104        // si le formulaire a ete sauvegarde, restituer les valeurs de session
105        $vals = array(
106                'titre' => $titre,
107                'texte' => '',
108                'nom_site' => '',
109                'url_site' => 'http://'
110        );
111
112        return array_merge($vals, array(
113                'modere' => (($accepter_forum != 'pri') ? '' : ' '),
114                'table' => $table,
115                'config' => array('afficher_barre' => ($GLOBALS['meta']['forums_afficher_barre']!='non'?' ':'')),
116                '_hidden' => $script_hidden, # pour les variables hidden qui seront inserees dans le form et dans le form de previsu
117                'cle_ajouter_document' => $cle,
118                'formats_documents_forum' => forum_documents_acceptes(),
119                'ajouter_document' => $_FILES['ajouter_document']['name'],
120                'nobot' => ($cle ? _request($cle) : _request('nobot')),
121                'ajouter_groupe' => $ajouter_groupe,
122                'ajouter_mot' => (is_array($ajouter_mot) ? $ajouter_mot : array($ajouter_mot)),
123                'id_forum' => $id_forum, // passer id_forum au formulaire pour lui permettre d'afficher a quoi l'internaute repond
124                '_sign'=>implode('_',$ids),
125                '_autosave_id' => $ids,
126        ));
127}
128
129
130/**
131 * Une securite qui nous protege contre :
132 * - les doubles validations de forums (derapages humains ou des brouteurs)
133 * - les abus visant a mettre des forums malgre nous sur un article (??)
134 * On installe un fichier temporaire dans _DIR_TMP (et pas _DIR_CACHE
135 * afin de ne pas bugguer quand on vide le cache)
136 * Le lock est leve au moment de l'insertion en base (inc-messforum)
137 * Ce systeme n'est pas fonctionnel pour les forums sans previsu (notamment
138 * si $afficher_previsu = 'non')
139 *
140 * http://doc.spip.org/@forum_fichier_tmp
141 *
142 * @param $arg
143 * @return int
144 */
145function forum_fichier_tmp($arg)
146{
147# astuce : mt_rand pour autoriser les hits simultanes
148        while (($alea = time() + @mt_rand()) + intval($arg)
149               AND @file_exists($f = _DIR_TMP."forum_$alea.lck"))
150          {};
151        spip_touch ($f);
152
153# et maintenant on purge les locks de forums ouverts depuis > 4 h
154
155        if ($dh = @opendir(_DIR_TMP))
156                while (($file = @readdir($dh)) !== false)
157                        if (preg_match('/^forum_([0-9]+)\.lck$/', $file)
158                        AND (time()-@filemtime(_DIR_TMP.$file) > 4*3600))
159                                spip_unlink(_DIR_TMP.$file);
160        return $alea;
161}
162
163/**
164 * Verifier la saisie de #FORMULAIRE_FORUM
165 * @param string $objet
166 * @param int $id_objet
167 * @param int $id_forum
168 * @param int|array $ajouter_mot
169 *   mots ajout�s coch�s par defaut
170 * @param $ajouter_groupe
171 *   groupes ajoutables
172 * @param $afficher_previsu
173 *   previsu oui ou non
174 * @param $retour
175 *   url de retour
176 * @return array|bool
177 */
178function formulaires_forum_verifier_dist($objet,$id_objet, $id_forum,
179        $ajouter_mot, $ajouter_groupe, $afficher_previsu, $retour)
180{
181        include_spip('inc/acces');
182        include_spip('inc/texte');
183        include_spip('inc/session');
184        include_spip('base/abstract_sql');
185
186        $erreurs = array();
187
188        // desactiver id_rubrique si un id_article ou autre existe dans le contexte
189        // if ($id_article OR $id_breve OR $id_forum OR $id_syndic)
190        //      $id_rubrique = 0;
191
192        // stocker un eventuel document dans un espace temporaire
193        // portant la cle du formulaire ; et ses metadonnees avec
194
195        if (!isset($GLOBALS['visiteur_session']['tmp_forum_document']))
196                session_set('tmp_forum_document',
197                sous_repertoire(_DIR_TMP,'documents_forum').md5(uniqid(rand())));
198        $tmp = $GLOBALS['visiteur_session']['tmp_forum_document'];
199        $doc = &$_FILES['ajouter_document'];
200        if (isset($_FILES['ajouter_document'])
201        AND $_FILES['ajouter_document']['tmp_name']) {
202                // securite :
203                // verifier si on possede la cle (ie on est autorise a poster)
204                // (sinon tant pis) ; cf. charger.php pour la definition de la cle
205                if (_request('cle_ajouter_document') != calculer_cle_action($a = "ajouter-document-$objet-$id_objet")) {
206                        $erreurs['document_forum'] = _T('forum:documents_interdits_forum');
207                        unset($_FILES['ajouter_document']);
208                } else {
209                        include_spip('inc/joindre_document');
210                        include_spip('action/ajouter_documents');
211                        list($extension,$doc['name']) = fixer_extension_document($doc);
212                        $acceptes = forum_documents_acceptes();
213
214                        if (!in_array($extension, $acceptes)) {
215                                # normalement on n'arrive pas ici : pas d'upload si aucun format
216                                if (!$formats = join(', ',$acceptes))
217                                        $formats = '-'; //_L('aucun');
218                                $erreurs['document_forum'] = _T('public:formats_acceptes', array('formats' => $formats));
219                        }
220                        else {
221                                include_spip('inc/getdocument');
222                                if (!deplacer_fichier_upload($doc['tmp_name'], $tmp.'.bin'))
223                                        $erreurs['document_forum'] = _T('copie_document_impossible');
224
225#               else if (...)
226#               verifier le type_document autorise
227#               retailler eventuellement les photos
228                        }
229
230                        // si ok on stocke les meta donnees, sinon on efface
231                        if (isset($erreurs['document_forum'])) {
232                                spip_unlink($tmp.'.bin');
233                                unset ($_FILES['ajouter_document']);
234                        } else {
235                                $doc['tmp_name'] = $tmp.'.bin';
236                                ecrire_fichier($tmp.'.txt', serialize($doc));
237                        }
238                }
239        }
240        // restaurer le document uploade au tour precedent
241        else if (file_exists($tmp.'.bin')) {
242                if (_request('supprimer_document_ajoute')) {
243                        spip_unlink($tmp.'.bin');
244                        spip_unlink($tmp.'.txt');
245                } else if (lire_fichier($tmp.'.txt', $meta))
246                        $doc = @unserialize($meta);
247        }
248
249        if (strlen($texte = _request('texte')) < 10
250        AND !$ajouter_mot AND $GLOBALS['meta']['forums_texte'] == 'oui')
251                $erreurs['texte'] = _T('forum:forum_attention_dix_caracteres');
252        else if (defined('_FORUM_LONGUEUR_MAXI')
253        AND _FORUM_LONGUEUR_MAXI > 0
254        AND strlen($texte) > _FORUM_LONGUEUR_MAXI)
255                $erreurs['texte'] = _T('forum:forum_attention_trop_caracteres',
256                        array(
257                                'compte' => strlen($texte),
258                                'max' => _FORUM_LONGUEUR_MAXI
259                        ));
260
261        if (array_reduce($_POST, 'reduce_strlen', (20 * 1024)) < 0) {
262                $erreurs['erreur_message'] = _T('forum:forum_message_trop_long');
263        }
264        else {
265                // Ne pas autoriser d'envoi hacke si forum sur abonnement
266                if (controler_forum($objet, $id_objet)=='abo'
267                  AND !test_espace_prive()) {
268                        if (!isset($GLOBALS['visiteur_session'])
269                          OR !isset($GLOBALS['visiteur_session']['statut'])) {
270                                $erreurs['erreur_message'] = _T('forum_non_inscrit');
271                        }
272                        elseif($GLOBALS['visiteur_session']['statut']=='5poubelle') {
273                                $erreurs['erreur_message'] = _T('forum:forum_acces_refuse');
274                        }
275
276                }
277        }
278
279        if (strlen($titre=_request('titre')) < 3
280        AND $GLOBALS['meta']['forums_titre'] == 'oui')
281                $erreurs['titre'] = _T('forum:forum_attention_trois_caracteres');
282
283        if (!count($erreurs) AND !_request('confirmer_previsu_forum')){
284                if ($afficher_previsu != 'non') {
285                        $previsu = inclure_previsu($texte, $titre, _request('url_site'), _request('nom_site'), _request('ajouter_mot'), $doc,
286                                $objet, $id_objet, $id_forum);
287                        $erreurs['previsu'] = $previsu;
288                }
289        }
290
291        //  Si forum avec previsu sans bon hash de securite, echec
292        if (!count($erreurs)){
293                if (!test_espace_prive()
294                  AND $afficher_previsu<>'non'
295                  AND forum_insert_noprevisu()) {
296                        $erreurs['erreur_message'] = _T('forum:forum_acces_refuse');
297                }
298        }
299
300        return $erreurs;
301}
302
303
304/**
305 * Lister les formats de documents joints acceptes dans les forum
306 * @return array
307 */
308function forum_documents_acceptes()
309{
310        $formats = trim($GLOBALS['meta']['formats_documents_forum']);
311        if (!$formats) return array();
312        if ($formats !== '*')
313                $formats = array_filter(preg_split(',[^a-zA-Z0-9/+_],', $formats));
314        else {
315                include_spip('base/typedoc');
316                $formats =  array_keys($GLOBALS['tables_mime']);
317        }
318        sort($formats);
319        return $formats;
320}
321
322
323/**
324 * Preparer la previsu d'un message de forum
325 *
326 * http://doc.spip.org/@inclure_previsu
327 *
328 * @param string $texte
329 * @param string $titre
330 * @param string $url_site
331 * @param string $nom_site
332 * @param array $ajouter_mot
333 * @param array $doc
334 * @param string $objet
335 * @param int $id_objet
336 * @param int $id_forum
337 * @return string
338 */
339function inclure_previsu($texte,$titre, $url_site, $nom_site, $ajouter_mot, $doc,
340$objet, $id_objet, $id_forum) {
341        global $table_des_traitements;
342
343        $bouton = _T('forum:forum_message_definitif');
344        include_spip('public/assembler');
345        include_spip('public/composer');
346
347        // appliquer les traitements de #TEXTE a la previsu
348        // comme on voit c'est complique... y a peut-etre plus simple ?
349        // recuperer les filtres eventuels de 'mes_fonctions.php' sur les balises
350        include_spip('public/parametrer');
351        $evaltexte = isset($table_des_traitements['TEXTE']['forums'])
352                ? $table_des_traitements['TEXTE']['forums']
353                : $table_des_traitements['TEXTE'][0];
354        $evaltexte = '$tmptexte = '.str_replace('%s', '$texte', $evaltexte).';';
355        // evaluer...
356        eval($evaltexte);
357
358        // supprimer les <form> de la previsualisation
359        // (sinon on ne peut pas faire <cadre>...</cadre> dans les forums)
360        return preg_replace("@<(/?)form\b@ism",
361                            '<\1div',
362                inclure_balise_dynamique(array('formulaires/inc-forum_previsu',
363                      0,
364                      array(
365                        'titre' => safehtml(typo($titre)),
366                        'texte' => $tmptexte,
367                        'notes' => safehtml(calculer_notes()),
368                        'url_site' => vider_url($url_site),
369                        'nom_site' => safehtml(typo($nom_site)),
370                        'ajouter_mot' => (is_array($ajouter_mot) ? $ajouter_mot : array($ajouter_mot)),
371                        'ajouter_document' => $doc,
372                        'erreur' => $erreur,
373                        'bouton' => $bouton,
374                    'objet' => $objet,
375                        'id_objet' => $id_objet,
376                        'id_forum' => $id_forum
377                     )
378                ), false));
379}
380
381
382/**
383 * Traiter la saisie de #FORMULAIRE_FORUM
384 * tout est delegue a inc_forum_insert()
385 *
386 * @param string $objet
387 * @param int $id_objet
388 * @param int $id_forum
389 * @param int|array $ajouter_mot
390 *   mots ajout�s coch�s par defaut
391 * @param $ajouter_groupe
392 *   groupes ajoutables
393 * @param $afficher_previsu
394 *   previsu oui ou non
395 * @param $retour
396 *   url de retour
397 * @return array|bool
398 */
399function formulaires_forum_traiter_dist($objet,$id_objet, $id_forum,
400        $ajouter_mot, $ajouter_groupe, $afficher_previsu, $retour) {
401
402        $forum_insert = charger_fonction('forum_insert', 'inc');
403
404        // Antispam basique :
405        // si l'input invisible a ete renseigne, ca ne peut etre qu'un bot
406        if (strlen(_request(_request('cle_ajouter_document')))) {
407                tracer_erreur_forum('champ interdit (nobot) rempli');
408                return array('message_erreur'=>_T('forum:erreur_enregistrement_message'));
409        }
410
411        $id_reponse = $forum_insert($objet, $id_objet, $id_forum);
412
413
414        if ($id_reponse){
415                // En cas de retour sur (par exemple) {#SELF}, on ajoute quand
416                // meme #forum12 a la fin de l'url, sauf si un #ancre est explicite
417                if ($retour){
418                        if (!strpos($retour, '#'))
419                                $retour .= '#forum'.$id_reponse;
420                }
421                else {
422                        // le retour par defaut envoie sur le thread, ce qui permet
423                        // de traiter elegamment le cas des forums moderes a priori.
424                        // Cela assure aussi qu'on retrouve son message dans le thread
425                        // dans le cas des forums moderes a posteriori, ce qui n'est
426                        // pas plus mal.
427                        if (function_exists('generer_url_forum')) {
428                                $retour = generer_url_forum($id_reponse);
429                        }
430                        else {
431                                $thread = sql_fetsel('id_thread', 'spip_forum', 'id_forum='.$id_reponse);
432                                spip_log('id_thread='.$thread['id_thread'], 'forum');
433                                $retour = generer_url_entite($thread['id_thread'], 'forum');
434                        }
435                }
436
437                $res = array('redirect'=>$retour,'id_forum'=>$id_forum);
438        }
439        else
440                $res = array('message_erreur'=>_T('forum:erreur_enregistrement_message'));
441
442        return $res;
443}
444
445
446?>
Note: See TracBrowser for help on using the repository browser.