mirror of
				https://github.com/phpbb/phpbb.git
				synced 2025-10-26 13:16:14 +01:00 
			
		
		
		
	* github-phpbb/develop: (586 commits) [ticket/11735] Display disabled checkbox in subsilver for read notifications [ticket/11735] Display disabled checkbox when notification is already read [ticket/11844] update acp/authentication language var [ticket/11795] Remove PM popup [ticket/11795] Remove outdated comment from forum_fn.js [ticket/11795] Move find user JS to forum_fn [ticket/11795] Replace TWIG with phpBB syntax in ACP [ticket/11795] Move MSN scripts to forum_fn.js [ticket/11795] Use phpBB template syntax instead of TWIG [ticket/11795] Move PM popup JS to forum_fn.js [ticket/11795] Get rid of pagination JS variables [ticket/11795] Get rid of onload_functions [ticket/11795] Use data-reset-on-edit attr to reset elements [ticket/11795] Redo form elements auto-focus [ticket/11811] Remove outline on :focus [ticket/11836] Fix subsilver fatal error [ticket/11837] Replace escaped single quote with utf-8 single quote [ticket/11836] Fix fatal error on unsupported provider for auth link [ticket/11837] Translate UCP_AUTH_LINK_NOT_SUPPORTED [ticket/11809] Ensure code.js is first script included after jQuery ... Conflicts: phpBB/config/services.yml phpBB/develop/create_schema_files.php phpBB/develop/mysql_upgrader.php phpBB/download/file.php phpBB/includes/bbcode.php phpBB/includes/functions_container.php phpBB/install/database_update.php phpBB/install/index.php phpBB/phpbb/controller/helper.php phpBB/phpbb/controller/resolver.php phpBB/phpbb/request/request_interface.php phpBB/phpbb/session.php phpBB/phpbb/style/extension_path_provider.php phpBB/phpbb/style/path_provider.php phpBB/phpbb/style/path_provider_interface.php phpBB/phpbb/style/resource_locator.php phpBB/phpbb/style/style.php phpBB/phpbb/template/locator.php phpBB/phpbb/template/template.php phpBB/phpbb/template/twig/node/includeasset.php phpBB/phpbb/template/twig/node/includecss.php phpBB/phpbb/template/twig/node/includejs.php phpBB/phpbb/template/twig/twig.php tests/controller/helper_url_test.php tests/di/create_container_test.php tests/extension/style_path_provider_test.php tests/notification/notification_test.php tests/session/continue_test.php tests/session/creation_test.php tests/template/template_events_test.php tests/template/template_test_case.php tests/template/template_test_case_with_tree.php tests/test_framework/phpbb_functional_test_case.php
		
			
				
	
	
		
			1312 lines
		
	
	
		
			39 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			1312 lines
		
	
	
		
			39 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
| *
 | |
| * @package acp
 | |
| * @copyright (c) 2005 phpBB Group
 | |
| * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
 | |
| *
 | |
| */
 | |
| 
 | |
| /**
 | |
| * @ignore
 | |
| */
 | |
| if (!defined('IN_PHPBB'))
 | |
| {
 | |
| 	exit;
 | |
| }
 | |
| 
 | |
| /**
 | |
| * @package acp
 | |
| */
 | |
| class acp_permissions
 | |
