diff options
-rw-r--r-- | phpBB/common.php | 2 | ||||
-rw-r--r-- | phpBB/includes/acp/acp_main.php | 7 | ||||
-rw-r--r-- | phpBB/includes/acp/acp_styles.php | 6 | ||||
-rw-r--r-- | phpBB/includes/auth.php | 473 | ||||
-rw-r--r-- | phpBB/includes/session.php | 362 | ||||
-rw-r--r-- | phpBB/includes/ucp/ucp_main.php | 25 | ||||
-rw-r--r-- | phpBB/memberlist.php | 4 |
7 files changed, 496 insertions, 383 deletions
diff --git a/phpBB/common.php b/phpBB/common.php index c232b07718..6822d8f72a 100644 --- a/phpBB/common.php +++ b/phpBB/common.php @@ -6,6 +6,7 @@ * @copyright (c) 2005 phpBB Group * @license http://opensource.org/licenses/gpl-license.php GNU Public License * +* Minimum Requirement: PHP 4.3.3 */ // Remove the following line to enable this software, be sure you note what it @@ -77,6 +78,7 @@ require($phpbb_root_path . 'includes/acm/acm_main.' . $phpEx); require($phpbb_root_path . 'includes/db/' . $dbms . '.' . $phpEx); require($phpbb_root_path . 'includes/template.' . $phpEx); require($phpbb_root_path . 'includes/session.' . $phpEx); +require($phpbb_root_path . 'includes/auth.' . $phpEx); require($phpbb_root_path . 'includes/functions.' . $phpEx); require($phpbb_root_path . 'includes/constants.' . $phpEx); diff --git a/phpBB/includes/acp/acp_main.php b/phpBB/includes/acp/acp_main.php index 9c31528955..924ae6713b 100644 --- a/phpBB/includes/acp/acp_main.php +++ b/phpBB/includes/acp/acp_main.php @@ -205,16 +205,17 @@ class acp_main } $post_count_ary = $auth->acl_getf('f_postcount'); - + $forum_read_ary = $auth->acl_getf('f_read'); + $forum_ary = array(); foreach ($post_count_ary as $forum_id => $allowed) { - if ($allowed['f_postcount']) + if ($allowed['f_postcount'] && $forum_read_ary[$forum_id]['f_read']) { $forum_ary[] = $forum_id; } } - + if (!sizeof($forum_ary)) { $db->sql_query('UPDATE ' . USERS_TABLE . ' SET user_posts = 0'); diff --git a/phpBB/includes/acp/acp_styles.php b/phpBB/includes/acp/acp_styles.php index 72cc82ee4b..57c9fbfeaf 100644 --- a/phpBB/includes/acp/acp_styles.php +++ b/phpBB/includes/acp/acp_styles.php @@ -1778,7 +1778,7 @@ pagination_sep = \'{PAGINATION_SEP}\' { return false; } - +/* if ($action != 'install') { @mkdir("{$phpbb_root_path}styles/$path", 0777); @@ -1789,7 +1789,7 @@ pagination_sep = \'{PAGINATION_SEP}\' $this->copy_files("$root_path$type", filelist("$root_path$type", '', '*'), "$path/$type"); } } - +*/ $sql_ary = array( $mode . '_name' => $name, $mode . '_copyright' => $copyright, @@ -1809,7 +1809,7 @@ pagination_sep = \'{PAGINATION_SEP}\' case 'theme': $sql_ary += array( 'theme_storedb' => (!is_writeable("{$phpbb_root_path}styles/$path/theme/stylesheet.css")) ? 1 : $store_db, - 'theme_data' => ($store_db) ? (($root_path) ? str_replace('./', "styles/$path/theme/", implode('', file("$root_path/$type/stylesheet.css"))) : '') : '', + 'theme_data' => ($store_db) ? (($root_path) ? str_replace('./', "styles/$path/theme/", implode('', file("$root_path/$mode/stylesheet.css"))) : '') : '', 'theme_mtime' => ($store_db) ? filemtime("{$phpbb_root_path}styles/$path/theme/stylesheet.css") : 0 ); break; diff --git a/phpBB/includes/auth.php b/phpBB/includes/auth.php new file mode 100644 index 0000000000..ef8245d58c --- /dev/null +++ b/phpBB/includes/auth.php @@ -0,0 +1,473 @@ +<?php +/** +* +* @package phpBB3 +* @version $Id$ +* @copyright (c) 2005 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +/** +* @package phpBB3 +* Permission/Auth class +*/ +class auth +{ + var $acl = array(); + var $acl_options = array(); + + /** + * Init permissions + */ + function acl(&$userdata) + { + global $db, $cache; + + $this->acl = array(); + + if (!($this->acl_options = $cache->get('acl_options'))) + { + $sql = 'SELECT auth_option, is_global, is_local + FROM ' . ACL_OPTIONS_TABLE . ' + ORDER BY auth_option_id'; + $result = $db->sql_query($sql); + + $global = $local = 0; + while ($row = $db->sql_fetchrow($result)) + { + if ($row['is_global']) + { + $this->acl_options['global'][$row['auth_option']] = $global++; + } + + if ($row['is_local']) + { + $this->acl_options['local'][$row['auth_option']] = $local++; + } + } + $db->sql_freeresult($result); + + $cache->put('acl_options', $this->acl_options); + $this->acl_clear_prefetch(); + $this->acl_cache($userdata); + } + else if (!trim($userdata['user_permissions'])) + { + $this->acl_cache($userdata); + } + + $user_permissions = explode("\n", $userdata['user_permissions']); + + foreach ($user_permissions as $f => $seq) + { + if ($seq) + { + $i = 0; + + while ($subseq = substr($seq, $i, 6)) + { + if (!isset($this->acl[$f])) + { + $this->acl[$f] = ''; + } + + // We put the original bitstring into the acl array + $this->acl[$f] .= str_pad(base_convert($subseq, 36, 2), 31, 0, STR_PAD_LEFT); + $i += 6; + } + } + } + + return; + } + + /** + * Look up an option + * if the option is prefixed with !, then the result becomes nagated + */ + function acl_get($opt, $f = 0) + { + static $cache; + + if (!isset($cache)) + { + $cache = array(); + } + + $negate = false; + + if (strpos($opt, '!') === 0) + { + $negate = true; + $opt = substr($opt, 1); + } + + if (!isset($cache[$f][$opt])) + { + // We combine the global/local option with an OR because some options are global and local. + // If the user has the global permission the local one is true too and vice versa + $cache[$f][$opt] = false; + + // Is this option a global permission setting? + if (isset($this->acl_options['global'][$opt])) + { + if (isset($this->acl[0])) + { + $cache[$f][$opt] = $this->acl[0]{$this->acl_options['global'][$opt]}; + } + } + + // Is this option a local permission setting? + if (isset($this->acl_options['local'][$opt])) + { + if (isset($this->acl[$f])) + { + $cache[$f][$opt] |= $this->acl[$f]{$this->acl_options['local'][$opt]}; + } + } + } + + // Founder always has all global options set to true... + return ($negate) ? !$cache[$f][$opt] : $cache[$f][$opt]; + } + + /** + * Get forums with the specified permission setting + * if the option is prefixed with !, then the result becomes nagated + * + * @param clean true|false set to true if only values needs to be returned which are set/unset + */ + function acl_getf($opt, $clean = false) + { + static $cache; + + $acl_f = array(); + + if (!isset($cache)) + { + $cache = array(); + } + + $negate = false; + + if (strpos($opt, '!') === 0) + { + $negate = true; + $opt = substr($opt, 1); + } + + if (isset($this->acl_options['local'][$opt])) + { + foreach ($this->acl as $f => $bitstring) + { + // Skip global settings + if (!$f) + { + continue; + } + + $allowed = (!isset($cache[$f][$opt])) ? $this->acl_get($opt, $f) : $cache[$f][$opt]; + + if (!$clean) + { + $acl_f[$f][$opt] = ($negate) ? !$allowed : $allowed; + } + else + { + if (($negate && !$allowed) || (!$negate && $allowed)) + { + $acl_f[$f][$opt] = 1; + } + } + } + } + + return $acl_f; + } + + /** + * Get permission settings (more than one) + */ + function acl_gets() + { + $args = func_get_args(); + $f = array_pop($args); + + if (!is_numeric($f)) + { + $args[] = $f; + $f = 0; + } + + // alternate syntax: acl_gets(array('m_', 'a_'), $forum_id) + if (is_array($args[0])) + { + $args = $args[0]; + } + + $acl = 0; + foreach ($args as $opt) + { + $acl |= $this->acl_get($opt, $f); + } + + return $acl; + } + + /** + * Get permission listing based on user_id/options/forum_ids + */ + function acl_get_list($user_id = false, $opts = false, $forum_id = false) + { + $hold_ary = $this->acl_raw_data($user_id, $opts, $forum_id); + + $auth_ary = array(); + foreach ($hold_ary as $user_id => $forum_ary) + { + foreach ($forum_ary as $forum_id => $auth_option_ary) + { + foreach ($auth_option_ary as $auth_option => $auth_setting) + { + if ($auth_setting) + { + $auth_ary[$forum_id][$auth_option][] = $user_id; + } + } + } + } + + return $auth_ary; + } + + /** + * Get raw group based permission settings + function acl_group_raw_data($group_id = false, $opts = false, $forum_id = false) + { + global $db; + + $sql_group = ($group_id !== false) ? ((!is_array($group_id)) ? "group_id = $group_id" : 'group_id IN (' . implode(', ', $group_id) . ')') : ''; + $sql_forum = ($forum_id !== false) ? ((!is_array($forum_id)) ? "AND a.forum_id = $forum_id" : 'AND a.forum_id IN (' . implode(', ', $forum_id) . ')') : ''; + $sql_opts = ($opts !== false) ? ((!is_array($opts)) ? "AND ao.auth_option = '$opts'" : 'AND ao.auth_option IN (' . implode(', ', preg_replace('#^\s*(.*)\s*$#e', "\"'\" . \$db->sql_escape('\\1') . \"'\"", $opts)) . ')') : ''; + + $hold_ary = array(); + + // Grab group settings... + $sql = 'SELECT a.group_id, ao.auth_option, a.forum_id, a.auth_setting + FROM ' . ACL_OPTIONS_TABLE . ' ao, ' . ACL_GROUPS_TABLE . ' a + WHERE ao.auth_option_id = a.auth_option_id + ' . (($sql_group) ? 'AND a.' . $sql_group : '') . " + $sql_forum + $sql_opts + ORDER BY a.forum_id, ao.auth_option"; + $result = $db->sql_query($sql); + + while ($row = $db->sql_fetchrow($result)) + { + $hold_ary[$row['group_id']][$row['forum_id']][$row['auth_option']] = $row['auth_setting']; + } + $db->sql_freeresult($result); + + return $hold_ary; + } +*/ + + /** + * Cache data to user_permissions row + */ + function acl_cache(&$userdata) + { + global $db; + + // Empty user_permissions + $userdata['user_permissions'] = ''; + + $hold_ary = $this->acl_raw_data($userdata['user_id'], false, false); + + if (isset($hold_ary[$userdata['user_id']])) + { + $hold_ary = $hold_ary[$userdata['user_id']]; + } + + // Key 0 in $hold_ary are global options, all others are forum_ids + + // If this user is founder we're going to force fill the admin options ... + if ($userdata['user_type'] == USER_FOUNDER) + { + foreach ($this->acl_options['global'] as $opt => $id) + { + if (strpos($opt, 'a_') === 0) + { + $hold_ary[0][$opt] = 1; + } + } + } + + $hold_str = ''; + if (sizeof($hold_ary)) + { + ksort($hold_ary); + + $last_f = 0; + + foreach ($hold_ary as $f => $auth_ary) + { + $ary_key = (!$f) ? 'global' : 'local'; + + $bitstring = array(); + foreach ($this->acl_options[$ary_key] as $opt => $id) + { + if (isset($auth_ary[$opt])) + { + $bitstring[$id] = 1; + + $option_key = substr($opt, 0, strpos($opt, '_') + 1); + + // If one option is allowed, the global permission for this option has to be allowed too + // example: if the user has the a_ permission this means he has one or more a_* permissions + if (!isset($bitstring[$this->acl_options[$ary_key][$option_key]]) || !$bitstring[$this->acl_options[$ary_key][$option_key]]) + { + $bitstring[$this->acl_options[$ary_key][$option_key]] = 1; + } + } + else + { + $bitstring[$id] = 0; + } + } + + // Now this bitstring defines the permission setting for the current forum $f (or global setting) + $bitstring = implode('', $bitstring); + + // The line number indicates the id, therefore we have to add empty lines for those ids not present + $hold_str .= str_repeat("\n", $f - $last_f); + + // Convert bitstring for storage - we do not use binary/bytes because PHP's string functions are not fully binary safe + for ($i = 0; $i < strlen($bitstring); $i += 31) + { + $hold_str .= str_pad(base_convert(str_pad(substr($bitstring, $i, 31), 31, 0, STR_PAD_RIGHT), 2, 36), 6, 0, STR_PAD_LEFT); + } + + $last_f = $f; + } + unset($bitstring); + + $userdata['user_permissions'] = rtrim($hold_str); + + $sql = 'UPDATE ' . USERS_TABLE . " + SET user_permissions = '" . $db->sql_escape($userdata['user_permissions']) . "' + WHERE user_id = " . $userdata['user_id']; + $db->sql_query($sql); + } + unset($hold_ary); + + return; + } + + /** + * Clear one or all users cached permission settings + */ + function acl_clear_prefetch($user_id = false) + { + global $db; + + $where_sql = ($user_id !== false) ? ' WHERE user_id ' . ((is_array($user_id)) ? ' IN (' . implode(', ', array_map('intval', $user_id)) . ')' : " = $user_id") : ''; + + $sql = 'UPDATE ' . USERS_TABLE . " + SET user_permissions = '' + $where_sql"; + $db->sql_query($sql); + + return; + } + + /** + * Get raw acl data based on user/option/forum + */ + function acl_raw_data($user_id = false, $opts = false, $forum_id = false) + { + global $db; + + $sql_user = ($user_id !== false) ? ((!is_array($user_id)) ? "user_id = $user_id" : 'user_id IN (' . implode(', ', $user_id) . ')') : ''; + $sql_forum = ($forum_id !== false) ? ((!is_array($forum_id)) ? "AND a.forum_id = $forum_id" : 'AND a.forum_id IN (' . implode(', ', $forum_id) . ')') : ''; + $sql_opts = ($opts !== false) ? ((!is_array($opts)) ? "AND ao.auth_option = '$opts'" : 'AND ao.auth_option IN (' . implode(', ', preg_replace('#^\s*(.*)\s*$#e', "\"'\" . \$db->sql_escape('\\1') . \"'\"", $opts)) . ')') : ''; + + $hold_ary = array(); + + // First grab user settings ... each user has only one setting for each + // option ... so we shouldn't need any ACL_NO checks ... he says ... + $sql = 'SELECT ao.auth_option, a.user_id, a.forum_id, a.auth_setting + FROM ' . ACL_OPTIONS_TABLE . ' ao, ' . ACL_USERS_TABLE . ' a + WHERE ao.auth_option_id = a.auth_option_id + ' . (($sql_user) ? 'AND a.' . $sql_user : '') . " + $sql_forum + $sql_opts + ORDER BY a.forum_id, ao.auth_option"; + $result = $db->sql_query($sql); + + while ($row = $db->sql_fetchrow($result)) + { + $hold_ary[$row['user_id']][$row['forum_id']][$row['auth_option']] = $row['auth_setting']; + } + $db->sql_freeresult($result); + + // Now grab group settings ... ACL_NO overrides ACL_YES so act appropriatley + $sql = 'SELECT ug.user_id, ao.auth_option, a.forum_id, a.auth_setting + FROM ' . USER_GROUP_TABLE . ' ug, ' . ACL_OPTIONS_TABLE . ' ao, ' . ACL_GROUPS_TABLE . ' a + WHERE ao.auth_option_id = a.auth_option_id + AND a.group_id = ug.group_id + ' . (($sql_user) ? 'AND ug.' . $sql_user : '') . " + $sql_forum + $sql_opts + ORDER BY a.forum_id, ao.auth_option"; + $result = $db->sql_query($sql); + + 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_NO)) + { + $hold_ary[$row['user_id']][$row['forum_id']][$row['auth_option']] = $row['auth_setting']; + } + } + $db->sql_freeresult($result); + + return $hold_ary; + } + + /** + * Authentication plug-ins is largely down to Sergey Kanareykin, our thanks to him. + * @todo replace this with a new system + */ + function login($username, $password, $autologin = false, $viewonline = 1, $admin = 0) + { + global $config, $db, $user, $phpbb_root_path, $phpEx; + + $method = trim($config['auth_method']); + + if (file_exists($phpbb_root_path . 'includes/auth/auth_' . $method . '.' . $phpEx)) + { + include_once($phpbb_root_path . 'includes/auth/auth_' . $method . '.' . $phpEx); + + $method = 'login_' . $method; + if (function_exists($method)) + { + $login = $method($username, $password); + + // If login returned anything other than an array there was an error + if (!is_array($login)) + { + /** + * @todo Login Attempt++ + */ + return $login; + } + + return $user->session_create($login['user_id'], $admin, $autologin, $viewonline); + } + } + + trigger_error('Authentication method not found', E_USER_ERROR); + } +} + +?>
\ No newline at end of file diff --git a/phpBB/includes/session.php b/phpBB/includes/session.php index 0094b4e107..b3315ec4bc 100644 --- a/phpBB/includes/session.php +++ b/phpBB/includes/session.php @@ -1094,364 +1094,4 @@ class user extends session } } - -class auth -{ - var $founder = false; - var $acl = array(); - var $option = array(); - var $acl_options = array(); - - function acl(&$userdata) - { - global $db, $cache; - - if (!($this->acl_options = $cache->get('acl_options'))) - { - $sql = 'SELECT auth_option, is_global, is_local - FROM ' . ACL_OPTIONS_TABLE . ' - ORDER BY auth_option_id'; - $result = $db->sql_query($sql); - - $global = $local = 0; - while ($row = $db->sql_fetchrow($result)) - { - if (!empty($row['is_global'])) - { - $this->acl_options['global'][$row['auth_option']] = $global++; - } - if (!empty($row['is_local'])) - { - $this->acl_options['local'][$row['auth_option']] = $local++; - } - } - $db->sql_freeresult($result); - - $cache->put('acl_options', $this->acl_options); - $this->acl_clear_prefetch(); - $this->acl_cache($userdata); - } - else if (!trim($userdata['user_permissions'])) - { - $this->acl_cache($userdata); - } - - foreach (explode("\n", $userdata['user_permissions']) as $f => $seq) - { - if ($seq) - { - $i = 0; - while ($subseq = substr($seq, $i, 6)) - { - if (!isset($this->acl[$f])) - { - $this->acl[$f] = ''; - } - $this->acl[$f] .= str_pad(base_convert($subseq, 36, 2), 31, 0, STR_PAD_LEFT); - $i += 6; - } - } - } - return; - } - - // Look up an option - function acl_get($opt, $f = 0) - { - static $cache; - - if (!isset($cache[$f][$opt])) - { - $cache[$f][$opt] = false; - if (isset($this->acl_options['global'][$opt])) - { - if (isset($this->acl[0])) - { - $cache[$f][$opt] = $this->acl[0]{$this->acl_options['global'][$opt]}; - } - } - if (isset($this->acl_options['local'][$opt])) - { - if (isset($this->acl[$f])) - { - $cache[$f][$opt] |= $this->acl[$f]{$this->acl_options['local'][$opt]}; - } - } - } - - // Needs to change ... check founder status when updating cache? - return $cache[$f][$opt]; - } - - function acl_getf($opt) - { - static $cache; - - if (isset($this->acl_options['local'][$opt])) - { - foreach ($this->acl as $f => $bitstring) - { - if (!isset($cache[$f][$opt])) - { - $cache[$f][$opt] = false; - - $cache[$f][$opt] = $bitstring{$this->acl_options['local'][$opt]}; - if (isset($this->acl_options['global'][$opt])) - { - $cache[$f][$opt] |= $this->acl[0]{$this->acl_options['global'][$opt]}; - } - } - } - } - - return $cache; - } - - function acl_gets() - { - $args = func_get_args(); - $f = array_pop($args); - - if (!is_numeric($f)) - { - $args[] = $f; - $f = 0; - } - - // alternate syntax: acl_gets(array('m_', 'a_'), $forum_id) - if (is_array($args[0])) - { - $args = $args[0]; - } - - $acl = 0; - foreach ($args as $opt) - { - $acl |= $this->acl_get($opt, $f); - } - - return $acl; - } - - function acl_get_list($user_id = false, $opts = false, $forum_id = false) - { - $hold_ary = $this->acl_raw_data($user_id, $opts, $forum_id); - - $auth_ary = array(); - foreach ($hold_ary as $user_id => $forum_ary) - { - foreach ($forum_ary as $forum_id => $auth_option_ary) - { - foreach ($auth_option_ary as $auth_option => $auth_setting) - { - if ($auth_setting == ACL_YES) - { - $auth_ary[$forum_id][$auth_option][] = $user_id; - } - } - } - } - - return $auth_ary; - } - - // Cache data - function acl_cache(&$userdata) - { - global $db; - - $hold_ary = $this->acl_raw_data($userdata['user_id'], false, false); - $hold_ary = $hold_ary[$userdata['user_id']]; - - // If this user is founder we're going to force fill the admin options ... - if ($userdata['user_type'] == USER_FOUNDER) - { - foreach ($this->acl_options['global'] as $opt => $id) - { - if (strpos($opt, 'a_') !== false) - { - $hold_ary[0][$opt] = 1; - } - } - } - - $hold_str = ''; - if (is_array($hold_ary)) - { - ksort($hold_ary); - - $last_f = 0; - foreach ($hold_ary as $f => $auth_ary) - { - $ary_key = (!$f) ? 'global' : 'local'; - - $bitstring = array(); - foreach ($this->acl_options[$ary_key] as $opt => $id) - { - if (!empty($auth_ary[$opt])) - { - $bitstring[$id] = 1; - - $option_key = substr($opt, 0, strpos($opt, '_') + 1); - if (empty($holding[$this->acl_options[$ary_key][$option_key]])) - { - $bitstring[$this->acl_options[$ary_key][$option_key]] = 1; - } - } - else - { - $bitstring[$id] = 0; - } - } - - $bitstring = implode('', $bitstring); - - $hold_str .= str_repeat("\n", $f - $last_f); - - for ($i = 0; $i < strlen($bitstring); $i += 31) - { - $hold_str .= str_pad(base_convert(str_pad(substr($bitstring, $i, 31), 31, 0, STR_PAD_RIGHT), 2, 36), 6, 0, STR_PAD_LEFT); - } - - $last_f = $f; - } - unset($bitstring); - - $userdata['user_permissions'] = rtrim($hold_str); - - $sql = 'UPDATE ' . USERS_TABLE . " - SET user_permissions = '" . $db->sql_escape($userdata['user_permissions']) . "' - WHERE user_id = " . $userdata['user_id']; - $db->sql_query($sql); - } - unset($hold_ary); - - return; - } - - function acl_raw_data($user_id = false, $opts = false, $forum_id = false) - { - global $db; - - $sql_user = ($user_id !== false) ? ((!is_array($user_id)) ? "user_id = $user_id" : 'user_id IN (' . implode(', ', $user_id) . ')') : ''; - $sql_forum = ($forum_id !== false) ? ((!is_array($forum_id)) ? "AND a.forum_id = $forum_id" : 'AND a.forum_id IN (' . implode(', ', $forum_id) . ')') : ''; - $sql_opts = ($opts !== false) ? ((!is_array($opts)) ? "AND ao.auth_option = '$opts'" : 'AND ao.auth_option IN (' . implode(', ', preg_replace('#^[\s]*?(.*?)[\s]*?$#e', "\"'\" . \$db->sql_escape('\\1') . \"'\"", $opts)) . ')') : ''; - - $hold_ary = array(); - // First grab user settings ... each user has only one setting for each - // option ... so we shouldn't need any ACL_NO checks ... he says ... - $sql = 'SELECT ao.auth_option, a.user_id, a.forum_id, a.auth_setting - FROM ' . ACL_OPTIONS_TABLE . ' ao, ' . ACL_USERS_TABLE . ' a - WHERE ao.auth_option_id = a.auth_option_id - ' . (($sql_user) ? 'AND a.' . $sql_user : '') . " - $sql_forum - $sql_opts - ORDER BY a.forum_id, ao.auth_option"; - $result = $db->sql_query($sql); - - while ($row = $db->sql_fetchrow($result)) - { - $hold_ary[$row['user_id']][$row['forum_id']][$row['auth_option']] = $row['auth_setting']; - } - $db->sql_freeresult($result); - - // Now grab group settings ... ACL_NO overrides ACL_YES so act appropriatley - $sql = 'SELECT ug.user_id, ao.auth_option, a.forum_id, a.auth_setting - FROM ' . USER_GROUP_TABLE . ' ug, ' . ACL_OPTIONS_TABLE . ' ao, ' . ACL_GROUPS_TABLE . ' a - WHERE ao.auth_option_id = a.auth_option_id - AND a.group_id = ug.group_id - ' . (($sql_user) ? 'AND ug.' . $sql_user : '') . " - $sql_forum - $sql_opts - ORDER BY a.forum_id, ao.auth_option"; - $result = $db->sql_query($sql); - - 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_NO)) - { - $hold_ary[$row['user_id']][$row['forum_id']][$row['auth_option']] = $row['auth_setting']; - } - } - $db->sql_freeresult($result); - - return $hold_ary; - } - - function acl_group_raw_data($group_id = false, $opts = false, $forum_id = false) - { - global $db; - - $sql_group = ($group_id !== false) ? ((!is_array($group_id)) ? "group_id = $group_id" : 'group_id IN (' . implode(', ', $group_id) . ')') : ''; - $sql_forum = ($forum_id !== false) ? ((!is_array($forum_id)) ? "AND a.forum_id = $forum_id" : 'AND a.forum_id IN (' . implode(', ', $forum_id) . ')') : ''; - $sql_opts = ($opts !== false) ? ((!is_array($opts)) ? "AND ao.auth_option = '$opts'" : 'AND ao.auth_option IN (' . implode(', ', preg_replace('#^[\s]*?(.*?)[\s]*?$#e', "\"'\" . \$db->sql_escape('\\1') . \"'\"", $opts)) . ')') : ''; - - $hold_ary = array(); - - // Grab group settings ... ACL_NO overrides ACL_YES so act appropriatley - $sql = 'SELECT a.group_id, ao.auth_option, a.forum_id, a.auth_setting - FROM ' . ACL_OPTIONS_TABLE . ' ao, ' . ACL_GROUPS_TABLE . ' a - WHERE ao.auth_option_id = a.auth_option_id - ' . (($sql_group) ? 'AND a.' . $sql_group : '') . " - $sql_forum - $sql_opts - ORDER BY a.forum_id, ao.auth_option"; - $result = $db->sql_query($sql); - - while ($row = $db->sql_fetchrow($result)) - { - $hold_ary[$row['group_id']][$row['forum_id']][$row['auth_option']] = $row['auth_setting']; - } - $db->sql_freeresult($result); - - return $hold_ary; - } - - // Clear one or all users cached permission settings - function acl_clear_prefetch($user_id = false) - { - global $db; - - $where_sql = ($user_id !== false) ? ' WHERE user_id ' . ((is_array($user_id)) ? ' IN (' . implode(', ', array_map('intval', $user_id)) . ')' : " = $user_id") : ''; - - $sql = 'UPDATE ' . USERS_TABLE . " - SET user_permissions = '' - $where_sql"; - $db->sql_query($sql); - - return; - } - - // @todo replace this with a new system - // Authentication plug-ins is largely down to Sergey Kanareykin, our thanks to him. - function login($username, $password, $autologin = false, $viewonline = 1, $admin = 0) - { - global $config, $db, $user, $phpbb_root_path, $phpEx; - - $method = trim($config['auth_method']); - - if (file_exists($phpbb_root_path . 'includes/auth/auth_' . $method . '.' . $phpEx)) - { - include_once($phpbb_root_path . 'includes/auth/auth_' . $method . '.' . $phpEx); - - $method = 'login_' . $method; - if (function_exists($method)) - { - $login = $method($username, $password); - - // If login returned anything other than an array there was an error - if (!is_array($login)) - { - // TODO: Login Attempt++ - return $login; - } - - return $user->session_create($login['user_id'], $admin, $autologin, $viewonline); - } - } - - trigger_error('Authentication method not found', E_USER_ERROR); - } -} - -?> +?>
\ No newline at end of file diff --git a/phpBB/includes/ucp/ucp_main.php b/phpBB/includes/ucp/ucp_main.php index 2ade45c779..8bc98adb3d 100644 --- a/phpBB/includes/ucp/ucp_main.php +++ b/phpBB/includes/ucp/ucp_main.php @@ -53,23 +53,15 @@ class ucp_main $folder = 'folder_announce'; $folder_new = $folder . '_new'; - // Determine first forum the user is able to read into - for global announcement link - $forum_ary = $auth->acl_getf('f_read'); - $g_forum_id = 0; - - foreach ($forum_ary as $forum_id => $allowed) - { - if (!$allowed['f_read']) - { - unset($forum_ary[$forum_id]); - } - } + // Get cleaned up list... return only those forums not having the f_read permission + $forum_ary = $auth->acl_getf('!f_read', true); $forum_ary = array_unique(array_keys($forum_ary)); + // Determine first forum the user is able to read into - for global announcement link $sql = 'SELECT forum_id FROM ' . FORUMS_TABLE . ' WHERE forum_type = ' . FORUM_POST . ' - AND forum_id IN (' . implode(', ', $forum_ary) . ')'; + AND forum_id NOT IN (' . implode(', ', $forum_ary) . ')'; $result = $db->sql_query_limit($sql, 1); $g_forum_id = (int) $db->sql_fetchfield('forum_id', 0, $result); $db->sql_freeresult($result); @@ -140,19 +132,20 @@ class ucp_main ); } - $post_count_ary = $auth->acl_getf('f_postcount'); + $post_count_ary = $auth->acl_getf('!f_postcount'); + $forum_read_ary = $auth->acl_getf('!f_read'); $forum_ary = array(); foreach ($post_count_ary as $forum_id => $allowed) { - if ($allowed['f_read'] && $allowed['f_postcount']) + if ($allowed['f_postcount'] || $forum_read_ary[$forum_id]['f_read']) { $forum_ary[] = $forum_id; } } - $post_count_sql = (sizeof($forum_ary)) ? 'AND f.forum_id IN (' . implode(', ', $forum_ary) . ')' : ''; - unset($forum_ary, $post_count_ary); + $post_count_sql = (sizeof($forum_ary)) ? 'AND f.forum_id NOT IN (' . implode(', ', $forum_ary) . ')' : ''; + unset($forum_ary, $post_count_ary, $forum_read_ary); if ($post_count_sql) { diff --git a/phpBB/memberlist.php b/phpBB/memberlist.php index 24d3c8fc49..825819d3e4 100644 --- a/phpBB/memberlist.php +++ b/phpBB/memberlist.php @@ -320,6 +320,10 @@ switch ($mode) $member['session_viewonline'] = (isset($row['session_viewonline'])) ? $row['session_viewonline'] : 0; unset($row); + /** + * @todo check for f_read and check the reasoning why $auth2 is not used for determining the active topics + */ + // Obtain list of forums where this users post count is incremented $auth2 = new auth(); $auth2->acl($member); |