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