[ Index ] |
|
Code source de SPIP 1.9.2c |
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('&','&',$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 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Wed Nov 21 10:20:27 2007 | par Balluche grâce à PHPXref 0.7 |
![]() |