PageRenderTime 46ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/includes/posts_merging.php

https://code.google.com/p/phpbbex/
PHP | 321 lines | 233 code | 52 blank | 36 comment | 61 complexity | 93f95b15efe8a755fe283b3464b2474b MD5 | raw file
Possible License(s): AGPL-1.0
  1. <?php
  2. /**
  3. *
  4. * @package phpBB3
  5. * @version $Id: posts_merging.php,v 1.100 2008/04/10 22:20:15 rxu Exp $
  6. * @copyright (c) 2005 phpBB Group
  7. * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  8. *
  9. */
  10. /**
  11. * @ignore
  12. */
  13. if (!defined('IN_PHPBB'))
  14. {
  15. exit;
  16. }
  17. $post_need_approval = (!$auth->acl_get('f_noapprove', $data['forum_id']) && !$auth->acl_get('m_approve', $data['forum_id'])) ? true : false;
  18. if (!$post_need_approval && ($mode == 'reply' || $mode == 'quote') && $config['merge_interval'] > 0 && !in_array($forum_id, explode(",", $config['merge_no_forums'])) && !in_array($topic_id, explode(",", $config['merge_no_topics'])))
  19. {
  20. $sql = 'SELECT f.*, t.*, p.* FROM ' . POSTS_TABLE . ' p, ' . TOPICS_TABLE . ' t, ' . FORUMS_TABLE . ' f
  21. WHERE p.post_id = t.topic_last_post_id
  22. AND t.topic_id = ' . (int) $topic_id . "
  23. AND (f.forum_id = t.forum_id
  24. OR f.forum_id = $forum_id)";
  25. $result = $db->sql_query($sql);
  26. $merge_post_data = $db->sql_fetchrow($result);
  27. $db->sql_freeresult($result);
  28. $merge_post_id = $merge_post_data['post_id'];
  29. if (!$merge_post_id)
  30. {
  31. $user->setup('posting');
  32. trigger_error('NO_POST');
  33. }
  34. $merge = false;
  35. if (!request_var('do_not_merge', false))
  36. {
  37. $merge_interval = intval($config['merge_interval']) * 3600;
  38. if (!$merge_post_data['post_edit_locked'] && ($current_time - $merge_post_data['topic_last_post_time']) < $merge_interval)
  39. {
  40. $merge = true;
  41. }
  42. }
  43. // Do merging
  44. if ($merge && $merge_post_data['poster_id'] == $user->data['user_id'] && $user->data['is_registered'] && $user->data['user_id'] != ANONYMOUS)
  45. {
  46. $message_parser = new parse_message();
  47. $message_parser->message = &$merge_post_data['post_text'];
  48. unset($merge_post_data['post_text']);
  49. // Decode text for update properly
  50. $message_parser->decode_message($merge_post_data['bbcode_uid']);
  51. if (version_compare(PHP_VERSION, '5.0.0', '>='))
  52. {
  53. $merge_post_data['post_text'] = html_entity_decode($message_parser->message, ENT_COMPAT, 'UTF-8');
  54. }
  55. else
  56. {
  57. // For users prior to PHP 5
  58. // A kind og code given in PHP manual for html_entity_decode function
  59. function unhtmlentities($string, $quote_style = ENT_COMPAT)
  60. {
  61. // replace numeric entities
  62. $string = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $string);
  63. $string = preg_replace('~&#([0-9]+);~e', 'chr("\\1")', $string);
  64. // replace literal entities
  65. $trans_tbl = get_html_translation_table(HTML_ENTITIES, $quote_style);
  66. $trans_tbl = array_flip($trans_tbl);
  67. return strtr($string, $trans_tbl);
  68. }
  69. $merge_post_data['post_text'] = unhtmlentities($message_parser->message);
  70. }
  71. unset($message_parser);
  72. //Handle with inline attachments
  73. if (sizeof($data['attachment_data']))
  74. {
  75. for($i = 0; $i < sizeof($data['attachment_data']); $i++)
  76. {
  77. $merge_post_data['post_text'] = preg_replace('#\[attachment=([0-9]+)\](.*?)\[\/attachment\]#e', "'[attachment='.(\\1 + 1).']\\2[/attachment]'", $merge_post_data['post_text']);
  78. }
  79. }
  80. // Make sure the message is safe
  81. set_var($merge_post_data['post_text'], $merge_post_data['post_text'], 'string', true);
  82. // Prepare message separator
  83. require($phpbb_root_path . 'includes/time_delta.'.$phpEx);
  84. $td = new timedelta();
  85. $time_delta = $td->spelldelta($merge_post_data['post_time'], $current_time);
  86. $separator = sprintf($user->lang['MERGE_SEPARATOR'], $user->lang['POSTED'], $time_delta);
  87. //set_var($separator, $separator, 'string', true);
  88. // Merge subject
  89. $subject = $post_data['post_subject'];
  90. if (!empty($post_data['post_subject']) && $post_data['post_subject'] != $merge_post_data['post_subject'] && $merge_post_data['post_id'] != $merge_post_data['topic_first_post_id'])
  91. {
  92. $separator .= sprintf($user->lang['MERGE_SUBJECT'], $subject);
  93. }
  94. $options = '';
  95. // Merge posts
  96. $merge_post_data['post_text'] = $merge_post_data['post_text'] . $separator . $addon_for_merge;
  97. //Prepare post for submit
  98. generate_text_for_storage($merge_post_data['post_text'], $merge_post_data['bbcode_uid'], $merge_post_data['bbcode_bitfield'], $options, $merge_post_data['enable_bbcode'], $merge_post_data['enable_magic_url'], $merge_post_data['enable_smilies']);
  99. $poster_id = (int) $merge_post_data['poster_id'];
  100. $post_time = $current_time;
  101. // Prepare post data for update
  102. $sql_data[POSTS_TABLE]['sql'] = array(
  103. 'bbcode_uid' => $merge_post_data['bbcode_uid'],
  104. 'bbcode_bitfield' => $merge_post_data['bbcode_bitfield'],
  105. 'post_text' => $merge_post_data['post_text'],
  106. 'post_checksum' => md5($merge_post_data['post_text']),
  107. 'post_created' => ($merge_post_data['post_created']) ? $merge_post_data['post_created'] : $merge_post_data['post_time'],
  108. 'post_time' => $post_time,
  109. 'post_attachment' => (!empty($data['attachment_data'])) ? 1 : ($merge_post_data['post_attachment'] ? 1 : 0),
  110. );
  111. $sql_data[TOPICS_TABLE]['sql'] = array(
  112. 'topic_last_post_id' => $merge_post_id,
  113. 'topic_last_poster_id' => $poster_id,
  114. 'topic_last_poster_name' => (!$user->data['is_registered'] && $post_data['username']) ? $post_data['username'] : (($user->data['user_id'] != ANONYMOUS) ? $user->data['username'] : ''),
  115. 'topic_last_poster_colour' => ($user->data['user_id'] != ANONYMOUS) ? $user->data['user_colour'] : '',
  116. 'topic_last_post_subject' => utf8_normalize_nfc($merge_post_data['post_subject']),
  117. 'topic_last_post_time' => $post_time,
  118. 'topic_attachment' => (!empty($data['attachment_data']) || (isset($merge_post_data['topic_attachment']) && $merge_post_data['topic_attachment'])) ? 1 : 0,
  119. );
  120. $sql_data[FORUMS_TABLE]['sql'] = array(
  121. 'forum_last_post_id' => $merge_post_id,
  122. 'forum_last_post_subject' => utf8_normalize_nfc($merge_post_data['post_subject']),
  123. 'forum_last_post_time' => $post_time,
  124. 'forum_last_poster_id' => $poster_id,
  125. 'forum_last_poster_name' => (!$user->data['is_registered'] && $post_data['username']) ? $post_data['username'] : (($user->data['user_id'] != ANONYMOUS) ? $user->data['username'] : ''),
  126. 'forum_last_poster_colour' => ($user->data['user_id'] != ANONYMOUS) ? $user->data['user_colour'] : '',
  127. );
  128. // Update post information - submit merged post
  129. $sql = 'UPDATE ' . POSTS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_data[POSTS_TABLE]['sql']) . " WHERE post_id = $merge_post_id";
  130. $db->sql_query($sql);
  131. $sql = 'UPDATE ' . TOPICS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_data[TOPICS_TABLE]['sql']) . " WHERE topic_id = $topic_id";
  132. $db->sql_query($sql);
  133. $sql = 'UPDATE ' . FORUMS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_data[FORUMS_TABLE]['sql']) . " WHERE forum_id = $forum_id";
  134. $db->sql_query($sql);
  135. // Submit Attachments
  136. if (!empty($data['attachment_data']))
  137. {
  138. $space_taken = $files_added = 0;
  139. $orphan_rows = array();
  140. foreach ($data['attachment_data'] as $pos => $attach_row)
  141. {
  142. $orphan_rows[(int) $attach_row['attach_id']] = array();
  143. }
  144. if (sizeof($orphan_rows))
  145. {
  146. $sql = 'SELECT attach_id, filesize, physical_filename
  147. FROM ' . ATTACHMENTS_TABLE . '
  148. WHERE ' . $db->sql_in_set('attach_id', array_keys($orphan_rows)) . '
  149. AND is_orphan = 1
  150. AND poster_id = ' . $user->data['user_id'];
  151. $result = $db->sql_query($sql);
  152. $orphan_rows = array();
  153. while ($row = $db->sql_fetchrow($result))
  154. {
  155. $orphan_rows[$row['attach_id']] = $row;
  156. }
  157. $db->sql_freeresult($result);
  158. }
  159. foreach ($data['attachment_data'] as $pos => $attach_row)
  160. {
  161. if ($attach_row['is_orphan'] && !in_array($attach_row['attach_id'], array_keys($orphan_rows)))
  162. {
  163. continue;
  164. }
  165. if (!$attach_row['is_orphan'])
  166. {
  167. // update entry in db if attachment already stored in db and filespace
  168. $sql = 'UPDATE ' . ATTACHMENTS_TABLE . "
  169. SET attach_comment = '" . $db->sql_escape($attach_row['attach_comment']) . "'
  170. WHERE attach_id = " . (int) $attach_row['attach_id'] . '
  171. AND is_orphan = 0';
  172. $db->sql_query($sql);
  173. }
  174. else
  175. {
  176. // insert attachment into db
  177. if (!@file_exists($phpbb_root_path . $config['upload_path'] . '/' . basename($orphan_rows[$attach_row['attach_id']]['physical_filename'])))
  178. {
  179. continue;
  180. }
  181. $space_taken += $orphan_rows[$attach_row['attach_id']]['filesize'];
  182. $files_added++;
  183. $attach_sql = array(
  184. 'post_msg_id' => $merge_post_id,
  185. 'topic_id' => $topic_id,
  186. 'is_orphan' => 0,
  187. 'poster_id' => $poster_id,
  188. 'attach_comment' => $attach_row['attach_comment'],
  189. );
  190. $sql = 'UPDATE ' . ATTACHMENTS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $attach_sql) . '
  191. WHERE attach_id = ' . $attach_row['attach_id'] . '
  192. AND is_orphan = 1
  193. AND poster_id = ' . $user->data['user_id'];
  194. $db->sql_query($sql);
  195. }
  196. }
  197. if ($space_taken && $files_added)
  198. {
  199. set_config('upload_dir_size', $config['upload_dir_size'] + $space_taken, true);
  200. set_config('num_files', $config['num_files'] + $files_added, true);
  201. }
  202. }
  203. // Index message contents
  204. if ($merge_post_data['enable_indexing'])
  205. {
  206. // Select the search method and do some additional checks to ensure it can actually be utilised
  207. $search_type = basename($config['search_type']);
  208. if (!file_exists($phpbb_root_path . 'includes/search/' . $search_type . '.' . $phpEx))
  209. {
  210. trigger_error('NO_SUCH_SEARCH_MODULE');
  211. }
  212. require_once("{$phpbb_root_path}includes/search/$search_type.$phpEx");
  213. $error = false;
  214. $search = new $search_type($error);
  215. if ($error)
  216. {
  217. trigger_error($error);
  218. }
  219. $search->index('edit', $merge_post_id, $merge_post_data['post_text'], $subject, $poster_id, $forum_id);
  220. }
  221. // Mark the post and the topic read
  222. markread('post', $forum_id, $topic_id, $post_time);
  223. markread('topic', $forum_id, $topic_id, time());
  224. //
  225. if ($config['load_db_lastread'] && $user->data['is_registered'])
  226. {
  227. $sql = 'SELECT mark_time
  228. FROM ' . FORUMS_TRACK_TABLE . '
  229. WHERE user_id = ' . $user->data['user_id'] . '
  230. AND forum_id = ' . $forum_id;
  231. $result = $db->sql_query($sql);
  232. $f_mark_time = (int) $db->sql_fetchfield('mark_time');
  233. $db->sql_freeresult($result);
  234. }
  235. else if ($config['load_anon_lastread'] || $user->data['is_registered'])
  236. {
  237. $f_mark_time = false;
  238. }
  239. if (($config['load_db_lastread'] && $user->data['is_registered']) || $config['load_anon_lastread'] || $user->data['is_registered'])
  240. {
  241. // Update forum info
  242. $sql = 'SELECT forum_last_post_time
  243. FROM ' . FORUMS_TABLE . '
  244. WHERE forum_id = ' . $forum_id;
  245. $result = $db->sql_query($sql);
  246. $forum_last_post_time = (int) $db->sql_fetchfield('forum_last_post_time');
  247. $db->sql_freeresult($result);
  248. update_forum_tracking_info($forum_id, $forum_last_post_time, $f_mark_time, false);
  249. }
  250. // Send Notifications
  251. if ($auth->acl_get('f_noapprove', $data['forum_id']) || $auth->acl_get('m_approve', $data['forum_id']))
  252. {
  253. user_notification($mode, $subject, $data['topic_title'], $data['forum_name'], $data['forum_id'], $data['topic_id'], $merge_post_id);
  254. }
  255. //Generate redirection URL and redirecting
  256. $params = $add_anchor = '';
  257. $params .= '&amp;t=' . $topic_id;
  258. $params .= '&amp;p=' . $merge_post_id;
  259. $add_anchor = '#p' . $merge_post_id;
  260. $redirect_url = "{$phpbb_root_path}viewtopic.$phpEx";
  261. $redirect_url = append_sid($redirect_url, 'f=' . $forum_id . $params) . $add_anchor;
  262. meta_refresh(3, $redirect_url);
  263. $message = (!$auth->acl_get('f_noapprove', $merge_post_data['forum_id']) && !$auth->acl_get('m_approve', $merge_post_data['forum_id'])) ? 'POST_STORED_MOD' : 'POST_STORED';
  264. $message = $user->lang[$message] . (($auth->acl_get('f_noapprove', $merge_post_data['forum_id']) || $auth->acl_get('m_approve', $merge_post_data['forum_id'])) ? '<br /><br />' . sprintf($user->lang['VIEW_MESSAGE'], '<a href="' . $redirect_url . '">', '</a>') : '');
  265. $message .= '<br /><br />' . sprintf($user->lang['RETURN_FORUM'], '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $merge_post_data['forum_id']) . '">', '</a>');
  266. trigger_error($message);
  267. }
  268. }
  269. ?>