Merge remote-tracking branch 'EXreaction/ticket/8796' into develop

* EXreaction/ticket/8796:
  [ticket/8796] Prevent setting post_time greater than time() in markread
  [ticket/8796] Fix a few issues with the previous commits
  [ticket/8796] Mark read links updated to include time() in url
  [ticket/8796] Revert changes to $user->data['lastmark']
  [ticket/8796] Make function markread obey the $post_time argument
This commit is contained in:
Andreas Fischer 2012-10-18 16:43:46 +02:00
commit b3fdf8a046
4 changed files with 55 additions and 26 deletions

View file

@ -1310,6 +1310,10 @@ function phpbb_timezone_select($user, $default = '', $truncate = false)
* Marks a topic/forum as read * Marks a topic/forum as read
* Marks a topic as posted to * Marks a topic as posted to
* *
* @param string $mode (all, topics, topic, post)
* @param int|bool $forum_id Used in all, topics, and topic mode
* @param int|bool $topic_id Used in topic and post mode
* @param int $post_time 0 means current time(), otherwise to set a specific mark time
* @param int $user_id can only be used with $mode == 'post' * @param int $user_id can only be used with $mode == 'post'
*/ */
function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $user_id = 0) function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $user_id = 0)
@ -1317,6 +1321,8 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
global $db, $user, $config; global $db, $user, $config;
global $request; global $request;
$post_time = ($post_time === 0 || $post_time > time()) ? time() : (int) $post_time;
if ($mode == 'all') if ($mode == 'all')
{ {
if ($forum_id === false || !sizeof($forum_id)) if ($forum_id === false || !sizeof($forum_id))
@ -1324,9 +1330,20 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
if ($config['load_db_lastread'] && $user->data['is_registered']) if ($config['load_db_lastread'] && $user->data['is_registered'])
{ {
// Mark all forums read (index page) // Mark all forums read (index page)
$db->sql_query('DELETE FROM ' . TOPICS_TRACK_TABLE . " WHERE user_id = {$user->data['user_id']}"); $tables = array(TOPICS_TRACK_TABLE, FORUMS_TRACK_TABLE);
$db->sql_query('DELETE FROM ' . FORUMS_TRACK_TABLE . " WHERE user_id = {$user->data['user_id']}"); foreach ($tables as $table)
$db->sql_query('UPDATE ' . USERS_TABLE . ' SET user_lastmark = ' . time() . " WHERE user_id = {$user->data['user_id']}"); {
$sql = 'DELETE FROM ' . $table . "
WHERE user_id = {$user->data['user_id']}
AND mark_time < $post_time";
$db->sql_query($sql);
}
$sql = 'UPDATE ' . USERS_TABLE . "
SET user_lastmark = $post_time
WHERE user_id = {$user->data['user_id']}
AND user_lastmark < $post_time";
$db->sql_query($sql);
} }
else if ($config['load_anon_lastread'] || $user->data['is_registered']) else if ($config['load_anon_lastread'] || $user->data['is_registered'])
{ {
@ -1336,16 +1353,20 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
unset($tracking_topics['tf']); unset($tracking_topics['tf']);
unset($tracking_topics['t']); unset($tracking_topics['t']);
unset($tracking_topics['f']); unset($tracking_topics['f']);
$tracking_topics['l'] = base_convert(time() - $config['board_startdate'], 10, 36); $tracking_topics['l'] = base_convert($post_time - $config['board_startdate'], 10, 36);
$user->set_cookie('track', tracking_serialize($tracking_topics), time() + 31536000); $user->set_cookie('track', tracking_serialize($tracking_topics), $post_time + 31536000);
$request->overwrite($config['cookie_name'] . '_track', tracking_serialize($tracking_topics), phpbb_request_interface::COOKIE); $request->overwrite($config['cookie_name'] . '_track', tracking_serialize($tracking_topics), phpbb_request_interface::COOKIE);
unset($tracking_topics); unset($tracking_topics);
if ($user->data['is_registered']) if ($user->data['is_registered'])
{ {
$db->sql_query('UPDATE ' . USERS_TABLE . ' SET user_lastmark = ' . time() . " WHERE user_id = {$user->data['user_id']}"); $sql = 'UPDATE ' . USERS_TABLE . "
SET user_lastmark = $post_time
WHERE user_id = {$user->data['user_id']}
AND user_lastmark < $post_time";
$db->sql_query($sql);
} }
} }
} }
@ -1367,12 +1388,14 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
{ {
$sql = 'DELETE FROM ' . TOPICS_TRACK_TABLE . " $sql = 'DELETE FROM ' . TOPICS_TRACK_TABLE . "
WHERE user_id = {$user->data['user_id']} WHERE user_id = {$user->data['user_id']}
AND mark_time < $post_time
AND " . $db->sql_in_set('forum_id', $forum_id); AND " . $db->sql_in_set('forum_id', $forum_id);
$db->sql_query($sql); $db->sql_query($sql);
$sql = 'SELECT forum_id $sql = 'SELECT forum_id
FROM ' . FORUMS_TRACK_TABLE . " FROM ' . FORUMS_TRACK_TABLE . "
WHERE user_id = {$user->data['user_id']} WHERE user_id = {$user->data['user_id']}
AND mark_time < $post_time
AND " . $db->sql_in_set('forum_id', $forum_id); AND " . $db->sql_in_set('forum_id', $forum_id);
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
@ -1385,9 +1408,10 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
if (sizeof($sql_update)) if (sizeof($sql_update))
{ {
$sql = 'UPDATE ' . FORUMS_TRACK_TABLE . ' $sql = 'UPDATE ' . FORUMS_TRACK_TABLE . "
SET mark_time = ' . time() . " SET mark_time = $post_time
WHERE user_id = {$user->data['user_id']} WHERE user_id = {$user->data['user_id']}
AND mark_time < $post_time
AND " . $db->sql_in_set('forum_id', $sql_update); AND " . $db->sql_in_set('forum_id', $sql_update);
$db->sql_query($sql); $db->sql_query($sql);
} }
@ -1400,7 +1424,7 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
$sql_ary[] = array( $sql_ary[] = array(
'user_id' => (int) $user->data['user_id'], 'user_id' => (int) $user->data['user_id'],
'forum_id' => (int) $f_id, 'forum_id' => (int) $f_id,
'mark_time' => time() 'mark_time' => $post_time,
); );
} }
@ -1431,7 +1455,7 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
unset($tracking['f'][$f_id]); unset($tracking['f'][$f_id]);
} }
$tracking['f'][$f_id] = base_convert(time() - $config['board_startdate'], 10, 36); $tracking['f'][$f_id] = base_convert($post_time - $config['board_startdate'], 10, 36);
} }
if (isset($tracking['tf']) && empty($tracking['tf'])) if (isset($tracking['tf']) && empty($tracking['tf']))
@ -1439,7 +1463,7 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
unset($tracking['tf']); unset($tracking['tf']);
} }
$user->set_cookie('track', tracking_serialize($tracking), time() + 31536000); $user->set_cookie('track', tracking_serialize($tracking), $post_time + 31536000);
$request->overwrite($config['cookie_name'] . '_track', tracking_serialize($tracking), phpbb_request_interface::COOKIE); $request->overwrite($config['cookie_name'] . '_track', tracking_serialize($tracking), phpbb_request_interface::COOKIE);
unset($tracking); unset($tracking);
@ -1456,9 +1480,10 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
if ($config['load_db_lastread'] && $user->data['is_registered']) if ($config['load_db_lastread'] && $user->data['is_registered'])
{ {
$sql = 'UPDATE ' . TOPICS_TRACK_TABLE . ' $sql = 'UPDATE ' . TOPICS_TRACK_TABLE . "
SET mark_time = ' . (($post_time) ? $post_time : time()) . " SET mark_time = $post_time
WHERE user_id = {$user->data['user_id']} WHERE user_id = {$user->data['user_id']}
AND mark_time < $post_time
AND topic_id = $topic_id"; AND topic_id = $topic_id";
$db->sql_query($sql); $db->sql_query($sql);
@ -1471,7 +1496,7 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
'user_id' => (int) $user->data['user_id'], 'user_id' => (int) $user->data['user_id'],
'topic_id' => (int) $topic_id, 'topic_id' => (int) $topic_id,
'forum_id' => (int) $forum_id, 'forum_id' => (int) $forum_id,
'mark_time' => ($post_time) ? (int) $post_time : time(), 'mark_time' => $post_time,
); );
$db->sql_query('INSERT INTO ' . TOPICS_TRACK_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary)); $db->sql_query('INSERT INTO ' . TOPICS_TRACK_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary));
@ -1491,7 +1516,6 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
$tracking['tf'][$forum_id][$topic_id36] = true; $tracking['tf'][$forum_id][$topic_id36] = true;
} }
$post_time = ($post_time) ? $post_time : time();
$tracking['t'][$topic_id36] = base_convert($post_time - $config['board_startdate'], 10, 36); $tracking['t'][$topic_id36] = base_convert($post_time - $config['board_startdate'], 10, 36);
// If the cookie grows larger than 10000 characters we will remove the smallest value // If the cookie grows larger than 10000 characters we will remove the smallest value
@ -1527,7 +1551,12 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
if ($user->data['is_registered']) if ($user->data['is_registered'])
{ {
$user->data['user_lastmark'] = intval(base_convert(max($time_keys) + $config['board_startdate'], 36, 10)); $user->data['user_lastmark'] = intval(base_convert(max($time_keys) + $config['board_startdate'], 36, 10));
$db->sql_query('UPDATE ' . USERS_TABLE . ' SET user_lastmark = ' . $user->data['user_lastmark'] . " WHERE user_id = {$user->data['user_id']}");
$sql = 'UPDATE ' . USERS_TABLE . "
SET user_lastmark = $post_time
WHERE user_id = {$user->data['user_id']}
AND mark_time < $post_time";
$db->sql_query($sql);
} }
else else
{ {
@ -1535,7 +1564,7 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
} }
} }
$user->set_cookie('track', tracking_serialize($tracking), time() + 31536000); $user->set_cookie('track', tracking_serialize($tracking), $post_time + 31536000);
$request->overwrite($config['cookie_name'] . '_track', tracking_serialize($tracking), phpbb_request_interface::COOKIE); $request->overwrite($config['cookie_name'] . '_track', tracking_serialize($tracking), phpbb_request_interface::COOKIE);
} }
@ -1557,7 +1586,7 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
$sql_ary = array( $sql_ary = array(
'user_id' => (int) $use_user_id, 'user_id' => (int) $use_user_id,
'topic_id' => (int) $topic_id, 'topic_id' => (int) $topic_id,
'topic_posted' => 1 'topic_posted' => 1,
); );
$db->sql_query('INSERT INTO ' . TOPICS_POSTED_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary)); $db->sql_query('INSERT INTO ' . TOPICS_POSTED_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary));

