Verzeichnisstruktur phpBB-2.0.0


Veröffentlicht
03.04.2002

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

functions_post.php

Zuletzt modifiziert: 09.10.2024, 12:51 - Dateigröße: 27.43 KiB


 001  <?php
 002  /***************************************************************************
 003   *                            functions_post.php
 004   *                            -------------------
 005   *   begin                : Saturday, Feb 13, 2001
 006   *   copyright            : (C) 2001 The phpBB Group
 007   *   email                : support@phpbb.com
 008   *
 009   *   $Id$
 010   *
 011   *
 012   ***************************************************************************/
 013   
 014  /***************************************************************************
 015   *
 016   *   This program is free software; you can redistribute it and/or modify
 017   *   it under the terms of the GNU General Public License as published by
 018   *   the Free Software Foundation; either version 2 of the License, or
 019   *   (at your option) any later version.
 020   *
 021   ***************************************************************************/
 022   
 023  if (!defined('IN_PHPBB'))
 024  {
 025      die('Hacking attempt');
 026  }
 027   
 028  $html_entities_match = array('#&(?!(\#[0-9]+;))#', '#<#', '#>#', '#"#');
 029  $html_entities_replace = array('&amp;', '&lt;', '&gt;', '&quot;');
 030   
 031  $unhtml_specialchars_match = array('#&gt;#', '#&lt;#', '#&quot;#', '#&amp;#');
 032  $unhtml_specialchars_replace = array('>', '<', '"', '&');
 033   
 034  //
 035  // This function will prepare a posted message for
 036  // entry into the database.
 037  //
 038  function prepare_message($message, $html_on, $bbcode_on, $smile_on, $bbcode_uid = 0)
 039  {
 040      global $board_config, $html_entities_match, $html_entities_replace;
 041   
 042      //
 043      // Clean up the message
 044      //
 045      $message = trim($message);
 046   
 047      if ($html_on)
 048      {
 049          // If HTML is on, we try to make it safe
 050          // This approach is quite agressive and anything that does not look like a valid tag
 051          // is going to get converted to HTML entities
 052          $message = stripslashes($message);
 053          $html_match = '#<[^\w<]*(\w+)((?:"[^"]*"|\'[^\']*\'|[^<>\'"])+)?>#';
 054          $matches = array();
 055   
 056          $message_split = preg_split($html_match, $message);
 057          preg_match_all($html_match, $message, $matches);
 058   
 059          $message = '';
 060   
 061          foreach ($message_split as $part)
 062          {
 063              $tag = array(array_shift($matches[0]), array_shift($matches[1]), array_shift($matches[2]));
 064              $message .= preg_replace($html_entities_match, $html_entities_replace, $part) . clean_html($tag);
 065          }
 066   
 067          $message = addslashes($message);
 068          $message = str_replace('&quot;', '\&quot;', $message);
 069      }
 070      else
 071      {
 072          $message = preg_replace($html_entities_match, $html_entities_replace, $message);
 073      }
 074   
 075      if($bbcode_on && $bbcode_uid != '')
 076      {
 077          $message = bbencode_first_pass($message, $bbcode_uid);
 078      }
 079   
 080      return $message;
 081  }
 082   
 083  function unprepare_message($message)
 084  {
 085      global $unhtml_specialchars_match, $unhtml_specialchars_replace;
 086   
 087      return preg_replace($unhtml_specialchars_match, $unhtml_specialchars_replace, $message);
 088  }
 089   
 090  //
 091  // Prepare a message for posting
 092  // 
 093  function prepare_post(&$mode, &$post_data, &$bbcode_on, &$html_on, &$smilies_on, &$error_msg, &$username, &$bbcode_uid, &$subject, &$message, &$poll_title, &$poll_options, &$poll_length)
 094  {
 095      global $board_config, $userdata, $lang, $phpEx, $phpbb_root_path;
 096   
 097      // Check username
 098      if (!empty($username))
 099      {
 100          $username = phpbb_clean_username($username);
 101   
 102          if (!$userdata['session_logged_in'] || ($userdata['session_logged_in'] && $username != $userdata['username']))
 103          {
 104              include($phpbb_root_path . 'includes/functions_validate.'.$phpEx);
 105   
 106              $result = validate_username($username);
 107              if ($result['error'])
 108              {
 109                  $error_msg .= (!empty($error_msg)) ? '<br />' . $result['error_msg'] : $result['error_msg'];
 110              }
 111          }
 112          else
 113          {
 114              $username = '';
 115          }
 116      }
 117   
 118      // Check subject
 119      if (!empty($subject))
 120      {
 121          $subject = htmlspecialchars(trim($subject));
 122      }
 123      else if ($mode == 'newtopic' || ($mode == 'editpost' && $post_data['first_post']))
 124      {
 125          $error_msg .= (!empty($error_msg)) ? '<br />' . $lang['Empty_subject'] : $lang['Empty_subject'];
 126      }
 127   
 128      // Check message
 129      if (!empty($message))
 130      {
 131          $bbcode_uid = ($bbcode_on) ? make_bbcode_uid() : '';
 132          $message = prepare_message(trim($message), $html_on, $bbcode_on, $smilies_on, $bbcode_uid);
 133      }
 134      else if ($mode != 'delete' && $mode != 'poll_delete') 
 135      {
 136          $error_msg .= (!empty($error_msg)) ? '<br />' . $lang['Empty_message'] : $lang['Empty_message'];
 137      }
 138   
 139      //
 140      // Handle poll stuff
 141      //
 142      if ($mode == 'newtopic' || ($mode == 'editpost' && $post_data['first_post']))
 143      {
 144          $poll_length = (isset($poll_length)) ? max(0, intval($poll_length)) : 0;
 145   
 146          if (!empty($poll_title))
 147          {
 148              $poll_title = htmlspecialchars(trim($poll_title));
 149          }
 150   
 151          if(!empty($poll_options))
 152          {
 153              $temp_option_text = array();
 154              while(list($option_id, $option_text) = @each($poll_options))
 155              {
 156                  $option_text = trim($option_text);
 157                  if (!empty($option_text))
 158                  {
 159                      $temp_option_text[intval($option_id)] = htmlspecialchars($option_text);
 160                  }
 161              }
 162              $option_text = $temp_option_text;
 163   
 164              if (count($poll_options) < 2)
 165              {
 166                  $error_msg .= (!empty($error_msg)) ? '<br />' . $lang['To_few_poll_options'] : $lang['To_few_poll_options'];
 167              }
 168              else if (count($poll_options) > $board_config['max_poll_options']) 
 169              {
 170                  $error_msg .= (!empty($error_msg)) ? '<br />' . $lang['To_many_poll_options'] : $lang['To_many_poll_options'];
 171              }
 172              else if ($poll_title == '')
 173              {
 174                  $error_msg .= (!empty($error_msg)) ? '<br />' . $lang['Empty_poll_title'] : $lang['Empty_poll_title'];
 175              }
 176          }
 177      }
 178   
 179      return;
 180  }
 181   
 182  //
 183  // Post a new topic/reply/poll or edit existing post/poll
 184  //
 185  function submit_post($mode, &$post_data, &$message, &$meta, &$forum_id, &$topic_id, &$post_id, &$poll_id, &$topic_type, &$bbcode_on, &$html_on, &$smilies_on, &$attach_sig, &$bbcode_uid, $post_username, $post_subject, $post_message, $poll_title, &$poll_options, &$poll_length)
 186  {
 187      global $board_config, $lang, $db, $phpbb_root_path, $phpEx;
 188      global $userdata, $user_ip;
 189   
 190      include($phpbb_root_path . 'includes/functions_search.'.$phpEx);
 191   
 192      $current_time = time();
 193   
 194      if ($mode == 'newtopic' || $mode == 'reply' || $mode == 'editpost') 
 195      {
 196          //
 197          // Flood control
 198          //
 199          $where_sql = ($userdata['user_id'] == ANONYMOUS) ? "poster_ip = '$user_ip'" : 'poster_id = ' . $userdata['user_id'];
 200          $sql = "SELECT MAX(post_time) AS last_post_time
 201              FROM " . POSTS_TABLE . "
 202              WHERE $where_sql";
 203          if ($result = $db->sql_query($sql))
 204          {
 205              if ($row = $db->sql_fetchrow($result))
 206              {
 207                  if (intval($row['last_post_time']) > 0 && ($current_time - intval($row['last_post_time'])) < intval($board_config['flood_interval']))
 208                  {
 209                      message_die(GENERAL_MESSAGE, $lang['Flood_Error']);
 210                  }
 211              }
 212          }
 213      }
 214   
 215      if ($mode == 'editpost')
 216      {
 217          remove_search_post($post_id);
 218      }
 219   
 220      if ($mode == 'newtopic' || ($mode == 'editpost' && $post_data['first_post']))
 221      {
 222          $topic_vote = (!empty($poll_title) && count($poll_options) >= 2) ? 1 : 0;
 223   
 224          $sql  = ($mode != "editpost") ? "INSERT INTO " . TOPICS_TABLE . " (topic_title, topic_poster, topic_time, forum_id, topic_status, topic_type, topic_vote) VALUES ('$post_subject', " . $userdata['user_id'] . ", $current_time, $forum_id, " . TOPIC_UNLOCKED . ", $topic_type, $topic_vote)" : "UPDATE " . TOPICS_TABLE . " SET topic_title = '$post_subject', topic_type = $topic_type " . (($post_data['edit_vote'] || !empty($poll_title)) ? ", topic_vote = " . $topic_vote : "") . " WHERE topic_id = $topic_id";
 225          if (!$db->sql_query($sql))
 226          {
 227              message_die(GENERAL_ERROR, 'Error in posting', '', __LINE__, __FILE__, $sql);
 228          }
 229   
 230          if ($mode == 'newtopic')
 231          {
 232              $topic_id = $db->sql_nextid();
 233          }
 234      }
 235   
 236      $edited_sql = ($mode == 'editpost' && !$post_data['last_post'] && $post_data['poster_post']) ? ", post_edit_time = $current_time, post_edit_count = post_edit_count + 1 " : "";
 237      $sql = ($mode != "editpost") ? "INSERT INTO " . POSTS_TABLE . " (topic_id, forum_id, poster_id, post_username, post_time, poster_ip, enable_bbcode, enable_html, enable_smilies, enable_sig) VALUES ($topic_id, $forum_id, " . $userdata['user_id'] . ", '$post_username', $current_time, '$user_ip', $bbcode_on, $html_on, $smilies_on, $attach_sig)" : "UPDATE " . POSTS_TABLE . " SET post_username = '$post_username', enable_bbcode = $bbcode_on, enable_html = $html_on, enable_smilies = $smilies_on, enable_sig = $attach_sig" . $edited_sql . " WHERE post_id = $post_id";
 238      if (!$db->sql_query($sql, BEGIN_TRANSACTION))
 239      {
 240          message_die(GENERAL_ERROR, 'Error in posting', '', __LINE__, __FILE__, $sql);
 241      }
 242   
 243      if ($mode != 'editpost')
 244      {
 245          $post_id = $db->sql_nextid();
 246      }
 247   
 248      $sql = ($mode != 'editpost') ? "INSERT INTO " . POSTS_TEXT_TABLE . " (post_id, post_subject, bbcode_uid, post_text) VALUES ($post_id, '$post_subject', '$bbcode_uid', '$post_message')" : "UPDATE " . POSTS_TEXT_TABLE . " SET post_text = '$post_message',  bbcode_uid = '$bbcode_uid', post_subject = '$post_subject' WHERE post_id = $post_id";
 249      if (!$db->sql_query($sql))
 250      {
 251          message_die(GENERAL_ERROR, 'Error in posting', '', __LINE__, __FILE__, $sql);
 252      }
 253   
 254      add_search_words('single', $post_id, stripslashes($post_message), stripslashes($post_subject));
 255   
 256      //
 257      // Add poll
 258      // 
 259      if (($mode == 'newtopic' || ($mode == 'editpost' && $post_data['edit_poll'])) && !empty($poll_title) && count($poll_options) >= 2)
 260      {
 261          $sql = (!$post_data['has_poll']) ? "INSERT INTO " . VOTE_DESC_TABLE . " (topic_id, vote_text, vote_start, vote_length) VALUES ($topic_id, '$poll_title', $current_time, " . ($poll_length * 86400) . ")" : "UPDATE " . VOTE_DESC_TABLE . " SET vote_text = '$poll_title', vote_length = " . ($poll_length * 86400) . " WHERE topic_id = $topic_id";
 262          if (!$db->sql_query($sql))
 263          {
 264              message_die(GENERAL_ERROR, 'Error in posting', '', __LINE__, __FILE__, $sql);
 265          }
 266   
 267          $delete_option_sql = '';
 268          $old_poll_result = array();
 269          if ($mode == 'editpost' && $post_data['has_poll'])
 270          {
 271              $sql = "SELECT vote_option_id, vote_result  
 272                  FROM " . VOTE_RESULTS_TABLE . " 
 273                  WHERE vote_id = $poll_id 
 274                  ORDER BY vote_option_id ASC";
 275              if (!($result = $db->sql_query($sql)))
 276              {
 277                  message_die(GENERAL_ERROR, 'Could not obtain vote data results for this topic', '', __LINE__, __FILE__, $sql);
 278              }
 279   
 280              while ($row = $db->sql_fetchrow($result))
 281              {
 282                  $old_poll_result[$row['vote_option_id']] = $row['vote_result'];
 283   
 284                  if (!isset($poll_options[$row['vote_option_id']]))
 285                  {
 286                      $delete_option_sql .= ($delete_option_sql != '') ? ', ' . $row['vote_option_id'] : $row['vote_option_id'];
 287                  }
 288              }
 289          }
 290          else
 291          {
 292              $poll_id = $db->sql_nextid();
 293          }
 294   
 295          @reset($poll_options);
 296   
 297          $poll_option_id = 1;
 298          while (list($option_id, $option_text) = each($poll_options))
 299          {
 300              if (!empty($option_text))
 301              {
 302                  $option_text = str_replace("\'", "''", htmlspecialchars($option_text));
 303                  $poll_result = ($mode == "editpost" && isset($old_poll_result[$option_id])) ? $old_poll_result[$option_id] : 0;
 304   
 305                  $sql = ($mode != "editpost" || !isset($old_poll_result[$option_id])) ? "INSERT INTO " . VOTE_RESULTS_TABLE . " (vote_id, vote_option_id, vote_option_text, vote_result) VALUES ($poll_id, $poll_option_id, '$option_text', $poll_result)" : "UPDATE " . VOTE_RESULTS_TABLE . " SET vote_option_text = '$option_text', vote_result = $poll_result WHERE vote_option_id = $option_id AND vote_id = $poll_id";
 306                  if (!$db->sql_query($sql))
 307                  {
 308                      message_die(GENERAL_ERROR, 'Error in posting', '', __LINE__, __FILE__, $sql);
 309                  }
 310                  $poll_option_id++;
 311              }
 312          }
 313   
 314          if ($delete_option_sql != '')
 315          {
 316              $sql = "DELETE FROM " . VOTE_RESULTS_TABLE . " 
 317                  WHERE vote_option_id IN ($delete_option_sql) 
 318                      AND vote_id = $poll_id";
 319              if (!$db->sql_query($sql))
 320              {
 321                  message_die(GENERAL_ERROR, 'Error deleting pruned poll options', '', __LINE__, __FILE__, $sql);
 322              }
 323          }
 324      }
 325   
 326      $meta = '<meta http-equiv="refresh" content="3;url=' . append_sid("viewtopic.$phpEx?" . POST_POST_URL . "=" . $post_id) . '#' . $post_id . '">';
 327      $message = $lang['Stored'] . '<br /><br />' . sprintf($lang['Click_view_message'], '<a href="' . append_sid("viewtopic.$phpEx?" . POST_POST_URL . "=" . $post_id) . '#' . $post_id . '">', '</a>') . '<br /><br />' . sprintf($lang['Click_return_forum'], '<a href="' . append_sid("viewforum.$phpEx?" . POST_FORUM_URL . "=$forum_id") . '">', '</a>');
 328   
 329      return false;
 330  }
 331   
 332  //
 333  // Update post stats and details
 334  //
 335  function update_post_stats(&$mode, &$post_data, &$forum_id, &$topic_id, &$post_id, &$user_id)
 336  {
 337      global $db;
 338   
 339      $sign = ($mode == 'delete') ? '- 1' : '+ 1';
 340      $forum_update_sql = "forum_posts = forum_posts $sign";
 341      $topic_update_sql = '';
 342   
 343      if ($mode == 'delete')
 344      {
 345          if ($post_data['last_post'])
 346          {
 347              if ($post_data['first_post'])
 348              {
 349                  $forum_update_sql .= ', forum_topics = forum_topics - 1';
 350              }
 351              else
 352              {
 353   
 354                  $topic_update_sql .= 'topic_replies = topic_replies - 1';
 355   
 356                  $sql = "SELECT MAX(post_id) AS last_post_id
 357                      FROM " . POSTS_TABLE . " 
 358                      WHERE topic_id = $topic_id";
 359                  if (!($result = $db->sql_query($sql)))
 360                  {
 361                      message_die(GENERAL_ERROR, 'Error in deleting post', '', __LINE__, __FILE__, $sql);
 362                  }
 363   
 364                  if ($row = $db->sql_fetchrow($result))
 365                  {
 366                      $topic_update_sql .= ', topic_last_post_id = ' . $row['last_post_id'];
 367                  }
 368              }
 369   
 370              if ($post_data['last_topic'])
 371              {
 372                  $sql = "SELECT MAX(post_id) AS last_post_id
 373                      FROM " . POSTS_TABLE . " 
 374                      WHERE forum_id = $forum_id"; 
 375                  if (!($result = $db->sql_query($sql)))
 376                  {
 377                      message_die(GENERAL_ERROR, 'Error in deleting post', '', __LINE__, __FILE__, $sql);
 378                  }
 379   
 380                  if ($row = $db->sql_fetchrow($result))
 381                  {
 382                      $forum_update_sql .= ($row['last_post_id']) ? ', forum_last_post_id = ' . $row['last_post_id'] : ', forum_last_post_id = 0';
 383                  }
 384              }
 385          }
 386          else if ($post_data['first_post']) 
 387          {
 388              $sql = "SELECT MIN(post_id) AS first_post_id
 389                  FROM " . POSTS_TABLE . " 
 390                  WHERE topic_id = $topic_id";
 391              if (!($result = $db->sql_query($sql)))
 392              {
 393                  message_die(GENERAL_ERROR, 'Error in deleting post', '', __LINE__, __FILE__, $sql);
 394              }
 395   
 396              if ($row = $db->sql_fetchrow($result))
 397              {
 398                  $topic_update_sql .= 'topic_replies = topic_replies - 1, topic_first_post_id = ' . $row['first_post_id'];
 399              }
 400          }
 401          else
 402          {
 403              $topic_update_sql .= 'topic_replies = topic_replies - 1';
 404          }
 405      }
 406      else if ($mode != 'poll_delete')
 407      {
 408          $forum_update_sql .= ", forum_last_post_id = $post_id" . (($mode == 'newtopic') ? ", forum_topics = forum_topics $sign" : ""); 
 409          $topic_update_sql = "topic_last_post_id = $post_id" . (($mode == 'reply') ? ", topic_replies = topic_replies $sign" : ", topic_first_post_id = $post_id");
 410      }
 411      else 
 412      {
 413          $topic_update_sql .= 'topic_vote = 0';
 414      }
 415   
 416      if ($mode != 'poll_delete')
 417      {
 418          $sql = "UPDATE " . FORUMS_TABLE . " SET 
 419              $forum_update_sql 
 420              WHERE forum_id = $forum_id";
 421          if (!$db->sql_query($sql))
 422          {
 423              message_die(GENERAL_ERROR, 'Error in posting', '', __LINE__, __FILE__, $sql);
 424          }
 425      }
 426   
 427      if ($topic_update_sql != '')
 428      {
 429          $sql = "UPDATE " . TOPICS_TABLE . " SET 
 430              $topic_update_sql 
 431              WHERE topic_id = $topic_id";
 432          if (!$db->sql_query($sql))
 433          {
 434              message_die(GENERAL_ERROR, 'Error in posting', '', __LINE__, __FILE__, $sql);
 435          }
 436      }
 437   
 438      if ($mode != 'poll_delete')
 439      {
 440          $sql = "UPDATE " . USERS_TABLE . "
 441              SET user_posts = user_posts $sign 
 442              WHERE user_id = $user_id";
 443          if (!$db->sql_query($sql, END_TRANSACTION))
 444          {
 445              message_die(GENERAL_ERROR, 'Error in posting', '', __LINE__, __FILE__, $sql);
 446          }
 447      }
 448   
 449      return;
 450  }
 451   
 452  //
 453  // Delete a post/poll
 454  //
 455  function delete_post($mode, &$post_data, &$message, &$meta, &$forum_id, &$topic_id, &$post_id, &$poll_id)
 456  {
 457      global $board_config, $lang, $db, $phpbb_root_path, $phpEx;
 458      global $userdata, $user_ip;
 459   
 460      if ($mode != 'poll_delete')
 461      {
 462          include($phpbb_root_path . 'includes/functions_search.'.$phpEx);
 463   
 464          $sql = "DELETE FROM " . POSTS_TABLE . " 
 465              WHERE post_id = $post_id";
 466          if (!$db->sql_query($sql))
 467          {
 468              message_die(GENERAL_ERROR, 'Error in deleting post', '', __LINE__, __FILE__, $sql);
 469          }
 470   
 471          $sql = "DELETE FROM " . POSTS_TEXT_TABLE . " 
 472              WHERE post_id = $post_id";
 473          if (!$db->sql_query($sql))
 474          {
 475              message_die(GENERAL_ERROR, 'Error in deleting post', '', __LINE__, __FILE__, $sql);
 476          }
 477   
 478          if ($post_data['last_post'])
 479          {
 480              if ($post_data['first_post'])
 481              {
 482                  $forum_update_sql .= ', forum_topics = forum_topics - 1';
 483                  $sql = "DELETE FROM " . TOPICS_TABLE . " 
 484                      WHERE topic_id = $topic_id 
 485                          OR topic_moved_id = $topic_id";
 486                  if (!$db->sql_query($sql))
 487                  {
 488                      message_die(GENERAL_ERROR, 'Error in deleting post', '', __LINE__, __FILE__, $sql);
 489                  }
 490   
 491                  $sql = "DELETE FROM " . TOPICS_WATCH_TABLE . "
 492                      WHERE topic_id = $topic_id";
 493                  if (!$db->sql_query($sql))
 494                  {
 495                      message_die(GENERAL_ERROR, 'Error in deleting post', '', __LINE__, __FILE__, $sql);
 496                  }
 497              }
 498          }
 499   
 500          remove_search_post($post_id);
 501      }
 502   
 503      if ($mode == 'poll_delete' || ($mode == 'delete' && $post_data['first_post'] && $post_data['last_post']) && $post_data['has_poll'] && $post_data['edit_poll'])
 504      {
 505          $sql = "DELETE FROM " . VOTE_DESC_TABLE . " 
 506              WHERE topic_id = $topic_id";
 507          if (!$db->sql_query($sql))
 508          {
 509              message_die(GENERAL_ERROR, 'Error in deleting poll', '', __LINE__, __FILE__, $sql);
 510          }
 511   
 512          $sql = "DELETE FROM " . VOTE_RESULTS_TABLE . " 
 513              WHERE vote_id = $poll_id";
 514          if (!$db->sql_query($sql))
 515          {
 516              message_die(GENERAL_ERROR, 'Error in deleting poll', '', __LINE__, __FILE__, $sql);
 517          }
 518   
 519          $sql = "DELETE FROM " . VOTE_USERS_TABLE . " 
 520              WHERE vote_id = $poll_id";
 521          if (!$db->sql_query($sql))
 522          {
 523              message_die(GENERAL_ERROR, 'Error in deleting poll', '', __LINE__, __FILE__, $sql);
 524          }
 525      }
 526   
 527      if ($mode == 'delete' && $post_data['first_post'] && $post_data['last_post'])
 528      {
 529          $meta = '<meta http-equiv="refresh" content="3;url=' . append_sid("viewforum.$phpEx?" . POST_FORUM_URL . '=' . $forum_id) . '">';
 530          $message = $lang['Deleted'];
 531      }
 532      else
 533      {
 534          $meta = '<meta http-equiv="refresh" content="3;url=' . append_sid("viewtopic.$phpEx?" . POST_TOPIC_URL . '=' . $topic_id) . '">';
 535          $message = (($mode == 'poll_delete') ? $lang['Poll_delete'] : $lang['Deleted']) . '<br /><br />' . sprintf($lang['Click_return_topic'], '<a href="' . append_sid("viewtopic.$phpEx?" . POST_TOPIC_URL . "=$topic_id") . '">', '</a>');
 536      }
 537   
 538      $message .=  '<br /><br />' . sprintf($lang['Click_return_forum'], '<a href="' . append_sid("viewforum.$phpEx?" . POST_FORUM_URL . "=$forum_id") . '">', '</a>');
 539   
 540      return;
 541  }
 542   
 543  //
 544  // Handle user notification on new post
 545  //
 546  function user_notification($mode, &$post_data, &$topic_title, &$forum_id, &$topic_id, &$post_id, &$notify_user)
 547  {
 548      global $board_config, $lang, $db, $phpbb_root_path, $phpEx;
 549      global $userdata, $user_ip;
 550   
 551      $current_time = time();
 552   
 553      if ($mode != 'delete')
 554      {
 555          if ($mode == 'reply')
 556          {
 557              $sql = "SELECT ban_userid 
 558                  FROM " . BANLIST_TABLE;
 559              if (!($result = $db->sql_query($sql)))
 560              {
 561                  message_die(GENERAL_ERROR, 'Could not obtain banlist', '', __LINE__, __FILE__, $sql);
 562              }
 563   
 564              $user_id_sql = '';
 565              while ($row = $db->sql_fetchrow($result))
 566              {
 567                  if (isset($row['ban_userid']) && !empty($row['ban_userid']))
 568                  {
 569                      $user_id_sql .= ', ' . $row['ban_userid'];
 570                  }
 571              }
 572   
 573              $sql = "SELECT u.user_id, u.user_email, u.user_lang 
 574                  FROM " . TOPICS_WATCH_TABLE . " tw, " . USERS_TABLE . " u 
 575                  WHERE tw.topic_id = $topic_id 
 576                      AND tw.user_id NOT IN (" . $userdata['user_id'] . ", " . ANONYMOUS . $user_id_sql . ") 
 577                      AND tw.notify_status = " . TOPIC_WATCH_UN_NOTIFIED . " 
 578                      AND u.user_id = tw.user_id";
 579              if (!($result = $db->sql_query($sql)))
 580              {
 581                  message_die(GENERAL_ERROR, 'Could not obtain list of topic watchers', '', __LINE__, __FILE__, $sql);
 582              }
 583   
 584              $update_watched_sql = '';
 585              $bcc_list_ary = array();
 586              
 587              if ($row = $db->sql_fetchrow($result))
 588              {
 589                  // Sixty second limit
 590                  @set_time_limit(60);
 591   
 592                  do
 593                  {
 594                      if ($row['user_email'] != '')
 595                      {
 596                          $bcc_list_ary[$row['user_lang']][] = $row['user_email'];
 597                      }
 598                      $update_watched_sql .= ($update_watched_sql != '') ? ', ' . $row['user_id'] : $row['user_id'];
 599                  }
 600                  while ($row = $db->sql_fetchrow($result));
 601   
 602                  //
 603                  // Let's do some checking to make sure that mass mail functions
 604                  // are working in win32 versions of php.
 605                  //
 606                  if (preg_match('/[c-z]:\\\.*/i', getenv('PATH')) && !$board_config['smtp_delivery'])
 607                  {
 608                      $ini_val = (@phpversion() >= '4.0.0') ? 'ini_get' : 'get_cfg_var';
 609   
 610                      // We are running on windows, force delivery to use our smtp functions
 611                      // since php's are broken by default
 612                      $board_config['smtp_delivery'] = 1;
 613                      $board_config['smtp_host'] = @$ini_val('SMTP');
 614                  }
 615   
 616                  if (sizeof($bcc_list_ary))
 617                  {
 618                      include($phpbb_root_path . 'includes/emailer.'.$phpEx);
 619                      $emailer = new emailer($board_config['smtp_delivery']);
 620   
 621                      $script_name = preg_replace('/^\/?(.*?)\/?$/', '\1', trim($board_config['script_path']));
 622                      $script_name = ($script_name != '') ? $script_name . '/viewtopic.'.$phpEx : 'viewtopic.'.$phpEx;
 623                      $server_name = trim($board_config['server_name']);
 624                      $server_protocol = ($board_config['cookie_secure']) ? 'https://' : 'http://';
 625                      $server_port = ($board_config['server_port'] <> 80) ? ':' . trim($board_config['server_port']) . '/' : '/';
 626   
 627                      $orig_word = array();
 628                      $replacement_word = array();
 629                      obtain_word_list($orig_word, $replacement_word);
 630   
 631                      $emailer->from($board_config['board_email']);
 632                      $emailer->replyto($board_config['board_email']);
 633   
 634                      $topic_title = (count($orig_word)) ? preg_replace($orig_word, $replacement_word, unprepare_message($topic_title)) : unprepare_message($topic_title);
 635   
 636                      @reset($bcc_list_ary);
 637                      while (list($user_lang, $bcc_list) = each($bcc_list_ary))
 638                      {
 639                          $emailer->use_template('topic_notify', $user_lang);
 640          
 641                          for ($i = 0; $i < count($bcc_list); $i++)
 642                          {
 643                              $emailer->bcc($bcc_list[$i]);
 644                          }
 645   
 646                          // The Topic_reply_notification lang string below will be used
 647                          // if for some reason the mail template subject cannot be read 
 648                          // ... note it will not necessarily be in the posters own language!
 649                          $emailer->set_subject($lang['Topic_reply_notification']); 
 650                          
 651                          // This is a nasty kludge to remove the username var ... till (if?)
 652                          // translators update their templates
 653                          $emailer->msg = preg_replace('#[ ]?{USERNAME}#', '', $emailer->msg);
 654   
 655                          $emailer->assign_vars(array(
 656                              'EMAIL_SIG' => (!empty($board_config['board_email_sig'])) ? str_replace('<br />', "\n", "-- \n" . $board_config['board_email_sig']) : '',
 657                              'SITENAME' => $board_config['sitename'],
 658                              'TOPIC_TITLE' => $topic_title, 
 659   
 660                              'U_TOPIC' => $server_protocol . $server_name . $server_port . $script_name . '?' . POST_POST_URL . "=$post_id#$post_id",
 661                              'U_STOP_WATCHING_TOPIC' => $server_protocol . $server_name . $server_port . $script_name . '?' . POST_TOPIC_URL . "=$topic_id&unwatch=topic")
 662                          );
 663   
 664                          $emailer->send();
 665                          $emailer->reset();
 666                      }
 667                  }
 668              }
 669              $db->sql_freeresult($result);
 670   
 671              if ($update_watched_sql != '')
 672              {
 673                  $sql = "UPDATE " . TOPICS_WATCH_TABLE . "
 674                      SET notify_status = " . TOPIC_WATCH_NOTIFIED . "
 675                      WHERE topic_id = $topic_id
 676                          AND user_id IN ($update_watched_sql)";
 677                  $db->sql_query($sql);
 678              }
 679          }
 680   
 681          $sql = "SELECT topic_id 
 682              FROM " . TOPICS_WATCH_TABLE . "
 683              WHERE topic_id = $topic_id
 684                  AND user_id = " . $userdata['user_id'];
 685          if (!($result = $db->sql_query($sql)))
 686          {
 687              message_die(GENERAL_ERROR, 'Could not obtain topic watch information', '', __LINE__, __FILE__, $sql);
 688          }
 689   
 690          $row = $db->sql_fetchrow($result);
 691   
 692          if (!$notify_user && !empty($row['topic_id']))
 693          {
 694              $sql = "DELETE FROM " . TOPICS_WATCH_TABLE . "
 695                  WHERE topic_id = $topic_id
 696                      AND user_id = " . $userdata['user_id'];
 697              if (!$db->sql_query($sql))
 698              {
 699                  message_die(GENERAL_ERROR, 'Could not delete topic watch information', '', __LINE__, __FILE__, $sql);
 700              }
 701          }
 702          else if ($notify_user && empty($row['topic_id']))
 703          {
 704              $sql = "INSERT INTO " . TOPICS_WATCH_TABLE . " (user_id, topic_id, notify_status)
 705                  VALUES (" . $userdata['user_id'] . ", $topic_id, 0)";
 706              if (!$db->sql_query($sql))
 707              {
 708                  message_die(GENERAL_ERROR, 'Could not insert topic watch information', '', __LINE__, __FILE__, $sql);
 709              }
 710          }
 711      }
 712  }
 713   
 714  //
 715  // Fill smiley templates (or just the variables) with smileys
 716  // Either in a window or inline
 717  //
 718  function generate_smilies($mode, $page_id)
 719  {
 720      global $db, $board_config, $template, $lang, $images, $theme, $phpEx, $phpbb_root_path;
 721      global $user_ip, $session_length, $starttime;
 722      global $userdata;
 723   
 724      $inline_columns = 4;
 725      $inline_rows = 5;
 726      $window_columns = 8;
 727   
 728      if ($mode == 'window')
 729      {
 730          $userdata = session_pagestart($user_ip, $page_id);
 731          init_userprefs($userdata);
 732   
 733          $gen_simple_header = TRUE;
 734   
 735          $page_title = $lang['Emoticons'];
 736          include($phpbb_root_path . 'includes/page_header.'.$phpEx);
 737   
 738          $template->set_filenames(array(
 739              'smiliesbody' => 'posting_smilies.tpl')
 740          );
 741      }
 742   
 743      $sql = "SELECT emoticon, code, smile_url   
 744          FROM " . SMILIES_TABLE . " 
 745          ORDER BY smilies_id";
 746      if ($result = $db->sql_query($sql))
 747      {
 748          $num_smilies = 0;
 749          $rowset = array();
 750          while ($row = $db->sql_fetchrow($result))
 751          {
 752              if (empty($rowset[$row['smile_url']]))
 753              {
 754                  $rowset[$row['smile_url']]['code'] = str_replace("'", "\\'", str_replace('\\', '\\\\', $row['code']));
 755                  $rowset[$row['smile_url']]['emoticon'] = $row['emoticon'];
 756                  $num_smilies++;
 757              }
 758          }
 759   
 760          if ($num_smilies)
 761          {
 762              $smilies_count = ($mode == 'inline') ? min(19, $num_smilies) : $num_smilies;
 763              $smilies_split_row = ($mode == 'inline') ? $inline_columns - 1 : $window_columns - 1;
 764   
 765              $s_colspan = 0;
 766              $row = 0;
 767              $col = 0;
 768   
 769              while (list($smile_url, $data) = @each($rowset))
 770              {
 771                  if (!$col)
 772                  {
 773                      $template->assign_block_vars('smilies_row', array());
 774                  }
 775   
 776                  $template->assign_block_vars('smilies_row.smilies_col', array(
 777                      'SMILEY_CODE' => $data['code'],
 778                      'SMILEY_IMG' => $board_config['smilies_path'] . '/' . $smile_url,
 779                      'SMILEY_DESC' => $data['emoticon'])
 780                  );
 781   
 782                  $s_colspan = max($s_colspan, $col + 1);
 783   
 784                  if ($col == $smilies_split_row)
 785                  {
 786                      if ($mode == 'inline' && $row == $inline_rows - 1)
 787                      {
 788                          break;
 789                      }
 790                      $col = 0;
 791                      $row++;
 792                  }
 793                  else
 794                  {
 795                      $col++;
 796                  }
 797              }
 798   
 799              if ($mode == 'inline' && $num_smilies > $inline_rows * $inline_columns)
 800              {
 801                  $template->assign_block_vars('switch_smilies_extra', array());
 802   
 803                  $template->assign_vars(array(
 804                      'L_MORE_SMILIES' => $lang['More_emoticons'], 
 805                      'U_MORE_SMILIES' => append_sid("posting.$phpEx?mode=smilies"))
 806                  );
 807              }
 808   
 809              $template->assign_vars(array(
 810                  'L_EMOTICONS' => $lang['Emoticons'], 
 811                  'L_CLOSE_WINDOW' => $lang['Close_window'], 
 812                  'S_SMILIES_COLSPAN' => $s_colspan)
 813              );
 814          }
 815      }
 816   
 817      if ($mode == 'window')
 818      {
 819          $template->pparse('smiliesbody');
 820   
 821          include($phpbb_root_path . 'includes/page_tail.'.$phpEx);
 822      }
 823  }
 824   
 825  /**
 826  * Called from within prepare_message to clean included HTML tags if HTML is
 827  * turned on for that post
 828  * @param array $tag Matching text from the message to parse
 829  */
 830  function clean_html($tag)
 831  {
 832      global $board_config;
 833   
 834      if (empty($tag[0]))
 835      {
 836          return '';
 837      }
 838   
 839      $allowed_html_tags = preg_split('/, */', strtolower($board_config['allow_html_tags']));
 840      $disallowed_attributes = '/^(?:style|on)/i';
 841   
 842      // Check if this is an end tag
 843      preg_match('/<[^\w\/]*\/[\W]*(\w+)/', $tag[0], $matches);
 844      if (sizeof($matches))
 845      {
 846          if (in_array(strtolower($matches[1]), $allowed_html_tags))
 847          {
 848              return  '</' . $matches[1] . '>';
 849          }
 850          else
 851          {
 852              return  htmlspecialchars('</' . $matches[1] . '>');
 853          }
 854      }
 855   
 856      // Check if this is an allowed tag
 857      if (in_array(strtolower($tag[1]), $allowed_html_tags))
 858      {
 859          $attributes = '';
 860          if (!empty($tag[2]))
 861          {
 862              preg_match_all('/[\W]*?(\w+)[\W]*?=[\W]*?(["\'])((?:(?!\2).)*)\2/', $tag[2], $test);
 863              for ($i = 0; $i < sizeof($test[0]); $i++)
 864              {
 865                  if (preg_match($disallowed_attributes, $test[1][$i]))
 866                  {
 867                      continue;
 868                  }
 869                  $attributes .= ' ' . $test[1][$i] . '=' . $test[2][$i] . str_replace(array('[', ']'), array('&#91;', '&#93;'), htmlspecialchars($test[3][$i])) . $test[2][$i];
 870              }
 871          }
 872          if (in_array(strtolower($tag[1]), $allowed_html_tags))
 873          {
 874              return '<' . $tag[1] . $attributes . '>';
 875          }
 876          else
 877          {
 878              return htmlspecialchars('<' . $tag[1] . $attributes . '>');
 879          }
 880      }
 881      // Finally, this is not an allowed tag so strip all the attibutes and escape it
 882      else
 883      {
 884          return htmlspecialchars('<' .   $tag[1] . '>');
 885      }
 886  }
 887  ?>