| {
 | |
| 	var $u_action;
 | |
| 	var $permission_dropdown;
 | |
| 	protected $permissions;
 | |
| 
 | |
| 	function main($id, $mode)
 | |
| 	{
 | |
| 		global $db, $user, $auth, $template, $cache, $phpbb_container;
 | |
| 		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
 | |
| 
 | |
| 		include_once($phpbb_root_path . 'includes/functions_user.' . $phpEx);
 | |
| 		include_once($phpbb_root_path . 'includes/acp/auth.' . $phpEx);
 | |
| 
 | |
| 		$this->permissions = $phpbb_container->get('acl.permissions');
 | |
| 
 | |
| 		$auth_admin = new auth_admin();
 | |
| 
 | |
| 		$user->add_lang('acp/permissions');
 | |
| 		add_permission_language();
 | |
| 
 | |
| 		$this->tpl_name = 'acp_permissions';
 | |
| 
 | |
| 		// Trace has other vars
 | |
| 		if ($mode == 'trace')
 | |
| 		{
 | |
| 			$user_id = request_var('u', 0);
 | |
| 			$forum_id = request_var('f', 0);
 | |
| 			$permission = request_var('auth', '');
 | |
| 
 | |
| 			$this->tpl_name = 'permission_trace';
 | |
| 
 | |
| 			if ($user_id && isset($auth_admin->acl_options['id'][$permission]) && $auth->acl_get('a_viewauth'))
 | |
| 			{
 | |
| 				$this->page_title = sprintf($user->lang['TRACE_PERMISSION'], $this->permissions->get_permission_lang($permission));
 | |
| 				$this->permission_trace($user_id, $forum_id, $permission);
 | |
| 				return;
 | |
| 			}
 | |
| 			trigger_error('NO_MODE', E_USER_ERROR);
 | |
| 		}
 | |
| 
 | |
| 		// Copy forum permissions
 | |
| 		if ($mode == 'setting_forum_copy')
 | |
| 		{
 | |
| 			$this->tpl_name = 'permission_forum_copy';
 | |
| 
 | |
| 			if ($auth->acl_get('a_fauth') && $auth->acl_get('a_authusers') && $auth->acl_get('a_authgroups') && $auth->acl_get('a_mauth'))
 | |
| 			{
 | |
| 				$this->page_title = 'ACP_FORUM_PERMISSIONS_COPY';
 | |
| 				$this->copy_forum_permissions();
 | |
| 				return;
 | |
| 			}
 | |
| 
 | |
| 			trigger_error('NO_MODE', E_USER_ERROR);
 | |
| 		}
 | |
| 
 | |
| 		// Set some vars
 | |
| 		$action = request_var('action', array('' => 0));
 | |
| 		$action = key($action);
 | |
| 		$action = (isset($_POST['psubmit'])) ? 'apply_permissions' : $action;
 | |
| 
 | |
| 		$all_forums = request_var('all_forums', 0);
 | |
| 		$subforum_id = request_var('subforum_id', 0);
 | |
| 		$forum_id = request_var('forum_id', array(0));
 | |
| 
 | |
| 		$username = request_var('username', array(''), true);
 | |
| 		$usernames = request_var('usernames', '', true);
 | |
| 		$user_id = request_var('user_id', array(0));
 | |
| 
 | |
| 		$group_id = request_var('group_id', array(0));
 | |
| 		$select_all_groups = request_var('select_all_groups', 0);
 | |
| 
 | |
| 		$form_name = 'acp_permissions';
 | |
| 		add_form_key($form_name);
 | |
| 
 | |
| 		// If select all groups is set, we pre-build the group id array (this option is used for other screens to link to the permission settings screen)
 | |
| 		if ($select_all_groups)
 | |
| 		{
 | |
| 			// Add default groups to selection
 | |
| 			$sql_and = (!$config['coppa_enable']) ? " AND group_name <> 'REGISTERED_COPPA'" : '';
 | |
| 
 | |
| 			$sql = 'SELECT group_id
 | |
| 				FROM ' . GROUPS_TABLE . '
 | |
| 				WHERE group_type = ' . GROUP_SPECIAL . "
 | |
| 				$sql_and";
 | |
| 			$result = $db->sql_query($sql);
 | |
| 
 | |
| 			while ($row = $db->sql_fetchrow($result))
 | |
| 			{
 | |
| 				$group_id[] = $row['group_id'];
 | |
| 			}
 | |
| 			$db->sql_freeresult($result);
 | |
| 		}
 | |
| 
 | |
| 		// Map usernames to ids and vice versa
 | |
| 		if ($usernames)
 | |
| 		{
 | |
| 			$username = explode("\n", $usernames);
 | |
| 		}
 | |
| 		unset($usernames);
 | |
| 
 | |
| 		if (sizeof($username) && !sizeof($user_id))
 | |
| 		{
 | |
| 			user_get_id_name($user_id, $username);
 | |
| 
 | |
| 			if (!sizeof($user_id))
 | |
| 			{
 | |
| 				trigger_error($user->lang['SELECTED_USER_NOT_EXIST'] . adm_back_link($this->u_action), E_USER_WARNING);
 | |
| 			}
 | |
| 		}
 | |
| 		unset($username);
 | |
| 
 | |
| 		// Build forum ids (of all forums are checked or subforum listing used)
 | |
| 		if ($all_forums)
 | |
| 		{
 | |
| 			$sql = 'SELECT forum_id
 | |
| 				FROM ' . FORUMS_TABLE . '
 | |
| 				ORDER BY left_id';
 | |
| 			$result = $db->sql_query($sql);
 | |
| 
 | |
| 			$forum_id = array();
 | |
| 			while ($row = $db->sql_fetchrow($result))
 | |
| 			{
 | |
| 				$forum_id[] = (int) $row['forum_id'];
 | |
| 			}
 | |
| 			$db->sql_freeresult($result);
 | |
| 		}
 | |
| 		else if ($subforum_id)
 | |
| 		{
 | |
| 			$forum_id = array();
 | |
| 			foreach (get_forum_branch($subforum_id, 'children') as $row)
 | |
| 			{
 | |
| 				$forum_id[] = (int) $row['forum_id'];
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// Define some common variables for every mode
 | |
| 		$error = array();
 | |
| 
 | |
| 		$permission_scope = (strpos($mode, '_global') !== false) ? 'global' : 'local';
 | |
| 
 | |
| 		// Showing introductionary page?
 | |
| 		if ($mode == 'intro')
 | |
| 		{
 | |
| 			$this->page_title = 'ACP_PERMISSIONS';
 | |
| 
 | |
| 			$template->assign_vars(array(
 | |
| 				'S_INTRO'		=> true)
 | |
| 			);
 | |
| 
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		switch ($mode)
 | |
| 		{
 | |
| 			case 'setting_user_global':
 | |
| 			case 'setting_group_global':
 | |
| 				$this->permission_dropdown = array('u_', 'm_', 'a_');
 | |
| 				$permission_victim = ($mode == 'setting_user_global') ? array('user') : array('group');
 | |
| 				$this->page_title = ($mode == 'setting_user_global') ? 'ACP_USERS_PERMISSIONS' : 'ACP_GROUPS_PERMISSIONS';
 | |
| 			break;
 | |
| 
 | |
| 			case 'setting_user_local':
 | |
| 			case 'setting_group_local':
 | |
| 				$this->permission_dropdown = array('f_', 'm_');
 | |
| 				$permission_victim = ($mode == 'setting_user_local') ? array('user', 'forums') : array('group', 'forums');
 | |
| 				$this->page_title = ($mode == 'setting_user_local') ? 'ACP_USERS_FORUM_PERMISSIONS' : 'ACP_GROUPS_FORUM_PERMISSIONS';
 | |
| 			break;
 | |
| 
 | |
| 			case 'setting_admin_global':
 | |
| 			case 'setting_mod_global':
 | |
| 				$this->permission_dropdown = (strpos($mode, '_admin_') !== false) ? array('a_') : array('m_');
 | |
| 				$permission_victim = array('usergroup');
 | |
| 				$this->page_title = ($mode == 'setting_admin_global') ? 'ACP_ADMINISTRATORS' : 'ACP_GLOBAL_MODERATORS';
 | |
| 			break;
 | |
| 
 | |
| 			case 'setting_mod_local':
 | |
| 			case 'setting_forum_local':
 | |
| 				$this->permission_dropdown = ($mode == 'setting_mod_local') ? array('m_') : array('f_');
 | |
| 				$permission_victim = array('forums', 'usergroup');
 | |
| 				$this->page_title = ($mode == 'setting_mod_local') ? 'ACP_FORUM_MODERATORS' : 'ACP_FORUM_PERMISSIONS';
 | |
| 			break;
 | |
| 
 | |
| 			case 'view_admin_global':
 | |
| 			case 'view_user_global':
 | |
| 			case 'view_mod_global':
 | |
| 				$this->permission_dropdown = ($mode == 'view_admin_global') ? array('a_') : (($mode == 'view_user_global') ? array('u_') : array('m_'));
 | |
| 				$permission_victim = array('usergroup_view');
 | |
| 				$this->page_title = ($mode == 'view_admin_global') ? 'ACP_VIEW_ADMIN_PERMISSIONS' : (($mode == 'view_user_global') ? 'ACP_VIEW_USER_PERMISSIONS' : 'ACP_VIEW_GLOBAL_MOD_PERMISSIONS');
 | |
| 			break;
 | |
| 
 | |
| 			case 'view_mod_local':
 | |
| 			case 'view_forum_local':
 | |
| 				$this->permission_dropdown = ($mode == 'view_mod_local') ? array('m_') : array('f_');
 | |
| 				$permission_victim = array('forums', 'usergroup_view');
 | |
| 				$this->page_title = ($mode == 'view_mod_local') ? 'ACP_VIEW_FORUM_MOD_PERMISSIONS' : 'ACP_VIEW_FORUM_PERMISSIONS';
 | |
| 			break;
 | |
| 
 | |
| 			default:
 | |
| 				trigger_error('NO_MODE', E_USER_ERROR);
 | |
| 			break;
 | |
| 		}
 | |
| 
 | |
| 		$template->assign_vars(array(
 | |
| 			'L_TITLE'		=> $user->lang[$this->page_title],
 | |
| 			'L_EXPLAIN'		=> $user->lang[$this->page_title . '_EXPLAIN'])
 | |
| 		);
 | |
| 
 | |
| 		// Get permission type
 | |
| 		$permission_type = request_var('type', $this->permission_dropdown[0]);
 | |
| 
 | |
| 		if (!in_array($permission_type, $this->permission_dropdown))
 | |
| 		{
 | |
| 			trigger_error($user->lang['WRONG_PERMISSION_TYPE'] . adm_back_link($this->u_action), E_USER_WARNING);
 | |
| 		}
 | |
| 
 | |
| 		// Handle actions
 | |
| 		if (strpos($mode, 'setting_') === 0 && $action)
 | |
| 		{
 | |
| 			switch ($action)
 | |
| 			{
 | |
| 				case 'delete':
 | |
| 					if (confirm_box(true))
 | |
| 					{
 | |
| 						// All users/groups selected?
 | |
| 						$all_users = (isset($_POST['all_users'])) ? true : false;
 | |
| 						$all_groups = (isset($_POST['all_groups'])) ? true : false;
 | |
| 
 | |
| 						if ($all_users || $all_groups)
 | |
| 						{
 | |
| 							$items = $this->retrieve_defined_user_groups($permission_scope, $forum_id, $permission_type);
 | |
| 
 | |
| 							if ($all_users && sizeof($items['user_ids']))
 | |
| 							{
 | |
| 								$user_id = $items['user_ids'];
 | |
| 							}
 | |
| 							else if ($all_groups && sizeof($items['group_ids']))
 | |
| 							{
 | |
| 								$group_id = $items['group_ids'];
 | |
| 							}
 | |
| 						}
 | |
| 
 | |
| 						if (sizeof($user_id) || sizeof($group_id))
 | |
| 						{
 | |
| 							$this->remove_permissions($mode, $permission_type, $auth_admin, $user_id, $group_id, $forum_id);
 | |
| 						}
 | |
| 						else
 | |
| 						{
 | |
| 							trigger_error($user->lang['NO_USER_GROUP_SELECTED'] . adm_back_link($this->u_action), E_USER_WARNING);
 | |
| 						}
 | |
| 					}
 | |
| 					else
 | |
| 					{
 | |
| 						if (isset($_POST['cancel']))
 | |
| 						{
 | |
| 							$u_redirect = $this->u_action . '&type=' . $permission_type;
 | |
| 							foreach ($forum_id as $fid)
 | |
| 							{
 | |
| 								$u_redirect .= '&forum_id[]=' . $fid;
 | |
| 							}
 | |
| 							redirect($u_redirect);
 | |
| 						}
 | |
| 
 | |
| 						$s_hidden_fields = array(
 | |
| 							'i'				=> $id,
 | |
| 							'mode'			=> $mode,
 | |
| 							'action'		=> array($action => 1),
 | |
| 							'user_id'		=> $user_id,
 | |
| 							'group_id'		=> $group_id,
 | |
| 							'forum_id'		=> $forum_id,
 | |
| 							'type'			=> $permission_type,
 | |
| 						);
 | |
| 						if (isset($_POST['all_users']))
 | |
| 						{
 | |
| 							$s_hidden_fields['all_users'] = 1;
 | |
| 						}
 | |
| 						if (isset($_POST['all_groups']))
 | |
| 						{
 | |
| 							$s_hidden_fields['all_groups'] = 1;
 | |
| 						}
 | |
| 						confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields($s_hidden_fields));
 | |
| 					}
 | |
| 				break;
 | |
| 
 | |
| 				case 'apply_permissions':
 | |
| 					if (!isset($_POST['setting']))
 | |
| 					{
 | |
| 						trigger_error($user->lang['NO_AUTH_SETTING_FOUND'] . adm_back_link($this->u_action), E_USER_WARNING);
 | |
| 					}
 | |
| 					if (!check_form_key($form_name))
 | |
| 					{
 | |
| 						trigger_error($user->lang['FORM_INVALID']. adm_back_link($this->u_action), E_USER_WARNING);
 | |
| 					}
 | |
| 
 | |
| 					$this->set_permissions($mode, $permission_type, $auth_admin, $user_id, $group_id);
 | |
| 				break;
 | |
| 
 | |
| 				case 'apply_all_permissions':
 | |
| 					if (!isset($_POST['setting']))
 | |
| 					{
 | |
| 						trigger_error($user->lang['NO_AUTH_SETTING_FOUND'] . adm_back_link($this->u_action), E_USER_WARNING);
 | |
| 					}
 | |
| 					if (!check_form_key($form_name))
 | |
| 					{
 | |
| 						trigger_error($user->lang['FORM_INVALID']. adm_back_link($this->u_action), E_USER_WARNING);
 | |
| 					}
 | |
| 
 | |
| 					$this->set_all_permissions($mode, $permission_type, $auth_admin, $user_id, $group_id);
 | |
| 				break;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 		// Setting permissions screen
 | |
| 		$s_hidden_fields = build_hidden_fields(array(
 | |
| 			'user_id'		=> $user_id,
 | |
| 			'group_id'		=> $group_id,
 | |
| 			'forum_id'		=> $forum_id,
 | |
| 			'type'			=> $permission_type)
 | |
| 		);
 | |
| 
 | |
| 		// Go through the screens/options needed and present them in correct order
 | |
| 		foreach ($permission_victim as $victim)
 | |
| 		{
 | |
| 			switch ($victim)
 | |
| 			{
 | |
| 				case 'forum_dropdown':
 | |
| 
 | |
| 					if (sizeof($forum_id))
 | |
| 					{
 | |
| 						$this->check_existence('forum', $forum_id);
 | |
| 						continue 2;
 | |
| 					}
 | |
| 
 | |
| 					$template->assign_vars(array(
 | |
| 						'S_SELECT_FORUM'		=> true,
 | |
| 						'S_FORUM_OPTIONS'		=> make_forum_select(false, false, true, false, false))
 | |
| 					);
 | |
| 
 | |
| 				break;
 | |
| 
 | |
| 				case 'forums':
 | |
| 
 | |
| 					if (sizeof($forum_id))
 | |
| 					{
 | |
| 						$this->check_existence('forum', $forum_id);
 | |
| 						continue 2;
 | |
| 					}
 | |
| 
 | |
| 					$forum_list = make_forum_select(false, false, true, false, false, false, true);
 | |
| 
 | |
| 					// Build forum options
 | |
| 					$s_forum_options = '';
 | |
| 					foreach ($forum_list as $f_id => $f_row)
 | |
| 					{
 | |
| 						$s_forum_options .= '<option value="' . $f_id . '"' . (($f_row['selected']) ? ' selected="selected"' : '') . (($f_row['disabled']) ? ' disabled="disabled" class="disabled-option"' : '') . '>' . $f_row['padding'] . $f_row['forum_name'] . '</option>';
 | |
| 					}
 | |
| 
 | |
| 					// Build subforum options
 | |
| 					$s_subforum_options = $this->build_subforum_options($forum_list);
 | |
| 
 | |
| 					$template->assign_vars(array(
 | |
| 						'S_SELECT_FORUM'		=> true,
 | |
| 						'S_FORUM_OPTIONS'		=> $s_forum_options,
 | |
| 						'S_SUBFORUM_OPTIONS'	=> $s_subforum_options,
 | |
| 						'S_FORUM_ALL'			=> true,
 | |
| 						'S_FORUM_MULTIPLE'		=> true)
 | |
| 					);
 | |
| 
 | |
| 				break;
 | |
| 
 | |
| 				case 'user':
 | |
| 
 | |
| 					if (sizeof($user_id))
 | |
| 					{
 | |
| 						$this->check_existence('user', $user_id);
 | |
| 						continue 2;
 | |
| 					}
 | |
| 
 | |
| 					$template->assign_vars(array(
 | |
| 						'S_SELECT_USER'			=> true,
 | |
| 						'U_FIND_USERNAME'		=> append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=searchuser&form=select_victim&field=username&select_single=true'),
 | |
| 					));
 | |
| 
 | |
| 				break;
 | |
| 
 | |
| 				case 'group':
 | |
| 
 | |
| 					if (sizeof($group_id))
 | |
| 					{
 | |
| 						$this->check_existence('group', $group_id);
 | |
| 						continue 2;
 | |
| 					}
 | |
| 
 | |
| 					$template->assign_vars(array(
 | |
| 						'S_SELECT_GROUP'		=> true,
 | |
| 						'S_GROUP_OPTIONS'		=> group_select_options(false, false, false), // Show all groups
 | |
| 					));
 | |
| 
 | |
| 				break;
 | |
| 
 | |
| 				case 'usergroup':
 | |
| 				case 'usergroup_view':
 | |
| 
 | |
| 					$all_users = (isset($_POST['all_users'])) ? true : false;
 | |
| 					$all_groups = (isset($_POST['all_groups'])) ? true : false;
 | |
| 
 | |
| 					if ((sizeof($user_id) && !$all_users) || (sizeof($group_id) && !$all_groups))
 | |
| 					{
 | |
| 						if (sizeof($user_id))
 | |
| 						{
 | |
| 							$this->check_existence('user', $user_id);
 | |
| 						}
 | |
| 
 | |
| 						if (sizeof($group_id))
 | |
| 						{
 | |
| 							$this->check_existence('group', $group_id);
 | |
| 						}
 | |
| 
 | |
| 						continue 2;
 | |
| 					}
 | |
| 
 | |
| 					// Now we check the users... because the "all"-selection is different here (all defined users/groups)
 | |
| 					$items = $this->retrieve_defined_user_groups($permission_scope, $forum_id, $permission_type);
 | |
| 
 | |
| 					if ($all_users && sizeof($items['user_ids']))
 | |
| 					{
 | |
| 						$user_id = $items['user_ids'];
 | |
| 						continue 2;
 | |
| 					}
 | |
| 
 | |
| 					if ($all_groups && sizeof($items['group_ids']))
 | |
| 					{
 | |
| 						$group_id = $items['group_ids'];
 | |
| 						continue 2;
 | |
| 					}
 | |
| 
 | |
| 					$template->assign_vars(array(
 | |
| 						'S_SELECT_USERGROUP'		=> ($victim == 'usergroup') ? true : false,
 | |
| 						'S_SELECT_USERGROUP_VIEW'	=> ($victim == 'usergroup_view') ? true : false,
 | |
| 						'S_DEFINED_USER_OPTIONS'	=> $items['user_ids_options'],
 | |
| 						'S_DEFINED_GROUP_OPTIONS'	=> $items['group_ids_options'],
 | |
| 						'S_ADD_GROUP_OPTIONS'		=> group_select_options(false, $items['group_ids'], false),	// Show all groups
 | |
| 						'U_FIND_USERNAME'			=> append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=searchuser&form=add_user&field=username&select_single=true'),
 | |
| 					));
 | |
| 
 | |
| 				break;
 | |
| 			}
 | |
| 
 | |
| 			// The S_ALLOW_SELECT parameter below is a measure to lower memory usage.
 | |
| 			// If there are more than 5 forums selected the admin is not able to select all users/groups too.
 | |
| 			// We need to see if the number of forums can be increased or need to be decreased.
 | |
| 
 | |
| 			$template->assign_vars(array(
 | |
| 				'U_ACTION'				=> $this->u_action,
 | |
| 				'ANONYMOUS_USER_ID'		=> ANONYMOUS,
 | |
| 
 | |
| 				'S_SELECT_VICTIM'		=> true,
 | |
| 				'S_ALLOW_ALL_SELECT'	=> (sizeof($forum_id) > 5) ? false : true,
 | |
| 				'S_CAN_SELECT_USER'		=> ($auth->acl_get('a_authusers')) ? true : false,
 | |
| 				'S_CAN_SELECT_GROUP'	=> ($auth->acl_get('a_authgroups')) ? true : false,
 | |
| 				'S_HIDDEN_FIELDS'		=> $s_hidden_fields)
 | |
| 			);
 | |
| 
 | |
| 			// Let the forum names being displayed
 | |
| 			if (sizeof($forum_id))
 | |
| 			{
 | |
| 				$sql = 'SELECT forum_name
 | |
| 					FROM ' . FORUMS_TABLE . '
 | |
| 					WHERE ' . $db->sql_in_set('forum_id', $forum_id) . '
 | |
| 					ORDER BY left_id ASC';
 | |
| 				$result = $db->sql_query($sql);
 | |
| 
 | |
| 				$forum_names = array();
 | |
| 				while ($row = $db->sql_fetchrow($result))
 | |
| 				{
 | |
| 					$forum_names[] = $row['forum_name'];
 | |
| 				}
 | |
| 				$db->sql_freeresult($result);
 | |
| 
 | |
| 				$template->assign_vars(array(
 | |
| 					'S_FORUM_NAMES'		=> (sizeof($forum_names)) ? true : false,
 | |
| 					'FORUM_NAMES'		=> implode($user->lang['COMMA_SEPARATOR'], $forum_names))
 | |
| 				);
 | |
| 			}
 | |
| 
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Do not allow forum_ids being set and no other setting defined (will bog down the server too much)
 | |
| 		if (sizeof($forum_id) && !sizeof($user_id) && !sizeof($group_id))
 | |
| 		{
 | |
| 			trigger_error($user->lang['ONLY_FORUM_DEFINED'] . adm_back_link($this->u_action), E_USER_WARNING);
 | |
| 		}
 | |
| 
 | |
| 		$template->assign_vars(array(
 | |
| 			'S_PERMISSION_DROPDOWN'		=> (sizeof($this->permission_dropdown) > 1) ? $this->build_permission_dropdown($this->permission_dropdown, $permission_type, $permission_scope) : false,
 | |
| 			'L_PERMISSION_TYPE'			=> $this->permissions->get_type_lang($permission_type),
 | |
| 
 | |
| 			'U_ACTION'					=> $this->u_action,
 | |
| 			'S_HIDDEN_FIELDS'			=> $s_hidden_fields)
 | |
| 		);
 | |
| 
 | |
| 		if (strpos($mode, 'setting_') === 0)
 | |
| 		{
 | |
| 			$template->assign_vars(array(
 | |
| 				'S_SETTING_PERMISSIONS'		=> true)
 | |
| 			);
 | |
| 
 | |
| 			$hold_ary = $auth_admin->get_mask('set', (sizeof($user_id)) ? $user_id : false, (sizeof($group_id)) ? $group_id : false, (sizeof($forum_id)) ? $forum_id : false, $permission_type, $permission_scope, ACL_NO);
 | |
| 			$auth_admin->display_mask('set', $permission_type, $hold_ary, ((sizeof($user_id)) ? 'user' : 'group'), (($permission_scope == 'local') ? true : false));
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			$template->assign_vars(array(
 | |
| 				'S_VIEWING_PERMISSIONS'		=> true)
 | |
| 			);
 | |
| 
 | |
| 			$hold_ary = $auth_admin->get_mask('view', (sizeof($user_id)) ? $user_id : false, (sizeof($group_id)) ? $group_id : false, (sizeof($forum_id)) ? $forum_id : false, $permission_type, $permission_scope, ACL_NEVER);
 | |
| 			$auth_admin->display_mask('view', $permission_type, $hold_ary, ((sizeof($user_id)) ? 'user' : 'group'), (($permission_scope == 'local') ? true : false));
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	* Build +subforum options
 | |
| 	*/
 | |
| 	function build_subforum_options($forum_list)
 | |
| 	{
 | |
| 		global $user;
 | |
| 
 | |
| 		$s_options = '';
 | |
| 
 | |
| 		$forum_list = array_merge($forum_list);
 | |
| 
 | |
| 		foreach ($forum_list as $key => $row)
 | |
| 		{
 | |
| 			if ($row['disabled'])
 | |
| 			{
 | |
| 				continue;
 | |
| 			}
 | |
| 
 | |
| 			$s_options .= '<option value="' . $row['forum_id'] . '"' . (($row['selected']) ? ' selected="selected"' : '') . '>' . $row['padding'] . $row['forum_name'];
 | |
| 
 | |
| 			// We check if a branch is there...
 | |
| 			$branch_there = false;
 | |
| 
 | |
| 			foreach (array_slice($forum_list, $key + 1) as $temp_row)
 | |
| 			{
 | |
| 				if ($temp_row['left_id'] > $row['left_id'] && $temp_row['left_id'] < $row['right_id'])
 | |
| 				{
 | |
| 					$branch_there = true;
 | |
| 					break;
 | |
| 				}
 | |
| 				continue;
 | |
| 			}
 | |
| 
 | |
| 			if ($branch_there)
 | |
| 			{
 | |
| 				$s_options .= ' [' . $user->lang['PLUS_SUBFORUMS'] . ']';
 | |
| 			}
 | |
| 
 | |
| 			$s_options .= '</option>';
 | |
| 		}
 | |
| 
 | |
| 		return $s_options;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	* Build dropdown field for changing permission types
 | |
| 	*/
 | |
| 	function build_permission_dropdown($options, $default_option, $permission_scope)
 | |
| 	{
 | |
| 		global $auth;
 | |
| 
 | |
| 		$s_dropdown_options = '';
 | |
| 		foreach ($options as $setting)
 | |
| 		{
 | |
| 			if (!$auth->acl_get('a_' . str_replace('_', '', $setting) . 'auth'))
 | |
| 			{
 | |
| 				continue;
 | |
| 			}
 | |
| 
 | |
| 			$selected = ($setting == $default_option) ? ' selected="selected"' : '';
 | |
| 			$l_setting = $this->permissions->get_type_lang($setting, $permission_scope);
 | |
| 			$s_dropdown_options .= '<option value="' . $setting . '"' . $selected . '>' . $l_setting . '</option>';
 | |
| 		}
 | |
| 
 | |
| 		return $s_dropdown_options;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	* Check if selected items exist. Remove not found ids and if empty return error.
 | |
| 	*/
 | |
| 	function check_existence($mode, &$ids)
 | |
| 	{
 | |
| 		global $db, $user;
 | |
| 
 | |
| 		switch ($mode)
 | |
| 		{
 | |
| 			case 'user':
 | |
| 				$table = USERS_TABLE;
 | |
| 				$sql_id = 'user_id';
 | |
| 			break;
 | |
| 
 | |
| 			case 'group':
 | |
| 				$table = GROUPS_TABLE;
 | |
| 				$sql_id = 'group_id';
 | |
| 			break;
 | |
| 
 | |
| 			case 'forum':
 | |
| 				$table = FORUMS_TABLE;
 | |
| 				$sql_id = 'forum_id';
 | |
| 			break;
 | |
| 		}
 | |
| 
 | |
| 		if (sizeof($ids))
 | |
| 		{
 | |
| 			$sql = "SELECT $sql_id
 | |
| 				FROM $table
 | |
| 				WHERE " . $db->sql_in_set($sql_id, $ids);
 | |
| 			$result = $db->sql_query($sql);
 | |
| 
 | |
| 			$ids = array();
 | |
| 			while ($row = $db->sql_fetchrow($result))
 | |
| 			{
 | |
| 				$ids[] = (int) $row[$sql_id];
 | |
| 			}
 | |
| 			$db->sql_freeresult($result);
 | |
| 		}
 | |
| 
 | |
| 		if (!sizeof($ids))
 | |
| 		{
 | |
| 			trigger_error($user->lang['SELECTED_' . strtoupper($mode) . '_NOT_EXIST'] . adm_back_link($this->u_action), E_USER_WARNING);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	* Apply permissions
 | |
| 	*/
 | |
| 	function set_permissions($mode, $permission_type, &$auth_admin, &$user_id, &$group_id)
 | |
| 	{
 | |
| 		global $db, $cache, $user, $auth;
 | |
| 		global $request;
 | |
| 
 | |
| 		$psubmit = request_var('psubmit', array(0 => array(0 => 0)));
 | |
| 
 | |
| 		// User or group to be set?
 | |
| 		$ug_type = (sizeof($user_id)) ? 'user' : 'group';
 | |
| 
 | |
| 		// Check the permission setting again
 | |
| 		if (!$auth->acl_get('a_' . str_replace('_', '', $permission_type) . 'auth') || !$auth->acl_get('a_auth' . $ug_type . 's'))
 | |
| 		{
 | |
| 			trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
 | |
| 		}
 | |
| 
 | |
| 		$ug_id = $forum_id = 0;
 | |
| 
 | |
| 		// We loop through the auth settings defined in our submit
 | |
| 		list($ug_id, ) = each($psubmit);
 | |
| 		list($forum_id, ) = each($psubmit[$ug_id]);
 | |
| 
 | |
| 		$settings = $request->variable('setting', array(0 => array(0 => array('' => 0))), false, \phpbb\request\request_interface::POST);
 | |
| 		if (empty($settings) || empty($settings[$ug_id]) || empty($settings[$ug_id][$forum_id]))
 | |
| 		{
 | |
| 			trigger_error('WRONG_PERMISSION_SETTING_FORMAT', E_USER_WARNING);
 | |
| 		}
 | |
| 
 | |
| 		$auth_settings = $settings[$ug_id][$forum_id];
 | |
| 
 | |
| 		// Do we have a role we want to set?
 | |
| 		$roles = $request->variable('role', array(0 => array(0 => 0)), false, \phpbb\request\request_interface::POST);
 | |
| 		$assigned_role = (isset($roles[$ug_id][$forum_id])) ? (int) $roles[$ug_id][$forum_id] : 0;
 | |
| 
 | |
| 		// Do the admin want to set these permissions to other items too?
 | |
| 		$inherit = request_var('inherit', array(0 => array(0)));
 | |
| 
 | |
| 		$ug_id = array($ug_id);
 | |
| 		$forum_id = array($forum_id);
 | |
| 
 | |
| 		if (sizeof($inherit))
 | |
| 		{
 | |
| 			foreach ($inherit as $_ug_id => $forum_id_ary)
 | |
| 			{
 | |
| 				// Inherit users/groups?
 | |
| 				if (!in_array($_ug_id, $ug_id))
 | |
| 				{
 | |
| 					$ug_id[] = $_ug_id;
 | |
| 				}
 | |
| 
 | |
| 				// Inherit forums?
 | |
| 				$forum_id = array_merge($forum_id, array_keys($forum_id_ary));
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		$forum_id = array_unique($forum_id);
 | |
| 
 | |
| 		// If the auth settings differ from the assigned role, then do not set a role...
 | |
| 		if ($assigned_role)
 | |
| 		{
 | |
| 			if (!$this->check_assigned_role($assigned_role, $auth_settings))
 | |
| 			{
 | |
| 				$assigned_role = 0;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// Update the permission set...
 | |
| 		$auth_admin->acl_set($ug_type, $forum_id, $ug_id, $auth_settings, $assigned_role);
 | |
| 
 | |
| 		// Do we need to recache the moderator lists?
 | |
| 		if ($permission_type == 'm_')
 | |
| 		{
 | |
| 			phpbb_cache_moderators($db, $cache, $auth);
 | |
| 		}
 | |
| 
 | |
| 		// Remove users who are now moderators or admins from everyones foes list
 | |
| 		if ($permission_type == 'm_' || $permission_type == 'a_')
 | |
| 		{
 | |
| 			phpbb_update_foes($db, $auth, $group_id, $user_id);
 | |
| 		}
 | |
| 
 | |
| 		$this->log_action($mode, 'add', $permission_type, $ug_type, $ug_id, $forum_id);
 | |
| 
 | |
| 		trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action));
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	* Apply all permissions
 | |
| 	*/
 | |
| 	function set_all_permissions($mode, $permission_type, &$auth_admin, &$user_id, &$group_id)
 | |
| 	{
 | |
| 		global $db, $cache, $user, $auth;
 | |
| 		global $request;
 | |
| 
 | |
| 		// User or group to be set?
 | |
| 		$ug_type = (sizeof($user_id)) ? 'user' : 'group';
 | |
| 
 | |
| 		// Check the permission setting again
 | |
| 		if (!$auth->acl_get('a_' . str_replace('_', '', $permission_type) . 'auth') || !$auth->acl_get('a_auth' . $ug_type . 's'))
 | |
| 		{
 | |
| 			trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
 | |
| 		}
 | |
| 
 | |
| 		$auth_settings = $request->variable('setting', array(0 => array(0 => array('' => 0))), false, \phpbb\request\request_interface::POST);
 | |
| 		$auth_roles = $request->variable('role', array(0 => array(0 => 0)), false, \phpbb\request\request_interface::POST);
 | |
| 		$ug_ids = $forum_ids = array();
 | |
| 
 | |
| 		// We need to go through the auth settings
 | |
| 		foreach ($auth_settings as $ug_id => $forum_auth_row)
 | |
| 		{
 | |
| 			$ug_id = (int) $ug_id;
 | |
| 			$ug_ids[] = $ug_id;
 | |
| 
 | |
| 			foreach ($forum_auth_row as $forum_id => $auth_options)
 | |
| 			{
 | |
| 				$forum_id = (int) $forum_id;
 | |
| 				$forum_ids[] = $forum_id;
 | |
| 
 | |
| 				// Check role...
 | |
| 				$assigned_role = (isset($auth_roles[$ug_id][$forum_id])) ? (int) $auth_roles[$ug_id][$forum_id] : 0;
 | |
| 
 | |
| 				// If the auth settings differ from the assigned role, then do not set a role...
 | |
| 				if ($assigned_role)
 | |
| 				{
 | |
| 					if (!$this->check_assigned_role($assigned_role, $auth_options))
 | |
| 					{
 | |
| 						$assigned_role = 0;
 | |
| 					}
 | |
| 				}
 | |
| 
 | |
| 				// Update the permission set...
 | |
| 				$auth_admin->acl_set($ug_type, $forum_id, $ug_id, $auth_options, $assigned_role, false);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		$auth_admin->acl_clear_prefetch();
 | |
| 
 | |
| 		// Do we need to recache the moderator lists?
 | |
| 		if ($permission_type == 'm_')
 | |
| 		{
 | |
| 			phpbb_cache_moderators($db, $cache, $auth);
 | |
| 		}
 | |
| 
 | |
| 		// Remove users who are now moderators or admins from everyones foes list
 | |
| 		if ($permission_type == 'm_' || $permission_type == 'a_')
 | |
| 		{
 | |
| 			phpbb_update_foes($db, $auth, $group_id, $user_id);
 | |
| 		}
 | |
| 
 | |
| 		$this->log_action($mode, 'add', $permission_type, $ug_type, $ug_ids, $forum_ids);
 | |
| 
 | |
| 		if ($mode == 'setting_forum_local' || $mode == 'setting_mod_local')
 | |
| 		{
 | |
| 			trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action . '&forum_id[]=' . implode('&forum_id[]=', $forum_ids)));
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action));
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	* Compare auth settings with auth settings from role
 | |
| 	* returns false if they differ, true if they are equal
 | |
| 	*/
 | |
| 	function check_assigned_role($role_id, &$auth_settings)
 | |
| 	{
 | |
| 		global $db;
 | |
| 
 | |
| 		$sql = 'SELECT o.auth_option, r.auth_setting
 | |
| 			FROM ' . ACL_OPTIONS_TABLE . ' o, ' . ACL_ROLES_DATA_TABLE . ' r
 | |
| 			WHERE o.auth_option_id = r.auth_option_id
 | |
| 				AND r.role_id = ' . $role_id;
 | |
| 		$result = $db->sql_query($sql);
 | |
| 
 | |
| 		$test_auth_settings = array();
 | |
| 		while ($row = $db->sql_fetchrow($result))
 | |
| 		{
 | |
| 			$test_auth_settings[$row['auth_option']] = $row['auth_setting'];
 | |
| 		}
 | |
| 		$db->sql_freeresult($result);
 | |
| 
 | |
| 		// We need to add any ACL_NO setting from auth_settings to compare correctly
 | |
| 		foreach ($auth_settings as $option => $setting)
 | |
| 		{
 | |
| 			if ($setting == ACL_NO)
 | |
| 			{
 | |
| 				$test_auth_settings[$option] = $setting;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		if (sizeof(array_diff_assoc($auth_settings, $test_auth_settings)))
 | |
| 		{
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		return true;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	* Remove permissions
 | |
| 	*/
 | |
| 	function remove_permissions($mode, $permission_type, &$auth_admin, &$user_id, &$group_id, &$forum_id)
 | |
| 	{
 | |
| 		global $user, $db, $cache, $auth;
 | |
| 
 | |
| 		// User or group to be set?
 | |
| 		$ug_type = (sizeof($user_id)) ? 'user' : 'group';
 | |
| 
 | |
| 		// Check the permission setting again
 | |
| 		if (!$auth->acl_get('a_' . str_replace('_', '', $permission_type) . 'auth') || !$auth->acl_get('a_auth' . $ug_type . 's'))
 | |
| 		{
 | |
| 			trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
 | |
| 		}
 | |
| 
 | |
| 		$auth_admin->acl_delete($ug_type, (($ug_type == 'user') ? $user_id : $group_id), (sizeof($forum_id) ? $forum_id : false), $permission_type);
 | |
| 
 | |
| 		// Do we need to recache the moderator lists?
 | |
| 		if ($permission_type == 'm_')
 | |
| 		{
 | |
| 			phpbb_cache_moderators($db, $cache, $auth);
 | |
| 		}
 | |
| 
 | |
| 		$this->log_action($mode, 'del', $permission_type, $ug_type, (($ug_type == 'user') ? $user_id : $group_id), (sizeof($forum_id) ? $forum_id : array(0 => 0)));
 | |
| 
 | |
| 		if ($mode == 'setting_forum_local' || $mode == 'setting_mod_local')
 | |
| 		{
 | |
| 			trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action . '&forum_id[]=' . implode('&forum_id[]=', $forum_id)));
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action));
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	* Log permission changes
 | |
| 	*/
 | |
| 	function log_action($mode, $action, $permission_type, $ug_type, $ug_id, $forum_id)
 | |
| 	{
 | |
| 		global $db, $user;
 | |
| 
 | |
| 		if (!is_array($ug_id))
 | |
| 		{
 | |
| 			$ug_id = array($ug_id);
 | |
| 		}
 | |
| 
 | |
| 		if (!is_array($forum_id))
 | |
| 		{
 | |
| 			$forum_id = array($forum_id);
 | |
| 		}
 | |
| 
 | |
| 		// Logging ... first grab user or groupnames ...
 | |
| 		$sql = ($ug_type == 'group') ? 'SELECT group_name as name, group_type FROM ' . GROUPS_TABLE . ' WHERE ' : 'SELECT username as name FROM ' . USERS_TABLE . ' WHERE ';
 | |
| 		$sql .= $db->sql_in_set(($ug_type == 'group') ? 'group_id' : 'user_id', array_map('intval', $ug_id));
 | |
| 		$result = $db->sql_query($sql);
 | |
| 
 | |
| 		$l_ug_list = '';
 | |
| 		while ($row = $db->sql_fetchrow($result))
 | |
| 		{
 | |
| 			$l_ug_list .= (($l_ug_list != '') ? ', ' : '') . ((isset($row['group_type']) && $row['group_type'] == GROUP_SPECIAL) ? '<span class="sep">' . $user->lang['G_' . $row['name']] . '</span>' : $row['name']);
 | |
| 		}
 | |
| 		$db->sql_freeresult($result);
 | |
| 
 | |
| 		$mode = str_replace('setting_', '', $mode);
 | |
| 
 | |
| 		if ($forum_id[0] == 0)
 | |
| 		{
 | |
| 			add_log('admin', 'LOG_ACL_' . strtoupper($action) . '_' . strtoupper($mode) . '_' . strtoupper($permission_type), $l_ug_list);
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			// Grab the forum details if non-zero forum_id
 | |
| 			$sql = 'SELECT forum_name
 | |
| 				FROM ' . FORUMS_TABLE . '
 | |
| 				WHERE ' . $db->sql_in_set('forum_id', $forum_id);
 | |
| 			$result = $db->sql_query($sql);
 | |
| 
 | |
| 			$l_forum_list = '';
 | |
| 			while ($row = $db->sql_fetchrow($result))
 | |
| 			{
 | |
| 				$l_forum_list .= (($l_forum_list != '') ? ', ' : '') . $row['forum_name'];
 | |
| 			}
 | |
| 			$db->sql_freeresult($result);
 | |
| 
 | |
| 			add_log('admin', 'LOG_ACL_' . strtoupper($action) . '_' . strtoupper($mode) . '_' . strtoupper($permission_type), $l_forum_list, $l_ug_list);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	* Display a complete trace tree for the selected permission to determine where settings are set/unset
 | |
| 	*/
 | |
| 	function permission_trace($user_id, $forum_id, $permission)
 | |
| 	{
 | |
| 		global $db, $template, $user, $auth;
 | |
| 
 | |
| 		if ($user_id != $user->data['user_id'])
 | |
| 		{
 | |
| 			$userdata = $auth->obtain_user_data($user_id);
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			$userdata = $user->data;
 | |
| 		}
 | |
| 
 | |
| 		if (!$userdata)
 | |
| 		{
 | |
| 			trigger_error('NO_USERS', E_USER_ERROR);
 | |
| 		}
 | |
| 
 | |
| 		$forum_name = false;
 | |
| 
 | |
| 		if ($forum_id)
 | |
| 		{
 | |
| 			$sql = 'SELECT forum_name
 | |
| 				FROM ' . FORUMS_TABLE . "
 | |
| 				WHERE forum_id = $forum_id";
 | |
| 			$result = $db->sql_query($sql, 3600);
 | |
| 			$forum_name = $db->sql_fetchfield('forum_name');
 | |
| 			$db->sql_freeresult($result);
 | |
| 		}
 | |
| 
 | |
| 		$back = request_var('back', 0);
 | |
| 
 | |
| 		$template->assign_vars(array(
 | |
| 			'PERMISSION'			=> $this->permissions->get_permission_lang($permission),
 | |
| 			'PERMISSION_USERNAME'	=> $userdata['username'],
 | |
| 			'FORUM_NAME'			=> $forum_name,
 | |
| 
 | |
| 			'S_GLOBAL_TRACE'		=> ($forum_id) ? false : true,
 | |
| 
 | |
| 			'U_BACK'				=> ($back) ? build_url(array('f', 'back')) . "&f=$back" : '')
 | |
| 		);
 | |
| 
 | |
| 		$template->assign_block_vars('trace', array(
 | |
| 			'WHO'			=> $user->lang['DEFAULT'],
 | |
| 			'INFORMATION'	=> $user->lang['TRACE_DEFAULT'],
 | |
| 
 | |
| 			'S_SETTING_NO'		=> true,
 | |
| 			'S_TOTAL_NO'		=> true)
 | |
| 		);
 | |
| 
 | |
| 		$sql = 'SELECT DISTINCT g.group_name, g.group_id, g.group_type
 | |
| 			FROM ' . GROUPS_TABLE . ' g
 | |
| 				LEFT JOIN ' . USER_GROUP_TABLE . ' ug ON (ug.group_id = g.group_id)
 | |
| 			WHERE ug.user_id = ' . $user_id . '
 | |
| 				AND ug.user_pending = 0
 | |
| 				AND NOT (ug.group_leader = 1 AND g.group_skip_auth = 1)
 | |
| 			ORDER BY g.group_type DESC, g.group_id DESC';
 | |
| 		$result = $db->sql_query($sql);
 | |
| 
 | |
| 		$groups = array();
 | |
| 		while ($row = $db->sql_fetchrow($result))
 | |
| 		{
 | |
| 			$groups[$row['group_id']] = array(
 | |
| 				'auth_setting'		=> ACL_NO,
 | |
| 				'group_name'		=> ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']
 | |
| 			);
 | |
| 		}
 | |
| 		$db->sql_freeresult($result);
 | |
| 
 | |
| 		$total = ACL_NO;
 | |
| 		$add_key = (($forum_id) ? '_LOCAL' : '');
 | |
| 
 | |
| 		if (sizeof($groups))
 | |
| 		{
 | |
| 			// Get group auth settings
 | |
| 			$hold_ary = $auth->acl_group_raw_data(array_keys($groups), $permission, $forum_id);
 | |
| 
 | |
| 			foreach ($hold_ary as $group_id => $forum_ary)
 | |
| 			{
 | |
| 				$groups[$group_id]['auth_setting'] = $hold_ary[$group_id][$forum_id][$permission];
 | |
| 			}
 | |
| 			unset($hold_ary);
 | |
| 
 | |
| 			foreach ($groups as $id => $row)
 | |
| 			{
 | |
| 				switch ($row['auth_setting'])
 | |
| 				{
 | |
| 					case ACL_NO:
 | |
| 						$information = $user->lang['TRACE_GROUP_NO' . $add_key];
 | |
| 					break;
 | |
| 
 | |
| 					case ACL_YES:
 | |
| 						$information = ($total == ACL_YES) ? $user->lang['TRACE_GROUP_YES_TOTAL_YES' . $add_key] : (($total == ACL_NEVER) ? $user->lang['TRACE_GROUP_YES_TOTAL_NEVER' . $add_key] : $user->lang['TRACE_GROUP_YES_TOTAL_NO' . $add_key]);
 | |
| 						$total = ($total == ACL_NO) ? ACL_YES : $total;
 | |
| 					break;
 | |
| 
 | |
| 					case ACL_NEVER:
 | |
| 						$information = ($total == ACL_YES) ? $user->lang['TRACE_GROUP_NEVER_TOTAL_YES' . $add_key] : (($total == ACL_NEVER) ? $user->lang['TRACE_GROUP_NEVER_TOTAL_NEVER' . $add_key] : $user->lang['TRACE_GROUP_NEVER_TOTAL_NO' . $add_key]);
 | |
| 						$total = ACL_NEVER;
 | |
| 					break;
 | |
| 				}
 | |
| 
 | |
| 				$template->assign_block_vars('trace', array(
 | |
| 					'WHO'			=> $row['group_name'],
 | |
| 					'INFORMATION'	=> $information,
 | |
| 
 | |
| 					'S_SETTING_NO'		=> ($row['auth_setting'] == ACL_NO) ? true : false,
 | |
| 					'S_SETTING_YES'		=> ($row['auth_setting'] == ACL_YES) ? true : false,
 | |
| 					'S_SETTING_NEVER'	=> ($row['auth_setting'] == ACL_NEVER) ? true : false,
 | |
| 					'S_TOTAL_NO'		=> ($total == ACL_NO) ? true : false,
 | |
| 					'S_TOTAL_YES'		=> ($total == ACL_YES) ? true : false,
 | |
| 					'S_TOTAL_NEVER'		=> ($total == ACL_NEVER) ? true : false)
 | |
| 				);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// Get user specific permission... globally or for this forum
 | |
| 		$hold_ary = $auth->acl_user_raw_data($user_id, $permission, $forum_id);
 | |
| 		$auth_setting = (!sizeof($hold_ary)) ? ACL_NO : $hold_ary[$user_id][$forum_id][$permission];
 | |
| 
 | |
| 		switch ($auth_setting)
 | |
| 		{
 | |
| 			case ACL_NO:
 | |
| 				$information = ($total == ACL_NO) ? $user->lang['TRACE_USER_NO_TOTAL_NO' . $add_key] : $user->lang['TRACE_USER_KEPT' . $add_key];
 | |
| 				$total = ($total == ACL_NO) ? ACL_NEVER : $total;
 | |
| 			break;
 | |
| 
 | |
| 			case ACL_YES:
 | |
| 				$information = ($total == ACL_YES) ? $user->lang['TRACE_USER_YES_TOTAL_YES' . $add_key] : (($total == ACL_NEVER) ? $user->lang['TRACE_USER_YES_TOTAL_NEVER' . $add_key] : $user->lang['TRACE_USER_YES_TOTAL_NO' . $add_key]);
 | |
| 				$total = ($total == ACL_NO) ? ACL_YES : $total;
 | |
| 			break;
 | |
| 
 | |
| 			case ACL_NEVER:
 | |
| 				$information = ($total == ACL_YES) ? $user->lang['TRACE_USER_NEVER_TOTAL_YES' . $add_key] : (($total == ACL_NEVER) ? $user->lang['TRACE_USER_NEVER_TOTAL_NEVER' . $add_key] : $user->lang['TRACE_USER_NEVER_TOTAL_NO' . $add_key]);
 | |
| 				$total = ACL_NEVER;
 | |
| 			break;
 | |
| 		}
 | |
| 
 | |
| 		$template->assign_block_vars('trace', array(
 | |
| 			'WHO'			=> $userdata['username'],
 | |
| 			'INFORMATION'	=> $information,
 | |
| 
 | |
| 			'S_SETTING_NO'		=> ($auth_setting == ACL_NO) ? true : false,
 | |
| 			'S_SETTING_YES'		=> ($auth_setting == ACL_YES) ? true : false,
 | |
| 			'S_SETTING_NEVER'	=> ($auth_setting == ACL_NEVER) ? true : false,
 | |
| 			'S_TOTAL_NO'		=> false,
 | |
| 			'S_TOTAL_YES'		=> ($total == ACL_YES) ? true : false,
 | |
| 			'S_TOTAL_NEVER'		=> ($total == ACL_NEVER) ? true : false)
 | |
| 		);
 | |
| 
 | |
| 		if ($forum_id != 0 && isset($auth->acl_options['global'][$permission]))
 | |
| 		{
 | |
| 			if ($user_id != $user->data['user_id'])
 | |
| 			{
 | |
| 				$auth2 = new \phpbb\auth\auth();
 | |
| 				$auth2->acl($userdata);
 | |
| 				$auth_setting = $auth2->acl_get($permission);
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				$auth_setting = $auth->acl_get($permission);
 | |
| 			}
 | |
| 
 | |
| 			if ($auth_setting)
 | |
| 			{
 | |
| 				$information = ($total == ACL_YES) ? $user->lang['TRACE_USER_GLOBAL_YES_TOTAL_YES'] : $user->lang['TRACE_USER_GLOBAL_YES_TOTAL_NEVER'];
 | |
| 				$total = ACL_YES;
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				$information = $user->lang['TRACE_USER_GLOBAL_NEVER_TOTAL_KEPT'];
 | |
| 			}
 | |
| 
 | |
| 			// If there is no auth information we do not need to worry the user by showing non-relevant data.
 | |
| 			if ($auth_setting)
 | |
| 			{
 | |
| 				$template->assign_block_vars('trace', array(
 | |
| 					'WHO'			=> sprintf($user->lang['TRACE_GLOBAL_SETTING'], $userdata['username']),
 | |
| 					'INFORMATION'	=> sprintf($information, '<a href="' . $this->u_action . "&u=$user_id&f=0&auth=$permission&back=$forum_id\">", '</a>'),
 | |
| 
 | |
| 					'S_SETTING_NO'		=> false,
 | |
| 					'S_SETTING_YES'		=> $auth_setting,
 | |
| 					'S_SETTING_NEVER'	=> !$auth_setting,
 | |
| 					'S_TOTAL_NO'		=> false,
 | |
| 					'S_TOTAL_YES'		=> ($total == ACL_YES) ? true : false,
 | |
| 					'S_TOTAL_NEVER'		=> ($total == ACL_NEVER) ? true : false)
 | |
| 				);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// Take founder status into account, overwriting the default values
 | |
| 		if ($userdata['user_type'] == USER_FOUNDER && strpos($permission, 'a_') === 0)
 | |
| 		{
 | |
| 			$template->assign_block_vars('trace', array(
 | |
| 				'WHO'			=> $userdata['username'],
 | |
| 				'INFORMATION'	=> $user->lang['TRACE_USER_FOUNDER'],
 | |
| 
 | |
| 				'S_SETTING_NO'		=> ($auth_setting == ACL_NO) ? true : false,
 | |
| 				'S_SETTING_YES'		=> ($auth_setting == ACL_YES) ? true : false,
 | |
| 				'S_SETTING_NEVER'	=> ($auth_setting == ACL_NEVER) ? true : false,
 | |
| 				'S_TOTAL_NO'		=> false,
 | |
| 				'S_TOTAL_YES'		=> true,
 | |
| 				'S_TOTAL_NEVER'		=> false)
 | |
| 			);
 | |
| 
 | |
| 			$total = ACL_YES;
 | |
| 		}
 | |
| 
 | |
| 		// Total value...
 | |
| 		$template->assign_vars(array(
 | |
| 			'S_RESULT_NO'		=> ($total == ACL_NO) ? true : false,
 | |
| 			'S_RESULT_YES'		=> ($total == ACL_YES) ? true : false,
 | |
| 			'S_RESULT_NEVER'	=> ($total == ACL_NEVER) ? true : false,
 | |
| 		));
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	* Handles copying permissions from one forum to others
 | |
| 	*/
 | |
| 	function copy_forum_permissions()
 | |
| 	{
 | |
| 		global $db, $auth, $cache, $template, $user;
 | |
| 
 | |
| 		$user->add_lang('acp/forums');
 | |
| 
 | |
| 		$submit = isset($_POST['submit']) ? true : false;
 | |
| 
 | |
| 		if ($submit)
 | |
| 		{
 | |
| 			$src = request_var('src_forum_id', 0);
 | |
| 			$dest = request_var('dest_forum_ids', array(0));
 | |
| 
 | |
| 			if (confirm_box(true))
 | |
| 			{
 | |
| 				if (copy_forum_permissions($src, $dest))
 | |
| 				{
 | |
| 					phpbb_cache_moderators($db, $cache, $auth);
 | |
| 
 | |
| 					$auth->acl_clear_prefetch();
 | |
| 					$cache->destroy('sql', FORUMS_TABLE);
 | |
| 
 | |
| 					trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action));
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					trigger_error($user->lang['SELECTED_FORUM_NOT_EXIST'] . adm_back_link($this->u_action), E_USER_WARNING);
 | |
| 				}
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				$s_hidden_fields = array(
 | |
| 					'submit'			=> $submit,
 | |
| 					'src_forum_id'		=> $src,
 | |
| 					'dest_forum_ids'	=> $dest,
 | |
| 				);
 | |
| 
 | |
| 				$s_hidden_fields = build_hidden_fields($s_hidden_fields);
 | |
| 
 | |
| 				confirm_box(false, $user->lang['COPY_PERMISSIONS_CONFIRM'], $s_hidden_fields);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		$template->assign_vars(array(
 | |
| 			'S_FORUM_OPTIONS' => make_forum_select(false, false, false, false, false),
 | |
| 		));
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	* Get already assigned users/groups
 | |
| 	*/
 | |
| 	function retrieve_defined_user_groups($permission_scope, $forum_id, $permission_type)
 | |
| 	{
 | |
| 		global $db, $user;
 | |
| 
 | |
| 		$sql_forum_id = ($permission_scope == 'global') ? 'AND a.forum_id = 0' : ((sizeof($forum_id)) ? 'AND ' . $db->sql_in_set('a.forum_id', $forum_id) : 'AND a.forum_id <> 0');
 | |
| 
 | |
| 		// Permission options are only able to be a permission set... therefore we will pre-fetch the possible options and also the possible roles
 | |
| 		$option_ids = $role_ids = array();
 | |
| 
 | |
| 		$sql = 'SELECT auth_option_id
 | |
| 			FROM ' . ACL_OPTIONS_TABLE . '
 | |
| 			WHERE auth_option ' . $db->sql_like_expression($permission_type . $db->any_char);
 | |
| 		$result = $db->sql_query($sql);
 | |
| 
 | |
| 		while ($row = $db->sql_fetchrow($result))
 | |
| 		{
 | |
| 			$option_ids[] = (int) $row['auth_option_id'];
 | |
| 		}
 | |
| 		$db->sql_freeresult($result);
 | |
| 
 | |
| 		if (sizeof($option_ids))
 | |
| 		{
 | |
| 			$sql = 'SELECT DISTINCT role_id
 | |
| 				FROM ' . ACL_ROLES_DATA_TABLE . '
 | |
| 				WHERE ' . $db->sql_in_set('auth_option_id', $option_ids);
 | |
| 			$result = $db->sql_query($sql);
 | |
| 
 | |
| 			while ($row = $db->sql_fetchrow($result))
 | |
| 			{
 | |
| 				$role_ids[] = (int) $row['role_id'];
 | |
| 			}
 | |
| 			$db->sql_freeresult($result);
 | |
| 		}
 | |
| 
 | |
| 		if (sizeof($option_ids) && sizeof($role_ids))
 | |
| 		{
 | |
| 			$sql_where = 'AND (' . $db->sql_in_set('a.auth_option_id', $option_ids) . ' OR ' . $db->sql_in_set('a.auth_role_id', $role_ids) . ')';
 | |
| 		}
 | |
| 		else if (sizeof($role_ids))
 | |
| 		{
 | |
| 			$sql_where = 'AND ' . $db->sql_in_set('a.auth_role_id', $role_ids);
 | |
| 		}
 | |
| 		else if (sizeof($option_ids))
 | |
| 		{
 | |
| 			$sql_where = 'AND ' . $db->sql_in_set('a.auth_option_id', $option_ids);
 | |
| 		}
 | |
| 
 | |
| 		// Not ideal, due to the filesort, non-use of indexes, etc.
 | |
| 		$sql = 'SELECT DISTINCT u.user_id, u.username, u.username_clean, u.user_regdate
 | |
| 			FROM ' . USERS_TABLE . ' u, ' . ACL_USERS_TABLE . " a
 | |
| 			WHERE u.user_id = a.user_id
 | |
| 				$sql_forum_id
 | |
| 				$sql_where
 | |
| 			ORDER BY u.username_clean, u.user_regdate ASC";
 | |
| 		$result = $db->sql_query($sql);
 | |
| 
 | |
| 		$s_defined_user_options = '';
 | |
| 		$defined_user_ids = array();
 | |
| 		while ($row = $db->sql_fetchrow($result))
 | |
| 		{
 | |
| 			$s_defined_user_options .= '<option value="' . $row['user_id'] . '">' . $row['username'] . '</option>';
 | |
| 			$defined_user_ids[] = $row['user_id'];
 | |
| 		}
 | |
| 		$db->sql_freeresult($result);
 | |
| 
 | |
| 		$sql = 'SELECT DISTINCT g.group_type, g.group_name, g.group_id
 | |
| 			FROM ' . GROUPS_TABLE . ' g, ' . ACL_GROUPS_TABLE . " a
 | |
| 			WHERE g.group_id = a.group_id
 | |
| 				$sql_forum_id
 | |
| 				$sql_where
 | |
| 			ORDER BY g.group_type DESC, g.group_name ASC";
 | |
| 		$result = $db->sql_query($sql);
 | |
| 
 | |
| 		$s_defined_group_options = '';
 | |
| 		$defined_group_ids = array();
 | |
| 		while ($row = $db->sql_fetchrow($result))
 | |
| 		{
 | |
| 			$s_defined_group_options .= '<option' . (($row['group_type'] == GROUP_SPECIAL) ? ' class="sep"' : '') . ' value="' . $row['group_id'] . '">' . (($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']) . '</option>';
 | |
| 			$defined_group_ids[] = $row['group_id'];
 | |
| 		}
 | |
| 		$db->sql_freeresult($result);
 | |
| 
 | |
| 		return array(
 | |
| 			'group_ids'			=> $defined_group_ids,
 | |
| 			'group_ids_options'	=> $s_defined_group_options,
 | |
| 			'user_ids'			=> $defined_user_ids,
 | |
| 			'user_ids_options'	=> $s_defined_user_options
 | |
| 		);
 | |
| 	}
 | |
| }
 |