View file

@ -54,12 +54,12 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
// Handle marking everything read // Handle marking everything read
if ($mark_read == 'all') if ($mark_read == 'all')
{ {
$redirect = build_url(array('mark', 'hash')); $redirect = build_url(array('mark', 'hash', 'mark_time'));
meta_refresh(3, $redirect); meta_refresh(3, $redirect);
if (check_link_hash(request_var('hash', ''), 'global')) if (check_link_hash(request_var('hash', ''), 'global'))
{ {
markread('all'); markread('all', false, false, request_var('mark_time', 0));
trigger_error( trigger_error(
$user->lang['FORUMS_MARKED'] . '<br /><br />' . $user->lang['FORUMS_MARKED'] . '<br /><br />' .
@ -305,11 +305,11 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
// Handle marking posts // Handle marking posts
if ($mark_read == 'forums') if ($mark_read == 'forums')
{ {
$redirect = build_url(array('mark', 'hash')); $redirect = build_url(array('mark', 'hash', 'mark_time'));
$token = request_var('hash', ''); $token = request_var('hash', '');
if (check_link_hash($token, 'global')) if (check_link_hash($token, 'global'))
{ {
markread('topics', $forum_ids); markread('topics', $forum_ids, false, request_var('mark_time', 0));
$message = sprintf($user->lang['RETURN_FORUM'], '<a href="' . $redirect . '">', '</a>'); $message = sprintf($user->lang['RETURN_FORUM'], '<a href="' . $redirect . '">', '</a>');
meta_refresh(3, $redirect); meta_refresh(3, $redirect);
@ -551,7 +551,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
} }
$template->assign_vars(array( $template->assign_vars(array(
'U_MARK_FORUMS' => ($user->data['is_registered'] || $config['load_anon_lastread']) ? append_sid("{$phpbb_root_path}viewforum.$phpEx", 'hash=' . generate_link_hash('global') . '&amp;f=' . $root_data['forum_id'] . '&amp;mark=forums') : '', 'U_MARK_FORUMS' => ($user->data['is_registered'] || $config['load_anon_lastread']) ? append_sid("{$phpbb_root_path}viewforum.$phpEx", 'hash=' . generate_link_hash('global') . '&amp;f=' . $root_data['forum_id'] . '&amp;mark=forums&amp;mark_time=' . time()) : '',
'S_HAS_SUBFORUM' => ($visible_forums) ? true : false, 'S_HAS_SUBFORUM' => ($visible_forums) ? true : false,
'L_SUBFORUM' => ($visible_forums == 1) ? $user->lang['SUBFORUM'] : $user->lang['SUBFORUMS'], 'L_SUBFORUM' => ($visible_forums == 1) ? $user->lang['SUBFORUM'] : $user->lang['SUBFORUMS'],
'LAST_POST_IMG' => $user->img('icon_topic_latest', 'VIEW_LATEST_POST'), 'LAST_POST_IMG' => $user->img('icon_topic_latest', 'VIEW_LATEST_POST'),

View file

@ -167,7 +167,7 @@ $template->assign_vars(array(
'S_LOGIN_ACTION' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=login'), 'S_LOGIN_ACTION' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=login'),
'S_DISPLAY_BIRTHDAY_LIST' => ($config['load_birthdays']) ? true : false, 'S_DISPLAY_BIRTHDAY_LIST' => ($config['load_birthdays']) ? true : false,
'U_MARK_FORUMS' => ($user->data['is_registered'] || $config['load_anon_lastread']) ? append_sid("{$phpbb_root_path}index.$phpEx", 'hash=' . generate_link_hash('global') . '&amp;mark=forums') : '', 'U_MARK_FORUMS' => ($user->data['is_registered'] || $config['load_anon_lastread']) ? append_sid("{$phpbb_root_path}index.$phpEx", 'hash=' . generate_link_hash('global') . '&amp;mark=forums&amp;mark_time=' . time()) : '',
'U_MCP' => ($auth->acl_get('m_') || $auth->acl_getf_global('m_')) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=main&amp;mode=front', true, $user->session_id) : '') 'U_MCP' => ($auth->acl_get('m_') || $auth->acl_getf_global('m_')) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=main&amp;mode=front', true, $user->session_id) : '')
); );

View file

@ -176,7 +176,7 @@ if ($mark_read == 'topics')
$token = request_var('hash', ''); $token = request_var('hash', '');
if (check_link_hash($token, 'global')) if (check_link_hash($token, 'global'))
{ {
markread('topics', array($forum_id)); markread('topics', array($forum_id), false, request_var('mark_time', 0));
} }
$redirect_url = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id); $redirect_url = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id);
meta_refresh(3, $redirect_url); meta_refresh(3, $redirect_url);
@ -340,7 +340,7 @@ $template->assign_vars(array(
'U_MCP' => ($auth->acl_get('m_', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "f=$forum_id&amp;i=main&amp;mode=forum_view", true, $user->session_id) : '', 'U_MCP' => ($auth->acl_get('m_', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "f=$forum_id&amp;i=main&amp;mode=forum_view", true, $user->session_id) : '',
'U_POST_NEW_TOPIC' => ($auth->acl_get('f_post', $forum_id) || $user->data['user_id'] == ANONYMOUS) ? append_sid("{$phpbb_root_path}posting.$phpEx", 'mode=post&amp;f=' . $forum_id) : '', 'U_POST_NEW_TOPIC' => ($auth->acl_get('f_post', $forum_id) || $user->data['user_id'] == ANONYMOUS) ? append_sid("{$phpbb_root_path}posting.$phpEx", 'mode=post&amp;f=' . $forum_id) : '',
'U_VIEW_FORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", "f=$forum_id" . ((strlen($u_sort_param)) ? "&amp;$u_sort_param" : '') . (($start == 0) ? '' : "&amp;start=$start")), 'U_VIEW_FORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", "f=$forum_id" . ((strlen($u_sort_param)) ? "&amp;$u_sort_param" : '') . (($start == 0) ? '' : "&amp;start=$start")),
'U_MARK_TOPICS' => ($user->data['is_registered'] || $config['load_anon_lastread']) ? append_sid("{$phpbb_root_path}viewforum.$phpEx", 'hash=' . generate_link_hash('global') . "&amp;f=$forum_id&amp;mark=topics") : '', 'U_MARK_TOPICS' => ($user->data['is_registered'] || $config['load_anon_lastread']) ? append_sid("{$phpbb_root_path}viewforum.$phpEx", 'hash=' . generate_link_hash('global') . "&amp;f=$forum_id&amp;mark=topics&amp;mark_time=" . time()) : '',
)); ));
// Grab icons // Grab icons