3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2007 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
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 \***************************************************************************/
13 if (!defined("_ECRIRE_INC_VERSION")) return; #securite
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');
24 charger_generer_url();
26 /*******************************/
27 /* GESTION DU FORMULAIRE FORUM */
28 /*******************************/
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
36 // http://doc.spip.org/@balise_FORMULAIRE_FORUM
37 function balise_FORMULAIRE_FORUM ($p) {
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'));
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
);
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) {
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)]
58 // le denier arg peut contenir l'url sur lequel faire le retour
59 // exemple dans un squelette article.html : [(#FORMULAIRE_FORUM{#SELF})]
61 // recuperer les donnees du forum auquel on repond, false = forum interdit
62 list ($idr, $idf, $ida, $idb, $ids, $am, $ag, $af, $url) = $args;
68 if (!$r = sql_recherche_donnees_forum ($idr, $idf, $ida, $idb, $ids))
71 list ($titre, $table, $forums_publics) = $r;
73 if (($GLOBALS['meta']["mots_cles_forums"] != "oui"))
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);
81 $script = self(); # sur soi-meme
84 array($titre, $table, $forums_publics, $script,
85 $idr, $idf, $ida, $idb, $ids, $am, $ag, $af, $url);
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)
94 // verifier l'identite des posteurs pour les forums sur 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')));
102 $auteur = $GLOBALS['auteur_session']['nom'];
103 $email_auteur = $GLOBALS['auteur_session']['email'];
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 != ''
113 // id_rubrique est parfois passee pour les articles, on n'en veut pas
115 if ($id_rubrique > 0 AND ($id_article OR $id_breve OR $id_syndic))
117 foreach (array('id_article', 'id_breve', 'id_forum', 'id_rubrique', 'id_syndic') as $o) {
118 $ids[$o] = ($x = intval($
$o)) ?
$x : '';
122 // ne pas mettre '', sinon le squelette n'affichera rien.
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);
133 // par defaut, on veut prendre url_forum(), mais elle ne sera connue
134 // qu'en sortie, on inscrit donc une valeur absurde ("!")
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);
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'];
145 $auteur = $GLOBALS['auteur_session']['nom'];
146 $email_auteur = $GLOBALS['auteur_session']['email'];
149 } else { // appels ulterieurs
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');
161 if ($afficher_texte != 'non')
162 $previsu = inclure_previsu($texte, $titre, $email_auteur, $auteur, $url_site, $nom_site, $ajouter_mot);
164 $arg = forum_fichier_tmp(join('', $ids));
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");
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)));
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, '&');
182 return array('formulaires/forum', 0,
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,
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://"),
200 'nobot' => _request('nobot'),
201 'ajouter_groupe' => $ajouter_groupe,
202 'ajouter_mot' => (is_array($ajouter_mot) ?
$ajouter_mot : array($ajouter_mot)),
207 // http://doc.spip.org/@inclure_previsu
208 function inclure_previsu($texte,$titre, $email_auteur, $auteur, $url_site, $nom_site, $ajouter_mot)
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',
220 'compte' => strlen($texte),
221 'max' => _FORUM_LONGUEUR_MAXI
224 $bouton = _T('forum_message_definitif');
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",
230 inclure_balise_dynamique(array('formulaires/forum_previsu',
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)),
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')
256 // http://doc.spip.org/@forum_fichier_tmp
257 function forum_fichier_tmp($arg)
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"))
265 # et maintenant on purge les locks de forums ouverts depuis > 4 h
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);
276 /*******************************************************/
277 /* FONCTIONS DE CALCUL DES DONNEES DU FORMULAIRE FORUM */
278 /*******************************************************/
281 // Chercher le titre et la configuration du forum de l'element auquel on repond
284 // http://doc.spip.org/@sql_recherche_donnees_forum
285 function sql_recherche_donnees_forum ($idr, $idf, $ida, $idb, $ids) {
287 // changer la table de reference s'il y a lieu (pour afficher_groupes[] !!)
289 $titre = spip_abstract_fetsel('titre', 'spip_articles', "statut = 'publie' AND id_article = $ida");
292 $titre = spip_abstract_fetsel('titre', 'spip_breves', "statut = 'publie' AND id_breve = $idb");
295 $titre = spip_abstract_fetsel('nom_site AS titre', 'spip_syndic', "statut = 'publie' AND id_syndic = $ids");
298 $titre = spip_abstract_fetsel('titre', 'spip_rubriques', "statut = 'publie' AND id_rubrique = $idr");
299 $table = "rubriques";
303 $titre = spip_abstract_fetsel('titre', 'spip_forum', "statut = 'publie' AND id_forum = $idf");
306 $titre = supprimer_numero($titre['titre']);
310 // quelle est la configuration du forum ?
311 $type = !$ida ? false
: spip_abstract_fetsel('accepter_forum', 'spip_articles', "id_article=$ida");
313 if ($type) $type = $type['accepter_forum'];
315 if (!$type) $type = substr($GLOBALS['meta']["forums_publics"],0,3);
317 // valeurs possibles : 'pos'teriori, 'pri'ori, 'abo'nnement
321 return array ($titre, $table, $type);