home *** CD-ROM | disk | FTP | other *** search
/ PC Advisor 2006 January / PCA126_DVD.iso / ADVISORS / phpBB-2.0.17 / phpBB2 / includes / functions_post.php < prev    next >
Encoding:
PHP Script  |  2005-07-19  |  27.3 KB  |  862 lines

  1. <?php
  2. /***************************************************************************
  3.  *                            functions_post.php
  4.  *                            -------------------
  5.  *   begin                : Saturday, Feb 13, 2001
  6.  *   copyright            : (C) 2001 The phpBB Group
  7.  *   email                : support@phpbb.com
  8.  *
  9.  *   $Id: functions_post.php,v 1.9.2.37 2004/11/18 17:49:44 acydburn Exp $
  10.  *
  11.  *
  12.  ***************************************************************************/
  13.  
  14. /***************************************************************************
  15.  *
  16.  *   This program is free software; you can redistribute it and/or modify
  17.  *   it under the terms of the GNU General Public License as published by
  18.  *   the Free Software Foundation; either version 2 of the License, or
  19.  *   (at your option) any later version.
  20.  *
  21.  ***************************************************************************/
  22.  
  23. if (!defined('IN_PHPBB'))
  24. {
  25.     die('Hacking attempt');
  26. }
  27.  
  28. $html_entities_match = array('#&(?!(\#[0-9]+;))#', '#<#', '#>#');
  29. $html_entities_replace = array('&', '<', '>');
  30.  
  31. $unhtml_specialchars_match = array('#>#', '#<#', '#"#', '#&#');
  32. $unhtml_specialchars_replace = array('>', '<', '"', '&');
  33.  
  34. //
  35. // This function will prepare a posted message for
  36. // entry into the database.
  37. //
  38. function prepare_message($message, $html_on, $bbcode_on, $smile_on, $bbcode_uid = 0)
  39. {
  40.     global $board_config, $html_entities_match, $html_entities_replace;
  41.  
  42.     //
  43.     // Clean up the message
  44.     //
  45.     $message = trim($message);
  46.  
  47.     if ($html_on)
  48.     {
  49.         $allowed_html_tags = split(',', $board_config['allow_html_tags']);
  50.  
  51.         $end_html = 0;
  52.         $start_html = 1;
  53.         $tmp_message = '';
  54.         $message = ' ' . $message . ' ';
  55.  
  56.         while ($start_html = strpos($message, '<', $start_html))
  57.         {
  58.             $tmp_message .= preg_replace($html_entities_match, $html_entities_replace, substr($message, $end_html + 1, ($start_html - $end_html - 1)));
  59.  
  60.             if ($end_html = strpos($message, '>', $start_html))
  61.             {
  62.                 $length = $end_html - $start_html + 1;
  63.                 $hold_string = substr($message, $start_html, $length);
  64.  
  65.                 if (($unclosed_open = strrpos(' ' . $hold_string, '<')) != 1)
  66.                 {
  67.                     $tmp_message .= preg_replace($html_entities_match, $html_entities_replace, substr($hold_string, 0, $unclosed_open - 1));
  68.                     $hold_string = substr($hold_string, $unclosed_open - 1);
  69.                 }
  70.  
  71.                 $tagallowed = false;
  72.                 for ($i = 0; $i < sizeof($allowed_html_tags); $i++)
  73.                 {
  74.                     $match_tag = trim($allowed_html_tags[$i]);
  75.                     if (preg_match('#^<\/?' . $match_tag . '[> ]#i', $hold_string))
  76.                     {
  77.                         $tagallowed = (preg_match('#^<\/?' . $match_tag . ' .*?(style[\t ]*?=|on[\w]+[\t ]*?=)#i', $hold_string)) ? false : true;
  78.                     }
  79.                 }
  80.  
  81.                 $tmp_message .= ($length && !$tagallowed) ? preg_replace($html_entities_match, $html_entities_replace, $hold_string) : $hold_string;
  82.  
  83.                 $start_html += $length;
  84.             }
  85.             else
  86.             {
  87.                 $tmp_message .= preg_replace($html_entities_match, $html_entities_replace, substr($message, $start_html, strlen($message)));
  88.  
  89.                 $start_html = strlen($message);
  90.                 $end_html = $start_html;
  91.             }
  92.         }
  93.  
  94.         if (!$end_html || ($end_html != strlen($message) && $tmp_message != ''))
  95.         {
  96.             $tmp_message .= preg_replace($html_entities_match, $html_entities_replace, substr($message, $end_html + 1));
  97.         }
  98.  
  99.         $message = ($tmp_message != '') ? trim($tmp_message) : trim($message);
  100.     }
  101.     else
  102.     {
  103.         $message = preg_replace($html_entities_match, $html_entities_replace, $message);
  104.     }
  105.  
  106.     if($bbcode_on && $bbcode_uid != '')
  107.     {
  108.         $message = bbencode_first_pass($message, $bbcode_uid);
  109.     }
  110.  
  111.     return $message;
  112. }
  113.  
  114. function unprepare_message($message)
  115. {
  116.     global $unhtml_specialchars_match, $unhtml_specialchars_replace;
  117.  
  118.     return preg_replace($unhtml_specialchars_match, $unhtml_specialchars_replace, $message);
  119. }
  120.  
  121. //
  122. // Prepare a message for posting
  123. // 
  124. 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)
  125. {
  126.     global $board_config, $userdata, $lang, $phpEx, $phpbb_root_path;
  127.  
  128.     // Check username
  129.     if (!empty($username))
  130.     {
  131.         $username = phpbb_clean_username($username);
  132.  
  133.         if (!$userdata['session_logged_in'] || ($userdata['session_logged_in'] && $username != $userdata['username']))
  134.         {
  135.             include($phpbb_root_path . 'includes/functions_validate.'.$phpEx);
  136.  
  137.             $result = validate_username($username);
  138.             if ($result['error'])
  139.             {
  140.                 $error_msg .= (!empty($error_msg)) ? '<br />' . $result['error_msg'] : $result['error_msg'];
  141.             }
  142.         }
  143.         else
  144.         {
  145.             $username = '';
  146.         }
  147.     }
  148.  
  149.     // Check subject
  150.     if (!empty($subject))
  151.     {
  152.         $subject = htmlspecialchars(trim($subject));
  153.     }
  154.     else if ($mode == 'newtopic' || ($mode == 'editpost' && $post_data['first_post']))
  155.     {
  156.         $error_msg .= (!empty($error_msg)) ? '<br />' . $lang['Empty_subject'] : $lang['Empty_subject'];
  157.     }
  158.  
  159.     // Check message
  160.     if (!empty($message))
  161.     {
  162.         $bbcode_uid = ($bbcode_on) ? make_bbcode_uid() : '';
  163.         $message = prepare_message(trim($message), $html_on, $bbcode_on, $smilies_on, $bbcode_uid);
  164.     }
  165.     else if ($mode != 'delete' && $mode != 'poll_delete') 
  166.     {
  167.         $error_msg .= (!empty($error_msg)) ? '<br />' . $lang['Empty_message'] : $lang['Empty_message'];
  168.     }
  169.  
  170.     //
  171.     // Handle poll stuff
  172.     //
  173.     if ($mode == 'newtopic' || ($mode == 'editpost' && $post_data['first_post']))
  174.     {
  175.         $poll_length = (isset($poll_length)) ? max(0, intval($poll_length)) : 0;
  176.  
  177.         if (!empty($poll_title))
  178.         {
  179.             $poll_title = htmlspecialchars(trim($poll_title));
  180.         }
  181.  
  182.         if(!empty($poll_options))
  183.         {
  184.             $temp_option_text = array();
  185.             while(list($option_id, $option_text) = @each($poll_options))
  186.             {
  187.                 $option_text = trim($option_text);
  188.                 if (!empty($option_text))
  189.                 {
  190.                     $temp_option_text[$option_id] = htmlspecialchars($option_text);
  191.                 }
  192.             }
  193.             $option_text = $temp_option_text;
  194.  
  195.             if (count($poll_options) < 2)
  196.             {
  197.                 $error_msg .= (!empty($error_msg)) ? '<br />' . $lang['To_few_poll_options'] : $lang['To_few_poll_options'];
  198.             }
  199.             else if (count($poll_options) > $board_config['max_poll_options']) 
  200.             {
  201.                 $error_msg .= (!empty($error_msg)) ? '<br />' . $lang['To_many_poll_options'] : $lang['To_many_poll_options'];
  202.             }
  203.             else if ($poll_title == '')
  204.             {
  205.                 $error_msg .= (!empty($error_msg)) ? '<br />' . $lang['Empty_poll_title'] : $lang['Empty_poll_title'];
  206.             }
  207.         }
  208.     }
  209.  
  210.     return;
  211. }
  212.  
  213. //
  214. // Post a new topic/reply/poll or edit existing post/poll
  215. //
  216. 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)
  217. {
  218.     global $board_config, $lang, $db, $phpbb_root_path, $phpEx;
  219.     global $userdata, $user_ip;
  220.  
  221.     include($phpbb_root_path . 'includes/functions_search.'.$phpEx);
  222.  
  223.     $current_time = time();
  224.  
  225.     if ($mode == 'newtopic' || $mode == 'reply' || $mode == 'editpost') 
  226.     {
  227.         //
  228.         // Flood control
  229.         //
  230.         $where_sql = ($userdata['user_id'] == ANONYMOUS) ? "poster_ip = '$user_ip'" : 'poster_id = ' . $userdata['user_id'];
  231.         $sql = "SELECT MAX(post_time) AS last_post_time
  232.             FROM " . POSTS_TABLE . "
  233.             WHERE $where_sql";
  234.         if ($result = $db->sql_query($sql))
  235.         {
  236.             if ($row = $db->sql_fetchrow($result))
  237.             {
  238.                 if (intval($row['last_post_time']) > 0 && ($current_time - intval($row['last_post_time'])) < intval($board_config['flood_interval']))
  239.                 {
  240.                     message_die(GENERAL_MESSAGE, $lang['Flood_Error']);
  241.                 }
  242.             }
  243.         }
  244.     }
  245.  
  246.     if ($mode == 'editpost')
  247.     {
  248.         remove_search_post($post_id);
  249.     }
  250.  
  251.     if ($mode == 'newtopic' || ($mode == 'editpost' && $post_data['first_post']))
  252.     {
  253.         $topic_vote = (!empty($poll_title) && count($poll_options) >= 2) ? 1 : 0;
  254.  
  255.         $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";
  256.         if (!$db->sql_query($sql))
  257.         {
  258.             message_die(GENERAL_ERROR, 'Error in posting', '', __LINE__, __FILE__, $sql);
  259.         }
  260.  
  261.         if ($mode == 'newtopic')
  262.         {
  263.             $topic_id = $db->sql_nextid();
  264.         }
  265.     }
  266.  
  267.     $edited_sql = ($mode == 'editpost' && !$post_data['last_post'] && $post_data['poster_post']) ? ", post_edit_time = $current_time, post_edit_count = post_edit_count + 1 " : "";
  268.     $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";
  269.     if (!$db->sql_query($sql, BEGIN_TRANSACTION))
  270.     {
  271.         message_die(GENERAL_ERROR, 'Error in posting', '', __LINE__, __FILE__, $sql);
  272.     }
  273.  
  274.     if ($mode != 'editpost')
  275.     {
  276.         $post_id = $db->sql_nextid();
  277.     }
  278.  
  279.     $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";
  280.     if (!$db->sql_query($sql))
  281.     {
  282.         message_die(GENERAL_ERROR, 'Error in posting', '', __LINE__, __FILE__, $sql);
  283.     }
  284.  
  285.     add_search_words('single', $post_id, stripslashes($post_message), stripslashes($post_subject));
  286.  
  287.     //
  288.     // Add poll
  289.     // 
  290.     if (($mode == 'newtopic' || ($mode == 'editpost' && $post_data['edit_poll'])) && !empty($poll_title) && count($poll_options) >= 2)
  291.     {
  292.         $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";
  293.         if (!$db->sql_query($sql))
  294.         {
  295.             message_die(GENERAL_ERROR, 'Error in posting', '', __LINE__, __FILE__, $sql);
  296.         }
  297.  
  298.         $delete_option_sql = '';
  299.         $old_poll_result = array();
  300.         if ($mode == 'editpost' && $post_data['has_poll'])
  301.         {
  302.             $sql = "SELECT vote_option_id, vote_result  
  303.                 FROM " . VOTE_RESULTS_TABLE . " 
  304.                 WHERE vote_id = $poll_id 
  305.                 ORDER BY vote_option_id ASC";
  306.             if (!($result = $db->sql_query($sql)))
  307.             {
  308.                 message_die(GENERAL_ERROR, 'Could not obtain vote data results for this topic', '', __LINE__, __FILE__, $sql);
  309.             }
  310.  
  311.             while ($row = $db->sql_fetchrow($result))
  312.             {
  313.                 $old_poll_result[$row['vote_option_id']] = $row['vote_result'];
  314.  
  315.                 if (!isset($poll_options[$row['vote_option_id']]))
  316.                 {
  317.                     $delete_option_sql .= ($delete_option_sql != '') ? ', ' . $row['vote_option_id'] : $row['vote_option_id'];
  318.                 }
  319.             }
  320.         }
  321.         else
  322.         {
  323.             $poll_id = $db->sql_nextid();
  324.         }
  325.  
  326.         @reset($poll_options);
  327.  
  328.         $poll_option_id = 1;
  329.         while (list($option_id, $option_text) = each($poll_options))
  330.         {
  331.             if (!empty($option_text))
  332.             {
  333.                 $option_text = str_replace("\'", "''", htmlspecialchars($option_text));
  334.                 $poll_result = ($mode == "editpost" && isset($old_poll_result[$option_id])) ? $old_poll_result[$option_id] : 0;
  335.  
  336.                 $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";
  337.                 if (!$db->sql_query($sql))
  338.                 {
  339.                     message_die(GENERAL_ERROR, 'Error in posting', '', __LINE__, __FILE__, $sql);
  340.                 }
  341.                 $poll_option_id++;
  342.             }
  343.         }
  344.  
  345.         if ($delete_option_sql != '')
  346.         {
  347.             $sql = "DELETE FROM " . VOTE_RESULTS_TABLE . " 
  348.                 WHERE vote_option_id IN ($delete_option_sql) 
  349.                     AND vote_id = $poll_id";
  350.             if (!$db->sql_query($sql))
  351.             {
  352.                 message_die(GENERAL_ERROR, 'Error deleting pruned poll options', '', __LINE__, __FILE__, $sql);
  353.             }
  354.         }
  355.     }
  356.  
  357.     $meta = '<meta http-equiv="refresh" content="3;url=' . append_sid("viewtopic.$phpEx?" . POST_POST_URL . "=" . $post_id) . '#' . $post_id . '">';
  358.     $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>');
  359.  
  360.     return false;
  361. }
  362.  
  363. //
  364. // Update post stats and details
  365. //
  366. function update_post_stats(&$mode, &$post_data, &$forum_id, &$topic_id, &$post_id, &$user_id)
  367. {
  368.     global $db;
  369.  
  370.     $sign = ($mode == 'delete') ? '- 1' : '+ 1';
  371.     $forum_update_sql = "forum_posts = forum_posts $sign";
  372.     $topic_update_sql = '';
  373.  
  374.     if ($mode == 'delete')
  375.     {
  376.         if ($post_data['last_post'])
  377.         {
  378.             if ($post_data['first_post'])
  379.             {
  380.                 $forum_update_sql .= ', forum_topics = forum_topics - 1';
  381.             }
  382.             else
  383.             {
  384.  
  385.                 $topic_update_sql .= 'topic_replies = topic_replies - 1';
  386.  
  387.                 $sql = "SELECT MAX(post_id) AS last_post_id
  388.                     FROM " . POSTS_TABLE . " 
  389.                     WHERE topic_id = $topic_id";
  390.                 if (!($result = $db->sql_query($sql)))
  391.                 {
  392.                     message_die(GENERAL_ERROR, 'Error in deleting post', '', __LINE__, __FILE__, $sql);
  393.                 }
  394.  
  395.                 if ($row = $db->sql_fetchrow($result))
  396.                 {
  397.                     $topic_update_sql .= ', topic_last_post_id = ' . $row['last_post_id'];
  398.                 }
  399.             }
  400.  
  401.             if ($post_data['last_topic'])
  402.             {
  403.                 $sql = "SELECT MAX(post_id) AS last_post_id
  404.                     FROM " . POSTS_TABLE . " 
  405.                     WHERE forum_id = $forum_id"; 
  406.                 if (!($result = $db->sql_query($sql)))
  407.                 {
  408.                     message_die(GENERAL_ERROR, 'Error in deleting post', '', __LINE__, __FILE__, $sql);
  409.                 }
  410.  
  411.                 if ($row = $db->sql_fetchrow($result))
  412.                 {
  413.                     $forum_update_sql .= ($row['last_post_id']) ? ', forum_last_post_id = ' . $row['last_post_id'] : ', forum_last_post_id = 0';
  414.                 }
  415.             }
  416.         }
  417.         else if ($post_data['first_post']) 
  418.         {
  419.             $sql = "SELECT MIN(post_id) AS first_post_id
  420.                 FROM " . POSTS_TABLE . " 
  421.                 WHERE topic_id = $topic_id";
  422.             if (!($result = $db->sql_query($sql)))
  423.             {
  424.                 message_die(GENERAL_ERROR, 'Error in deleting post', '', __LINE__, __FILE__, $sql);
  425.             }
  426.  
  427.             if ($row = $db->sql_fetchrow($result))
  428.             {
  429.                 $topic_update_sql .= 'topic_replies = topic_replies - 1, topic_first_post_id = ' . $row['first_post_id'];
  430.             }
  431.         }
  432.         else
  433.         {
  434.             $topic_update_sql .= 'topic_replies = topic_replies - 1';
  435.         }
  436.     }
  437.     else if ($mode != 'poll_delete')
  438.     {
  439.         $forum_update_sql .= ", forum_last_post_id = $post_id" . (($mode == 'newtopic') ? ", forum_topics = forum_topics $sign" : ""); 
  440.         $topic_update_sql = "topic_last_post_id = $post_id" . (($mode == 'reply') ? ", topic_replies = topic_replies $sign" : ", topic_first_post_id = $post_id");
  441.     }
  442.     else 
  443.     {
  444.         $topic_update_sql .= 'topic_vote = 0';
  445.     }
  446.  
  447.     $sql = "UPDATE " . FORUMS_TABLE . " SET 
  448.         $forum_update_sql 
  449.         WHERE forum_id = $forum_id";
  450.     if (!$db->sql_query($sql))
  451.     {
  452.         message_die(GENERAL_ERROR, 'Error in posting', '', __LINE__, __FILE__, $sql);
  453.     }
  454.  
  455.     if ($topic_update_sql != '')
  456.     {
  457.         $sql = "UPDATE " . TOPICS_TABLE . " SET 
  458.             $topic_update_sql 
  459.             WHERE topic_id = $topic_id";
  460.         if (!$db->sql_query($sql))
  461.         {
  462.             message_die(GENERAL_ERROR, 'Error in posting', '', __LINE__, __FILE__, $sql);
  463.         }
  464.     }
  465.  
  466.     if ($mode != 'poll_delete')
  467.     {
  468.         $sql = "UPDATE " . USERS_TABLE . "
  469.             SET user_posts = user_posts $sign 
  470.             WHERE user_id = $user_id";
  471.         if (!$db->sql_query($sql, END_TRANSACTION))
  472.         {
  473.             message_die(GENERAL_ERROR, 'Error in posting', '', __LINE__, __FILE__, $sql);
  474.         }
  475.     }
  476.  
  477.     return;
  478. }
  479.  
  480. //
  481. // Delete a post/poll
  482. //
  483. function delete_post($mode, &$post_data, &$message, &$meta, &$forum_id, &$topic_id, &$post_id, &$poll_id)
  484. {
  485.     global $board_config, $lang, $db, $phpbb_root_path, $phpEx;
  486.     global $userdata, $user_ip;
  487.  
  488.     if ($mode != 'poll_delete')
  489.     {
  490.         include($phpbb_root_path . 'includes/functions_search.'.$phpEx);
  491.  
  492.         $sql = "DELETE FROM " . POSTS_TABLE . " 
  493.             WHERE post_id = $post_id";
  494.         if (!$db->sql_query($sql))
  495.         {
  496.             message_die(GENERAL_ERROR, 'Error in deleting post', '', __LINE__, __FILE__, $sql);
  497.         }
  498.  
  499.         $sql = "DELETE FROM " . POSTS_TEXT_TABLE . " 
  500.             WHERE post_id = $post_id";
  501.         if (!$db->sql_query($sql))
  502.         {
  503.             message_die(GENERAL_ERROR, 'Error in deleting post', '', __LINE__, __FILE__, $sql);
  504.         }
  505.  
  506.         if ($post_data['last_post'])
  507.         {
  508.             if ($post_data['first_post'])
  509.             {
  510.                 $forum_update_sql .= ', forum_topics = forum_topics - 1';
  511.                 $sql = "DELETE FROM " . TOPICS_TABLE . " 
  512.                     WHERE topic_id = $topic_id 
  513.                         OR topic_moved_id = $topic_id";
  514.                 if (!$db->sql_query($sql))
  515.                 {
  516.                     message_die(GENERAL_ERROR, 'Error in deleting post', '', __LINE__, __FILE__, $sql);
  517.                 }
  518.  
  519.                 $sql = "DELETE FROM " . TOPICS_WATCH_TABLE . "
  520.                     WHERE topic_id = $topic_id";
  521.                 if (!$db->sql_query($sql))
  522.                 {
  523.                     message_die(GENERAL_ERROR, 'Error in deleting post', '', __LINE__, __FILE__, $sql);
  524.                 }
  525.             }
  526.         }
  527.  
  528.         remove_search_post($post_id);
  529.     }
  530.  
  531.     if ($mode == 'poll_delete' || ($mode == 'delete' && $post_data['first_post'] && $post_data['last_post']) && $post_data['has_poll'] && $post_data['edit_poll'])
  532.     {
  533.         $sql = "DELETE FROM " . VOTE_DESC_TABLE . " 
  534.             WHERE topic_id = $topic_id";
  535.         if (!$db->sql_query($sql))
  536.         {
  537.             message_die(GENERAL_ERROR, 'Error in deleting poll', '', __LINE__, __FILE__, $sql);
  538.         }
  539.  
  540.         $sql = "DELETE FROM " . VOTE_RESULTS_TABLE . " 
  541.             WHERE vote_id = $poll_id";
  542.         if (!$db->sql_query($sql))
  543.         {
  544.             message_die(GENERAL_ERROR, 'Error in deleting poll', '', __LINE__, __FILE__, $sql);
  545.         }
  546.  
  547.         $sql = "DELETE FROM " . VOTE_USERS_TABLE . " 
  548.             WHERE vote_id = $poll_id";
  549.         if (!$db->sql_query($sql))
  550.         {
  551.             message_die(GENERAL_ERROR, 'Error in deleting poll', '', __LINE__, __FILE__, $sql);
  552.         }
  553.     }
  554.  
  555.     if ($mode == 'delete' && $post_data['first_post'] && $post_data['last_post'])
  556.     {
  557.         $meta = '<meta http-equiv="refresh" content="3;url=' . append_sid("viewforum.$phpEx?" . POST_FORUM_URL . '=' . $forum_id) . '">';
  558.         $message = $lang['Deleted'];
  559.     }
  560.     else
  561.     {
  562.         $meta = '<meta http-equiv="refresh" content="3;url=' . append_sid("viewtopic.$phpEx?" . POST_TOPIC_URL . '=' . $topic_id) . '">';
  563.         $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>');
  564.     }
  565.  
  566.     $message .=  '<br /><br />' . sprintf($lang['Click_return_forum'], '<a href="' . append_sid("viewforum.$phpEx?" . POST_FORUM_URL . "=$forum_id") . '">', '</a>');
  567.  
  568.     return;
  569. }
  570.  
  571. //
  572. // Handle user notification on new post
  573. //
  574. function user_notification($mode, &$post_data, &$topic_title, &$forum_id, &$topic_id, &$post_id, &$notify_user)
  575. {
  576.     global $board_config, $lang, $db, $phpbb_root_path, $phpEx;
  577.     global $userdata, $user_ip;
  578.  
  579.     $current_time = time();
  580.  
  581.     if ($mode == 'delete')
  582.     {
  583.         $delete_sql = (!$post_data['first_post'] && !$post_data['last_post']) ? " AND user_id = " . $userdata['user_id'] : '';
  584.         $sql = "DELETE FROM " . TOPICS_WATCH_TABLE . " WHERE topic_id = $topic_id" . $delete_sql;
  585.         if (!$db->sql_query($sql))
  586.         {
  587.             message_die(GENERAL_ERROR, 'Could not change topic notify data', '', __LINE__, __FILE__, $sql);
  588.         }
  589.     }
  590.     else 
  591.     {
  592.         if ($mode == 'reply')
  593.         {
  594.             $sql = "SELECT ban_userid 
  595.                 FROM " . BANLIST_TABLE;
  596.             if (!($result = $db->sql_query($sql)))
  597.             {
  598.                 message_die(GENERAL_ERROR, 'Could not obtain banlist', '', __LINE__, __FILE__, $sql);
  599.             }
  600.  
  601.             $user_id_sql = '';
  602.             while ($row = $db->sql_fetchrow($result))
  603.             {
  604.                 if (isset($row['ban_userid']) && !empty($row['ban_userid']))
  605.                 {
  606.                     $user_id_sql .= ', ' . $row['ban_userid'];
  607.                 }
  608.             }
  609.  
  610.             $sql = "SELECT u.user_id, u.user_email, u.user_lang 
  611.                 FROM " . TOPICS_WATCH_TABLE . " tw, " . USERS_TABLE . " u 
  612.                 WHERE tw.topic_id = $topic_id 
  613.                     AND tw.user_id NOT IN (" . $userdata['user_id'] . ", " . ANONYMOUS . $user_id_sql . ") 
  614.                     AND tw.notify_status = " . TOPIC_WATCH_UN_NOTIFIED . " 
  615.                     AND u.user_id = tw.user_id";
  616.             if (!($result = $db->sql_query($sql)))
  617.             {
  618.                 message_die(GENERAL_ERROR, 'Could not obtain list of topic watchers', '', __LINE__, __FILE__, $sql);
  619.             }
  620.  
  621.             $update_watched_sql = '';
  622.             $bcc_list_ary = array();
  623.             
  624.             if ($row = $db->sql_fetchrow($result))
  625.             {
  626.                 // Sixty second limit
  627.                 @set_time_limit(60);
  628.  
  629.                 do
  630.                 {
  631.                     if ($row['user_email'] != '')
  632.                     {
  633.                         $bcc_list_ary[$row['user_lang']][] = $row['user_email'];
  634.                     }
  635.                     $update_watched_sql .= ($update_watched_sql != '') ? ', ' . $row['user_id'] : $row['user_id'];
  636.                 }
  637.                 while ($row = $db->sql_fetchrow($result));
  638.  
  639.                 //
  640.                 // Let's do some checking to make sure that mass mail functions
  641.                 // are working in win32 versions of php.
  642.                 //
  643.                 if (preg_match('/[c-z]:\\\.*/i', getenv('PATH')) && !$board_config['smtp_delivery'])
  644.                 {
  645.                     $ini_val = (@phpversion() >= '4.0.0') ? 'ini_get' : 'get_cfg_var';
  646.  
  647.                     // We are running on windows, force delivery to use our smtp functions
  648.                     // since php's are broken by default
  649.                     $board_config['smtp_delivery'] = 1;
  650.                     $board_config['smtp_host'] = @$ini_val('SMTP');
  651.                 }
  652.  
  653.                 if (sizeof($bcc_list_ary))
  654.                 {
  655.                     include($phpbb_root_path . 'includes/emailer.'.$phpEx);
  656.                     $emailer = new emailer($board_config['smtp_delivery']);
  657.  
  658.                     $script_name = preg_replace('/^\/?(.*?)\/?$/', '\1', trim($board_config['script_path']));
  659.                     $script_name = ($script_name != '') ? $script_name . '/viewtopic.'.$phpEx : 'viewtopic.'.$phpEx;
  660.                     $server_name = trim($board_config['server_name']);
  661.                     $server_protocol = ($board_config['cookie_secure']) ? 'https://' : 'http://';
  662.                     $server_port = ($board_config['server_port'] <> 80) ? ':' . trim($board_config['server_port']) . '/' : '/';
  663.  
  664.                     $orig_word = array();
  665.                     $replacement_word = array();
  666.                     obtain_word_list($orig_word, $replacement_word);
  667.  
  668.                     $emailer->from($board_config['board_email']);
  669.                     $emailer->replyto($board_config['board_email']);
  670.  
  671.                     $topic_title = (count($orig_word)) ? preg_replace($orig_word, $replacement_word, unprepare_message($topic_title)) : unprepare_message($topic_title);
  672.  
  673.                     @reset($bcc_list_ary);
  674.                     while (list($user_lang, $bcc_list) = each($bcc_list_ary))
  675.                     {
  676.                         $emailer->use_template('topic_notify', $user_lang);
  677.         
  678.                         for ($i = 0; $i < count($bcc_list); $i++)
  679.                         {
  680.                             $emailer->bcc($bcc_list[$i]);
  681.                         }
  682.  
  683.                         // The Topic_reply_notification lang string below will be used
  684.                         // if for some reason the mail template subject cannot be read 
  685.                         // ... note it will not necessarily be in the posters own language!
  686.                         $emailer->set_subject($lang['Topic_reply_notification']); 
  687.                         
  688.                         // This is a nasty kludge to remove the username var ... till (if?)
  689.                         // translators update their templates
  690.                         $emailer->msg = preg_replace('#[ ]?{USERNAME}#', '', $emailer->msg);
  691.  
  692.                         $emailer->assign_vars(array(
  693.                             'EMAIL_SIG' => (!empty($board_config['board_email_sig'])) ? str_replace('<br />', "\n", "-- \n" . $board_config['board_email_sig']) : '',
  694.                             'SITENAME' => $board_config['sitename'],
  695.                             'TOPIC_TITLE' => $topic_title, 
  696.  
  697.                             'U_TOPIC' => $server_protocol . $server_name . $server_port . $script_name . '?' . POST_POST_URL . "=$post_id#$post_id",
  698.                             'U_STOP_WATCHING_TOPIC' => $server_protocol . $server_name . $server_port . $script_name . '?' . POST_TOPIC_URL . "=$topic_id&unwatch=topic")
  699.                         );
  700.  
  701.                         $emailer->send();
  702.                         $emailer->reset();
  703.                     }
  704.                 }
  705.             }
  706.             $db->sql_freeresult($result);
  707.  
  708.             if ($update_watched_sql != '')
  709.             {
  710.                 $sql = "UPDATE " . TOPICS_WATCH_TABLE . "
  711.                     SET notify_status = " . TOPIC_WATCH_NOTIFIED . "
  712.                     WHERE topic_id = $topic_id
  713.                         AND user_id IN ($update_watched_sql)";
  714.                 $db->sql_query($sql);
  715.             }
  716.         }
  717.  
  718.         $sql = "SELECT topic_id 
  719.             FROM " . TOPICS_WATCH_TABLE . "
  720.             WHERE topic_id = $topic_id
  721.                 AND user_id = " . $userdata['user_id'];
  722.         if (!($result = $db->sql_query($sql)))
  723.         {
  724.             message_die(GENERAL_ERROR, 'Could not obtain topic watch information', '', __LINE__, __FILE__, $sql);
  725.         }
  726.  
  727.         $row = $db->sql_fetchrow($result);
  728.  
  729.         if (!$notify_user && !empty($row['topic_id']))
  730.         {
  731.             $sql = "DELETE FROM " . TOPICS_WATCH_TABLE . "
  732.                 WHERE topic_id = $topic_id
  733.                     AND user_id = " . $userdata['user_id'];
  734.             if (!$db->sql_query($sql))
  735.             {
  736.                 message_die(GENERAL_ERROR, 'Could not delete topic watch information', '', __LINE__, __FILE__, $sql);
  737.             }
  738.         }
  739.         else if ($notify_user && empty($row['topic_id']))
  740.         {
  741.             $sql = "INSERT INTO " . TOPICS_WATCH_TABLE . " (user_id, topic_id, notify_status)
  742.                 VALUES (" . $userdata['user_id'] . ", $topic_id, 0)";
  743.             if (!$db->sql_query($sql))
  744.             {
  745.                 message_die(GENERAL_ERROR, 'Could not insert topic watch information', '', __LINE__, __FILE__, $sql);
  746.             }
  747.         }
  748.     }
  749. }
  750.  
  751. //
  752. // Fill smiley templates (or just the variables) with smileys
  753. // Either in a window or inline
  754. //
  755. function generate_smilies($mode, $page_id)
  756. {
  757.     global $db, $board_config, $template, $lang, $images, $theme, $phpEx, $phpbb_root_path;
  758.     global $user_ip, $session_length, $starttime;
  759.     global $userdata;
  760.  
  761.     $inline_columns = 4;
  762.     $inline_rows = 5;
  763.     $window_columns = 8;
  764.  
  765.     if ($mode == 'window')
  766.     {
  767.         $userdata = session_pagestart($user_ip, $page_id);
  768.         init_userprefs($userdata);
  769.  
  770.         $gen_simple_header = TRUE;
  771.  
  772.         $page_title = $lang['Emoticons'] . " - $topic_title";
  773.         include($phpbb_root_path . 'includes/page_header.'.$phpEx);
  774.  
  775.         $template->set_filenames(array(
  776.             'smiliesbody' => 'posting_smilies.tpl')
  777.         );
  778.     }
  779.  
  780.     $sql = "SELECT emoticon, code, smile_url   
  781.         FROM " . SMILIES_TABLE . " 
  782.         ORDER BY smilies_id";
  783.     if ($result = $db->sql_query($sql))
  784.     {
  785.         $num_smilies = 0;
  786.         $rowset = array();
  787.         while ($row = $db->sql_fetchrow($result))
  788.         {
  789.             if (empty($rowset[$row['smile_url']]))
  790.             {
  791.                 $rowset[$row['smile_url']]['code'] = str_replace("'", "\\'", str_replace('\\', '\\\\', $row['code']));
  792.                 $rowset[$row['smile_url']]['emoticon'] = $row['emoticon'];
  793.                 $num_smilies++;
  794.             }
  795.         }
  796.  
  797.         if ($num_smilies)
  798.         {
  799.             $smilies_count = ($mode == 'inline') ? min(19, $num_smilies) : $num_smilies;
  800.             $smilies_split_row = ($mode == 'inline') ? $inline_columns - 1 : $window_columns - 1;
  801.  
  802.             $s_colspan = 0;
  803.             $row = 0;
  804.             $col = 0;
  805.  
  806.             while (list($smile_url, $data) = @each($rowset))
  807.             {
  808.                 if (!$col)
  809.                 {
  810.                     $template->assign_block_vars('smilies_row', array());
  811.                 }
  812.  
  813.                 $template->assign_block_vars('smilies_row.smilies_col', array(
  814.                     'SMILEY_CODE' => $data['code'],
  815.                     'SMILEY_IMG' => $board_config['smilies_path'] . '/' . $smile_url,
  816.                     'SMILEY_DESC' => $data['emoticon'])
  817.                 );
  818.  
  819.                 $s_colspan = max($s_colspan, $col + 1);
  820.  
  821.                 if ($col == $smilies_split_row)
  822.                 {
  823.                     if ($mode == 'inline' && $row == $inline_rows - 1)
  824.                     {
  825.                         break;
  826.                     }
  827.                     $col = 0;
  828.                     $row++;
  829.                 }
  830.                 else
  831.                 {
  832.                     $col++;
  833.                 }
  834.             }
  835.  
  836.             if ($mode == 'inline' && $num_smilies > $inline_rows * $inline_columns)
  837.             {
  838.                 $template->assign_block_vars('switch_smilies_extra', array());
  839.  
  840.                 $template->assign_vars(array(
  841.                     'L_MORE_SMILIES' => $lang['More_emoticons'], 
  842.                     'U_MORE_SMILIES' => append_sid("posting.$phpEx?mode=smilies"))
  843.                 );
  844.             }
  845.  
  846.             $template->assign_vars(array(
  847.                 'L_EMOTICONS' => $lang['Emoticons'], 
  848.                 'L_CLOSE_WINDOW' => $lang['Close_window'], 
  849.                 'S_SMILIES_COLSPAN' => $s_colspan)
  850.             );
  851.         }
  852.     }
  853.  
  854.     if ($mode == 'window')
  855.     {
  856.         $template->pparse('smiliesbody');
  857.  
  858.         include($phpbb_root_path . 'includes/page_tail.'.$phpEx);
  859.     }
  860. }
  861.  
  862. ?>