Mise en route du suivi.
[aidenligne_francais_universite.git] / ecrire / inc / forum_insert.php
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
13 if (!defined("_ECRIRE_INC_VERSION")) return;
14 include_spip('inc/meta');
15 include_spip('inc/forum');
16 include_spip('inc/filtres');
17 include_spip('base/abstract_sql');
18 include_spip('inc/actions');
19
20 spip_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://doc.spip.org/@controler_forum_abo
28 function 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://doc.spip.org/@controler_forum
48 function 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://doc.spip.org/@mots_du_forum
64 function 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://doc.spip.org/@reduce_strlen
73 function reduce_strlen($n, $c)
74 {
75 return $n - strlen($c);
76 }
77
78
79 // http://doc.spip.org/@tracer_erreur_forum
80 function 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://doc.spip.org/@inc_forum_insert_dist
94 function 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 }
159
160 // id_rubrique est parfois passee pour les articles, on n'en veut pas
161 if ($id_rubrique > 0 AND ($id_article OR $id_breve OR $id_syndic))
162 $id_rubrique = 0;
163
164 $statut = controler_forum($id_article);
165
166 // Ne pas autoriser de changement de nom si forum sur abonnement
167 if ($statut == 'abo') {
168 controler_forum_abo($retour_forum);
169 set_request('auteur', $GLOBALS['auteur_session']['nom']);
170 set_request('email_auteur', $GLOBALS['auteur_session']['email']);
171 }
172
173 $statut = ($statut == 'non') ? 'off' : (($statut == 'pri') ? 'prop' :
174 'publie');
175
176 // Antispam : si 'nobot' a ete renseigne, ca ne peut etre qu'un bot
177 if (strlen(_request('nobot'))) {
178 tracer_erreur_forum('champ interdit (nobot) rempli');
179 return $retour_forum; # echec silencieux du POST
180 }
181
182 // Entrer le message dans la base
183 $id_message = spip_abstract_insert('spip_forum', '(date_heure)', '(NOW())');
184
185 if ($id_forum) {
186 $id_thread = spip_fetch_array(spip_query("SELECT id_thread FROM spip_forum WHERE id_forum = $id_forum"));
187 $id_thread = $id_thread['id_thread'];
188 }
189 else
190 $id_thread = $id_message; # id_thread oblige INSERT puis UPDATE.
191
192 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");
193
194 // Entrer les mots-cles associes
195 if (is_array($ajouter_mot)) mots_du_forum($ajouter_mot, $id_message);
196
197 //
198 // Entree du contenu et invalidation des caches
199 //
200 include_spip('inc/modifier');
201 revision_forum($id_message);
202
203 // Notification
204 if ($notifications = charger_fonction('notifications', 'inc'))
205 $notifications('forumposte', $id_message);
206
207 // En cas de retour sur (par exemple) {#SELF}, on ajoute quand
208 // meme #forum12 a la fin de l'url, sauf si un #ancre est explicite
209 if (!$calculer_retour)
210 return strstr('#', $retour_forum) ?
211 $retour_forum
212 : $retour_forum.'#forum'.$id_message;
213
214 // le retour automatique envoie sur le thread, ce qui permet
215 // de traiter elegamment le cas des forums moderes a priori.
216 // Cela assure aussi qu'on retrouve son message dans le thread
217 // dans le cas des forums moderes a posteriori, ce qui n'est
218 // pas plus mal.
219
220 charger_generer_url();
221 return generer_url_forum($id_message);
222 }
223 ?>