diff options
Diffstat (limited to 'phpBB/includes/auth.php')
-rw-r--r-- | phpBB/includes/auth.php | 84 |
1 files changed, 57 insertions, 27 deletions
diff --git a/phpBB/includes/auth.php b/phpBB/includes/auth.php index 28b3384d9c..c8aa56adc2 100644 --- a/phpBB/includes/auth.php +++ b/phpBB/includes/auth.php @@ -520,8 +520,6 @@ class auth ' . (($sql_user) ? 'AND a.' . $sql_user : '') . " $sql_forum $sql_opts", - - 'ORDER_BY' => 'a.forum_id, ao.auth_option' )); $result = $db->sql_query($sql); @@ -533,60 +531,92 @@ class auth $db->sql_freeresult($result); // Now grab group settings ... ACL_NEVER overrides ACL_YES so act appropriatley - $sql = $db->sql_build_query('SELECT', array( + $sql_ary[] = $db->sql_build_query('SELECT', array( 'SELECT' => 'ug.user_id, ao.auth_option, a.forum_id, a.auth_setting, a.auth_role_id, r.auth_setting as role_auth_setting', 'FROM' => array( - ACL_GROUPS_TABLE => 'a', + USER_GROUP_TABLE => 'ug', + ACL_OPTIONS_TABLE => 'ao', + ACL_GROUPS_TABLE => 'a' ), 'LEFT_JOIN' => array( array( - 'FROM' => array(USER_GROUP_TABLE => 'ug'), - 'ON' => 'a.group_id = ug.group_id' - ), - array( 'FROM' => array(ACL_ROLES_DATA_TABLE => 'r'), 'ON' => 'a.auth_role_id = r.role_id' + ) + ), + + 'WHERE' => 'ao.auth_option_id = a.auth_option_id + AND a.group_id = ug.group_id + AND ug.user_pending = 0 + ' . (($sql_user) ? 'AND ug.' . $sql_user : '') . " + $sql_forum + $sql_opts" + )); + + $sql_ary[] = $db->sql_build_query('SELECT', array( + 'SELECT' => 'ug.user_id, a.forum_id, a.auth_setting, a.auth_role_id, r.auth_setting as role_auth_setting, ao.auth_option' , + + 'FROM' => array( + ACL_OPTIONS_TABLE => 'ao' + + ), + + 'LEFT_JOIN' => array( + + array( + 'FROM' => array(ACL_ROLES_DATA_TABLE => 'r'), + 'ON' => 'r.auth_option_id = ao.auth_option_id' ), array( - 'FROM' => array(ACL_OPTIONS_TABLE => 'ao'), - 'ON' => '(ao.auth_option_id = a.auth_option_id OR ao.auth_option_id = r.auth_option_id)' + 'FROM' => array(ACL_GROUPS_TABLE => 'a'), + 'ON' => 'a.auth_role_id = r.role_id' ), + array( + 'FROM' => array(USER_GROUP_TABLE => 'ug'), + 'ON' => 'ug.group_id = a.group_id' + ) + ), 'WHERE' => 'ug.user_pending = 0 ' . (($sql_user) ? 'AND ug.' . $sql_user : '') . " $sql_forum - $sql_opts", + $sql_opts" )); - $result = $db->sql_query($sql); + - while ($row = $db->sql_fetchrow($result)) + foreach ($sql_ary as $sql) { - if (!isset($hold_ary[$row['user_id']][$row['forum_id']][$row['auth_option']]) || (isset($hold_ary[$row['user_id']][$row['forum_id']][$row['auth_option']]) && $hold_ary[$row['user_id']][$row['forum_id']][$row['auth_option']] != ACL_NEVER)) - { - $setting = ($row['auth_role_id']) ? $row['role_auth_setting'] : $row['auth_setting']; - $hold_ary[$row['user_id']][$row['forum_id']][$row['auth_option']] = $setting; + $result = $db->sql_query($sql); - // Check for existence of ACL_YES if an option got set to ACL_NEVER - if ($setting == ACL_NEVER) + while ($row = $db->sql_fetchrow($result)) + { + if (!isset($hold_ary[$row['user_id']][$row['forum_id']][$row['auth_option']]) || (isset($hold_ary[$row['user_id']][$row['forum_id']][$row['auth_option']]) && $hold_ary[$row['user_id']][$row['forum_id']][$row['auth_option']] != ACL_NEVER)) { - $flag = substr($row['auth_option'], 0, strpos($row['auth_option'], '_') + 1); - - if (isset($hold_ary[$row['user_id']][$row['forum_id']][$flag]) && $hold_ary[$row['user_id']][$row['forum_id']][$flag] == ACL_YES) + $setting = ($row['auth_role_id']) ? $row['role_auth_setting'] : $row['auth_setting']; + $hold_ary[$row['user_id']][$row['forum_id']][$row['auth_option']] = $setting; + + // Check for existence of ACL_YES if an option got set to ACL_NEVER + if ($setting == ACL_NEVER) { - unset($hold_ary[$row['user_id']][$row['forum_id']][$flag]); - - if (in_array(ACL_YES, $hold_ary[$row['user_id']][$row['forum_id']])) + $flag = substr($row['auth_option'], 0, strpos($row['auth_option'], '_') + 1); + + if (isset($hold_ary[$row['user_id']][$row['forum_id']][$flag]) && $hold_ary[$row['user_id']][$row['forum_id']][$flag] == ACL_YES) { - $hold_ary[$row['user_id']][$row['forum_id']][$flag] = ACL_YES; + unset($hold_ary[$row['user_id']][$row['forum_id']][$flag]); + + if (in_array(ACL_YES, $hold_ary[$row['user_id']][$row['forum_id']])) + { + $hold_ary[$row['user_id']][$row['forum_id']][$flag] = ACL_YES; + } } } } } + $db->sql_freeresult($result); } - $db->sql_freeresult($result); return $hold_ary; } |