Commit | Line | Data |
---|---|---|
c495c100 P |
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; #securite | |
14 | ||
15 | include_spip('inc/meta'); | |
16 | include_spip('inc/acces'); | |
17 | include_spip('inc/texte'); | |
18 | include_spip('inc/lang'); | |
19 | include_spip('inc/mail'); | |
20 | include_spip('inc/forum'); | |
21 | include_spip('base/abstract_sql'); | |
22 | spip_connect(); | |
23 | ||
24 | charger_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://doc.spip.org/@balise_FORMULAIRE_FORUM | |
37 | function 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://doc.spip.org/@balise_FORMULAIRE_FORUM_stat | |
51 | function 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://doc.spip.org/@balise_FORMULAIRE_FORUM_dyn | |
89 | function 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 | // au premier appel (pas de Post-var nommee "retour_forum") | |
126 | // memoriser eventuellement l'URL de retour pour y revenir apres | |
127 | // envoi du message ; aux appels suivants, reconduire la valeur. | |
128 | // Initialiser aussi l'auteur | |
129 | if (!$retour_forum = rawurldecode(_request('retour_forum'))) { | |
130 | if ($retour_forum = rawurldecode(_request('retour'))) | |
131 | $retour_forum = str_replace('&var_mode=recalcul','',$retour_forum); | |
132 | else { | |
133 | // par defaut, on veut prendre url_forum(), mais elle ne sera connue | |
134 | // qu'en sortie, on inscrit donc une valeur absurde ("!") | |
135 | $retour_forum = "!"; | |
136 | // sauf si on a passe un parametre en argument (exemple : {#SELF}) | |
137 | if ($url_param_retour) | |
138 | $retour_forum = str_replace('&', '&', $url_param_retour); | |
139 | } | |
140 | if (isset($_COOKIE['spip_forum_user']) | |
141 | AND is_array($cookie_user = unserialize($_COOKIE['spip_forum_user']))) { | |
142 | $auteur = $cookie_user['nom']; | |
143 | $email_auteur = $cookie_user['email']; | |
144 | } else { | |
145 | $auteur = $GLOBALS['auteur_session']['nom']; | |
146 | $email_auteur = $GLOBALS['auteur_session']['email']; | |
147 | } | |
148 | ||
149 | } else { // appels ulterieurs | |
150 | ||
151 | // Recuperer le message a previsualiser | |
152 | $titre = _request('titre'); | |
153 | $texte = _request('texte'); | |
154 | $auteur = _request('auteur'); | |
155 | $email_auteur = _request('email_auteur'); | |
156 | $nom_site = _request('nom_site'); | |
157 | $url_site = _request('url_site'); | |
158 | $ajouter_mot = _request('ajouter_mot'); | |
159 | $ajouter_groupe = _request('ajouter_groupe'); | |
160 | ||
161 | if ($afficher_texte != 'non') | |
162 | $previsu = inclure_previsu($texte, $titre, $email_auteur, $auteur, $url_site, $nom_site, $ajouter_mot); | |
163 | ||
164 | $arg = forum_fichier_tmp(join('', $ids)); | |
165 | ||
166 | $securiser_action = charger_fonction('securiser_action', 'inc'); | |
167 | // on sait que cette fonction est dans le fichier associe | |
168 | $hash = calculer_action_auteur("ajout_forum-$arg"); | |
169 | ||
170 | // Poser un cookie pour ne pas retaper les infos invariables | |
171 | include_spip('inc/cookie'); | |
172 | spip_setcookie('spip_forum_user', | |
173 | serialize(array('nom' => $auteur, | |
174 | 'email' => $email_auteur))); | |
175 | } | |
176 | ||
177 | // pour la chaine de hidden | |
178 | $script_hidden = $script = str_replace('&', '&', $script); | |
179 | foreach ($ids as $id => $v) | |
180 | $script_hidden = parametre_url($script_hidden, $id, $v, '&'); | |
181 | ||
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('nobot'), | |
201 | 'ajouter_groupe' => $ajouter_groupe, | |
202 | 'ajouter_mot' => (is_array($ajouter_mot) ? $ajouter_mot : array($ajouter_mot)), | |
203 | ||
204 | )); | |
205 | } | |
206 | ||
207 | // http://doc.spip.org/@inclure_previsu | |
208 | function 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://doc.spip.org/@forum_fichier_tmp | |
257 | function 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://doc.spip.org/@sql_recherche_donnees_forum | |
285 | function 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 | ?> |