source: spip-zone/_plugins_/_stable_/moderation_moderee/inc/forum_insert.php @ 22187

Last change on this file since 22187 was 22187, checked in by prigent.yohann@…, 13 years ago

Déplacement du plugin dans stable !

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