aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB
diff options
context:
space:
mode:
Diffstat (limited to 'phpBB')
-rw-r--r--phpBB/includes/content_visibility.php138
1 files changed, 35 insertions, 103 deletions
diff --git a/phpBB/includes/content_visibility.php b/phpBB/includes/content_visibility.php
index 8bc67a7fd2..112780224f 100644
--- a/phpBB/includes/content_visibility.php
+++ b/phpBB/includes/content_visibility.php
@@ -34,48 +34,14 @@ class phpbb_content_visibility
*/
static public function get_visibility_sql($mode, $forum_id, $table_alias = '')
{
- global $auth, $db, $user;
+ global $auth;
- $status_ary = array(ITEM_APPROVED);
if ($auth->acl_get('m_approve', $forum_id))
{
- $status_ary[] = ITEM_UNAPPROVED;
+ return '1 = 1';
}
- if ($auth->acl_get('m_restore', $forum_id))
- {
- $status_ary[] = ITEM_DELETED;
-
- if (sizeof($status_ary) == 3)
- {
- // The user can see all types, so we simplify this to an empty string,
- // as we don't need to restrict anything on the query.
- return '1 = 1';
- }
- }
-
- return $db->sql_in_set($table_alias . $mode . '_visibility', $status_ary);
-
- /**
- * @todo: Commented out, because the performance is not the best
- *
- // If the user has m_restore, the rest of the function will not
- // make more content visible, so we can return the query here.
- return $db->sql_in_set($table_alias . $mode . '_visibility', $status_ary);
- }
-
- $clause = $db->sql_in_set($table_alias . $mode . '_visibility', $status_ary);
-
- // only allow the user to view deleted posts he himself made
- if ($auth->acl_get('f_restore', $forum_id) && !$auth->acl_get('m_restore', $forum_id))
- {
- $poster_column = ($mode == 'topic') ? 'topic_poster' : 'poster_id';
- $clause = '(' . $clause . "
- OR ($table_alias{$mode}_visibility = " . ITEM_DELETED . "
- AND $table_alias$poster_column = " . (int) $user->data['user_id'] . '))';
- }*/
-
- return $clause;
+ return $table_alias . $mode . '_visibility = ' . ITEM_APPROVED;
}
/**
@@ -91,46 +57,37 @@ class phpbb_content_visibility
*/
static public function get_forums_visibility_sql($mode, $forum_ids = array(), $table_alias = '')
{
- global $auth, $db, $user;
+ global $auth, $db;
- // users can always see approved posts
- $where_sql = "(($table_alias{$mode}_visibility = " . ITEM_APPROVED . '
- AND ' . $db->sql_in_set($table_alias . 'forum_id', $forum_ids) . ')';
+ $where_sql = '(';
- // in set notation: {approve_forums} = {m_approve} - {exclude_forums}
$approve_forums = array_intersect($forum_ids, array_keys($auth->acl_getf('m_approve', true)));
+
if (sizeof($approve_forums))
{
- // users can view unapproved topics in certain forums. specify them.
- $where_sql .= " OR ($table_alias{$mode}_visibility = " . ITEM_UNAPPROVED . '
- AND ' . $db->sql_in_set($table_alias . 'forum_id', $approve_forums) . ')';
- }
+ // Remove moderator forums from the rest
+ $forum_ids = array_diff($forum_ids, $approve_forums);
- // this is exactly the same logic as for approve forums, above
- $restore_forums = array_intersect($forum_ids, array_keys($auth->acl_getf('m_restore', true)));
- if (sizeof($restore_forums))
- {
- $where_sql .= " OR ($table_alias{$mode}_visibility = " . ITEM_DELETED . '
- AND ' . $db->sql_in_set($table_alias . 'forum_id', $restore_forums) . ')';
+ if (!sizeof($forum_ids))
+ {
+ // The user can see all posts/topics in all specified forums
+ return $db->sql_in_set($table_alias . 'forum_id', $approve_forums);
+ }
+ else
+ {
+ // Moderator can view all posts/topics in some forums
+ $where_sql .= $db->sql_in_set($table_alias . 'forum_id', $approve_forums) . ' OR ';
+ }
}
-
- /*
- * @todo: Commented out, because the performance is not the best
- *
- // we also allow the user to view deleted posts he himself made
- $user_restore_forums = array_diff(array_intersect($forum_ids, array_keys($auth->acl_getf('f_restore', true))), $restore_forums);
- if (sizeof($user_restore_forums) && !sizeof($restore_forums))
+ else
{
- $poster_column = ($mode == 'topic') ? 'topic_poster' : 'poster_id';
-
- // specify the poster ID, the visibility type, and the forums we're interested in
- $where_sql .= " OR ($table_alias$poster_column = " . $user->data['user_id'] . "
- AND $table_alias{$mode}_visibility = " . ITEM_DELETED . "
- AND " . $db->sql_in_set($table_alias . 'forum_id', $user_restore_forums) . ')';
+ // The user is just a normal user
+ return "$table_alias{$mode}_visibility = " . ITEM_APPROVED . '
+ AND ' . $db->sql_in_set($table_alias . 'forum_id', $forum_ids, false, true);
}
- */
- $where_sql .= ')';
+ $where_sql .= "($table_alias{$mode}_visibility = " . ITEM_APPROVED . '
+ AND ' . $db->sql_in_set($table_alias . 'forum_id', $forum_ids) . '))';
return $where_sql;
}
@@ -148,55 +105,30 @@ class phpbb_content_visibility
*/
static public function get_global_visibility_sql($mode, $exclude_forum_ids = array(), $table_alias = '')
{
- global $auth, $db, $user;
+ global $auth, $db;
+
+ $where_sqls = array();
+
+ $approve_forums = array_diff(array_keys($auth->acl_getf('m_approve', true)), $exclude_forum_ids);
- // users can always see approved posts
if (sizeof($exclude_forum_ids))
{
- $where_sql = '((' . $db->sql_in_set($table_alias . 'forum_id', $exclude_forum_ids, true, true) . "
+ $where_sqls[] = '(' . $db->sql_in_set($table_alias . 'forum_id', $exclude_forum_ids, true) . "
AND $table_alias{$mode}_visibility = " . ITEM_APPROVED . ')';
}
else
{
- $where_sql = "($table_alias{$mode}_visibility = " . ITEM_APPROVED;
+ $where_sqls[] = "$table_alias{$mode}_visibility = " . ITEM_APPROVED;
}
- // in set notation: {approve_forums} = {m_approve} - {exclude_forums}
- $approve_forums = array_diff(array_keys($auth->acl_getf('m_approve', true)), $exclude_forum_ids);
if (sizeof($approve_forums))
{
- // users can view unapproved topics in certain forums. specify them.
- $where_sql .= " OR ($table_alias{$mode}_visibility = " . ITEM_UNAPPROVED . '
- AND ' . $db->sql_in_set($table_alias . 'forum_id', $approve_forums) . ')';
+ $where_sqls[] = $db->sql_in_set($table_alias . 'forum_id', $approve_forums);
+ return '(' . implode(' OR ', $where_sqls) . ')';
}
- // this is exactly the same logic as for approve forums, above
- $restore_forums = array_diff(array_keys($auth->acl_getf('m_restore', true)), $exclude_forum_ids);
- if (sizeof($restore_forums))
- {
- $where_sql .= " OR ($table_alias{$mode}_visibility = " . ITEM_DELETED . '
- AND ' . $db->sql_in_set($table_alias . 'forum_id', $restore_forums) . ')';
- }
-
- /*
- * @todo: Commented out, because the performance is not the best
- *
- // we also allow the user to view deleted posts he himself made
- $user_restore_forums = array_diff(array_keys($auth->acl_getf('f_restore', true)), $exclude_forum_ids);
- if (sizeof($user_restore_forums) && !sizeof($restore_forums))
- {
- $poster_column = ($mode == 'topic') ? 'topic_poster' : 'poster_id';
-
- // specify the poster ID, the visibility type, and the forums we're interested in
- $where_sql .= " OR ($table_alias$poster_column = " . $user->data['user_id'] . "
- AND $table_alias{$mode}_visibility = " . ITEM_DELETED . "
- AND " . $db->sql_in_set($table_alias . 'forum_id', $user_restore_forums) . ')';
- }
- */
-
- $where_sql .= ')';
-
- return $where_sql;
+ // There is only one element, so we just return that one
+ return $where_sqls[0];
}
/**