1 | <?php |
---|
2 | |
---|
3 | /***************************************************************************\ |
---|
4 | * SPIP, Systeme de publication pour l'internet * |
---|
5 | * * |
---|
6 | * Copyright (c) 2001-2011 * |
---|
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 | function formulaires_forum_charger_dist( |
---|
14 | $titre, $table, $type, $objet, $primary, $script, |
---|
15 | $id_objet, $id_forum, |
---|
16 | $ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour) { |
---|
17 | |
---|
18 | // exiger l'authentification des posteurs pour les forums sur abo |
---|
19 | if ($type == "abo") { |
---|
20 | if (!$GLOBALS["visiteur_session"]['statut']) { |
---|
21 | return array( |
---|
22 | 'action' => '', #ne sert pas dans ce cas, on la vide pour mutualiser le cache |
---|
23 | 'editable'=>false, |
---|
24 | 'login_forum_abo'=>' ', |
---|
25 | 'inscription' => generer_url_public('identifiants', 'lang='.$GLOBALS['spip_lang']), |
---|
26 | 'oubli' => generer_url_public('spip_pass','lang='.$GLOBALS['spip_lang'],true), |
---|
27 | ); |
---|
28 | } |
---|
29 | } |
---|
30 | // Tableau des valeurs servant au calcul d'une signature de securite. |
---|
31 | // Elles seront placees en Input Hidden pour que inc/forum_insert |
---|
32 | // recalcule la meme chose et verifie l'identite des resultats. |
---|
33 | // Donc ne pas changer la valeur de ce tableau entre le calcul de |
---|
34 | // la signature et la fabrication des Hidden |
---|
35 | // Faire attention aussi a 0 != '' |
---|
36 | |
---|
37 | $ids = array(); |
---|
38 | |
---|
39 | $ids[$primary] = ($x = intval($id_objet)) ? $x : ''; |
---|
40 | $ids['id_objet'] = ($x = intval($id_objet)) ? $x : ''; |
---|
41 | $ids['objet'] = $objet; |
---|
42 | $ids['id_forum'] = ($x = intval($id_forum)) ? $x : ''; |
---|
43 | |
---|
44 | // ne pas mettre '', sinon le squelette n'affichera rien. |
---|
45 | $previsu = ' '; |
---|
46 | |
---|
47 | // au premier appel (pas de Post-var nommee "retour_forum") |
---|
48 | // memoriser eventuellement l'URL de retour pour y revenir apres |
---|
49 | // envoi du message ; aux appels suivants, reconduire la valeur. |
---|
50 | // Initialiser aussi l'auteur |
---|
51 | if ($retour_forum = rawurldecode(_request('retour'))) |
---|
52 | $retour_forum = str_replace('&var_mode=recalcul','',$retour_forum); |
---|
53 | else { |
---|
54 | // par defaut, on veut prendre url_forum(), mais elle ne sera connue |
---|
55 | // qu'en sortie, on inscrit donc une valeur absurde ("!") |
---|
56 | $retour_forum = "!"; |
---|
57 | // sauf si on a passe un parametre en argument (exemple : {#SELF}) |
---|
58 | if ($url_param_retour) |
---|
59 | $retour_forum = str_replace('&', '&', $url_param_retour); |
---|
60 | $retour_forum = rawurlencode($retour_forum); |
---|
61 | } |
---|
62 | if (_request('retour_forum')){ |
---|
63 | $arg = forum_fichier_tmp(join('', $ids)); |
---|
64 | |
---|
65 | $securiser_action = charger_fonction('securiser_action', 'inc'); |
---|
66 | // on sait que cette fonction est dans le fichier associe |
---|
67 | $hash = calculer_action_auteur("ajout_forum-$arg"); |
---|
68 | } |
---|
69 | |
---|
70 | // pour les hidden |
---|
71 | $script_hidden = ""; |
---|
72 | foreach ($ids as $id => $v) |
---|
73 | $script_hidden .= "<input type='hidden' name='$id' value='$v' />"; |
---|
74 | |
---|
75 | $script_hidden .= "<input type='hidden' name='arg' value='$arg' />"; |
---|
76 | $script_hidden .= "<input type='hidden' name='hash' value='$hash' />"; |
---|
77 | $script_hidden .= "<input type='hidden' name='verif_$hash' value='ok' />"; |
---|
78 | $script_hidden .= "<input type='hidden' name='afficher_texte' value='$afficher_texte' />"; |
---|
79 | $script_hidden .= "<input type='hidden' name='retour_forum' value='$retour_forum' />"; |
---|
80 | |
---|
81 | if ($formats = forum_documents_acceptes()) { |
---|
82 | include_spip('inc/securiser_action'); |
---|
83 | $cle = calculer_cle_action('ajouter-document-'.$objet.'-'.$id_objet); |
---|
84 | } |
---|
85 | // Valeurs par defaut du formulaire |
---|
86 | // si le formulaire a ete sauvegarde, restituer les valeurs de session |
---|
87 | $vals = array( |
---|
88 | 'titre' => str_replace('~', ' ', extraire_multi($titre)), |
---|
89 | 'texte' => '', |
---|
90 | 'nom_site' => '', |
---|
91 | 'url_site' => 'http://' |
---|
92 | ); |
---|
93 | $cle_autosave = 'forum-'. join('-',array_map('intval',$ids)); |
---|
94 | $script_hidden .= "<input type='hidden' name='autosave' value='$cle_autosave' />"; |
---|
95 | if (isset($GLOBALS['visiteur_session']['session_autosave_'.$cle_autosave])) { |
---|
96 | // si on poste 'autosave' c'est qu'on n'a pas besoin de sauvegarder : |
---|
97 | // on elimine les donnees de la session |
---|
98 | if (_request('autosave') == $cle_autosave) |
---|
99 | session_set('session_autosave_'.$cle_autosave, null); |
---|
100 | |
---|
101 | // sinon on restitue les donnees |
---|
102 | else |
---|
103 | foreach (explode('&', $GLOBALS['visiteur_session']['session_autosave_'.$cle_autosave]) as $l) { |
---|
104 | if (list($key, $val) = explode('=', $l, 2) |
---|
105 | AND isset($vals[$key])) |
---|
106 | $vals[$key] = urldecode($val); |
---|
107 | } |
---|
108 | } |
---|
109 | |
---|
110 | return array_merge($vals, array( |
---|
111 | 'modere' => (($type != 'pri') ? '' : ' '), |
---|
112 | 'table' => $table, |
---|
113 | 'config' => array('afficher_barre' => ($GLOBALS['meta']['forums_afficher_barre']!='non'?' ':'')), |
---|
114 | 'action' => $script, # ce sur quoi on fait le action='...' |
---|
115 | '_hidden' => $script_hidden, # pour les variables hidden |
---|
116 | 'cle_ajouter_document' => $cle, |
---|
117 | 'formats_documents_forum' => forum_documents_acceptes(), |
---|
118 | 'ajouter_document' => $_FILES['ajouter_document']['name'], |
---|
119 | 'nobot' => ($cle ? _request($cle) : _request('nobot')), |
---|
120 | 'ajouter_groupe' => $ajouter_groupe, |
---|
121 | 'ajouter_mot' => (is_array($ajouter_mot) ? $ajouter_mot : array($ajouter_mot)), |
---|
122 | 'id_forum' => $id_forum, // passer id_forum au formulaire pour lui permettre d'afficher a quoi l'internaute repond |
---|
123 | '_sign'=>implode('_',$ids) |
---|
124 | )); |
---|
125 | } |
---|
126 | |
---|
127 | |
---|
128 | // Une securite qui nous protege contre : |
---|
129 | // - les doubles validations de forums (derapages humains ou des brouteurs) |
---|
130 | // - les abus visant a mettre des forums malgre nous sur un article (??) |
---|
131 | // On installe un fichier temporaire dans _DIR_TMP (et pas _DIR_CACHE |
---|
132 | // afin de ne pas bugguer quand on vide le cache) |
---|
133 | // Le lock est leve au moment de l'insertion en base (inc-messforum) |
---|
134 | // Ce systeme n'est pas fonctionnel pour les forums sans previsu (notamment |
---|
135 | // si $afficher_texte = 'non') |
---|
136 | |
---|
137 | // http://doc.spip.org/@forum_fichier_tmp |
---|
138 | function forum_fichier_tmp($arg) |
---|
139 | { |
---|
140 | # astuce : mt_rand pour autoriser les hits simultanes |
---|
141 | while (($alea = time() + @mt_rand()) + intval($arg) |
---|
142 | AND @file_exists($f = _DIR_TMP."forum_$alea.lck")) |
---|
143 | {}; |
---|
144 | spip_touch ($f); |
---|
145 | |
---|
146 | # et maintenant on purge les locks de forums ouverts depuis > 4 h |
---|
147 | |
---|
148 | if ($dh = @opendir(_DIR_TMP)) |
---|
149 | while (($file = @readdir($dh)) !== false) |
---|
150 | if (preg_match('/^forum_([0-9]+)\.lck$/', $file) |
---|
151 | AND (time()-@filemtime(_DIR_TMP.$file) > 4*3600)) |
---|
152 | spip_unlink(_DIR_TMP.$file); |
---|
153 | return $alea; |
---|
154 | } |
---|
155 | |
---|
156 | function formulaires_forum_verifier_dist( |
---|
157 | $titre, $table, $type, $objet, $primary, $script, |
---|
158 | $id_objet, $id_forum, |
---|
159 | $ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour) |
---|
160 | { |
---|
161 | include_spip('inc/acces'); |
---|
162 | include_spip('inc/texte'); |
---|
163 | include_spip('inc/forum'); |
---|
164 | include_spip('inc/session'); |
---|
165 | include_spip('base/abstract_sql'); |
---|
166 | |
---|
167 | $erreurs = array(); |
---|
168 | |
---|
169 | // desactiver id_rubrique si un id_article ou autre existe dans le contexte |
---|
170 | // if ($id_article OR $id_breve OR $id_forum OR $id_syndic) |
---|
171 | // $id_rubrique = 0; |
---|
172 | |
---|
173 | // stocker un eventuel document dans un espace temporaire |
---|
174 | // portant la cle du formulaire ; et ses metadonnees avec |
---|
175 | |
---|
176 | if (!isset($GLOBALS['visiteur_session']['tmp_forum_document'])) |
---|
177 | session_set('tmp_forum_document', |
---|
178 | sous_repertoire(_DIR_TMP,'documents_forum').md5(uniqid(rand()))); |
---|
179 | $tmp = $GLOBALS['visiteur_session']['tmp_forum_document']; |
---|
180 | $doc = &$_FILES['ajouter_document']; |
---|
181 | if (isset($_FILES['ajouter_document']) |
---|
182 | AND $_FILES['ajouter_document']['tmp_name']) { |
---|
183 | // securite : |
---|
184 | // verifier si on possede la cle (ie on est autorise a poster) |
---|
185 | // (sinon tant pis) ; cf. charger.php pour la definition de la cle |
---|
186 | if (_request('cle_ajouter_document') != calculer_cle_action($a = "ajouter-document-$objet-$id_objet")) { |
---|
187 | $erreurs['document_forum'] = _T('forum:documents_interdits_forum'); |
---|
188 | unset($_FILES['ajouter_document']); |
---|
189 | } else { |
---|
190 | include_spip('inc/ajouter_documents'); |
---|
191 | list($extension,$doc['name']) = fixer_extension_document($doc); |
---|
192 | $acceptes = forum_documents_acceptes(); |
---|
193 | |
---|
194 | if (!in_array($extension, $acceptes)) { |
---|
195 | # normalement on n'arrive pas ici : pas d'upload si aucun format |
---|
196 | if (!$formats = join(', ',$acceptes)) |
---|
197 | $formats = '-'; //_L('aucun'); |
---|
198 | $erreurs['document_forum'] = _T('public:formats_acceptes', array('formats' => $formats)); |
---|
199 | } |
---|
200 | else { |
---|
201 | include_spip('inc/getdocument'); |
---|
202 | if (!deplacer_fichier_upload($doc['tmp_name'], $tmp.'.bin')) |
---|
203 | $erreurs['document_forum'] = _T('copie_document_impossible'); |
---|
204 | |
---|
205 | # else if (...) |
---|
206 | # verifier le type_document autorise |
---|
207 | # retailler eventuellement les photos |
---|
208 | } |
---|
209 | |
---|
210 | // si ok on stocke les meta donnees, sinon on efface |
---|
211 | if (isset($erreurs['document_forum'])) { |
---|
212 | spip_unlink($tmp.'.bin'); |
---|
213 | unset ($_FILES['ajouter_document']); |
---|
214 | } else { |
---|
215 | $doc['tmp_name'] = $tmp.'.bin'; |
---|
216 | ecrire_fichier($tmp.'.txt', serialize($doc)); |
---|
217 | } |
---|
218 | } |
---|
219 | } |
---|
220 | // restaurer le document uploade au tour precedent |
---|
221 | else if (file_exists($tmp.'.bin')) { |
---|
222 | if (_request('supprimer_document_ajoute')) { |
---|
223 | spip_unlink($tmp.'.bin'); |
---|
224 | spip_unlink($tmp.'.txt'); |
---|
225 | } else if (lire_fichier($tmp.'.txt', $meta)) |
---|
226 | $doc = @unserialize($meta); |
---|
227 | } |
---|
228 | |
---|
229 | if (strlen($texte = _request('texte')) < 10 |
---|
230 | AND !$ajouter_mot AND $GLOBALS['meta']['forums_texte'] == 'oui') |
---|
231 | $erreurs['texte'] = _T('forum:forum_attention_dix_caracteres'); |
---|
232 | else if (defined('_FORUM_LONGUEUR_MAXI') |
---|
233 | AND _FORUM_LONGUEUR_MAXI > 0 |
---|
234 | AND strlen($texte) > _FORUM_LONGUEUR_MAXI) |
---|
235 | $erreurs['texte'] = _T('forum:forum_attention_trop_caracteres', |
---|
236 | array( |
---|
237 | 'compte' => strlen($texte), |
---|
238 | 'max' => _FORUM_LONGUEUR_MAXI |
---|
239 | )); |
---|
240 | |
---|
241 | if (strlen($titre=_request('titre')) < 3 |
---|
242 | AND $GLOBALS['meta']['forums_titre'] == 'oui') |
---|
243 | $erreurs['titre'] = _T('forum:forum_attention_trois_caracteres'); |
---|
244 | |
---|
245 | if (!count($erreurs) AND !_request('confirmer_previsu_forum')){ |
---|
246 | if ($afficher_texte != 'non') { |
---|
247 | $previsu = inclure_previsu($texte, $titre, _request('url_site'), _request('nom_site'), _request('ajouter_mot'), $doc, |
---|
248 | $objet, $id_objet, $id_forum); |
---|
249 | $erreurs['previsu'] = $previsu; |
---|
250 | } |
---|
251 | } |
---|
252 | |
---|
253 | return $erreurs; |
---|
254 | } |
---|
255 | |
---|
256 | function forum_documents_acceptes() |
---|
257 | { |
---|
258 | $formats = trim($GLOBALS['meta']['formats_documents_forum']); |
---|
259 | if (!$formats) return array(); |
---|
260 | if ($formats !== '*') |
---|
261 | $formats = array_filter(preg_split(',[^a-zA-Z0-9/+_],', $formats)); |
---|
262 | else { |
---|
263 | include_spip('base/typedoc'); |
---|
264 | $formats = array_keys($GLOBALS['tables_mime']); |
---|
265 | } |
---|
266 | sort($formats); |
---|
267 | return $formats; |
---|
268 | } |
---|
269 | |
---|
270 | // http://doc.spip.org/@inclure_previsu |
---|
271 | function inclure_previsu($texte,$titre, $url_site, $nom_site, $ajouter_mot, $doc, |
---|
272 | $objet, $id_objet, $id_forum) { |
---|
273 | global $table_des_traitements; |
---|
274 | |
---|
275 | $bouton = _T('forum:forum_message_definitif'); |
---|
276 | include_spip('public/assembler'); |
---|
277 | include_spip('public/composer'); |
---|
278 | |
---|
279 | // appliquer les traitements de #TEXTE a la previsu |
---|
280 | // comme on voit c'est complique... y a peut-etre plus simple ? |
---|
281 | // recuperer les filtres eventuels de 'mes_fonctions.php' sur les balises |
---|
282 | include_spip('public/parametrer'); |
---|
283 | $evaltexte = isset($table_des_traitements['TEXTE']['forums']) |
---|
284 | ? $table_des_traitements['TEXTE']['forums'] |
---|
285 | : $table_des_traitements['TEXTE'][0]; |
---|
286 | $evaltexte = '$tmptexte = '.str_replace('%s', '$texte', $evaltexte).';'; |
---|
287 | // evaluer... |
---|
288 | eval($evaltexte); |
---|
289 | |
---|
290 | // supprimer les <form> de la previsualisation |
---|
291 | // (sinon on ne peut pas faire <cadre>...</cadre> dans les forums) |
---|
292 | return preg_replace("@<(/?)form\b@ism", |
---|
293 | '<\1div', |
---|
294 | inclure_balise_dynamique(array('formulaires/inc-forum_previsu', |
---|
295 | 0, |
---|
296 | array( |
---|
297 | 'titre' => safehtml(typo($titre)), |
---|
298 | 'texte' => $tmptexte, |
---|
299 | 'notes' => safehtml(calculer_notes()), |
---|
300 | 'url_site' => vider_url($url_site), |
---|
301 | 'nom_site' => safehtml(typo($nom_site)), |
---|
302 | 'ajouter_mot' => (is_array($ajouter_mot) ? $ajouter_mot : array($ajouter_mot)), |
---|
303 | 'ajouter_document' => $doc, |
---|
304 | 'erreur' => $erreur, |
---|
305 | 'bouton' => $bouton, |
---|
306 | 'objet' => $objet, |
---|
307 | 'id_objet' => $id_objet, |
---|
308 | 'id_forum' => $id_forum |
---|
309 | ) |
---|
310 | ), false)); |
---|
311 | } |
---|
312 | |
---|
313 | |
---|
314 | function formulaires_forum_traiter_dist() { |
---|
315 | |
---|
316 | $forum_insert = charger_fonction('forum_insert', 'inc'); |
---|
317 | |
---|
318 | list($redirect,$id_forum) = $forum_insert(); |
---|
319 | |
---|
320 | if ($id_forum) |
---|
321 | $res = array('redirect'=>$redirect,'id_forum'=>$id_forum); |
---|
322 | else |
---|
323 | $res = array('message_erreur'=>_T('forum:erreur_enregistrement_message')); |
---|
324 | return $res; |
---|
325 | } |
---|
326 | |
---|
327 | |
---|
328 | ?> |
---|