[ Index ]
 

Code source de SPIP 1.9.2c

Accédez au Source d'autres logiciels libres

title

Body

[fermer]

/ecrire/inc/ -> forum_insert.php (source)

   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('&amp;','&',$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  ?>


Généré le : Wed Nov 21 10:20:27 2007 par Balluche grâce à PHPXref 0.7
  Clicky Web Analytics