diff options
Diffstat (limited to 'phpBB/includes/acp')
63 files changed, 1584 insertions, 4088 deletions
| diff --git a/phpBB/includes/acp/acp_attachments.php b/phpBB/includes/acp/acp_attachments.php index fc5f44e14f..abe304c282 100644 --- a/phpBB/includes/acp/acp_attachments.php +++ b/phpBB/includes/acp/acp_attachments.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -61,6 +60,10 @@ class acp_attachments  				$l_title = 'ACP_ORPHAN_ATTACHMENTS';  			break; +			case 'manage': +				$l_title = 'ACP_MANAGE_ATTACHMENTS'; +			break; +  			default:  				trigger_error('NO_MODE', E_USER_ERROR);  			break; @@ -1043,6 +1046,229 @@ class acp_attachments  				$db->sql_freeresult($result);  			break; + +			case 'manage': + +				if ($submit) +				{ +					$delete_files = (isset($_POST['delete'])) ? array_keys(request_var('delete', array('' => 0))) : array(); + +					if (sizeof($delete_files)) +					{ +						// Select those attachments we want to delete... +						$sql = 'SELECT real_filename +							FROM ' . ATTACHMENTS_TABLE . ' +							WHERE ' . $db->sql_in_set('attach_id', $delete_files) . ' +								AND is_orphan = 0'; +						$result = $db->sql_query($sql); +						while ($row = $db->sql_fetchrow($result)) +						{ +							$deleted_filenames[] = $row['real_filename']; +						} +						$db->sql_freeresult($result); + +						if ($num_deleted = delete_attachments('attach', $delete_files)) +						{ +							if (sizeof($delete_files) != $num_deleted) +							{ +								$error[] = $user->lang['FILES_GONE']; +							} +							add_log('admin', 'LOG_ATTACHMENTS_DELETED', implode(', ', $deleted_filenames)); +							$notify[] = sprintf($user->lang['LOG_ATTACHMENTS_DELETED'], implode(', ', $deleted_filenames)); +						} +						else +						{ +							$error[] = $user->lang['NO_FILES_TO_DELETE']; +						} +					} +				} + +				$template->assign_vars(array( +					'S_MANAGE'		=> true) +				); + +				$start		= request_var('start', 0); + +				// Sort keys +				$sort_days	= request_var('st', 0); +				$sort_key	= request_var('sk', 't'); +				$sort_dir	= request_var('sd', 'd'); + +				// Sorting +				$limit_days = array(0 => $user->lang['ALL_ENTRIES'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']); +				$sort_by_text = array('f' => $user->lang['FILENAME'], 't' => $user->lang['FILEDATE'], 's' => $user->lang['FILESIZE'], 'x' => $user->lang['EXTENSION'], 'd' => $user->lang['DOWNLOADS'],'p' => $user->lang['ATTACH_POST_TYPE'], 'u' => $user->lang['AUTHOR']); +				$sort_by_sql = array('f' => 'a.real_filename', 't' => 'a.filetime', 's' => 'a.filesize', 'x' => 'a.extension', 'd' => 'a.download_count', 'p' => 'a.in_message', 'u' => 'u.username'); + +				$s_limit_days = $s_sort_key = $s_sort_dir = $u_sort_param = ''; +				gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $u_sort_param); + +				$min_filetime = ($sort_days) ? (time() - ($sort_days * 86400)) : ''; +				$limit_filetime = ($min_filetime) ? " AND a.filetime >= $min_filetime " : ''; +				$start = ($sort_days && isset($_POST['sort'])) ? 0 : $start; + +				$attachments_per_page = (int) $config['topics_per_page']; + +				// Handle files stats resync +				$action = request_var('action', ''); +				$resync_files_stats = false; +				if ($action && $action = 'stats') +				{ +					if (!confirm_box(true)) +					{ +						confirm_box(false, $user->lang['RESYNC_FILES_STATS_CONFIRM'], build_hidden_fields(array( +							'i'			=> $id, +							'mode'		=> $mode, +							'action'	=> $action, +						))); +					} +					else +					{ +						$resync_files_stats = true; +						add_log('admin', 'LOG_RESYNC_FILES_STATS'); +					} +				} + +				// Check if files stats are accurate +				$sql = 'SELECT COUNT(attach_id) as num_files +					FROM ' . ATTACHMENTS_TABLE . ' +					WHERE is_orphan = 0'; +				$result = $db->sql_query($sql, 600); +				$num_files_real = (int) $db->sql_fetchfield('num_files'); +				if ($resync_files_stats === true) +				{ +					set_config('num_files', $num_files_real, true); +				} +				$db->sql_freeresult($result); + +				$sql = 'SELECT SUM(filesize) as upload_dir_size +					FROM ' . ATTACHMENTS_TABLE . ' +					WHERE is_orphan = 0'; +				$result = $db->sql_query($sql, 600); +				$total_size_real = (float) $db->sql_fetchfield('upload_dir_size'); +				if ($resync_files_stats === true) +				{ +					set_config('upload_dir_size', $total_size_real, true); +				} +				$db->sql_freeresult($result); + +				// Get current files stats +				$num_files = (int) $config['num_files']; +				$total_size = (float) $config['upload_dir_size']; + +				// Issue warning message if files stats are inaccurate +				if (($num_files != $num_files_real) || ($total_size != $total_size_real)) +				{ +					$error[] = $user->lang('FILES_STATS_WRONG', (int) $num_files_real, get_formatted_filesize($total_size_real)); + +					$template->assign_vars(array( +						'S_ACTION_OPTIONS'	=> ($auth->acl_get('a_board')) ? true : false, +						'U_ACTION'			=> $this->u_action,) +					);					 +				} + +				// Make sure $start is set to the last page if it exceeds the amount +				if ($start < 0 || $start > $num_files) +				{ +					$start = ($start < 0) ? 0 : floor(($num_files - 1) / $attachments_per_page) * $attachments_per_page; +				} + +				// If the user is trying to reach the second half of the attachments list, fetch it starting from the end +				$store_reverse = false; +				$sql_limit = $attachments_per_page; + +				if ($start > $num_files / 2) +				{ +					$store_reverse = true; + +					if ($start + $attachments_per_page > $num_files) +					{ +						$sql_limit = min($attachments_per_page, max(1, $num_files - $start)); +					} + +					// Select the sort order. Add time sort anchor for non-time sorting cases +					$sql_sort_anchor = ($sort_key != 't') ? ', a.filetime ' . (($sort_dir == 'd') ? 'ASC' : 'DESC') : ''; +					$sql_sort_order = $sort_by_sql[$sort_key] . ' ' . (($sort_dir == 'd') ? 'ASC' : 'DESC') . $sql_sort_anchor; +					$sql_start = max(0, $num_files - $sql_limit - $start); +				} +				else +				{ +					// Select the sort order. Add time sort anchor for non-time sorting cases +					$sql_sort_anchor = ($sort_key != 't') ? ', a.filetime ' . (($sort_dir == 'd') ? 'DESC' : 'ASC') : ''; +					$sql_sort_order = $sort_by_sql[$sort_key] . ' ' . (($sort_dir == 'd') ? 'DESC' : 'ASC') . $sql_sort_anchor; +					$sql_start = $start; + +				} + +				$attachments_list = array(); + +				// Just get the files +				$sql = 'SELECT a.*, u.username, u.user_colour, t.topic_title +					FROM ' . ATTACHMENTS_TABLE . ' a  +					LEFT JOIN ' . USERS_TABLE . ' u ON (u.user_id = a.poster_id)  +					LEFT JOIN ' . TOPICS_TABLE . " t ON (a.topic_id = t.topic_id) +					WHERE a.is_orphan = 0 +						$limit_filetime +					ORDER BY $sql_sort_order"; +				$result = $db->sql_query_limit($sql, $sql_limit, $sql_start); + +				$i = ($store_reverse) ? $sql_limit - 1 : 0; + +				// Store increment value in a variable to save some conditional calls +				$i_increment = ($store_reverse) ? -1 : 1; +				while ($attachment_row = $db->sql_fetchrow($result)) +				{ +					$attachments_list[$i] = $attachment_row; +					$i = $i + $i_increment; +				} +				$db->sql_freeresult($result); + +				$template->assign_vars(array( +					'TOTAL_FILES'		=> $num_files, +					'TOTAL_SIZE'		=> get_formatted_filesize($total_size), +					'PAGINATION'		=> generate_pagination($this->u_action . "&$u_sort_param", $num_files, $attachments_per_page, $start, true), + +					'S_ON_PAGE'			=> on_page($num_files, $attachments_per_page, $start), +					'S_LIMIT_DAYS'		=> $s_limit_days, +					'S_SORT_KEY'		=> $s_sort_key, +					'S_SORT_DIR'		=> $s_sort_dir) +				); + +				// Grab extensions +				$extensions = $cache->obtain_attach_extensions(true); + +				for ($i = 0, $end = sizeof($attachments_list); $i < $end; ++$i) +				{ +					$row = $attachments_list[$i]; + +					$row['extension'] = strtolower(trim((string) $row['extension'])); +					$comment = ($row['attach_comment'] && !$row['in_message']) ? str_replace(array("\n", "\r"), array('<br />', "\n"), $row['attach_comment']) : ''; +					$display_cat = $extensions[$row['extension']]['display_cat']; +					$l_downloaded_viewed = ($display_cat == ATTACHMENT_CATEGORY_NONE) ? 'DOWNLOAD_COUNTS' : 'VIEWED_COUNTS'; + +					$template->assign_block_vars('attachments', array( +						'ATTACHMENT_POSTER'	=> get_username_string('full', (int) $row['poster_id'], (string) $row['username'], (string) $row['user_colour'], (string) $row['username']), +						'FILESIZE'			=> get_formatted_filesize((int) $row['filesize']), +						'FILETIME'			=> $user->format_date((int) $row['filetime']), +						'REAL_FILENAME'		=> (!$row['in_message']) ? utf8_wordwrap(utf8_basename((string) $row['real_filename']), 40, '<br />', true) : '', +						'PHYSICAL_FILENAME'	=> utf8_basename((string) $row['physical_filename']), +						'EXT_GROUP_NAME'	=> (!empty($extensions[$row['extension']]['group_name'])) ? $user->lang['EXT_GROUP_' . $extensions[$row['extension']]['group_name']] : '', +						'COMMENT'			=> $comment, +						'TOPIC_TITLE'		=> (!$row['in_message']) ? (string) $row['topic_title'] : '', +						'ATTACH_ID'			=> (int) $row['attach_id'], +						'POST_ID'			=> (int) $row['post_msg_id'], +						'TOPIC_ID'			=> (int) $row['topic_id'], +						'POST_IDS'			=> (!empty($post_ids[$row['attach_id']])) ? (int) $post_ids[$row['attach_id']] : '', + +						'L_DOWNLOAD_COUNT'	=> $user->lang($l_downloaded_viewed, (int) $row['download_count']), + +						'S_IN_MESSAGE'		=> (bool) $row['in_message'], + +						'U_VIEW_TOPIC'		=> append_sid("{$phpbb_root_path}viewtopic.$phpEx", "t={$row['topic_id']}&p={$row['post_msg_id']}") . "#p{$row['post_msg_id']}", +						'U_FILE'			=> append_sid($phpbb_root_path . 'download/file.' . $phpEx, 'mode=view&id=' . $row['attach_id'])) +					); +				} + +			break;  		}  		if (sizeof($error)) @@ -1235,6 +1461,7 @@ class acp_attachments  	function perform_site_list()  	{  		global $db, $user; +		global $request;  		if (isset($_REQUEST['securesubmit']))  		{ @@ -1243,7 +1470,7 @@ class acp_attachments  			$ip_list = array_unique(explode("\n", $ips));  			$ip_list_log = implode(', ', $ip_list); -			$ip_exclude = (!empty($_POST['ipexclude'])) ? 1 : 0; +			$ip_exclude = (int) $request->variable('ipexclude', false, false, phpbb_request_interface::POST);  			$iplist = array();  			$hostlist = array(); @@ -1455,5 +1682,3 @@ class acp_attachments  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/acp_ban.php b/phpBB/includes/acp/acp_ban.php index f8af1b86e1..d275c7f10c 100644 --- a/phpBB/includes/acp/acp_ban.php +++ b/phpBB/includes/acp/acp_ban.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -272,5 +271,3 @@ class acp_ban  		));  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/acp_bbcodes.php b/phpBB/includes/acp/acp_bbcodes.php index 0644b38eb1..e537d7a8b9 100644 --- a/phpBB/includes/acp/acp_bbcodes.php +++ b/phpBB/includes/acp/acp_bbcodes.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -25,7 +24,7 @@ class acp_bbcodes  	function main($id, $mode)  	{ -		global $db, $user, $auth, $template, $cache; +		global $db, $user, $auth, $template, $cache, $request;  		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;  		$user->add_lang('acp/posting'); @@ -273,6 +272,18 @@ class acp_bbcodes  						$db->sql_query('DELETE FROM ' . BBCODES_TABLE . " WHERE bbcode_id = $bbcode_id");  						$cache->destroy('sql', BBCODES_TABLE);  						add_log('admin', 'LOG_BBCODE_DELETE', $row['bbcode_tag']); +						 +						if ($request->is_ajax()) +						{ +							$json_response = new phpbb_json_response; +							$json_response->send(array( +								'MESSAGE_TITLE'	=> $user->lang['INFORMATION'], +								'MESSAGE_TEXT'	=> $user->lang['BBCODE_DELETED'], +								'REFRESH_DATA'	=> array( +									'time'	=> 3 +								) +							)); +						}  					}  					else  					{ @@ -317,16 +328,7 @@ class acp_bbcodes  		$bbcode_tpl = trim($bbcode_tpl);  		$utf8 = strpos($bbcode_match, 'INTTEXT') !== false; -		// make sure we have utf8 support -		$utf8_pcre_properties = false; -		if (version_compare(PHP_VERSION, '5.1.0', '>=') || (version_compare(PHP_VERSION, '5.0.0-dev', '<=') && version_compare(PHP_VERSION, '4.4.0', '>='))) -		{ -			// While this is the proper range of PHP versions, PHP may not be linked with the bundled PCRE lib and instead with an older version -			if (@preg_match('/\p{L}/u', 'a') !== false) -			{ -				$utf8_pcre_properties = true; -			} -		} +		$utf8_pcre_properties = phpbb_pcre_utf8_support();  		$fp_match = preg_quote($bbcode_match, '!');  		$fp_replace = preg_replace('#^\[(.*?)\]#', '[$1:$uid]', $bbcode_match); @@ -472,5 +474,3 @@ class acp_bbcodes  		);  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/acp_board.php b/phpBB/includes/acp/acp_board.php index f437dca8f9..951166f086 100644 --- a/phpBB/includes/acp/acp_board.php +++ b/phpBB/includes/acp/acp_board.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  * @todo add cron intervals to server settings? (database_gc, queue_interval, session_gc, search_gc, cache_gc, warnings_gc)  */ @@ -96,6 +95,7 @@ class acp_board  						'load_moderators'		=> array('lang' => 'YES_MODERATORS',		'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => false),  						'load_jumpbox'			=> array('lang' => 'YES_JUMPBOX',			'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => false),  						'load_cpf_memberlist'	=> array('lang' => 'LOAD_CPF_MEMBERLIST',	'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => false), +						'load_cpf_pm'			=> array('lang' => 'LOAD_CPF_PM',			'validate' => 'bool',	'type' => 'radio:yes_no', 'explain'	=> false),  						'load_cpf_viewprofile'	=> array('lang' => 'LOAD_CPF_VIEWPROFILE',	'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => false),  						'load_cpf_viewtopic'	=> array('lang' => 'LOAD_CPF_VIEWTOPIC',	'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => false), @@ -110,10 +110,10 @@ class acp_board  					'vars'	=> array(  						'legend1'				=> 'ACP_AVATAR_SETTINGS', -						'avatar_min_width'		=> array('lang' => 'MIN_AVATAR_SIZE', 'validate' => 'int:0', 'type' => false, 'method' => false, 'explain' => false,), -						'avatar_min_height'		=> array('lang' => 'MIN_AVATAR_SIZE', 'validate' => 'int:0', 'type' => false, 'method' => false, 'explain' => false,), -						'avatar_max_width'		=> array('lang' => 'MAX_AVATAR_SIZE', 'validate' => 'int:0', 'type' => false, 'method' => false, 'explain' => false,), -						'avatar_max_height'		=> array('lang' => 'MAX_AVATAR_SIZE', 'validate' => 'int:0', 'type' => false, 'method' => false, 'explain' => false,), +						'avatar_min_width'		=> array('lang' => 'MIN_AVATAR_SIZE', 'validate' => 'int:0', 'type' => false, 'method' => false, 'explain' => false), +						'avatar_min_height'		=> array('lang' => 'MIN_AVATAR_SIZE', 'validate' => 'int:0', 'type' => false, 'method' => false, 'explain' => false), +						'avatar_max_width'		=> array('lang' => 'MAX_AVATAR_SIZE', 'validate' => 'int:0', 'type' => false, 'method' => false, 'explain' => false), +						'avatar_max_height'		=> array('lang' => 'MAX_AVATAR_SIZE', 'validate' => 'int:0', 'type' => false, 'method' => false, 'explain' => false),  						'allow_avatar'			=> array('lang' => 'ALLOW_AVATARS',			'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => true),  						'allow_avatar_local'	=> array('lang' => 'ALLOW_LOCAL',			'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => false), @@ -124,7 +124,7 @@ class acp_board  						'avatar_min'			=> array('lang' => 'MIN_AVATAR_SIZE',		'validate' => 'int:0',	'type' => 'dimension:3:4', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']),  						'avatar_max'			=> array('lang' => 'MAX_AVATAR_SIZE',		'validate' => 'int:0',	'type' => 'dimension:3:4', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']),  						'avatar_path'			=> array('lang' => 'AVATAR_STORAGE_PATH',	'validate' => 'rwpath',	'type' => 'text:20:255', 'explain' => true), -						'avatar_gallery_path'	=> array('lang' => 'AVATAR_GALLERY_PATH',	'validate' => 'rpath',	'type' => 'text:20:255', 'explain' => true) +						'avatar_gallery_path'	=> array('lang' => 'AVATAR_GALLERY_PATH',	'validate' => 'rpath',	'type' => 'text:20:255', 'explain' => true),  					)  				);  			break; @@ -296,7 +296,7 @@ class acp_board  						'cookie_domain'	=> array('lang' => 'COOKIE_DOMAIN',	'validate' => 'string',	'type' => 'text::255', 'explain' => false),  						'cookie_name'	=> array('lang' => 'COOKIE_NAME',	'validate' => 'string',	'type' => 'text::16', 'explain' => false),  						'cookie_path'	=> array('lang'	=> 'COOKIE_PATH',	'validate' => 'string',	'type' => 'text::255', 'explain' => false), -						'cookie_secure'	=> array('lang' => 'COOKIE_SECURE',	'validate' => 'bool',	'type' => 'radio:disabled_enabled', 'explain' => true) +						'cookie_secure'	=> array('lang' => 'COOKIE_SECURE',	'validate' => 'bool',	'type' => 'radio:disabled_enabled', 'explain' => true),  					)  				);  			break; @@ -323,10 +323,12 @@ class acp_board  						'load_moderators'		=> array('lang' => 'YES_MODERATORS',		'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => false),  						'load_jumpbox'			=> array('lang' => 'YES_JUMPBOX',			'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => false),  						'load_user_activity'	=> array('lang' => 'LOAD_USER_ACTIVITY',	'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => true), -						'load_tplcompile'		=> array('lang' => 'RECOMPILE_STYLES',	'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => true), +						'load_tplcompile'		=> array('lang' => 'RECOMPILE_STYLES',		'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => true), +						'load_jquery_cdn'		=> array('lang' => 'LOAD_JQUERY_CDN',		'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => true),  						'legend3'				=> 'CUSTOM_PROFILE_FIELDS',  						'load_cpf_memberlist'	=> array('lang' => 'LOAD_CPF_MEMBERLIST',	'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => false), +						'load_cpf_pm'			=> array('lang' => 'LOAD_CPF_PM',			'validate' => 'bool',	'type' => 'radio:yes_no', 'explain'	=> false),  						'load_cpf_viewprofile'	=> array('lang' => 'LOAD_CPF_VIEWPROFILE',	'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => false),  						'load_cpf_viewtopic'	=> array('lang' => 'LOAD_CPF_VIEWTOPIC',	'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => false), @@ -340,7 +342,7 @@ class acp_board  					'title'	=> 'ACP_AUTH_SETTINGS',  					'vars'	=> array(  						'legend1'		=> 'ACP_AUTH_SETTINGS', -						'auth_method'	=> array('lang' => 'AUTH_METHOD',	'validate' => 'string',	'type' => 'select', 'method' => 'select_auth_method', 'explain' => false) +						'auth_method'	=> array('lang' => 'AUTH_METHOD',	'validate' => 'string',	'type' => 'select', 'method' => 'select_auth_method', 'explain' => false),  					)  				);  			break; @@ -351,6 +353,7 @@ class acp_board  					'vars'	=> array(  						'legend1'				=> 'ACP_SERVER_SETTINGS',  						'gzip_compress'			=> array('lang' => 'ENABLE_GZIP',		'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => true), +						'use_system_cron'		=> array('lang' => 'USE_SYSTEM_CRON',		'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => true),  						'legend2'				=> 'PATH_SETTINGS',  						'smilies_path'			=> array('lang' => 'SMILIES_PATH',		'validate' => 'rpath',	'type' => 'text:20:255', 'explain' => true), @@ -440,7 +443,7 @@ class acp_board  		$cfg_array = (isset($_REQUEST['config'])) ? utf8_normalize_nfc(request_var('config', array('' => ''), true)) : $this->new_config;  		$error = array(); -		// We validate the complete config if whished +		// We validate the complete config if wished  		validate_config_vars($display_vars['vars'], $cfg_array, $error);  		if ($submit && !check_form_key($form_key)) @@ -1001,5 +1004,3 @@ class acp_board  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/acp_bots.php b/phpBB/includes/acp/acp_bots.php index d08cabb062..b9dd6664f4 100644 --- a/phpBB/includes/acp/acp_bots.php +++ b/phpBB/includes/acp/acp_bots.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -25,7 +24,7 @@ class acp_bots  	function main($id, $mode)  	{ -		global $config, $db, $user, $auth, $template, $cache; +		global $config, $db, $user, $auth, $template, $cache, $request;  		global $phpbb_root_path, $phpbb_admin_path, $phpEx, $table_prefix;  		$action = request_var('action', ''); @@ -353,6 +352,14 @@ class acp_bots  			break;  		} +		 +		if ($request->is_ajax() && ($action == 'activate' || $action == 'deactivate')) +		{ +			$json_response = new phpbb_json_response; +			$json_response->send(array( +				'text'	=> $user->lang['BOT_' . (($action == 'activate') ? 'DE' : '') . 'ACTIVATE'], +			)); +		}  		$s_options = '';  		$_options = array('activate' => 'BOT_ACTIVATE', 'deactivate' => 'BOT_DEACTIVATE', 'delete' => 'DELETE'); @@ -414,5 +421,3 @@ class acp_bots  		return ($row) ? false : true;  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/acp_captcha.php b/phpBB/includes/acp/acp_captcha.php index 469a367bba..51b5dd3301 100644 --- a/phpBB/includes/acp/acp_captcha.php +++ b/phpBB/includes/acp/acp_captcha.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  */  /** @@ -46,7 +45,7 @@ class acp_captcha  		// Delegate  		if ($configure)  		{ -			$config_captcha =& phpbb_captcha_factory::get_instance($selected); +			$config_captcha = phpbb_captcha_factory::get_instance($selected);  			$config_captcha->acp_page($id, $this);  		}  		else @@ -78,11 +77,11 @@ class acp_captcha  					// sanity check  					if (isset($captchas['available'][$selected]))  					{ -						$old_captcha =& phpbb_captcha_factory::get_instance($config['captcha_plugin']); +						$old_captcha = phpbb_captcha_factory::get_instance($config['captcha_plugin']);  						$old_captcha->uninstall();  						set_config('captcha_plugin', $selected); -						$new_captcha =& phpbb_captcha_factory::get_instance($config['captcha_plugin']); +						$new_captcha = phpbb_captcha_factory::get_instance($config['captcha_plugin']);  						$new_captcha->install();  						add_log('admin', 'LOG_CONFIG_VISUAL'); @@ -104,16 +103,16 @@ class acp_captcha  				foreach ($captchas['available'] as $value => $title)  				{  					$current = ($selected !== false && $value == $selected) ? ' selected="selected"' : ''; -					$captcha_select .= '<option value="' . $value . '"' . $current . '>' . $user->lang[$title] . '</option>'; +					$captcha_select .= '<option value="' . $value . '"' . $current . '>' . $user->lang($title) . '</option>';  				}  				foreach ($captchas['unavailable'] as $value => $title)  				{  					$current = ($selected !== false && $value == $selected) ? ' selected="selected"' : ''; -					$captcha_select .= '<option value="' . $value . '"' . $current . ' class="disabled-option">' . $user->lang[$title] . '</option>'; +					$captcha_select .= '<option value="' . $value . '"' . $current . ' class="disabled-option">' . $user->lang($title) . '</option>';  				} -				$demo_captcha =& phpbb_captcha_factory::get_instance($selected); +				$demo_captcha = phpbb_captcha_factory::get_instance($selected);  				foreach ($config_vars as $config_var => $options)  				{ @@ -136,7 +135,7 @@ class acp_captcha  	{  		global $db, $user, $config; -		$captcha =& phpbb_captcha_factory::get_instance($selected); +		$captcha = phpbb_captcha_factory::get_instance($selected);  		$captcha->init(CONFIRM_REG);  		$captcha->execute_demo(); @@ -144,5 +143,3 @@ class acp_captcha  		exit_handler();  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/acp_database.php b/phpBB/includes/acp/acp_database.php index 62bcd43a47..e66fd850c6 100644 --- a/phpBB/includes/acp/acp_database.php +++ b/phpBB/includes/acp/acp_database.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -489,6 +488,8 @@ class base_extractor  	function base_extractor($download = false, $store = false, $format, $filename, $time)  	{ +		global $request; +  		$this->download = $download;  		$this->store = $store;  		$this->time = $time; @@ -533,7 +534,7 @@ class base_extractor  				break;  				case 'gzip': -					if ((isset($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false) && strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'msie') === false) +					if (strpos($request->header('Accept-Encoding'), 'gzip') !== false && strpos(strtolower($request->header('User-Agent')), 'msie') === false)  					{  						ob_start('ob_gzhandler');  					} @@ -1010,43 +1011,8 @@ class sqlite_extractor extends base_extractor  	function write_data($table_name)  	{  		global $db; -		static $proper; - -		if (is_null($proper)) -		{ -			$proper = version_compare(PHP_VERSION, '5.1.3', '>='); -		} - -		if ($proper) -		{ -			$col_types = sqlite_fetch_column_types($db->db_connect_id, $table_name); -		} -		else -		{ -			$sql = "SELECT sql -				FROM sqlite_master -				WHERE type = 'table' -					AND name = '" . $table_name . "'"; -			$table_data = sqlite_single_query($db->db_connect_id, $sql); -			$table_data = preg_replace('#CREATE\s+TABLE\s+"?' . $table_name . '"?#i', '', $table_data); -			$table_data = trim($table_data); - -			preg_match('#\((.*)\)#s', $table_data, $matches); - -			$table_cols = explode(',', trim($matches[1])); -			foreach ($table_cols as $declaration) -			{ -				$entities = preg_split('#\s+#', trim($declaration)); -				$column_name = preg_replace('/"?([^"]+)"?/', '\1', $entities[0]); -				// Hit a primary key, those are not what we need :D -				if (empty($entities[1]) || (strtolower($entities[0]) === 'primary' && strtolower($entities[1]) === 'key')) -				{ -					continue; -				} -				$col_types[$column_name] = $entities[1]; -			} -		} +		$col_types = sqlite_fetch_column_types($db->db_connect_id, $table_name);  		$sql = "SELECT *  			FROM $table_name"; @@ -1618,7 +1584,7 @@ class mssql_extractor extends base_extractor  		}  		$this->flush($sql_data);  	} -	 +  	function write_data_mssqlnative($table_name)  	{  		global $db; @@ -1644,7 +1610,7 @@ class mssql_extractor extends base_extractor  		$row = new result_mssqlnative($result_fields);  		$i_num_fields = $row->num_fields(); -		 +  		for ($i = 0; $i < $i_num_fields; $i++)  		{  			$ary_type[$i] = $row->field_type($i); @@ -1657,7 +1623,7 @@ class mssql_extractor extends base_extractor  			WHERE COLUMNPROPERTY(object_id('$table_name'), COLUMN_NAME, 'IsIdentity') = 1";  		$result2 = $db->sql_query($sql);  		$row2 = $db->sql_fetchrow($result2); -		 +  		if (!empty($row2['has_identity']))  		{  			$sql_data .= "\nSET IDENTITY_INSERT $table_name ON\nGO\n"; @@ -1721,8 +1687,8 @@ class mssql_extractor extends base_extractor  			$sql_data .= "\nSET IDENTITY_INSERT $table_name OFF\nGO\n";  		}  		$this->flush($sql_data); -	}	 -	 +	} +  	function write_data_odbc($table_name)  	{  		global $db; @@ -2458,5 +2424,3 @@ function fgetd_seekless(&$fp, $delim, $read, $seek, $eof, $buffer = 8192)  	return false;  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/acp_disallow.php b/phpBB/includes/acp/acp_disallow.php index e2176b7bcd..f613fa325d 100644 --- a/phpBB/includes/acp/acp_disallow.php +++ b/phpBB/includes/acp/acp_disallow.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -116,5 +115,3 @@ class acp_disallow  		);  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/acp_email.php b/phpBB/includes/acp/acp_email.php index df0d44c0c5..c9d149b6d7 100644 --- a/phpBB/includes/acp/acp_email.php +++ b/phpBB/includes/acp/acp_email.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -281,5 +280,3 @@ class acp_email  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/acp_forums.php b/phpBB/includes/acp/acp_forums.php index 50e12a0f15..3a3b2021eb 100644 --- a/phpBB/includes/acp/acp_forums.php +++ b/phpBB/includes/acp/acp_forums.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -26,7 +25,7 @@ class acp_forums  	function main($id, $mode)  	{ -		global $db, $user, $auth, $template, $cache; +		global $db, $user, $auth, $template, $cache, $request;  		global $config, $phpbb_admin_path, $phpbb_root_path, $phpEx;  		$user->add_lang('acp/forums'); @@ -256,6 +255,12 @@ class acp_forums  					add_log('admin', 'LOG_FORUM_' . strtoupper($action), $row['forum_name'], $move_forum_name);  					$cache->destroy('sql', FORUMS_TABLE);  				} +				 +				if ($request->is_ajax()) +				{ +					$json_response = new phpbb_json_response; +					$json_response->send(array('success' => ($move_forum_name !== false))); +				}  			break; @@ -1946,5 +1951,3 @@ class acp_forums  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/acp_groups.php b/phpBB/includes/acp/acp_groups.php index 486616c33d..607254adb5 100644 --- a/phpBB/includes/acp/acp_groups.php +++ b/phpBB/includes/acp/acp_groups.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -35,6 +34,12 @@ class acp_groups  		$form_key = 'acp_groups';  		add_form_key($form_key); +		if ($mode == 'position') +		{ +			$this->manage_position(); +			return; +		} +  		include($phpbb_root_path . 'includes/functions_user.' . $phpEx);  		// Check and set some common vars @@ -306,6 +311,7 @@ class acp_groups  						'rank'				=> request_var('group_rank', 0),  						'receive_pm'		=> isset($_REQUEST['group_receive_pm']) ? 1 : 0,  						'legend'			=> isset($_REQUEST['group_legend']) ? 1 : 0, +						'teampage'			=> isset($_REQUEST['group_teampage']) ? 1 : 0,  						'message_limit'		=> request_var('group_message_limit', 0),  						'max_recipients'	=> request_var('group_max_recipients', 0),  						'founder_manage'	=> 0, @@ -364,7 +370,7 @@ class acp_groups  						{  							if ($data['width'] > $config['avatar_max_width'] || $data['height'] > $config['avatar_max_height'])  							{ -								$error[] = sprintf($user->lang['AVATAR_WRONG_SIZE'], $config['avatar_min_width'], $config['avatar_min_height'], $config['avatar_max_width'], $config['avatar_max_height'], $data['width'], $data['height']); +								$error[] = phpbb_avatar_error_wrong_size($data['width'], $data['height']);  							}  						} @@ -374,7 +380,7 @@ class acp_groups  							{  								if ($data['width'] < $config['avatar_min_width'] || $data['height'] < $config['avatar_min_height'])  								{ -									$error[] = sprintf($user->lang['AVATAR_WRONG_SIZE'], $config['avatar_min_width'], $config['avatar_min_height'], $config['avatar_max_width'], $config['avatar_max_height'], $data['width'], $data['height']); +									$error[] = phpbb_avatar_error_wrong_size($data['width'], $data['height']);  								}  							}  						} @@ -408,6 +414,9 @@ class acp_groups  						// Only set the rank, colour, etc. if it's changed or if we're adding a new  						// group. This prevents existing group members being updated if no changes  						// were made. +						// However there are some attributes that need to be set everytime, +						// otherwise the group gets removed from the feature. +						$set_attributes = array('legend', 'teampage');  						$group_attributes = array();  						$test_variables = array( @@ -419,6 +428,7 @@ class acp_groups  							'avatar_height'	=> 'int',  							'receive_pm'	=> 'int',  							'legend'		=> 'int', +							'teampage'		=> 'int',  							'message_limit'	=> 'int',  							'max_recipients'=> 'int',  							'founder_manage'=> 'int', @@ -427,7 +437,7 @@ class acp_groups  						foreach ($test_variables as $test => $type)  						{ -							if (isset($submit_ary[$test]) && ($action == 'add' || $group_row['group_' . $test] != $submit_ary[$test])) +							if (isset($submit_ary[$test]) && ($action == 'add' || $group_row['group_' . $test] != $submit_ary[$test] || in_array($test, $set_attributes)))  							{  								settype($submit_ary[$test], $type);  								$group_attributes['group_' . $test] = $group_row['group_' . $test] = $submit_ary[$test]; @@ -584,6 +594,7 @@ class acp_groups  					'GROUP_RECEIVE_PM'		=> (isset($group_row['group_receive_pm']) && $group_row['group_receive_pm']) ? ' checked="checked"' : '',  					'GROUP_FOUNDER_MANAGE'	=> (isset($group_row['group_founder_manage']) && $group_row['group_founder_manage']) ? ' checked="checked"' : '',  					'GROUP_LEGEND'			=> (isset($group_row['group_legend']) && $group_row['group_legend']) ? ' checked="checked"' : '', +					'GROUP_TEAMPAGE'		=> (isset($group_row['group_teampage']) && $group_row['group_teampage']) ? ' checked="checked"' : '',  					'GROUP_MESSAGE_LIMIT'	=> (isset($group_row['group_message_limit'])) ? $group_row['group_message_limit'] : 0,  					'GROUP_MAX_RECIPIENTS'	=> (isset($group_row['group_max_recipients'])) ? $group_row['group_max_recipients'] : 0,  					'GROUP_COLOUR'			=> (isset($group_row['group_colour'])) ? $group_row['group_colour'] : '', @@ -615,7 +626,7 @@ class acp_groups  					'U_BACK'			=> $u_back,  					'U_SWATCH'			=> append_sid("{$phpbb_admin_path}swatch.$phpEx", 'form=settings&name=group_colour'),  					'U_ACTION'			=> "{$this->u_action}&action=$action&g=$group_id", -					'L_AVATAR_EXPLAIN'	=> sprintf($user->lang['AVATAR_EXPLAIN'], $config['avatar_max_width'], $config['avatar_max_height'], round($config['avatar_filesize'] / 1024)), +					'L_AVATAR_EXPLAIN'	=> phpbb_avatar_explanation_string(),  				));  				return; @@ -793,6 +804,122 @@ class acp_groups  			}  		}  	} -} -?>
\ No newline at end of file +	public function manage_position() +	{ +		global $config, $db, $template, $user; + +		$this->tpl_name = 'acp_groups_position'; +		$this->page_title = 'ACP_GROUPS_POSITION'; + +		$field = request_var('field', ''); +		$action = request_var('action', ''); +		$group_id = request_var('g', 0); + +		if ($field && !in_array($field, array('legend', 'teampage'))) +		{ +			// Invalid mode +			trigger_error($user->lang['NO_MODE'] . adm_back_link($this->u_action), E_USER_WARNING); +		} +		else if ($field) +		{ +			$group_position = new phpbb_group_positions($db, $field, $this->u_action); +		} + +		switch ($action) +		{ +			case 'set_config_legend': +				set_config('legend_sort_groupname', request_var('legend_sort_groupname', 0)); +			break; + +			case 'set_config_teampage': +				set_config('teampage_forums', request_var('teampage_forums', 0)); +				set_config('teampage_memberships', request_var('teampage_memberships', 0)); +			break; + +			case 'add': +				$group_position->add_group($group_id); +			break; + +			case 'delete': +				$group_position->delete_group($group_id); +			break; + +			case 'move_up': +				$group_position->move_up($group_id); +			break; + +			case 'move_down': +				$group_position->move_down($group_id); +			break; +		} + +		$sql = 'SELECT group_id, group_name, group_colour, group_type, group_legend +			FROM ' . GROUPS_TABLE . ' +			ORDER BY group_legend, group_name ASC'; +		$result = $db->sql_query($sql); + +		$s_group_select_legend = ''; +		while ($row = $db->sql_fetchrow($result)) +		{ +			$group_name = ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']; +			if ($row['group_legend']) +			{ +				$template->assign_block_vars('legend', array( +					'GROUP_NAME' => $group_name, +					'GROUP_COLOUR' => ($row['group_colour']) ? ' style="color: #' . $row['group_colour'] . '"' : '', +					'GROUP_TYPE' => $user->lang[phpbb_group_positions::group_type_language($row['group_type'])], + +					'U_MOVE_DOWN' => "{$this->u_action}&field=legend&action=move_down&g=" . $row['group_id'], +					'U_MOVE_UP' => "{$this->u_action}&field=legend&action=move_up&g=" . $row['group_id'], +					'U_DELETE' => "{$this->u_action}&field=legend&action=delete&g=" . $row['group_id'], +				)); +			} +			else +			{ +				$s_group_select_legend .= '<option value="' . (int) $row['group_id'] . '">' . $group_name . '</option>'; +			} +		} +		$db->sql_freeresult($result); + +		$sql = 'SELECT group_id, group_name, group_colour, group_type, group_teampage +			FROM ' . GROUPS_TABLE . ' +			ORDER BY group_teampage, group_name ASC'; +		$result = $db->sql_query($sql); + +		$s_group_select_teampage = ''; +		while ($row = $db->sql_fetchrow($result)) +		{ +			$group_name = ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']; +			if ($row['group_teampage']) +			{ +				$template->assign_block_vars('teampage', array( +					'GROUP_NAME' => $group_name, +					'GROUP_COLOUR' => ($row['group_colour']) ? ' style="color: #' . $row['group_colour'] . '"' : '', +					'GROUP_TYPE' => $user->lang[phpbb_group_positions::group_type_language($row['group_type'])], + +					'U_MOVE_DOWN' => "{$this->u_action}&field=teampage&action=move_down&g=" . $row['group_id'], +					'U_MOVE_UP' => "{$this->u_action}&field=teampage&action=move_up&g=" . $row['group_id'], +					'U_DELETE' => "{$this->u_action}&field=teampage&action=delete&g=" . $row['group_id'], +				)); +			} +			else +			{ +				$s_group_select_teampage .= '<option value="' . (int) $row['group_id'] . '">' . $group_name . '</option>'; +			} +		} +		$db->sql_freeresult($result); + +		$template->assign_vars(array( +			'U_ACTION' => $this->u_action, +			'U_ACTION_LEGEND' => $this->u_action . '&field=legend', +			'U_ACTION_TEAMPAGE' => $this->u_action . '&field=teampage', + +			'S_GROUP_SELECT_LEGEND'		=> $s_group_select_legend, +			'S_GROUP_SELECT_TEAMPAGE'	=> $s_group_select_teampage, +			'DISPLAY_FORUMS'			=> ($config['teampage_forums']) ? true : false, +			'DISPLAY_MEMBERSHIPS'		=> $config['teampage_memberships'], +			'LEGEND_SORT_GROUPNAME'		=> ($config['legend_sort_groupname']) ? true : false, +		)); +	} +} diff --git a/phpBB/includes/acp/acp_icons.php b/phpBB/includes/acp/acp_icons.php index 24f6cbbcbf..bfe17c5007 100644 --- a/phpBB/includes/acp/acp_icons.php +++ b/phpBB/includes/acp/acp_icons.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -28,6 +27,7 @@ class acp_icons  	{  		global $db, $user, $auth, $template, $cache;  		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx; +		global $request;  		$user->add_lang('acp/posting'); @@ -338,7 +338,7 @@ class acp_icons  				$image_display_on_posting = (isset($_POST['display_on_posting'])) ? request_var('display_on_posting', array('' => 0)) : array();  				// Ok, add the relevant bits if we are adding new codes to existing emoticons... -				if (!empty($_POST['add_additional_code'])) +				if ($request->variable('add_additional_code', false, false, phpbb_request_interface::POST))  				{  					$add_image			= request_var('add_image', '');  					$add_code			= utf8_normalize_nfc(request_var('add_code', '', true)); @@ -354,7 +354,7 @@ class acp_icons  						$image_width[$add_image] = request_var('add_width', 0);  						$image_height[$add_image] = request_var('add_height', 0); -						if (!empty($_POST['add_display_on_posting'])) +						if ($request->variable('add_display_on_posting', false, false, phpbb_request_interface::POST))  						{  							$image_display_on_posting[$add_image] = 1;  						} @@ -378,7 +378,7 @@ class acp_icons  					if ($smiley_count + $addable_smileys_count > SMILEY_LIMIT)  					{ -						trigger_error(sprintf($user->lang['TOO_MANY_SMILIES'], SMILEY_LIMIT) . adm_back_link($this->u_action), E_USER_WARNING); +						trigger_error($user->lang('TOO_MANY_SMILIES', SMILEY_LIMIT) . adm_back_link($this->u_action), E_USER_WARNING);  					}  				} @@ -486,21 +486,7 @@ class acp_icons  				$cache->destroy('_icons');  				$cache->destroy('sql', $table); -				$level = E_USER_NOTICE; -				switch ($icons_updated) -				{ -					case 0: -						$suc_lang = "{$lang}_NONE"; -						$level = E_USER_WARNING; -						break; - -					case 1: -						$suc_lang = "{$lang}_ONE"; -						break; - -					default: -						$suc_lang = $lang; -				} +				$level = ($icons_updated) ? E_USER_NOTICE : E_USER_WARNING;  				$errormsgs = '';  				foreach ($errors as $img => $error)  				{ @@ -508,11 +494,11 @@ class acp_icons  				}  				if ($action == 'modify')  				{ -					trigger_error($user->lang[$suc_lang . '_EDITED'] . $errormsgs . adm_back_link($this->u_action), $level); +					trigger_error($user->lang($lang . '_EDITED', $icons_updated) . $errormsgs . adm_back_link($this->u_action), $level);  				}  				else  				{ -					trigger_error($user->lang[$suc_lang . '_ADDED'] . $errormsgs . adm_back_link($this->u_action), $level); +					trigger_error($user->lang($lang . '_ADDED', $icons_updated) . $errormsgs . adm_back_link($this->u_action), $level);  				}  			break; @@ -598,7 +584,7 @@ class acp_icons  						$smiley_count = $this->item_count($table);  						if ($smiley_count + sizeof($pak_ary) > SMILEY_LIMIT)  						{ -							trigger_error(sprintf($user->lang['TOO_MANY_SMILIES'], SMILEY_LIMIT) . adm_back_link($this->u_action), E_USER_WARNING); +							trigger_error($user->lang('TOO_MANY_SMILIES', SMILEY_LIMIT) . adm_back_link($this->u_action), E_USER_WARNING);  						}  					} @@ -796,6 +782,18 @@ class acp_icons  					$cache->destroy('_icons');  					$cache->destroy('sql', $table); +					 +					if ($request->is_ajax()) +					{ +						$json_response = new phpbb_json_response; +						$json_response->send(array( +							'MESSAGE_TITLE'	=> $user->lang['INFORMATION'], +							'MESSAGE_TEXT'	=> $notice, +							'REFRESH_DATA'	=> array( +								'time'	=> 3 +							) +						)); +					}  				}  				else  				{ @@ -954,5 +952,3 @@ class acp_icons  		return $item_count;  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/acp_inactive.php b/phpBB/includes/acp/acp_inactive.php index f3f332d707..78d6a0b2f3 100644 --- a/phpBB/includes/acp/acp_inactive.php +++ b/phpBB/includes/acp/acp_inactive.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2006 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -302,5 +301,3 @@ class acp_inactive  		$this->page_title = 'ACP_INACTIVE_USERS';  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/acp_jabber.php b/phpBB/includes/acp/acp_jabber.php index 9925527b34..96371075d6 100644 --- a/phpBB/includes/acp/acp_jabber.php +++ b/phpBB/includes/acp/acp_jabber.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  * @todo Check/enter/update transport info  */ @@ -127,5 +126,3 @@ class acp_jabber  		));  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/acp_language.php b/phpBB/includes/acp/acp_language.php index d560cdd0c5..2b19f93c75 100644 --- a/phpBB/includes/acp/acp_language.php +++ b/phpBB/includes/acp/acp_language.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -34,6 +33,7 @@ class acp_language  		global $config, $db, $user, $auth, $template, $cache;  		global $phpbb_root_path, $phpbb_admin_path, $phpEx, $table_prefix;  		global $safe_mode, $file_uploads; +		global $request;  		include_once($phpbb_root_path . 'includes/functions_user.' . $phpEx); @@ -58,7 +58,7 @@ class acp_language  		if (isset($_POST['missing_file']))  		{  			$missing_file = request_var('missing_file', array('' => 0)); -			list($_REQUEST['language_file'], ) = array_keys($missing_file); +			$request->overwrite('language_file', array_shift(array_keys($missing_file)));  		}  		$selected_lang_file = request_var('language_file', '|common.' . $phpEx); @@ -68,6 +68,23 @@ class acp_language  		$this->language_directory = basename($this->language_directory);  		$this->language_file = basename($this->language_file); +		// detect language file type +		if ($this->language_directory == 'email') +		{ +			$language_file_type = 'email'; +			$request_default = ''; +		} +		else if (strpos($this->language_file, 'help_') === 0) +		{ +			$language_file_type = 'help'; +			$request_default = array(0 => array(0 => '')); +		} +		else +		{ +			$language_file_type = 'normal'; +			$request_default = array('' => ''); +		} +  		$user->add_lang('acp/language');  		$this->tpl_name = 'acp_language';  		$this->page_title = 'ACP_LANGUAGE_PACKS'; @@ -119,7 +136,7 @@ class acp_language  						'DATA'		=> $data,  						'NAME'		=> $user->lang[strtoupper($method . '_' . $data)],  						'EXPLAIN'	=> $user->lang[strtoupper($method . '_' . $data) . '_EXPLAIN'], -						'DEFAULT'	=> (!empty($_REQUEST[$data])) ? request_var($data, '') : $default +						'DEFAULT'	=> $request->variable($data, (string) $default),  					));  				} @@ -130,7 +147,7 @@ class acp_language  					'method'		=> $method)  				); -				$hidden_data .= build_hidden_fields(array('entry' => $_POST['entry']), true, STRIP); +				$hidden_data .= build_hidden_fields(array('entry' => $request->variable('entry', $request_default, true, phpbb_request_interface::POST)));  				$template->assign_vars(array(  					'S_UPLOAD'	=> true, @@ -187,12 +204,9 @@ class acp_language  					trigger_error($user->lang['FORM_INVALID']. adm_back_link($this->u_action), E_USER_WARNING);  				} -				if (!$lang_id || empty($_POST['entry'])) -				{ -					trigger_error($user->lang['NO_LANG_ID'] . adm_back_link($this->u_action), E_USER_WARNING); -				} +				$entry_value = $request->variable('entry', $request_default, true, phpbb_request_interface::POST); -				if ($this->language_directory != 'email' && !is_array($_POST['entry'])) +				if (!$lang_id || !$entry_value)  				{  					trigger_error($user->lang['NO_LANG_ID'] . adm_back_link($this->u_action), E_USER_WARNING);  				} @@ -291,10 +305,10 @@ class acp_language  					trigger_error(sprintf($user->lang['UNABLE_TO_WRITE_FILE'], $filename) . adm_back_link($this->u_action . '&id=' . $lang_id . '&action=details&language_file=' . urlencode($selected_lang_file)), E_USER_WARNING);  				} -				if ($this->language_directory == 'email') +				if ($language_file_type == 'email')  				{  					// Email Template -					$entry = $this->prepare_lang_entry($_POST['entry'], false); +					$entry = $this->prepare_lang_entry(htmlspecialchars_decode($entry_value), false);  					fwrite($fp, $entry);  				}  				else @@ -302,13 +316,13 @@ class acp_language  					$name = (($this->language_directory) ? $this->language_directory . '_' : '') . $this->language_file;  					$header = str_replace(array('{FILENAME}', '{LANG_NAME}', '{CHANGED}', '{AUTHOR}'), array($name, $row['lang_english_name'], date('Y-m-d', time()), $row['lang_author']), $this->language_file_header); -					if (strpos($this->language_file, 'help_') === 0) +					if ($language_file_type == 'help')  					{  						// Help File  						$header .= '$help = array(' . "\n";  						fwrite($fp, $header); -						foreach ($_POST['entry'] as $key => $value) +						foreach ($entry_value as $key => $value)  						{  							if (!is_array($value))  							{ @@ -319,7 +333,7 @@ class acp_language  							foreach ($value as $_key => $_value)  							{ -								$entry .= "\t\t" . (int) $_key . "\t=> '" . $this->prepare_lang_entry($_value) . "',\n"; +								$entry .= "\t\t" . (int) $_key . "\t=> '" . $this->prepare_lang_entry(htmlspecialchars_decode($_value)) . "',\n";  							}  							$entry .= "\t),\n"; @@ -329,15 +343,15 @@ class acp_language  						$footer = ");\n\n?>";  						fwrite($fp, $footer);  					} -					else +					else if ($language_file_type == 'normal')  					{  						// Language File  						$header .= $this->lang_header;  						fwrite($fp, $header); -						foreach ($_POST['entry'] as $key => $value) +						foreach ($entry_value as $key => $value)  						{ -							$entry = $this->format_lang_array($key, $value); +							$entry = $this->format_lang_array(htmlspecialchars_decode($key), htmlspecialchars_decode($value));  							fwrite($fp, $entry);  						} @@ -782,11 +796,6 @@ class acp_language  					$sql = 'DELETE FROM ' . PROFILE_FIELDS_LANG_TABLE . ' WHERE lang_id = ' . $lang_id;  					$db->sql_query($sql); -					$sql = 'DELETE FROM ' . STYLES_IMAGESET_DATA_TABLE . " WHERE image_lang = '" . $db->sql_escape($row['lang_iso']) . "'"; -					$result = $db->sql_query($sql); - -					$cache->destroy('sql', STYLES_IMAGESET_DATA_TABLE); -  					add_log('admin', 'LOG_LANGUAGE_PACK_DELETED', $row['lang_english_name']);  					trigger_error(sprintf($user->lang['LANGUAGE_PACK_DELETED'], $row['lang_english_name']) . adm_back_link($this->u_action)); @@ -851,66 +860,6 @@ class acp_language  				$db->sql_query('INSERT INTO ' . LANG_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary));  				$lang_id = $db->sql_nextid(); -				$valid_localized = array( -					'icon_back_top', 'icon_contact_aim', 'icon_contact_email', 'icon_contact_icq', 'icon_contact_jabber', 'icon_contact_msnm', 'icon_contact_pm', 'icon_contact_yahoo', 'icon_contact_www', 'icon_post_delete', 'icon_post_edit', 'icon_post_info', 'icon_post_quote', 'icon_post_report', 'icon_user_online', 'icon_user_offline', 'icon_user_profile', 'icon_user_search', 'icon_user_warn', 'button_pm_forward', 'button_pm_new', 'button_pm_reply', 'button_topic_locked', 'button_topic_new', 'button_topic_reply', -				); - -				$sql_ary = array(); - -				$sql = 'SELECT * -					FROM ' . STYLES_IMAGESET_TABLE; -				$result = $db->sql_query($sql); -				while ($imageset_row = $db->sql_fetchrow($result)) -				{ -					if (@file_exists("{$phpbb_root_path}styles/{$imageset_row['imageset_path']}/imageset/{$lang_pack['iso']}/imageset.cfg")) -					{ -						$cfg_data_imageset_data = parse_cfg_file("{$phpbb_root_path}styles/{$imageset_row['imageset_path']}/imageset/{$lang_pack['iso']}/imageset.cfg"); -						foreach ($cfg_data_imageset_data as $image_name => $value) -						{ -							if (strpos($value, '*') !== false) -							{ -								if (substr($value, -1, 1) === '*') -								{ -									list($image_filename, $image_height) = explode('*', $value); -									$image_width = 0; -								} -								else -								{ -									list($image_filename, $image_height, $image_width) = explode('*', $value); -								} -							} -							else -							{ -								$image_filename = $value; -								$image_height = $image_width = 0; -							} - -							if (strpos($image_name, 'img_') === 0 && $image_filename) -							{ -								$image_name = substr($image_name, 4); -								if (in_array($image_name, $valid_localized)) -								{ -									$sql_ary[] = array( -										'image_name'		=> (string) $image_name, -										'image_filename'	=> (string) $image_filename, -										'image_height'		=> (int) $image_height, -										'image_width'		=> (int) $image_width, -										'imageset_id'		=> (int) $imageset_row['imageset_id'], -										'image_lang'		=> (string) $lang_pack['iso'], -									); -								} -							} -						} -					} -				} -				$db->sql_freeresult($result); - -				if (sizeof($sql_ary)) -				{ -					$db->sql_multi_insert(STYLES_IMAGESET_DATA_TABLE, $sql_ary); -					$cache->destroy('sql', STYLES_IMAGESET_DATA_TABLE); -				} -  				// Now let's copy the default language entries for custom profile fields for this new language - makes admin's life easier.  				$sql = 'SELECT lang_id  					FROM ' . LANG_TABLE . " @@ -1186,10 +1135,9 @@ class acp_language  * {FILENAME} [{LANG_NAME}]  *  * @package language -* @version $' . 'Id: ' . '$  * @copyright (c) ' . date('Y') . ' phpBB Group  * @author {CHANGED} - {AUTHOR} -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -1461,5 +1409,3 @@ $lang = array_merge($lang, array(  		return $entry;  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/acp_logs.php b/phpBB/includes/acp/acp_logs.php index 2fc86e325f..6b67175220 100644 --- a/phpBB/includes/acp/acp_logs.php +++ b/phpBB/includes/acp/acp_logs.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -27,6 +26,7 @@ class acp_logs  	{  		global $db, $user, $auth, $template, $cache;  		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx; +		global $request;  		$user->add_lang('mcp'); @@ -35,8 +35,8 @@ class acp_logs  		$forum_id	= request_var('f', 0);  		$topic_id	= request_var('t', 0);  		$start		= request_var('start', 0); -		$deletemark = (!empty($_POST['delmarked'])) ? true : false; -		$deleteall	= (!empty($_POST['delall'])) ? true : false; +		$deletemark = $request->variable('delmarked', false, false, phpbb_request_interface::POST); +		$deleteall	= $request->variable('delall', false, false, phpbb_request_interface::POST);  		$marked		= request_var('mark', array(0));  		// Sort keys @@ -172,5 +172,3 @@ class acp_logs  		}  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/acp_main.php b/phpBB/includes/acp/acp_main.php index cffe296651..eb613535bf 100644 --- a/phpBB/includes/acp/acp_main.php +++ b/phpBB/includes/acp/acp_main.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -25,7 +24,7 @@ class acp_main  	function main($id, $mode)  	{ -		global $config, $db, $user, $auth, $template; +		global $config, $db, $user, $auth, $template, $request;  		global $phpbb_root_path, $phpbb_admin_path, $phpEx;  		// Show restore permissions notice @@ -130,6 +129,11 @@ class acp_main  						set_config('record_online_users', 1, true);  						set_config('record_online_date', time(), true);  						add_log('admin', 'LOG_RESET_ONLINE'); +						 +						if ($request->is_ajax()) +						{ +							trigger_error('RESET_ONLINE_SUCCESS'); +						}  					break;  					case 'stats': @@ -180,6 +184,11 @@ class acp_main  						update_last_username();  						add_log('admin', 'LOG_RESYNC_STATS'); +						 +						if ($request->is_ajax()) +						{ +							trigger_error('RESYNC_STATS_SUCCESS'); +						}  					break;  					case 'user': @@ -242,7 +251,11 @@ class acp_main  						}  						add_log('admin', 'LOG_RESYNC_POSTCOUNTS'); - +						 +						if ($request->is_ajax()) +						{ +							trigger_error('RESYNC_POSTCOUNTS_SUCCESS'); +						}  					break;  					case 'date': @@ -253,6 +266,11 @@ class acp_main  						set_config('board_startdate', time() - 1);  						add_log('admin', 'LOG_RESET_DATE'); +						 +						if ($request->is_ajax()) +						{ +							trigger_error('RESET_DATE_SUCCESS'); +						}  					break;  					case 'db_track': @@ -328,14 +346,14 @@ class acp_main  						}  						add_log('admin', 'LOG_RESYNC_POST_MARKING'); -					break; - -					case 'purge_cache': -						if ((int) $user->data['user_type'] !== USER_FOUNDER) +						 +						if ($request->is_ajax())  						{ -							trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING); +							trigger_error('RESYNC_POST_MARKING_SUCCESS');  						} +					break; +					case 'purge_cache':  						global $cache;  						$cache->purge(); @@ -344,6 +362,11 @@ class acp_main  						cache_moderators();  						add_log('admin', 'LOG_PURGE_CACHE'); +						 +						if ($request->is_ajax()) +						{ +							trigger_error('PURGE_CACHE_SUCCESS'); +						}  					break;  					case 'purge_sessions': @@ -390,6 +413,11 @@ class acp_main  						$db->sql_query($sql);  						add_log('admin', 'LOG_PURGE_SESSIONS'); +						 +						if ($request->is_ajax()) +						{ +							trigger_error('PURGE_SESSIONS_SUCCESS'); +						}  					break;  				}  			} @@ -621,5 +649,3 @@ class acp_main  		$this->page_title = 'ACP_MAIN';  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/acp_modules.php b/phpBB/includes/acp/acp_modules.php index 75bc5766a9..8528dc91c4 100644 --- a/phpBB/includes/acp/acp_modules.php +++ b/phpBB/includes/acp/acp_modules.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -37,7 +36,7 @@ class acp_modules  	function main($id, $mode)  	{ -		global $db, $user, $auth, $template, $module; +		global $db, $user, $auth, $template, $module, $request;  		global $config, $phpbb_admin_path, $phpbb_root_path, $phpEx;  		// Set a global define for modules we might include (the author is able to prevent execution of code by checking this constant) @@ -111,7 +110,7 @@ class acp_modules  				}  			break; -			 +  			case 'enable':  			case 'disable':  				if (!$module_id) @@ -170,7 +169,7 @@ class acp_modules  					add_log('admin', 'LOG_MODULE_' . strtoupper($action), $this->lang_name($row['module_langname']), $move_module_name);  					$this->remove_cache_file();  				} -		 +  			break;  			case 'quickadd': @@ -207,7 +206,7 @@ class acp_modules  						if (!sizeof($errors))  						{  							$this->remove_cache_file(); -	 +  							trigger_error($user->lang['MODULE_ADDED'] . adm_back_link($this->u_action . '&parent_id=' . $this->parent_id));  						}  					} @@ -231,7 +230,7 @@ class acp_modules  				{  					trigger_error($user->lang['NO_MODULE_ID'] . adm_back_link($this->u_action . '&parent_id=' . $this->parent_id), E_USER_WARNING);  				} -				 +  				$module_row = $this->get_module_row($module_id);  			// no break @@ -250,7 +249,7 @@ class acp_modules  						'module_auth'		=> '',  					);  				} -				 +  				$module_data = array();  				$module_data['module_basename'] = request_var('module_basename', (string) $module_row['module_basename']); @@ -295,7 +294,7 @@ class acp_modules  					if (!sizeof($errors))  					{  						$this->remove_cache_file(); -	 +  						trigger_error((($action == 'add') ? $user->lang['MODULE_ADDED'] : $user->lang['MODULE_EDITED']) . adm_back_link($this->u_action . '&parent_id=' . $this->parent_id));  					}  				} @@ -316,7 +315,7 @@ class acp_modules  					}  					// Name options -					$s_name_options .= '<option value="' . $option . '"' . (($option == $module_data['module_basename']) ? ' selected="selected"' : '') . '>' . $this->lang_name($values['title']) . ' [' . $this->module_class . '_' . $option . ']</option>'; +					$s_name_options .= '<option value="' . $option . '"' . (($option == $module_data['module_basename']) ? ' selected="selected"' : '') . '>' . $this->lang_name($values['title']) . ' [' . $option . ']</option>';  					$template->assign_block_vars('m_names', array('NAME' => $option, 'A_NAME' => addslashes($option))); @@ -327,7 +326,7 @@ class acp_modules  						{  							$s_mode_options .= '<option value="' . $m_mode . '"' . (($m_mode == $module_data['module_mode']) ? ' selected="selected"' : '') . '>' . $this->lang_name($m_values['title']) . '</option>';  						} -						 +  						$template->assign_block_vars('m_names.modes', array(  							'OPTION'		=> $m_mode,  							'VALUE'			=> $this->lang_name($m_values['title']), @@ -336,7 +335,7 @@ class acp_modules  						);  					}  				} -				 +  				$s_cat_option = '<option value="0"' . (($module_data['parent_id'] == 0) ? ' selected="selected"' : '') . '>' . $user->lang['NO_PARENT'] . '</option>';  				$template->assign_vars(array_merge(array( @@ -349,7 +348,7 @@ class acp_modules  					'U_EDIT_ACTION'		=> $this->u_action . '&parent_id=' . $this->parent_id,  					'L_TITLE'			=> $user->lang[strtoupper($action) . '_MODULE'], -					 +  					'MODULENAME'		=> $this->lang_name($module_data['module_langname']),  					'ACTION'			=> $action,  					'MODULE_ID'			=> $module_id, @@ -374,6 +373,15 @@ class acp_modules  		// Default management page  		if (sizeof($errors))  		{ +			if ($request->is_ajax()) +			{ +				$json_response = new phpbb_json_response; +				$json_response->send(array( +					'MESSAGE_TITLE'	=> $user->lang('ERROR'), +					'MESSAGE_TEXT'	=> implode('<br />', $errors), +				)); +			} +  			$template->assign_vars(array(  				'S_ERROR'	=> true,  				'ERROR_MSG'	=> implode('<br />', $errors)) @@ -480,7 +488,7 @@ class acp_modules  		foreach ($module_infos as $option => $values)  		{  			// Name options -			$s_install_options .= '<optgroup label="' . $this->lang_name($values['title']) . ' [' . $this->module_class . '_' . $option . ']">'; +			$s_install_options .= '<optgroup label="' . $this->lang_name($values['title']) . ' [' . $option . ']">';  			// Build module modes  			foreach ($values['modes'] as $m_mode => $m_values) @@ -516,7 +524,7 @@ class acp_modules  		$result = $db->sql_query($sql);  		$row = $db->sql_fetchrow($result);  		$db->sql_freeresult($result); -		 +  		if (!$row)  		{  			trigger_error($user->lang['NO_MODULE'] . adm_back_link($this->u_action . '&parent_id=' . $this->parent_id), E_USER_WARNING); @@ -524,14 +532,14 @@ class acp_modules  		return $row;  	} -	 +  	/**  	* Get available module information from module files  	*/  	function get_module_infos($module = '', $module_class = false)  	{  		global $phpbb_root_path, $phpEx; -		 +  		$module_class = ($module_class === false) ? $this->module_class : $module_class;  		$directory = $phpbb_root_path . 'includes/' . $module_class . '/info/'; @@ -539,57 +547,72 @@ class acp_modules  		if (!$module)  		{ -			$dh = @opendir($directory); +			global $phpbb_extension_manager; -			if (!$dh) -			{ -				return $fileinfo; -			} +			$finder = $phpbb_extension_manager->get_finder(); -			while (($file = readdir($dh)) !== false) +			$modules = $finder +				->extension_suffix('_module') +				->extension_directory("/$module_class") +				->core_path("includes/$module_class/info/") +				->core_prefix($module_class . '_') +				->get_classes(); + +			foreach ($modules as $module)  			{ -				// Is module? -				if (preg_match('/^' . $module_class . '_.+\.' . $phpEx . '$/', $file)) -				{ -					$class = str_replace(".$phpEx", '', $file) . '_info'; +				$info_class = preg_replace('/_module$/', '_info', $module); -					if (!class_exists($class)) +				// If the class does not exist it might be following the old +				// format. phpbb_acp_info_acp_foo needs to be turned into +				// acp_foo_info and the respective file has to be included +				// manually because it does not support auto loading +				if (!class_exists($info_class)) +				{ +					$info_class = str_replace("phpbb_{$module_class}_info_", '', $module) . '_info'; +					if (file_exists($directory . $info_class . '.' . $phpEx))  					{ -						include($directory . $file); +						include($directory . $info_class . '.' . $phpEx);  					} +				} -					// Get module title tag -					if (class_exists($class)) -					{ -						$c_class = new $class(); -						$module_info = $c_class->module(); -						$fileinfo[str_replace($module_class . '_', '', $module_info['filename'])] = $module_info; -					} +				if (class_exists($info_class)) +				{ +					$info = new $info_class(); +					$module_info = $info->module(); + +					$main_class = (isset($module_info['filename'])) ? $module_info['filename'] : $module; + +					$fileinfo[$main_class] = $module_info;  				}  			} -			closedir($dh);  			ksort($fileinfo);  		}  		else  		{ -			$filename = $module_class . '_' . basename($module); -			$class = $module_class . '_' . basename($module) . '_info'; +			$info_class = preg_replace('/_module$/', '_info', $module); -			if (!class_exists($class)) +			if (!class_exists($info_class))  			{ -				include($directory . $filename . '.' . $phpEx); +				if (file_exists($directory . $module . '.' . $phpEx)) +				{ +					include($directory . $module . '.' . $phpEx); +				} +				$info_class = $module . '_info';  			}  			// Get module title tag -			if (class_exists($class)) +			if (class_exists($info_class))  			{ -				$c_class = new $class(); -				$module_info = $c_class->module(); -				$fileinfo[str_replace($module_class . '_', '', $module_info['filename'])] = $module_info; +				$info = new $info_class(); +				$module_info = $info->module(); + +				$main_class = (isset($module_info['filename'])) ? $module_info['filename'] : $module; + +				$fileinfo[$main_class] = $module_info;  			}  		} -		 +  		return $fileinfo;  	} @@ -721,7 +744,7 @@ class acp_modules  		// Sanitise for future path use, it's escaped as appropriate for queries  		$p_class = str_replace(array('.', '/', '\\'), '', basename($this->module_class)); -		 +  		$cache->destroy('_modules_' . $p_class);  		// Additionally remove sql cache @@ -1061,5 +1084,3 @@ class acp_modules  		return $this->lang_name($target['module_langname']);  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/acp_permission_roles.php b/phpBB/includes/acp/acp_permission_roles.php index 03ea5a39dd..004187af84 100644 --- a/phpBB/includes/acp/acp_permission_roles.php +++ b/phpBB/includes/acp/acp_permission_roles.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -567,5 +566,3 @@ class acp_permission_roles  		$auth_admin->acl_clear_prefetch();  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/acp_permissions.php b/phpBB/includes/acp/acp_permissions.php index e9f0af5071..d728744c04 100644 --- a/phpBB/includes/acp/acp_permissions.php +++ b/phpBB/includes/acp/acp_permissions.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -658,6 +657,7 @@ class acp_permissions  	function set_permissions($mode, $permission_type, &$auth_admin, &$user_id, &$group_id)  	{  		global $user, $auth; +		global $request;  		$psubmit = request_var('psubmit', array(0 => array(0 => 0))); @@ -676,18 +676,17 @@ class acp_permissions  		list($ug_id, ) = each($psubmit);  		list($forum_id, ) = each($psubmit[$ug_id]); -		if (empty($_POST['setting']) || empty($_POST['setting'][$ug_id]) || empty($_POST['setting'][$ug_id][$forum_id]) || !is_array($_POST['setting'][$ug_id][$forum_id])) +		$settings = $request->variable('setting', array(0 => array(0 => array('' => 0))), false, phpbb_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);  		} -		// We obtain and check $_POST['setting'][$ug_id][$forum_id] directly and not using request_var() because request_var() -		// currently does not support the amount of dimensions required. ;) -		//		$auth_settings = request_var('setting', array(0 => array(0 => array('' => 0)))); -		$auth_settings = array_map('intval', $_POST['setting'][$ug_id][$forum_id]); +		$auth_settings = $settings[$ug_id][$forum_id];  		// Do we have a role we want to set? -		$assigned_role = (isset($_POST['role'][$ug_id][$forum_id])) ? (int) $_POST['role'][$ug_id][$forum_id] : 0; +		$roles = $request->variable('role', array(0 => array(0 => 0)), false, phpbb_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))); @@ -747,6 +746,7 @@ class acp_permissions  	function set_all_permissions($mode, $permission_type, &$auth_admin, &$user_id, &$group_id)  	{  		global $user, $auth; +		global $request;  		// User or group to be set?  		$ug_type = (sizeof($user_id)) ? 'user' : 'group'; @@ -757,8 +757,8 @@ class acp_permissions  			trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);  		} -		$auth_settings = (isset($_POST['setting'])) ? $_POST['setting'] : array(); -		$auth_roles = (isset($_POST['role'])) ? $_POST['role'] : array(); +		$auth_settings = $request->variable('setting', array(0 => array(0 => array('' => 0))), false, phpbb_request_interface::POST); +		$auth_roles = $request->variable('role', array(0 => array(0 => 0)), false, phpbb_request_interface::POST);  		$ug_ids = $forum_ids = array();  		// We need to go through the auth settings @@ -1105,7 +1105,7 @@ class acp_permissions  		{  			if ($user_id != $user->data['user_id'])  			{ -				$auth2 = new auth(); +				$auth2 = new phpbb_auth();  				$auth2->acl($userdata);  				$auth_setting = $auth2->acl_get($permission);  			} @@ -1311,5 +1311,3 @@ class acp_permissions  		);  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/acp_php_info.php b/phpBB/includes/acp/acp_php_info.php index 7dd345971a..125b77529f 100644 --- a/phpBB/includes/acp/acp_php_info.php +++ b/phpBB/includes/acp/acp_php_info.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -88,5 +87,3 @@ class acp_php_info  		return '<a name="' . str_replace(' ', '_', $matches[1]) . '">';  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/acp_profile.php b/phpBB/includes/acp/acp_profile.php index a591474fce..3ffffd3047 100644 --- a/phpBB/includes/acp/acp_profile.php +++ b/phpBB/includes/acp/acp_profile.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -30,6 +29,7 @@ class acp_profile  	{  		global $config, $db, $user, $auth, $template, $cache;  		global $phpbb_root_path, $phpbb_admin_path, $phpEx, $table_prefix; +		global $request;  		include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);  		include($phpbb_root_path . 'includes/functions_user.' . $phpEx); @@ -242,6 +242,15 @@ class acp_profile  				$db->sql_freeresult($result);  				add_log('admin', 'LOG_PROFILE_FIELD_ACTIVATE', $field_ident); + +				if ($request->is_ajax()) +				{ +					$json_response = new phpbb_json_response(); +					$json_response->send(array( +						'text'	=> $user->lang('DEACTIVATE'), +					)); +				} +  				trigger_error($user->lang['PROFILE_FIELD_ACTIVATED'] . adm_back_link($this->u_action));  			break; @@ -266,7 +275,16 @@ class acp_profile  				$field_ident = (string) $db->sql_fetchfield('field_ident');  				$db->sql_freeresult($result); +				if ($request->is_ajax()) +				{ +					$json_response = new phpbb_json_response(); +					$json_response->send(array( +						'text'	=> $user->lang('ACTIVATE'), +					)); +				} +  				add_log('admin', 'LOG_PROFILE_FIELD_DEACTIVATE', $field_ident); +  				trigger_error($user->lang['PROFILE_FIELD_DEACTIVATED'] . adm_back_link($this->u_action));  			break; @@ -369,6 +387,7 @@ class acp_profile  						'field_show_profile'=> 0,  						'field_no_view'		=> 0,  						'field_show_on_reg'	=> 0, +						'field_show_on_pm'	=> 0,  						'field_show_on_vt'	=> 0,  						'lang_name'			=> utf8_normalize_nfc(request_var('field_ident', '', true)),  						'lang_explain'		=> '', @@ -380,7 +399,7 @@ class acp_profile  				// $exclude contains the data we gather in each step  				$exclude = array( -					1	=> array('field_ident', 'lang_name', 'lang_explain', 'field_option_none', 'field_show_on_reg', 'field_show_on_vt', 'field_required', 'field_hide', 'field_show_profile', 'field_no_view'), +					1	=> array('field_ident', 'lang_name', 'lang_explain', 'field_option_none', 'field_show_on_reg', 'field_show_on_pm', 'field_show_on_vt', 'field_required', 'field_hide', 'field_show_profile', 'field_no_view'),  					2	=> array('field_length', 'field_maxlen', 'field_minlen', 'field_validation', 'field_novalue', 'field_default_value'),  					3	=> array('l_lang_name', 'l_lang_explain', 'l_lang_default_value', 'l_lang_options')  				); @@ -406,6 +425,7 @@ class acp_profile  				$visibility_ary = array(  					'field_required',  					'field_show_on_reg', +					'field_show_on_pm',  					'field_show_on_vt',  					'field_show_profile',  					'field_hide', @@ -487,7 +507,8 @@ class acp_profile  							$cp->vars['field_default_value_day'] = $now['mday'];  							$cp->vars['field_default_value_month'] = $now['mon'];  							$cp->vars['field_default_value_year'] = $now['year']; -							$var = $_POST['field_default_value'] = 'now'; +							$var = 'now'; +							$request->overwrite('field_default_value', $var, phpbb_request_interface::POST);  						}  						else  						{ @@ -496,7 +517,8 @@ class acp_profile  								$cp->vars['field_default_value_day'] = request_var('field_default_value_day', 0);  								$cp->vars['field_default_value_month'] = request_var('field_default_value_month', 0);  								$cp->vars['field_default_value_year'] = request_var('field_default_value_year', 0); -								$var = $_POST['field_default_value'] = sprintf('%2d-%2d-%4d', $cp->vars['field_default_value_day'], $cp->vars['field_default_value_month'], $cp->vars['field_default_value_year']); +								$var = sprintf('%2d-%2d-%4d', $cp->vars['field_default_value_day'], $cp->vars['field_default_value_month'], $cp->vars['field_default_value_year']); +								$request->overwrite('field_default_value', $var, phpbb_request_interface::POST);  							}  							else  							{ @@ -715,7 +737,7 @@ class acp_profile  							}  							else  							{ -								$_new_key_ary[$key] = (is_array($_REQUEST[$key])) ? utf8_normalize_nfc(request_var($key, array(''), true)) : utf8_normalize_nfc(request_var($key, '', true)); +								$_new_key_ary[$key] = ($field_type == FIELD_BOOL && $key == 'lang_options') ? utf8_normalize_nfc(request_var($key, array(''), true)) : utf8_normalize_nfc(request_var($key, '', true));  							}  						}  					} @@ -758,6 +780,7 @@ class acp_profile  							'S_STEP_ONE'		=> true,  							'S_FIELD_REQUIRED'	=> ($cp->vars['field_required']) ? true : false,  							'S_SHOW_ON_REG'		=> ($cp->vars['field_show_on_reg']) ? true : false, +							'S_SHOW_ON_PM'		=> ($cp->vars['field_show_on_pm']) ? true : false,  							'S_SHOW_ON_VT'		=> ($cp->vars['field_show_on_vt']) ? true : false,  							'S_FIELD_HIDE'		=> ($cp->vars['field_hide']) ? true : false,  							'S_SHOW_PROFILE'	=> ($cp->vars['field_show_profile']) ? true : false, @@ -1074,6 +1097,7 @@ class acp_profile  			'field_validation'		=> $cp->vars['field_validation'],  			'field_required'		=> $cp->vars['field_required'],  			'field_show_on_reg'		=> $cp->vars['field_show_on_reg'], +			'field_show_on_pm'		=> $cp->vars['field_show_on_pm'],  			'field_show_on_vt'		=> $cp->vars['field_show_on_vt'],  			'field_hide'			=> $cp->vars['field_hide'],  			'field_show_profile'	=> $cp->vars['field_show_profile'], @@ -1649,5 +1673,3 @@ class acp_profile  		return $sql;  	}  } - -?> diff --git a/phpBB/includes/acp/acp_prune.php b/phpBB/includes/acp/acp_prune.php index ffe20f86f5..240e3596ba 100644 --- a/phpBB/includes/acp/acp_prune.php +++ b/phpBB/includes/acp/acp_prune.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -462,5 +461,3 @@ class acp_prune  		$db->sql_freeresult($result);  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/acp_ranks.php b/phpBB/includes/acp/acp_ranks.php index ea057cd84c..d9ed5b17f1 100644 --- a/phpBB/includes/acp/acp_ranks.php +++ b/phpBB/includes/acp/acp_ranks.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -25,7 +24,7 @@ class acp_ranks  	function main($id, $mode)  	{ -		global $db, $user, $auth, $template, $cache; +		global $db, $user, $auth, $template, $cache, $request;  		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;  		$user->add_lang('acp/posting'); @@ -123,6 +122,18 @@ class acp_ranks  					$cache->destroy('_ranks');  					add_log('admin', 'LOG_RANK_REMOVED', $rank_title); +					 +					if ($request->is_ajax()) +					{ +						$json_response = new phpbb_json_response; +						$json_response->send(array( +							'MESSAGE_TITLE'	=> $user->lang['INFORMATION'], +							'MESSAGE_TEXT'	=> $user->lang['RANK_REMOVED'], +							'REFRESH_DATA'	=> array( +								'time'	=> 3 +							) +						)); +					}  				}  				else  				{ @@ -236,5 +247,3 @@ class acp_ranks  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/acp_reasons.php b/phpBB/includes/acp/acp_reasons.php index dbc9fcb6cc..479fcfba81 100644 --- a/phpBB/includes/acp/acp_reasons.php +++ b/phpBB/includes/acp/acp_reasons.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -371,5 +370,3 @@ class acp_reasons  		$db->sql_freeresult($result);  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/acp_search.php b/phpBB/includes/acp/acp_search.php index 0cd67b1c34..54a3e7aaa1 100644 --- a/phpBB/includes/acp/acp_search.php +++ b/phpBB/includes/acp/acp_search.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -77,7 +76,8 @@ class acp_search  				continue;  			} -			$name = ucfirst(strtolower(str_replace('_', ' ', $type))); +			$name = $search->get_name(); +  			$selected = ($config['search_type'] == $type) ? ' selected="selected"' : '';  			$search_options .= '<option value="' . $type . '"' . $selected . '>' . $name . '</option>'; @@ -232,15 +232,7 @@ class acp_search  		global $db, $user, $auth, $template, $cache;  		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx; -		if (isset($_REQUEST['action']) && is_array($_REQUEST['action'])) -		{ -			$action = request_var('action', array('' => false)); -			$action = key($action); -		} -		else -		{ -			$action = request_var('action', ''); -		} +		$action = request_var('action', '');  		$this->state = explode(',', $config['search_indexing_state']);  		if (isset($_POST['cancel'])) @@ -283,7 +275,7 @@ class acp_search  			{  				trigger_error($error . adm_back_link($this->u_action), E_USER_WARNING);  			} -			$name = ucfirst(strtolower(str_replace('_', ' ', $this->state[0]))); +			$name = $this->search->get_name();  			$action = &$this->state[1]; @@ -345,7 +337,7 @@ class acp_search  							$totaltime = $mtime[0] + $mtime[1] - $starttime;  							$rows_per_second = $row_count / $totaltime;  							meta_refresh(1, append_sid($this->u_action . '&action=delete&skip_rows=' . $post_counter)); -							trigger_error(sprintf($user->lang['SEARCH_INDEX_DELETE_REDIRECT'], $post_counter, $row_count, $rows_per_second)); +							trigger_error($user->lang('SEARCH_INDEX_DELETE_REDIRECT', (int) $row_count, $post_counter, $rows_per_second));  						}  					} @@ -405,9 +397,8 @@ class acp_search  							$i = 0;  							while ($row = ($buffer ? $rows[$i++] : $db->sql_fetchrow($result)))  							{ -								// Indexing enabled for this forum or global announcement? -								// Global announcements get indexed by default. -								if (!$row['forum_id'] || (isset($forums[$row['forum_id']]) && $forums[$row['forum_id']])) +								// Indexing enabled for this forum +								if (isset($forums[$row['forum_id']]) && $forums[$row['forum_id']])  								{  									$this->search->index('post', $row['post_id'], $row['post_text'], $row['post_subject'], $row['poster_id'], $row['forum_id']);  								} @@ -436,7 +427,7 @@ class acp_search  							$totaltime = $mtime[0] + $mtime[1] - $starttime;  							$rows_per_second = $row_count / $totaltime;  							meta_refresh(1, append_sid($this->u_action . '&action=create&skip_rows=' . $post_counter)); -							trigger_error(sprintf($user->lang['SEARCH_INDEX_CREATE_REDIRECT'], $post_counter, $row_count, $rows_per_second)); +							trigger_error($user->lang('SEARCH_INDEX_CREATE_REDIRECT', (int) $row_count, $post_counter) . $user->lang('SEARCH_INDEX_CREATE_REDIRECT_RATE', $rows_per_second));  						}  					} @@ -463,7 +454,7 @@ class acp_search  				continue;  			} -			$name = ucfirst(strtolower(str_replace('_', ' ', $type))); +			$name = $search->get_name();  			$data = array();  			if (method_exists($search, 'index_stats')) @@ -562,27 +553,15 @@ class acp_search  	function get_search_types()  	{ -		global $phpbb_root_path, $phpEx; - -		$search_types = array(); +		global $phpbb_root_path, $phpEx, $phpbb_extension_manager; -		$dp = @opendir($phpbb_root_path . 'includes/search'); +		$finder = $phpbb_extension_manager->get_finder(); -		if ($dp) -		{ -			while (($file = readdir($dp)) !== false) -			{ -				if ((preg_match('#\.' . $phpEx . '$#', $file)) && ($file != "search.$phpEx")) -				{ -					$search_types[] = preg_replace('#^(.*?)\.' . $phpEx . '$#', '\1', $file); -				} -			} -			closedir($dp); - -			sort($search_types); -		} - -		return $search_types; +		return $finder +			->extension_suffix('_backend') +			->extension_directory('/search') +			->core_path('includes/search/') +			->get_classes();  	}  	function get_max_post_id() @@ -619,15 +598,7 @@ class acp_search  	{  		global $phpbb_root_path, $phpEx, $user; -		if (!preg_match('#^\w+$#', $type) || !file_exists("{$phpbb_root_path}includes/search/$type.$phpEx")) -		{ -			$error = $user->lang['NO_SUCH_SEARCH_MODULE']; -			return $error; -		} - -		include_once("{$phpbb_root_path}includes/search/$type.$phpEx"); - -		if (!class_exists($type)) +		if (!class_exists($type) || !method_exists($type, 'get_name'))  		{  			$error = $user->lang['NO_SUCH_SEARCH_MODULE'];  			return $error; @@ -639,5 +610,3 @@ class acp_search  		return $error;  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/acp_send_statistics.php b/phpBB/includes/acp/acp_send_statistics.php index b3baf54983..4421fbef18 100644 --- a/phpBB/includes/acp/acp_send_statistics.php +++ b/phpBB/includes/acp/acp_send_statistics.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -16,8 +15,6 @@ if (!defined('IN_PHPBB'))  	exit;  } -include($phpbb_root_path . 'includes/questionnaire/questionnaire.' . $phpEx); -  /**  * @package acp  */ @@ -27,7 +24,9 @@ class acp_send_statistics  	function main($id, $mode)  	{ -		global $config, $template, $phpbb_admin_path, $phpEx; +		global $config, $template, $phpbb_admin_path, $phpbb_root_path, $phpEx; + +		include($phpbb_root_path . 'includes/questionnaire/questionnaire.' . $phpEx);  		$collect_url = "http://www.phpbb.com/stats/receive_stats.php"; @@ -86,5 +85,3 @@ class acp_send_statistics  		}  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/acp_styles.php b/phpBB/includes/acp/acp_styles.php index d7b0484af8..de1f678e38 100644 --- a/phpBB/includes/acp/acp_styles.php +++ b/phpBB/includes/acp/acp_styles.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -21,3952 +20,1285 @@ if (!defined('IN_PHPBB'))  */  class acp_styles  { -	var $u_action; - -	var $style_cfg; -	var $template_cfg; -	var $theme_cfg; -	var $imageset_cfg; -	var $imageset_keys; - -	function main($id, $mode) +	public $u_action; +	 +	protected $u_base_action; +	protected $s_hidden_fields; +	protected $mode; +	protected $styles_path; +	protected $styles_path_absolute = 'styles'; +	protected $default_style = 0; + +	protected $db; +	protected $user; +	protected $template; +	protected $request; +	protected $cache; +	protected $auth; +	protected $phpbb_root_path; +	protected $phpEx; + +	public function main($id, $mode)  	{ -		global $db, $user, $auth, $template, $cache; -		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx; - -		// Hardcoded template bitfield to add for new templates -		$bitfield = new bitfield(); -		$bitfield->set(0); -		$bitfield->set(1); -		$bitfield->set(2); -		$bitfield->set(3); -		$bitfield->set(4); -		$bitfield->set(8); -		$bitfield->set(9); -		$bitfield->set(11); -		$bitfield->set(12); -		define('TEMPLATE_BITFIELD', $bitfield->get_base64()); -		unset($bitfield); +		global $db, $user, $phpbb_admin_path, $phpbb_root_path, $phpEx, $template, $request, $cache, $auth, $config; + +		$this->db = $db; +		$this->user = $user; +		$this->template = $template; +		$this->request = $request; +		$this->cache = $cache; +		$this->auth = $auth; +		$this->config = $config; +		$this->phpbb_root_path = $phpbb_root_path; +		$this->phpEx = $phpEx; + +		$this->default_style = $config['default_style']; +		$this->styles_path = $this->phpbb_root_path . $this->styles_path_absolute . '/'; + +		$this->u_base_action = append_sid("{$phpbb_admin_path}index.$phpEx", "i={$id}"); +		$this->s_hidden_fields = array( +			'mode'		=> $mode, +		); -		$user->add_lang('acp/styles'); +		$this->user->add_lang('acp/styles');  		$this->tpl_name = 'acp_styles';  		$this->page_title = 'ACP_CAT_STYLES'; +		$this->mode = $mode; + +		$action = $this->request->variable('action', ''); +		$post_actions = array('install', 'activate', 'deactivate', 'uninstall'); +		foreach ($post_actions as $key) +		{ +			if (isset($_POST[$key])) +			{ +				$action = $key; +			} +		} +		if ($action != '') +		{ +			$this->s_hidden_fields['action'] = $action; +		} -		$action = request_var('action', ''); -		$action = (isset($_POST['add'])) ? 'add' : $action; -		$style_id = request_var('id', 0); - -		// Fill the configuration variables -		$this->style_cfg = $this->template_cfg = $this->theme_cfg = $this->imageset_cfg = ' -# -# phpBB {MODE} configuration file -# -# @package phpBB3 -# @copyright (c) 2005 phpBB Group -# @license http://opensource.org/licenses/gpl-license.php GNU Public License -# -# -# At the left is the name, please do not change this -# At the right the value is entered -# For on/off options the valid values are on, off, 1, 0, true and false -# -# Values get trimmed, if you want to add a space in front or at the end of -# the value, then enclose the value with single or double quotes. -# Single and double quotes do not need to be escaped. -# -# - -# General Information about this {MODE} -name = {NAME} -copyright = {COPYRIGHT} -version = {VERSION} -'; - -		$this->theme_cfg .= ' -# Some configuration options - -# -# You have to turn this option on if you want to use the -# path template variables ({T_IMAGESET_PATH} for example) within -# your css file. -# This is mostly the case if you want to use language specific -# images within your css file. -# -parse_css_file = {PARSE_CSS_FILE} -'; - -		$this->template_cfg .= ' -# Some configuration options - -# Template inheritance -# See http://blog.phpbb.com/2008/07/31/templating-just-got-easier/ -# Set value to empty or this template name to ignore template inheritance. -inherit_from = {INHERIT_FROM} -'; - -		$this->imageset_keys = array( -			'logos' => array( -				'site_logo', -			), -			'buttons'	=> array( -				'icon_back_top', 'icon_contact_aim', 'icon_contact_email', 'icon_contact_icq', 'icon_contact_jabber', 'icon_contact_msnm', 'icon_contact_pm', 'icon_contact_yahoo', 'icon_contact_www', 'icon_post_delete', 'icon_post_edit', 'icon_post_info', 'icon_post_quote', 'icon_post_report', 'icon_user_online', 'icon_user_offline', 'icon_user_profile', 'icon_user_search', 'icon_user_warn', 'button_pm_forward', 'button_pm_new', 'button_pm_reply', 'button_topic_locked', 'button_topic_new', 'button_topic_reply', -			), -			'icons'		=> array( -				'icon_post_target', 'icon_post_target_unread', 'icon_topic_attach', 'icon_topic_latest', 'icon_topic_newest', 'icon_topic_reported', 'icon_topic_unapproved', 'icon_friend', 'icon_foe', -			), -			'forums'	=> array( -				'forum_link', 'forum_read', 'forum_read_locked', 'forum_read_subforum', 'forum_unread', 'forum_unread_locked', 'forum_unread_subforum', 'subforum_read', 'subforum_unread' -			), -			'folders'	=> array( -				'topic_moved', 'topic_read', 'topic_read_mine', 'topic_read_hot', 'topic_read_hot_mine', 'topic_read_locked', 'topic_read_locked_mine', 'topic_unread', 'topic_unread_mine', 'topic_unread_hot', 'topic_unread_hot_mine', 'topic_unread_locked', 'topic_unread_locked_mine', 'sticky_read', 'sticky_read_mine', 'sticky_read_locked', 'sticky_read_locked_mine', 'sticky_unread', 'sticky_unread_mine', 'sticky_unread_locked', 'sticky_unread_locked_mine', 'announce_read', 'announce_read_mine', 'announce_read_locked', 'announce_read_locked_mine', 'announce_unread', 'announce_unread_mine', 'announce_unread_locked', 'announce_unread_locked_mine', 'global_read', 'global_read_mine', 'global_read_locked', 'global_read_locked_mine', 'global_unread', 'global_unread_mine', 'global_unread_locked', 'global_unread_locked_mine', 'pm_read', 'pm_unread', -			), -			'polls'		=> array( -				'poll_left', 'poll_center', 'poll_right', -			), -			'ui'		=> array( -				'upload_bar', -			), -			'user'		=> array( -				'user_icon1', 'user_icon2', 'user_icon3', 'user_icon4', 'user_icon5', 'user_icon6', 'user_icon7', 'user_icon8', 'user_icon9', 'user_icon10', -			), +		$this->template->assign_vars(array( +			'U_ACTION'			=> $this->u_base_action, +			'S_HIDDEN_FIELDS'	=> build_hidden_fields($this->s_hidden_fields) +			)  		); -		// Execute overall actions +		// Execute actions  		switch ($action)  		{ -			case 'delete': -				if ($style_id) -				{ -					$this->remove($mode, $style_id); -					return; -				} -			break; - -			case 'export': -				if ($style_id) -				{ -					$this->export($mode, $style_id); -					return; -				} -			break; -  			case 'install': -				$this->install($mode); +				$this->action_install();  				return; -			break; - -			case 'add': -				$this->add($mode); +			case 'uninstall': +				$this->action_uninstall(); +				return; +			case 'activate': +				$this->action_activate(); +				return; +			case 'deactivate': +				$this->action_deactivate();  				return; -			break; -  			case 'details': -				if ($style_id) -				{ -					$this->details($mode, $style_id); -					return; -				} -			break; - -			case 'edit': -				if ($style_id) -				{ -					switch ($mode) -					{ -						case 'imageset': -							return $this->edit_imageset($style_id); -						case 'template': -							return $this->edit_template($style_id); -						case 'theme': -							return $this->edit_theme($style_id); -					} -				} -			break; - -			case 'cache': -				if ($style_id) -				{ -					switch ($mode) -					{ -						case 'template': -							return $this->template_cache($style_id); -					} -				} -			break; -		} - -		switch ($mode) -		{ -			case 'style': - -				switch ($action) -				{ -					case 'activate': -					case 'deactivate': - -						if ($style_id == $config['default_style']) -						{ -							trigger_error($user->lang['DEACTIVATE_DEFAULT'] . adm_back_link($this->u_action), E_USER_WARNING); -						} - -						if (($action == 'deactivate' && confirm_box(true)) || $action == 'activate') -						{ -							$sql = 'UPDATE ' . STYLES_TABLE . ' -								SET style_active = ' . (($action == 'activate') ? 1 : 0) . ' -								WHERE style_id = ' . $style_id; -							$db->sql_query($sql); - -							// Set style to default for any member using deactivated style -							if ($action == 'deactivate') -							{ -								$sql = 'UPDATE ' . USERS_TABLE . ' -									SET user_style = ' . $config['default_style'] . " -									WHERE user_style = $style_id"; -								$db->sql_query($sql); - -								$sql = 'UPDATE ' . FORUMS_TABLE . ' -									SET forum_style = 0 -									WHERE forum_style = ' . $style_id; -								$db->sql_query($sql); -							} -						} -						else if ($action == 'deactivate') -						{ -							$s_hidden_fields = array( -								'i'			=> $id, -								'mode'		=> $mode, -								'action'	=> $action, -								'style_id'	=> $style_id, -							); -							confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields($s_hidden_fields)); -						} -					break; -				} - -				$this->frontend('style', array('details'), array('export', 'delete')); -			break; - -			case 'template': - -				switch ($action) -				{ -					// Refresh template data stored in db and clear cache -					case 'refresh': - -						$sql = 'SELECT * -							FROM ' . STYLES_TEMPLATE_TABLE . " -							WHERE template_id = $style_id"; -						$result = $db->sql_query($sql); -						$template_row = $db->sql_fetchrow($result); -						$db->sql_freeresult($result); - -						if (!$template_row) -						{ -							trigger_error($user->lang['NO_TEMPLATE'] . adm_back_link($this->u_action), E_USER_WARNING); -						} - -						if (confirm_box(true)) -						{ -							$template_refreshed = ''; - -							// Only refresh database if the template is stored in the database -							if ($template_row['template_storedb'] && file_exists("{$phpbb_root_path}styles/{$template_row['template_path']}/template/")) -							{ -								$filelist = array('' => array()); - -								$sql = 'SELECT template_filename, template_mtime -									FROM ' . STYLES_TEMPLATE_DATA_TABLE . " -									WHERE template_id = $style_id"; -								$result = $db->sql_query($sql); - -								while ($row = $db->sql_fetchrow($result)) -								{ -//									if (@filemtime("{$phpbb_root_path}styles/{$template_row['template_path']}/template/" . $row['template_filename']) > $row['template_mtime']) -//									{ -										// get folder info from the filename -										if (($slash_pos = strrpos($row['template_filename'], '/')) === false) -										{ -											$filelist[''][] = $row['template_filename']; -										} -										else -										{ -											$filelist[substr($row['template_filename'], 0, $slash_pos + 1)][] = substr($row['template_filename'], $slash_pos + 1, strlen($row['template_filename']) - $slash_pos - 1); -										} -//									} -								} -								$db->sql_freeresult($result); - -								$this->store_templates('update', $style_id, $template_row['template_path'], $filelist); -								unset($filelist); - -								$template_refreshed = $user->lang['TEMPLATE_REFRESHED'] . '<br />'; -								add_log('admin', 'LOG_TEMPLATE_REFRESHED', $template_row['template_name']); -							} - -							$this->clear_template_cache($template_row); - -							trigger_error($template_refreshed . $user->lang['TEMPLATE_CACHE_CLEARED'] . adm_back_link($this->u_action)); -						} -						else -						{ -							confirm_box(false, ($template_row['template_storedb']) ? $user->lang['CONFIRM_TEMPLATE_REFRESH'] : $user->lang['CONFIRM_TEMPLATE_CLEAR_CACHE'], build_hidden_fields(array( -								'i'			=> $id, -								'mode'		=> $mode, -								'action'	=> $action, -								'id'		=> $style_id -							))); -						} - -					break; -				} - -				$this->frontend('template', array('edit', 'cache', 'details'), array('refresh', 'export', 'delete')); -			break; - -			case 'theme': - -				switch ($action) -				{ -					// Refresh theme data stored in the database -					case 'refresh': - -						$sql = 'SELECT * -							FROM ' . STYLES_THEME_TABLE . " -							WHERE theme_id = $style_id"; -						$result = $db->sql_query($sql); -						$theme_row = $db->sql_fetchrow($result); -						$db->sql_freeresult($result); - -						if (!$theme_row) -						{ -							trigger_error($user->lang['NO_THEME'] . adm_back_link($this->u_action), E_USER_WARNING); -						} - -						if (!$theme_row['theme_storedb']) -						{ -							trigger_error($user->lang['THEME_ERR_REFRESH_FS'] . adm_back_link($this->u_action), E_USER_WARNING); -						} - -						if (confirm_box(true)) -						{ -							if ($theme_row['theme_storedb'] && file_exists("{$phpbb_root_path}styles/{$theme_row['theme_path']}/theme/stylesheet.css")) -							{ -								// Save CSS contents -								$sql_ary = array( -									'theme_mtime'	=> (int) filemtime("{$phpbb_root_path}styles/{$theme_row['theme_path']}/theme/stylesheet.css"), -									'theme_data'	=> $this->db_theme_data($theme_row) -								); - -								$sql = 'UPDATE ' . STYLES_THEME_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . " -									WHERE theme_id = $style_id"; -								$db->sql_query($sql); - -								$cache->destroy('sql', STYLES_THEME_TABLE); - -								add_log('admin', 'LOG_THEME_REFRESHED', $theme_row['theme_name']); -								trigger_error($user->lang['THEME_REFRESHED'] . adm_back_link($this->u_action)); -							} -						} -						else -						{ -							confirm_box(false, $user->lang['CONFIRM_THEME_REFRESH'], build_hidden_fields(array( -								'i'			=> $id, -								'mode'		=> $mode, -								'action'	=> $action, -								'id'		=> $style_id -							))); -						} -					break; -				} - -				$this->frontend('theme', array('edit', 'details'), array('refresh', 'export', 'delete')); -			break; - -			case 'imageset': - -				switch ($action) -				{ -					case 'refresh': - -						$sql = 'SELECT * -							FROM ' . STYLES_IMAGESET_TABLE . " -							WHERE imageset_id = $style_id"; -						$result = $db->sql_query($sql); -						$imageset_row = $db->sql_fetchrow($result); -						$db->sql_freeresult($result); - -						if (!$imageset_row) -						{ -							trigger_error($user->lang['NO_IMAGESET'] . adm_back_link($this->u_action), E_USER_WARNING); -						} - -						if (confirm_box(true)) -						{ -							$sql_ary = array(); - -							$imageset_definitions = array(); -							foreach ($this->imageset_keys as $topic => $key_array) -							{ -								$imageset_definitions = array_merge($imageset_definitions, $key_array); -							} - -							$cfg_data_imageset = parse_cfg_file("{$phpbb_root_path}styles/{$imageset_row['imageset_path']}/imageset/imageset.cfg"); - -							$db->sql_transaction('begin'); - -							$sql = 'DELETE FROM ' . STYLES_IMAGESET_DATA_TABLE . ' -								WHERE imageset_id = ' . $style_id; -							$result = $db->sql_query($sql); - -							foreach ($cfg_data_imageset as $image_name => $value) -							{ -								if (strpos($value, '*') !== false) -								{ -									if (substr($value, -1, 1) === '*') -									{ -										list($image_filename, $image_height) = explode('*', $value); -										$image_width = 0; -									} -									else -									{ -										list($image_filename, $image_height, $image_width) = explode('*', $value); -									} -								} -								else -								{ -									$image_filename = $value; -									$image_height = $image_width = 0; -								} - -								if (strpos($image_name, 'img_') === 0 && $image_filename) -								{ -									$image_name = substr($image_name, 4); -									if (in_array($image_name, $imageset_definitions)) -									{ -										$sql_ary[] = array( -											'image_name'		=> (string) $image_name, -											'image_filename'	=> (string) $image_filename, -											'image_height'		=> (int) $image_height, -											'image_width'		=> (int) $image_width, -											'imageset_id'		=> (int) $style_id, -											'image_lang'		=> '', -										); -									} -								} -							} - -							$sql = 'SELECT lang_dir -								FROM ' . LANG_TABLE; -							$result = $db->sql_query($sql); - -							while ($row = $db->sql_fetchrow($result)) -							{ -								if (@file_exists("{$phpbb_root_path}styles/{$imageset_row['imageset_path']}/imageset/{$row['lang_dir']}/imageset.cfg")) -								{ -									$cfg_data_imageset_data = parse_cfg_file("{$phpbb_root_path}styles/{$imageset_row['imageset_path']}/imageset/{$row['lang_dir']}/imageset.cfg"); -									foreach ($cfg_data_imageset_data as $image_name => $value) -									{ -										if (strpos($value, '*') !== false) -										{ -											if (substr($value, -1, 1) === '*') -											{ -												list($image_filename, $image_height) = explode('*', $value); -												$image_width = 0; -											} -											else -											{ -												list($image_filename, $image_height, $image_width) = explode('*', $value); -											} -										} -										else -										{ -											$image_filename = $value; -											$image_height = $image_width = 0; -										} - -										if (strpos($image_name, 'img_') === 0 && $image_filename) -										{ -											$image_name = substr($image_name, 4); -											if (in_array($image_name, $imageset_definitions)) -											{ -												$sql_ary[] = array( -													'image_name'		=> (string) $image_name, -													'image_filename'	=> (string) $image_filename, -													'image_height'		=> (int) $image_height, -													'image_width'		=> (int) $image_width, -													'imageset_id'		=> (int) $style_id, -													'image_lang'		=> (string) $row['lang_dir'], -												); -											} -										} -									} -								} -							} -							$db->sql_freeresult($result); - -							$db->sql_multi_insert(STYLES_IMAGESET_DATA_TABLE, $sql_ary); - -							$db->sql_transaction('commit'); - -							$cache->destroy('sql', STYLES_IMAGESET_DATA_TABLE); -							$cache->destroy('imageset_site_logo_md5'); - -							add_log('admin', 'LOG_IMAGESET_REFRESHED', $imageset_row['imageset_name']); -							trigger_error($user->lang['IMAGESET_REFRESHED'] . adm_back_link($this->u_action)); -						} -						else -						{ -							confirm_box(false, $user->lang['CONFIRM_IMAGESET_REFRESH'], build_hidden_fields(array( -								'i'			=> $id, -								'mode'		=> $mode, -								'action'	=> $action, -								'id'		=> $style_id -							))); -						} -					break; -				} - -				$this->frontend('imageset', array('edit', 'details'), array('refresh', 'export', 'delete')); -			break; +				$this->action_details(); +				return; +			default: +				$this->frontend();  		}  	}  	/** -	* Build Frontend with supplied options +	* Main page  	*/ -	function frontend($mode, $options, $actions) +	protected function frontend()  	{ -		global $user, $template, $db, $config, $phpbb_root_path, $phpEx; - -		$sql_from = ''; -		$sql_sort = 'LOWER(' . $mode . '_name)'; -		$style_count = array(); - -		switch ($mode) +		// Check mode +		switch ($this->mode)  		{  			case 'style': -				$sql_from = STYLES_TABLE; -				$sql_sort = 'style_active DESC, ' . $sql_sort; - -				$sql = 'SELECT user_style, COUNT(user_style) AS style_count -					FROM ' . USERS_TABLE . ' -					GROUP BY user_style'; -				$result = $db->sql_query($sql); - -				while ($row = $db->sql_fetchrow($result)) -				{ -					$style_count[$row['user_style']] = $row['style_count']; -				} -				$db->sql_freeresult($result); - -			break; - -			case 'template': -				$sql_from = STYLES_TEMPLATE_TABLE; -			break; - -			case 'theme': -				$sql_from = STYLES_THEME_TABLE; -			break; - -			case 'imageset': -				$sql_from = STYLES_IMAGESET_TABLE; -			break; -			 -			default: -				trigger_error($user->lang['NO_MODE'] . adm_back_link($this->u_action), E_USER_WARNING); -		} - -		$l_prefix = strtoupper($mode); - -		$this->page_title = 'ACP_' . $l_prefix . 'S'; - -		$template->assign_vars(array( -			'S_FRONTEND'		=> true, -			'S_STYLE'			=> ($mode == 'style') ? true : false, - -			'L_TITLE'			=> $user->lang[$this->page_title], -			'L_EXPLAIN'			=> $user->lang[$this->page_title . '_EXPLAIN'], -			'L_NAME'			=> $user->lang[$l_prefix . '_NAME'], -			'L_INSTALLED'		=> $user->lang['INSTALLED_' . $l_prefix], -			'L_UNINSTALLED'		=> $user->lang['UNINSTALLED_' . $l_prefix], -			'L_NO_UNINSTALLED'	=> $user->lang['NO_UNINSTALLED_' . $l_prefix], -			'L_CREATE'			=> $user->lang['CREATE_' . $l_prefix], - -			'U_ACTION'			=> $this->u_action, -			) -		); - -		$sql = "SELECT * -			FROM $sql_from -			ORDER BY $sql_sort ASC"; -		$result = $db->sql_query($sql); - -		$installed = array(); - -		$basis_options = '<option class="sep" value="">' . $user->lang['OPTIONAL_BASIS'] . '</option>'; -		while ($row = $db->sql_fetchrow($result)) -		{ -			$installed[] = $row[$mode . '_name']; -			$basis_options .= '<option value="' . $row[$mode . '_id'] . '">' . $row[$mode . '_name'] . '</option>'; - -			$stylevis = ($mode == 'style' && !$row['style_active']) ? 'activate' : 'deactivate'; - -			$s_options = array(); -			foreach ($options as $option) -			{ -				$s_options[] = '<a href="' . $this->u_action . "&action=$option&id=" . $row[$mode . '_id'] . '">' . $user->lang[strtoupper($option)] . '</a>'; -			} - -			$s_actions = array(); -			foreach ($actions as $option) -			{ -				$s_actions[] = '<a href="' . $this->u_action . "&action=$option&id=" . $row[$mode . '_id'] . '">' . $user->lang[strtoupper($option)] . '</a>'; -			} - -			$template->assign_block_vars('installed', array( -				'S_DEFAULT_STYLE'		=> ($mode == 'style' && $row['style_id'] == $config['default_style']) ? true : false, -				'U_EDIT'				=> $this->u_action . '&action=' . (($mode == 'style') ? 'details' : 'edit') . '&id=' . $row[$mode . '_id'], -				'U_STYLE_ACT_DEACT'		=> $this->u_action . '&action=' . $stylevis . '&id=' . $row[$mode . '_id'], -				'L_STYLE_ACT_DEACT'		=> $user->lang['STYLE_' . strtoupper($stylevis)], -				'S_OPTIONS'				=> implode(' | ', $s_options), -				'S_ACTIONS'				=> implode(' | ', $s_actions), -				'U_PREVIEW'				=> ($mode == 'style') ? append_sid("{$phpbb_root_path}index.$phpEx", "$mode=" . $row[$mode . '_id']) : '', - -				'NAME'					=> $row[$mode . '_name'], -				'STYLE_COUNT'			=> ($mode == 'style' && isset($style_count[$row['style_id']])) ? $style_count[$row['style_id']] : 0, - -				'S_INACTIVE'			=> ($mode == 'style' && !$row['style_active']) ? true : false, -				) -			); -		} -		$db->sql_freeresult($result); - -		// Grab uninstalled items -		$new_ary = $cfg = array(); - -		$dp = @opendir("{$phpbb_root_path}styles"); - -		if ($dp) -		{ -			while (($file = readdir($dp)) !== false) -			{ -				if ($file[0] == '.' || !is_dir($phpbb_root_path . 'styles/' . $file)) -				{ -					continue; -				} - -				$subpath = ($mode != 'style') ? "$mode/" : ''; -				if (file_exists("{$phpbb_root_path}styles/$file/$subpath$mode.cfg")) -				{ -					if ($cfg = file("{$phpbb_root_path}styles/$file/$subpath$mode.cfg")) -					{ -						$items = parse_cfg_file('', $cfg); -						$name = (isset($items['name'])) ? trim($items['name']) : false; - -						if ($name && !in_array($name, $installed)) -						{ -							$new_ary[] = array( -								'path'		=> $file, -								'name'		=> $name, -								'copyright'	=> $items['copyright'], -							); -						} -					} -				} -			} -			closedir($dp); -		} - -		unset($installed); - -		if (sizeof($new_ary)) -		{ -			foreach ($new_ary as $cfg) -			{ -				$template->assign_block_vars('uninstalled', array( -					'NAME'			=> $cfg['name'], -					'COPYRIGHT'		=> $cfg['copyright'], -					'U_INSTALL'		=> $this->u_action . '&action=install&path=' . urlencode($cfg['path'])) -				); -			} +				$this->welcome_message('ACP_STYLES', 'ACP_STYLES_EXPLAIN'); +				$this->show_installed(); +				return; +			case 'install': +				$this->welcome_message('INSTALL_STYLES', 'INSTALL_STYLES_EXPLAIN'); +				$this->show_available(); +				return; +			case 'cache': +				$this->action_cache(); +				return;  		} -		unset($new_ary); - -		$template->assign_vars(array( -			'S_BASIS_OPTIONS'		=> $basis_options) -		); - +		trigger_error($this->user->lang['NO_MODE'] . adm_back_link($this->u_action), E_USER_WARNING);  	}  	/** -	* Provides a template editor which allows saving changes to template files on the filesystem or in the database. -	* -	* @param int $template_id specifies which template set is being edited +	* Purge cache  	*/ -	function edit_template($template_id) +	protected function action_cache()  	{ -		global $phpbb_root_path, $phpEx, $config, $db, $cache, $user, $template, $safe_mode; - -		if (defined('PHPBB_DISABLE_ACP_EDITOR')) -		{ -			trigger_error($user->lang['EDITOR_DISABLED'] . adm_back_link($this->u_action)); -		} - -		$this->page_title = 'EDIT_TEMPLATE'; - -		$filelist = $filelist_cats = array(); +		$this->cache->purge(); -		$template_data	= utf8_normalize_nfc(request_var('template_data', '', true)); -		$template_data	= htmlspecialchars_decode($template_data); -		$template_file	= utf8_normalize_nfc(request_var('template_file', '', true)); -		$text_rows		= max(5, min(999, request_var('text_rows', 20))); -		$save_changes	= (isset($_POST['save'])) ? true : false; +		// Clear permissions +		$this->auth->acl_clear_prefetch(); +		cache_moderators(); -		// make sure template_file path doesn't go upwards -		$template_file = preg_replace('#\.{2,}#', '.', $template_file); +		add_log('admin', 'LOG_PURGE_CACHE'); -		// Retrieve some information about the template -		$sql = 'SELECT template_storedb, template_path, template_name -			FROM ' . STYLES_TEMPLATE_TABLE . " -			WHERE template_id = $template_id"; -		$result = $db->sql_query($sql); -		$template_info = $db->sql_fetchrow($result); -		$db->sql_freeresult($result); +		trigger_error($this->user->lang['PURGED_CACHE'] . adm_back_link($this->u_base_action), E_USER_NOTICE); +	} -		if (!$template_info) -		{ -			trigger_error($user->lang['NO_TEMPLATE'] . adm_back_link($this->u_action), E_USER_WARNING); -		} +	/** +	* Install style(s) +	*/ +	protected function action_install() +	{ +		// Get list of styles to install +		$dirs = $this->request_vars('dir', '', true); -		if ($save_changes && !check_form_key('acp_styles')) -		{ -			trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING); -		} -		else if (!$save_changes) -		{ -			add_form_key('acp_styles'); -		} +		// Get list of styles that can be installed +		$styles = $this->find_available(false); -		// save changes to the template if the user submitted any -		if ($save_changes && $template_file) +		// Install each style +		$messages = array(); +		$installed_names = array(); +		$installed_dirs = array(); +		$last_installed = false; +		foreach ($dirs as $dir)  		{ -			// Get the filesystem location of the current file -			$file = "{$phpbb_root_path}styles/{$template_info['template_path']}/template/$template_file"; -			$additional = ''; - -			// If the template is stored on the filesystem try to write the file else store it in the database -			if (!$safe_mode && !$template_info['template_storedb'] && file_exists($file) && phpbb_is_writable($file)) +			$found = false; +			foreach ($styles as &$style)  			{ -				if (!($fp = @fopen($file, 'wb'))) +				// Check if: +				// 1. Directory matches directory we are looking for +				// 2. Style is not installed yet +				// 3. Style with same name or directory hasn't been installed already within this function +				if ($style['style_path'] == $dir && empty($style['_installed']) && !in_array($style['style_path'], $installed_dirs) && !in_array($style['style_name'], $installed_names))  				{ -					// File exists and is writeable, but still not able to be written to -					trigger_error(sprintf($user->lang['TEMPLATE_FILE_NOT_WRITABLE'], htmlspecialchars($template_file)) . adm_back_link($this->u_action), E_USER_WARNING); +					// Install style +					$style['style_active'] = 1; +					$style['style_id'] = $this->install_style($style); +					$style['_installed'] = true; +					$found = true; +					$last_installed = $style['style_id']; +					$installed_names[] = $style['style_name']; +					$installed_dirs[] = $style['style_path']; +					$messages[] = sprintf($this->user->lang['STYLE_INSTALLED'], htmlspecialchars($style['style_name']));  				} -				fwrite($fp, $template_data); -				fclose($fp);  			} -			else +			if (!$found)  			{ -				$db->sql_transaction('begin'); - -				// If it's not stored in the db yet, then update the template setting and store all template files in the db -				if (!$template_info['template_storedb']) -				{ -					if ($super = $this->get_super('template', $template_id)) -					{ -						$this->store_in_db('template', $super['template_id']); -					} -					else -					{ -						$this->store_in_db('template', $template_id); -					} - -					add_log('admin', 'LOG_TEMPLATE_EDIT_DETAILS', $template_info['template_name']); -					$additional .= '<br />' . $user->lang['EDIT_TEMPLATE_STORED_DB']; -				} - -				// Update the template_data table entry for this template file -				$sql = 'UPDATE ' . STYLES_TEMPLATE_DATA_TABLE . " -					SET template_data = '" . $db->sql_escape($template_data) . "', template_mtime = " . time() . " -					WHERE template_id = $template_id -						AND template_filename = '" . $db->sql_escape($template_file) . "'"; -				$db->sql_query($sql); - -				$db->sql_transaction('commit'); +				$messages[] = sprintf($this->user->lang['STYLE_NOT_INSTALLED'], htmlspecialchars($dir));  			} - -			// destroy the cached version of the template (filename without extension) -			$this->clear_template_cache($template_info, array(substr($template_file, 0, -5))); - -			$cache->destroy('sql', STYLES_TABLE); - -			add_log('admin', 'LOG_TEMPLATE_EDIT', $template_info['template_name'], $template_file); -			trigger_error($user->lang['TEMPLATE_FILE_UPDATED'] . $additional . adm_back_link($this->u_action . "&action=edit&id=$template_id&text_rows=$text_rows&template_file=$template_file"));  		} -		// Generate a category array containing template filenames -		if (!$template_info['template_storedb']) +		// Show message +		if (!count($messages))  		{ -			$template_path = "{$phpbb_root_path}styles/{$template_info['template_path']}/template"; - -			$filelist = filelist($template_path, '', 'html'); -			$filelist[''] = array_diff($filelist[''], array('bbcode.html')); - -			if ($template_file) -			{ -				if (!file_exists($template_path . "/$template_file") || !($template_data = file_get_contents($template_path . "/$template_file"))) -				{ -					trigger_error($user->lang['NO_TEMPLATE'] . adm_back_link($this->u_action), E_USER_WARNING); -				} -			} -		} -		else -		{ -			$sql = 'SELECT * -				FROM ' . STYLES_TEMPLATE_DATA_TABLE . " -				WHERE template_id = $template_id"; -			$result = $db->sql_query($sql); - -			$filelist = array('' => array()); -			while ($row = $db->sql_fetchrow($result)) -			{ -				$file_info = pathinfo($row['template_filename']); - -				if (($file_info['basename'] != 'bbcode') && ($file_info['extension'] == 'html')) -				{ -					if (($file_info['dirname'] == '.') || empty($file_info['dirname'])) -					{ -						$filelist[''][] = $row['template_filename']; -					} -					else -					{ -						$filelist[$file_info['dirname'] . '/'][] = $file_info['basename']; -					} -				} - -				if ($row['template_filename'] == $template_file) -				{ -					$template_data = $row['template_data']; -				} -			} -			$db->sql_freeresult($result); -			unset($file_info); +			trigger_error($this->user->lang['NO_MATCHING_STYLES_FOUND'] . adm_back_link($this->u_action), E_USER_WARNING);  		} +		$message = implode('<br />', $messages); +		$message .= '<br /><br />' . sprintf($this->user->lang['STYLE_INSTALLED_RETURN_STYLES'], $this->u_base_action . '&mode=style'); +		$message .= '<br /><br />' . sprintf($this->user->lang['STYLE_INSTALLED_RETURN_UNINSTALLED'], $this->u_base_action . '&mode=install'); +		trigger_error($message, E_USER_NOTICE); +	} -		if (empty($filelist[''])) -		{ -			trigger_error($user->lang['NO_TEMPLATE'] . adm_back_link($this->u_action), E_USER_WARNING); -		} +	/** +	* Confirm styles removal +	*/ +	protected function action_uninstall() +	{ +		// Get list of styles to uninstall +		$ids = $this->request_vars('id', 0, true); -		// Now create the categories -		$filelist_cats[''] = array(); -		foreach ($filelist as $pathfile => $file_ary) +		// Check if confirmation box was submitted +		if (confirm_box(true))  		{ -			// Use the directory name as category name -			if (!empty($pathfile)) -			{ -				$filelist_cats[$pathfile] = array(); -				foreach ($file_ary as $file) -				{ -					$filelist_cats[$pathfile][$pathfile . $file] = $file; -				} -			} -			// or if it's in the main category use the word before the first underscore to group files -			else -			{ -				$cats = array(); -				foreach ($file_ary as $file) -				{ -					$cats[] = substr($file, 0, strpos($file, '_')); -					$filelist_cats[substr($file, 0, strpos($file, '_'))][$file] = $file; -				} - -				$cats = array_values(array_unique($cats)); - -				// we don't need any single element categories so put them into the misc '' category -				for ($i = 0, $n = sizeof($cats); $i < $n; $i++) -				{ -					if (sizeof($filelist_cats[$cats[$i]]) == 1 && $cats[$i] !== '') -					{ -						$filelist_cats[''][key($filelist_cats[$cats[$i]])] = current($filelist_cats[$cats[$i]]); -						unset($filelist_cats[$cats[$i]]); -					} -				} -				unset($cats); -			} +			// Uninstall +			$this->action_uninstall_confirmed($ids, $this->request->variable('confirm_delete_files', false)); +			return;  		} -		unset($filelist); -		// Generate list of categorised template files -		$tpl_options = ''; -		ksort($filelist_cats); -		foreach ($filelist_cats as $category => $tpl_ary) -		{ -			ksort($tpl_ary); - -			if (!empty($category)) -			{ -				$tpl_options .= '<option class="sep" value="">' . $category . '</option>'; -			} - -			foreach ($tpl_ary as $filename => $file) -			{ -				$selected = ($template_file == $filename) ? ' selected="selected"' : ''; -				$tpl_options .= '<option value="' . $filename . '"' . $selected . '>' . $file . '</option>'; -			} -		} +		// Confirm box +		$s_hidden = build_hidden_fields(array( +			'action'	=> 'uninstall', +			'ids'		=> $ids +		)); +		$this->template->assign_var('S_CONFIRM_DELETE', true); +		confirm_box(false, $this->user->lang['CONFIRM_UNINSTALL_STYLES'], $s_hidden, 'acp_styles.html'); -		$template->assign_vars(array( -			'S_EDIT_TEMPLATE'	=> true, -			'S_HIDDEN_FIELDS'	=> build_hidden_fields(array('template_file' => $template_file)), -			'S_TEMPLATES'		=> $tpl_options, - -			'U_ACTION'			=> $this->u_action . "&action=edit&id=$template_id&text_rows=$text_rows", -			'U_BACK'			=> $this->u_action, - -			'L_EDIT'			=> $user->lang['EDIT_TEMPLATE'], -			'L_EDIT_EXPLAIN'	=> $user->lang['EDIT_TEMPLATE_EXPLAIN'], -			'L_EDITOR'			=> $user->lang['TEMPLATE_EDITOR'], -			'L_EDITOR_HEIGHT'	=> $user->lang['TEMPLATE_EDITOR_HEIGHT'], -			'L_FILE'			=> $user->lang['TEMPLATE_FILE'], -			'L_SELECT'			=> $user->lang['SELECT_TEMPLATE'], -			'L_SELECTED'		=> $user->lang['SELECTED_TEMPLATE'], -			'L_SELECTED_FILE'	=> $user->lang['SELECTED_TEMPLATE_FILE'], - -			'SELECTED_TEMPLATE'	=> $template_info['template_name'], -			'TEMPLATE_FILE'		=> $template_file, -			'TEMPLATE_DATA'		=> utf8_htmlspecialchars($template_data), -			'TEXT_ROWS'			=> $text_rows) -		); +		// Canceled - show styles list +		$this->frontend();  	}  	/** -	* Allows the admin to view cached versions of template files and clear single template cache files +	* Uninstall styles(s)  	* -	* @param int $template_id specifies which template's cache is shown +	* @param array $ids List of style IDs +	* @param bool $delete_files If true, script will attempt to remove files for selected styles  	*/ -	function template_cache($template_id) +	protected function action_uninstall_confirmed($ids, $delete_files)  	{ -		global $phpbb_root_path, $phpEx, $config, $db, $cache, $user, $template; - -		$source		= str_replace('/', '.', request_var('source', '')); -		$file_ary	= array_diff(request_var('delete', array('')), array('')); -		$submit		= isset($_POST['submit']) ? true : false; - -		$sql = 'SELECT * -			FROM ' . STYLES_TEMPLATE_TABLE . " -			WHERE template_id = $template_id"; -		$result = $db->sql_query($sql); -		$template_row = $db->sql_fetchrow($result); -		$db->sql_freeresult($result); - -		if (!$template_row) -		{ -			trigger_error($user->lang['NO_TEMPLATE'] . adm_back_link($this->u_action), E_USER_WARNING); -		} - -		// User wants to delete one or more files ... -		if ($submit && $file_ary) -		{ -			$this->clear_template_cache($template_row, $file_ary); -			trigger_error($user->lang['TEMPLATE_CACHE_CLEARED'] . adm_back_link($this->u_action . "&action=cache&id=$template_id")); -		} +		$default = $this->default_style; +		$uninstalled = array(); +		$messages = array(); -		$cache_prefix = 'tpl_' . str_replace('_', '-', $template_row['template_path']); - -		// Someone wants to see the cached source ... so we'll highlight it, -		// add line numbers and indent it appropriately. This could be nasty -		// on larger source files ... -		if ($source && file_exists("{$phpbb_root_path}cache/{$cache_prefix}_$source.html.$phpEx")) +		// Check styles list +		foreach ($ids as $id)  		{ -			adm_page_header($user->lang['TEMPLATE_CACHE']); - -			$template->set_filenames(array( -				'body'	=> 'viewsource.html') -			); - -			$template->assign_vars(array( -				'FILENAME'	=> str_replace('.', '/', $source) . '.html') -			); - -			$code = str_replace(array("\r\n", "\r"), array("\n", "\n"), file_get_contents("{$phpbb_root_path}cache/{$cache_prefix}_$source.html.$phpEx")); - -			$conf = array('highlight.bg', 'highlight.comment', 'highlight.default', 'highlight.html', 'highlight.keyword', 'highlight.string'); -			foreach ($conf as $ini_var) +			if (!$id)  			{ -				@ini_set($ini_var, str_replace('highlight.', 'syntax', $ini_var)); +				trigger_error($this->user->lang['INVALID_STYLE_ID'] . adm_back_link($this->u_action), E_USER_WARNING);  			} - -			$marker = 'MARKER' . time(); -			$code = highlight_string(str_replace("\n", $marker, $code), true); -			$code = str_replace($marker, "\n", $code); -			$str_from = array('<span style="color: ', '<font color="syntax', '</font>', '<code>', '</code>','[', ']', '.', ':'); -			$str_to = array('<span class="', '<span class="syntax', '</span>', '', '', '[', ']', '.', ':'); - -			$code = str_replace($str_from, $str_to, $code); -			$code = preg_replace('#^(<span class="[a-z_]+">)\n?(.*?)\n?(</span>)$#ism', '$1$2$3', $code); -			$code = substr($code, strlen('<span class="syntaxhtml">')); -			$code = substr($code, 0, -1 * strlen('</ span>')); -			$code = explode("\n", $code); - -			foreach ($code as $key => $line) +			if ($id == $default)  			{ -				$template->assign_block_vars('source', array( -					'LINENUM'	=> $key + 1, -					'LINE'		=> preg_replace('#([^ ;]) ([^ &])#', '$1 $2', $line)) -				); -				unset($code[$key]); +				trigger_error($this->user->lang['UNINSTALL_DEFAULT'] . adm_back_link($this->u_action), E_USER_WARNING);  			} - -			adm_page_footer(); +			$uninstalled[$id] = false;  		} -		$filemtime = array(); -		if ($template_row['template_storedb']) -		{ -			$ids = array(); -			if (isset($template_row['template_inherits_id']) && $template_row['template_inherits_id']) -			{ -				$ids[] = $template_row['template_inherits_id']; -			} -			$ids[] = $template_row['template_id']; - -			$filemtime 			= array(); -			$file_template_db	= array(); - -			foreach ($ids as $id) -			{ -				$sql = 'SELECT template_filename, template_mtime -					FROM ' . STYLES_TEMPLATE_DATA_TABLE . " -					WHERE template_id = $id"; -				$result = $db->sql_query($sql); - -				while ($row = $db->sql_fetchrow($result)) -				{ -					$filemtime[$row['template_filename']] = $row['template_mtime']; -					$file_template_db[$row['template_filename']] = $id; -				} -				$db->sql_freeresult($result); -			} -		} +		// Order by reversed style_id, so parent styles would be removed after child styles +		// This way parent and child styles can be removed in same function call +		$sql = 'SELECT * +			FROM ' . STYLES_TABLE . ' +			WHERE style_id IN (' . implode(', ', $ids) . ') +			ORDER BY style_id DESC'; +		$result = $this->db->sql_query($sql); -		// Get a list of cached template files and then retrieve additional information about them -		$file_ary = $this->template_cache_filelist($template_row['template_path']); +		$rows = $this->db->sql_fetchrowset($result); +		$this->db->sql_freeresult($result); -		foreach ($file_ary as $file) +		// Uinstall each style +		$uninstalled = array(); +		foreach ($rows as $style)  		{ -			$file		= str_replace('/', '.', $file); - -			// perform some dirty guessing to get the path right. -			// We assume that three dots in a row were '../' -			$tpl_file	= str_replace('.', '/', $file); -			$tpl_file	= str_replace('///', '../', $tpl_file); +			$result = $this->uninstall_style($style, $delete_files); -			$filename = "{$cache_prefix}_$file.html.$phpEx"; - -			if (!file_exists("{$phpbb_root_path}cache/$filename")) +			if (is_string($result))  			{ +				$messages[] = $result;  				continue;  			} +			$messages[] = sprintf($this->user->lang['STYLE_UNINSTALLED'], $style['style_name']); +			$uninstalled[] = $style['style_name']; -			$file_tpl = "{$phpbb_root_path}styles/{$template_row['template_path']}/template/$tpl_file.html"; -			$inherited = false; - -			if (isset($template_row['template_inherits_id']) && $template_row['template_inherits_id']) -			{ -				if (!$template_row['template_storedb']) -				{ -					if (!file_exists($file_tpl)) -					{ -						$file_tpl = "{$phpbb_root_path}styles/{$template_row['template_inherit_path']}/template/$tpl_file.html"; -						$inherited = true; -					} -				} -				else -				{ -					if ($file_template_db[$file . '.html'] == $template_row['template_inherits_id']) -					{ -						$file_tpl = "{$phpbb_root_path}styles/{$template_row['template_inherit_path']}/template/$tpl_file.html"; -						$inherited = true; -					} -				} -			} - -			// Correct the filename if it is stored in database and the file is in a subfolder. -			if ($template_row['template_storedb']) +			// Attempt to delete files +			if ($delete_files)  			{ -				$file = str_replace('.', '/', $file); +				$messages[] = sprintf($this->user->lang[$this->delete_style_files($style['style_path']) ? 'DELETE_STYLE_FILES_SUCCESS' : 'DELETE_STYLE_FILES_FAILED'], $style['style_name']);  			} +		} -			$template->assign_block_vars('file', array( -				'U_VIEWSOURCE'	=> $this->u_action . "&action=cache&id=$template_id&source=$file", +		if (empty($messages)) +		{ +			// Nothing to uninstall? +			trigger_error($this->user->lang['NO_MATCHING_STYLES_FOUND'] . adm_back_link($this->u_action), E_USER_WARNING); +		} -				'CACHED'		=> $user->format_date(filemtime("{$phpbb_root_path}cache/$filename")), -				'FILENAME'		=> $file, -				'FILENAME_PATH'	=> $file_tpl, -				'FILESIZE'		=> get_formatted_filesize(filesize("{$phpbb_root_path}cache/$filename")), -				'MODIFIED'		=> $user->format_date((!$template_row['template_storedb']) ? filemtime($file_tpl) : $filemtime[$file . '.html'])) -			); +		// Log action +		if (count($uninstalled)) +		{ +			add_log('admin', 'LOG_STYLE_DELETE', implode(', ', $uninstalled));  		} -		unset($filemtime); -		$template->assign_vars(array( -			'S_CACHE'			=> true, -			'S_TEMPLATE'		=> true, +		// Clear cache +		$this->cache->purge(); -			'U_ACTION'			=> $this->u_action . "&action=cache&id=$template_id", -			'U_BACK'			=> $this->u_action) -		); +		// Show message +		trigger_error(implode('<br />', $messages) . adm_back_link($this->u_action), E_USER_NOTICE);  	}  	/** -	* Provides a css editor and a basic easier to use stylesheet editing tool for less experienced (or lazy) users -	* -	* @param int $theme_id specifies which theme is being edited +	* Activate styles  	*/ -	function edit_theme($theme_id) +	protected function action_activate()  	{ -		global $phpbb_root_path, $phpEx, $config, $db, $cache, $user, $template, $safe_mode; - -		$this->page_title = 'EDIT_THEME'; - -		$filelist = $filelist_cats = array(); - -		$theme_data		= utf8_normalize_nfc(request_var('template_data', '', true)); -		$theme_data		= htmlspecialchars_decode($theme_data); -		$theme_file		= utf8_normalize_nfc(request_var('template_file', '', true)); -		$text_rows		= max(5, min(999, request_var('text_rows', 20))); -		$save_changes	= (isset($_POST['save'])) ? true : false; - -		// make sure theme_file path doesn't go upwards -		$theme_file = str_replace('..', '.', $theme_file); - -		// Retrieve some information about the theme -		$sql = 'SELECT theme_storedb, theme_path, theme_name, theme_data -			FROM ' . STYLES_THEME_TABLE . " -			WHERE theme_id = $theme_id"; -		$result = $db->sql_query($sql); - -		if (!($theme_info = $db->sql_fetchrow($result))) -		{ -			trigger_error($user->lang['NO_THEME'] . adm_back_link($this->u_action), E_USER_WARNING); -		} -		$db->sql_freeresult($result); - -		// save changes to the theme if the user submitted any -		if ($save_changes) -		{ -			// Get the filesystem location of the current file -			$file = "{$phpbb_root_path}styles/{$theme_info['theme_path']}/theme/$theme_file"; -			$additional = ''; -			$message = $user->lang['THEME_UPDATED']; - -			// If the theme is stored on the filesystem try to write the file else store it in the database -			if (!$safe_mode && !$theme_info['theme_storedb'] && file_exists($file) && phpbb_is_writable($file)) -			{ -				if (!($fp = @fopen($file, 'wb'))) -				{ -					trigger_error($user->lang['NO_THEME'] . adm_back_link($this->u_action), E_USER_WARNING); -				} -				fwrite($fp, $theme_data); -				fclose($fp); -			} -			else -			{ -				// Write stylesheet to db -				$sql_ary = array( -					'theme_mtime'		=> time(), -					'theme_storedb'		=> 1, -					'theme_data'		=> $this->db_theme_data($theme_info, $theme_data), -				); -				$sql = 'UPDATE ' . STYLES_THEME_TABLE . ' -					SET ' . $db->sql_build_array('UPDATE', $sql_ary) . ' -					WHERE theme_id = ' . $theme_id; -				$db->sql_query($sql); - -				$cache->destroy('sql', STYLES_THEME_TABLE); - -				// notify the user if the theme was not stored in the db before his modification -				if (!$theme_info['theme_storedb']) -				{ -					add_log('admin', 'LOG_THEME_EDIT_DETAILS', $theme_info['theme_name']); -					$message .= '<br />' . $user->lang['EDIT_THEME_STORED_DB']; -				} -			} -			$cache->destroy('sql', STYLES_THEME_TABLE); -			add_log('admin', (!$theme_info['theme_storedb']) ? 'LOG_THEME_EDIT_FILE' : 'LOG_THEME_EDIT', $theme_info['theme_name'], (!$theme_info['theme_storedb']) ? $theme_file : ''); +		// Get list of styles to activate +		$ids = $this->request_vars('id', 0, true); -			trigger_error($message . adm_back_link($this->u_action . "&action=edit&id=$theme_id&template_file=$theme_file&text_rows=$text_rows")); -		} +		// Activate styles +		$sql = 'UPDATE ' . STYLES_TABLE . ' +			SET style_active = 1 +			WHERE style_id IN (' . implode(', ', $ids) . ')'; +		$this->db->sql_query($sql); -		// Generate a category array containing theme filenames -		if (!$theme_info['theme_storedb']) -		{ -			$theme_path = "{$phpbb_root_path}styles/{$theme_info['theme_path']}/theme"; +		// Purge cache +		$this->cache->destroy('sql', STYLES_TABLE); -			$filelist = filelist($theme_path, '', 'css'); +		// Show styles list +		$this->frontend(); +	} -			if ($theme_file) -			{ -				if (!file_exists($theme_path . "/$theme_file") || !($theme_data = file_get_contents($theme_path . "/$theme_file"))) -				{ -					trigger_error($user->lang['NO_THEME'] . adm_back_link($this->u_action), E_USER_WARNING); -				} -			} -		} -		else -		{ -			$theme_data = &$theme_info['theme_data']; -		} +	/** +	* Deactivate styles +	*/ +	protected function action_deactivate() +	{ +		// Get list of styles to deactivate +		$ids = $this->request_vars('id', 0, true); -		// Now create the categories -		$filelist_cats[''] = array(); -		foreach ($filelist as $pathfile => $file_ary) +		// Check for default style +		foreach ($ids as $id)  		{ -			// Use the directory name as category name -			if (!empty($pathfile)) -			{ -				$filelist_cats[$pathfile] = array(); -				foreach ($file_ary as $file) -				{ -					$filelist_cats[$pathfile][$pathfile . $file] = $file; -				} -			} -			// or if it's in the main category use the word before the first underscore to group files -			else +			if ($id == $this->default_style)  			{ -				$cats = array(); -				foreach ($file_ary as $file) -				{ -					$cats[] = substr($file, 0, strpos($file, '_')); -					$filelist_cats[substr($file, 0, strpos($file, '_'))][$file] = $file; -				} - -				$cats = array_values(array_unique($cats)); - -				// we don't need any single element categories so put them into the misc '' category -				for ($i = 0, $n = sizeof($cats); $i < $n; $i++) -				{ -					if (sizeof($filelist_cats[$cats[$i]]) == 1 && $cats[$i] !== '') -					{ -						$filelist_cats[''][key($filelist_cats[$cats[$i]])] = current($filelist_cats[$cats[$i]]); -						unset($filelist_cats[$cats[$i]]); -					} -				} -				unset($cats); +				trigger_error($this->user->lang['DEACTIVATE_DEFAULT'] . adm_back_link($this->u_action), E_USER_WARNING);  			}  		} -		unset($filelist); -		// Generate list of categorised theme files -		$tpl_options = ''; -		ksort($filelist_cats); -		foreach ($filelist_cats as $category => $tpl_ary) -		{ -			ksort($tpl_ary); +		// Reset default style for users who use selected styles +		$sql = 'UPDATE ' . USERS_TABLE . ' +			SET user_style = 0 +			WHERE user_style IN (' . implode(', ', $ids) . ')'; +		$this->db->sql_query($sql); -			if (!empty($category)) -			{ -				$tpl_options .= '<option class="sep" value="">' . $category . '</option>'; -			} +		// Deactivate styles +		$sql = 'UPDATE ' . STYLES_TABLE . ' +			SET style_active = 0 +			WHERE style_id IN (' . implode(', ', $ids) . ')'; +		$this->db->sql_query($sql); -			foreach ($tpl_ary as $filename => $file) -			{ -				$selected = ($theme_file == $filename) ? ' selected="selected"' : ''; -				$tpl_options .= '<option value="' . $filename . '"' . $selected . '>' . $file . '</option>'; -			} -		} +		// Purge cache +		$this->cache->destroy('sql', STYLES_TABLE); -		$template->assign_vars(array( -			'S_EDIT_THEME'		=> true, -			'S_HIDDEN_FIELDS'	=> build_hidden_fields(array('template_file' => $theme_file)), -			'S_THEME_IN_DB'		=> $theme_info['theme_storedb'], -			'S_TEMPLATES'		=> $tpl_options, - -			'U_ACTION'			=> $this->u_action . "&action=edit&id=$theme_id&text_rows=$text_rows", -			'U_BACK'			=> $this->u_action, - -			'L_EDIT'			=> $user->lang['EDIT_THEME'], -			'L_EDIT_EXPLAIN'	=> $user->lang['EDIT_THEME_EXPLAIN'], -			'L_EDITOR'			=> $user->lang['THEME_EDITOR'], -			'L_EDITOR_HEIGHT'	=> $user->lang['THEME_EDITOR_HEIGHT'], -			'L_FILE'			=> $user->lang['THEME_FILE'], -			'L_SELECT'			=> $user->lang['SELECT_THEME'], -			'L_SELECTED'		=> $user->lang['SELECTED_THEME'], -			'L_SELECTED_FILE'	=> $user->lang['SELECTED_THEME_FILE'], - -			'SELECTED_TEMPLATE'	=> $theme_info['theme_name'], -			'TEMPLATE_FILE'		=> $theme_file, -			'TEMPLATE_DATA'		=> utf8_htmlspecialchars($theme_data), -			'TEXT_ROWS'			=> $text_rows) -		); +		// Show styles list +		$this->frontend();  	}  	/** -	* Edit imagesets -	* -	* @param int $imageset_id specifies which imageset is being edited +	* Show style details  	*/ -	function edit_imageset($imageset_id) +	protected function action_details()  	{ -		global $db, $user, $phpbb_root_path, $cache, $template; - -		$this->page_title = 'EDIT_IMAGESET'; - -		if (!$imageset_id) +		$id = $this->request->variable('id', 0); +		if (!$id)  		{ -			trigger_error($user->lang['NO_IMAGESET'] . adm_back_link($this->u_action), E_USER_WARNING); +			trigger_error($this->user->lang['NO_MATCHING_STYLES_FOUND'] . adm_back_link($this->u_action), E_USER_WARNING);  		} -		$update		= (isset($_POST['update'])) ? true : false; - -		$imgname	= request_var('imgname', 'site_logo'); -		$imgname	= preg_replace('#[^a-z0-9\-+_]#i', '', $imgname); -		$sql_extra = $imgnamelang = ''; +		// Get all styles +		$styles = $this->get_styles(); +		usort($styles, array($this, 'sort_styles')); -		$sql = 'SELECT imageset_path, imageset_name -			FROM ' . STYLES_IMAGESET_TABLE . " -			WHERE imageset_id = $imageset_id"; -		$result = $db->sql_query($sql); -		$imageset_row = $db->sql_fetchrow($result); -		$db->sql_freeresult($result); - -		if (!$imageset_row) +		// Find current style +		$style = false; +		foreach ($styles as $row)  		{ -			trigger_error($user->lang['NO_IMAGESET'] . adm_back_link($this->u_action), E_USER_WARNING); -		} - -		$imageset_path		= $imageset_row['imageset_path']; -		$imageset_name		= $imageset_row['imageset_name']; - -		if (strpos($imgname, '-') !== false) -		{ -			list($imgname, $imgnamelang) = explode('-', $imgname); -			$sql_extra = " AND image_lang IN ('" . $db->sql_escape($imgnamelang) . "', '')"; -		} - -		$sql = 'SELECT image_filename, image_width, image_height, image_lang, image_id -			FROM ' . STYLES_IMAGESET_DATA_TABLE . " -			WHERE imageset_id = $imageset_id -				AND image_name = '" . $db->sql_escape($imgname) . "'$sql_extra"; -		$result = $db->sql_query($sql); -		$imageset_data_row = $db->sql_fetchrow($result); -		$db->sql_freeresult($result); - -		$image_filename	= $imageset_data_row['image_filename']; -		$image_width	= $imageset_data_row['image_width']; -		$image_height	= $imageset_data_row['image_height']; -		$image_lang		= $imageset_data_row['image_lang']; -		$image_id		= $imageset_data_row['image_id']; -		$imgsize		= ($imageset_data_row['image_width'] && $imageset_data_row['image_height']) ? 1 : 0; - -		// Check to see whether the selected image exists in the table -		$valid_name = ($update) ? false : true; - -		foreach ($this->imageset_keys as $category => $img_ary) -		{ -			if (in_array($imgname, $img_ary)) +			if ($row['style_id'] == $id)  			{ -				$valid_name = true; +				$style = $row;  				break;  			}  		} -		if ($update && isset($_POST['imgpath']) && $valid_name) +		if ($style === false)  		{ -			// If imgwidth and imgheight are non-zero grab the actual size -			// from the image itself ... we ignore width settings for the poll center image -			$imgwidth	= request_var('imgwidth', 0); -			$imgheight	= request_var('imgheight', 0); -			$imgsize	= request_var('imgsize', 0); -			$imgpath	= request_var('imgpath', ''); -			$imgpath	= str_replace('..', '.', $imgpath); - -			// If no dimensions selected, we reset width and height to 0 ;) -			if (!$imgsize) -			{ -				$imgwidth = $imgheight = 0; -			} - -			$imglang = ''; +			trigger_error($this->user->lang['NO_MATCHING_STYLES_FOUND'] . adm_back_link($this->u_action), E_USER_WARNING); +		} -			if ($imgpath && !file_exists("{$phpbb_root_path}styles/$imageset_path/imageset/$imgpath")) -			{ -				trigger_error($user->lang['NO_IMAGE_ERROR'] . adm_back_link($this->u_action), E_USER_WARNING); -			} +		// Find all available parent styles +		$list = $this->find_possible_parents($styles, $id); -			// Determine width/height. If dimensions included and no width/height given, we detect them automatically... -			if ($imgsize && $imgpath) -			{ -				if (!$imgwidth || !$imgheight) -				{ -					list($imgwidth_file, $imgheight_file) = getimagesize("{$phpbb_root_path}styles/$imageset_path/imageset/$imgpath"); -					$imgwidth = ($imgwidth) ? $imgwidth : $imgwidth_file; -					$imgheight = ($imgheight) ? $imgheight : $imgheight_file; -				} -				$imgwidth	= ($imgname != 'poll_center') ? (int) $imgwidth : 0; -				$imgheight	= (int) $imgheight; -			} +		// Add form key +		$form_key = 'acp_styles'; +		add_form_key($form_key); -			if (strpos($imgpath, '/') !== false) -			{ -				list($imglang, $imgfilename) = explode('/', $imgpath); -			} -			else +		// Change data +		if ($this->request->variable('update', false)) +		{ +			if (!check_form_key($form_key))  			{ -				$imgfilename = $imgpath; +				trigger_error($this->user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);  			} -			$sql_ary = array( -				'image_filename'	=> (string) $imgfilename, -				'image_width'		=> (int) $imgwidth, -				'image_height'		=> (int) $imgheight, -				'image_lang'		=> (string) $imglang, +			$update = array( +				'style_name'		=> trim($this->request->variable('style_name', $style['style_name'])), +				'style_parent_id'	=> $this->request->variable('style_parent', (int) $style['style_parent_id']), +				'style_active'		=> $this->request->variable('style_active', (int) $style['style_active']),  			); +			$update_action = $this->u_action . '&action=details&id=' . $id; -			// already exists -			if ($imageset_data_row) -			{ -				$sql = 'UPDATE ' . STYLES_IMAGESET_DATA_TABLE . ' -					SET ' . $db->sql_build_array('UPDATE', $sql_ary) . " -					WHERE image_id = $image_id"; -				$db->sql_query($sql); -			} -			// does not exist -			else if (!$imageset_data_row) -			{ -				$sql_ary['image_name']	= $imgname; -				$sql_ary['imageset_id']	= (int) $imageset_id; -				$db->sql_query('INSERT INTO ' . STYLES_IMAGESET_DATA_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary)); -			} - -			$cache->destroy('sql', STYLES_IMAGESET_DATA_TABLE); - -			add_log('admin', 'LOG_IMAGESET_EDIT', $imageset_name); - -			$template->assign_var('SUCCESS', true); - -			$image_filename = $imgfilename; -			$image_width	= $imgwidth; -			$image_height	= $imgheight; -			$image_lang		= $imglang; -		} - -		$imglang = ''; -		$imagesetlist = array('nolang' => array(), 'lang' => array()); -		$langs = array(); - -		$dir = "{$phpbb_root_path}styles/$imageset_path/imageset"; -		$dp = @opendir($dir); - -		if ($dp) -		{ -			while (($file = readdir($dp)) !== false) +			// Check style name +			if ($update['style_name'] != $style['style_name'])  			{ -				if ($file[0] != '.' && strtoupper($file) != 'CVS' && !is_file($dir . '/' . $file) && !is_link($dir . '/' . $file)) +				if (!strlen($update['style_name']))  				{ -					$langs[] = $file; +					trigger_error($this->user->lang['STYLE_ERR_STYLE_NAME'] . adm_back_link($update_action), E_USER_WARNING);  				} -				else if (preg_match('#\.(?:gif|jpg|png)$#', $file)) +				foreach ($styles as $row)  				{ -					$imagesetlist['nolang'][] = $file; +					if ($row['style_name'] == $update['style_name']) +					{ +						trigger_error($this->user->lang['STYLE_ERR_NAME_EXIST'] . adm_back_link($update_action), E_USER_WARNING); +					}  				}  			} - -			if ($sql_extra) +			else  			{ -				$dp2 = @opendir("$dir/$imgnamelang"); +				unset($update['style_name']); +			} -				if ($dp2) +			// Check parent style id +			if ($update['style_parent_id'] != $style['style_parent_id']) +			{ +				if ($update['style_parent_id'] != 0)  				{ -					while (($file2 = readdir($dp2)) !== false) +					$found = false; +					foreach ($list as $row)  					{ -						if (preg_match('#\.(?:gif|jpg|png)$#', $file2)) +						if ($row['style_id'] == $update['style_parent_id'])  						{ -							$imagesetlist['lang'][] = "$imgnamelang/$file2"; +							$found = true; +							$update['style_parent_tree'] = ($row['style_parent_tree'] != '' ? $row['style_parent_tree'] . '/' : '') . $row['style_path']; +							break;  						}  					} -					closedir($dp2); -				} -			} -			closedir($dp); -		} - -		// Generate list of image options -		$img_options = ''; -		foreach ($this->imageset_keys as $category => $img_ary) -		{ -			$template->assign_block_vars('category', array( -				'NAME'			=> $user->lang['IMG_CAT_' . strtoupper($category)] -			)); - -			foreach ($img_ary as $img) -			{ -				if ($category == 'buttons') -				{ -					foreach ($langs as $language) +					if (!$found)  					{ -						$template->assign_block_vars('category.images', array( -							'SELECTED'			=> ($img == $imgname && $language == $imgnamelang), -							'VALUE'				=> $img . '-' . $language, -							'TEXT'				=> $user->lang['IMG_' . strtoupper($img)] . ' [ ' . $language . ' ]' -						)); +						trigger_error($this->user->lang['STYLE_ERR_INVALID_PARENT'] . adm_back_link($update_action), E_USER_WARNING);  					}  				}  				else  				{ -					$template->assign_block_vars('category.images', array( -						'SELECTED'			=> ($img == $imgname), -						'VALUE'				=> $img, -						'TEXT'				=> (($category == 'custom') ? $img : $user->lang['IMG_' . strtoupper($img)]) -					)); +					$update['style_parent_tree'] = '';  				}  			} -		} - -		// Make sure the list of possible images is sorted alphabetically -		sort($imagesetlist['lang']); -		sort($imagesetlist['nolang']); - -		$image_found = false; -		$img_val = ''; -		foreach ($imagesetlist as $type => $img_ary) -		{ -			if ($type !== 'lang' || $sql_extra) +			else  			{ -				$template->assign_block_vars('imagesetlist', array( -					'TYPE'	=> ($type == 'lang') -				)); +				unset($update['style_parent_id']);  			} -			foreach ($img_ary as $img) +			// Check style_active +			if ($update['style_active'] != $style['style_active'])  			{ -				$imgtext = preg_replace('/^([^\/]+\/)/', '', $img); -				$selected = (!empty($imgname) && strpos($image_filename, $imgtext) !== false); -				if ($selected) +				if (!$update['style_active'] && $this->default_style == $style['style_id'])  				{ -					$image_found = true; -					$img_val = htmlspecialchars($img); +					trigger_error($this->user->lang['DEACTIVATE_DEFAULT'] . adm_back_link($update_action), E_USER_WARNING);  				} -				$template->assign_block_vars('imagesetlist.images', array( -					'SELECTED'			=> $selected, -					'TEXT'				=> $imgtext, -					'VALUE'				=> htmlspecialchars($img) -				));  			} -		} - -		$imgsize_bool = (!empty($imgname) && $image_width && $image_height) ? true : false; -		$image_request = '../styles/' . $imageset_path . '/imageset/' . ($image_lang ? $imgnamelang . '/' : '') . $image_filename; - -		$template->assign_vars(array( -			'S_EDIT_IMAGESET'	=> true, -			'L_TITLE'			=> $user->lang[$this->page_title], -			'L_EXPLAIN'			=> $user->lang[$this->page_title . '_EXPLAIN'], -			'IMAGE_OPTIONS'		=> $img_options, -			'IMAGE_SIZE'		=> $image_width, -			'IMAGE_HEIGHT'		=> $image_height, -			'IMAGE_REQUEST'		=> (empty($image_filename)) ? 'images/no_image.png' : $image_request, -			'U_ACTION'			=> $this->u_action . "&action=edit&id=$imageset_id", -			'U_BACK'			=> $this->u_action, -			'NAME'				=> $imageset_name, -			'A_NAME'			=> addslashes($imageset_name), -			'PATH'				=> $imageset_path, -			'A_PATH'			=> addslashes($imageset_path), -			'ERROR'				=> !$valid_name, -			'IMG_SRC'			=> ($image_found) ? '../styles/' . $imageset_path . '/imageset/' . $img_val : 'images/no_image.png', -			'IMAGE_SELECT'		=> $image_found -		)); -	} - -	/** -	* Remove style/template/theme/imageset -	*/ -	function remove($mode, $style_id) -	{ -		global $db, $template, $user, $phpbb_root_path, $cache, $config; - -		$new_id = request_var('new_id', 0); -		$update = (isset($_POST['update'])) ? true : false; -		$sql_where = ''; - -		switch ($mode) -		{ -			case 'style': -				$sql_from = STYLES_TABLE; -				$sql_select = 'style_id, style_name, template_id, theme_id, imageset_id'; -				$sql_where = 'AND style_active = 1'; -			break; - -			case 'template': -				$sql_from = STYLES_TEMPLATE_TABLE; -				$sql_select = 'template_id, template_name, template_path, template_storedb'; -			break; - -			case 'theme': -				$sql_from = STYLES_THEME_TABLE; -				$sql_select = 'theme_id, theme_name, theme_path, theme_storedb'; -			break; - -			case 'imageset': -				$sql_from = STYLES_IMAGESET_TABLE; -				$sql_select = 'imageset_id, imageset_name, imageset_path'; -			break; -		} - -		if ($mode === 'template' && ($conflicts = $this->check_inheritance($mode, $style_id))) -		{ -			$l_type = strtoupper($mode); -			$msg = $user->lang[$l_type . '_DELETE_DEPENDENT']; -			foreach ($conflicts as $id => $values) +			else  			{ -				$msg .= '<br />' . $values['template_name']; +				unset($update['style_active']);  			} -			trigger_error($msg . adm_back_link($this->u_action), E_USER_WARNING); -		} - -		$l_prefix = strtoupper($mode); - -		$sql = "SELECT $sql_select -			FROM $sql_from -			WHERE {$mode}_id = $style_id"; -		$result = $db->sql_query($sql); -		$style_row = $db->sql_fetchrow($result); -		$db->sql_freeresult($result); - -		if (!$style_row) -		{ -			trigger_error($user->lang['NO_' . $l_prefix] . adm_back_link($this->u_action), E_USER_WARNING); -		} - -		$s_only_component = $this->display_component_options($mode, $style_row[$mode . '_id'], $style_row); - -		if ($s_only_component) -		{ -			trigger_error($user->lang['ONLY_' . $l_prefix] . adm_back_link($this->u_action), E_USER_WARNING); -		} - -		if ($update) -		{ -			if ($mode == 'style') +			// Update data +			if (count($update))  			{ -				$sql = "DELETE FROM $sql_from -					WHERE {$mode}_id = $style_id"; -				$db->sql_query($sql); +				$sql = 'UPDATE ' . STYLES_TABLE . ' +					SET ' . $this->db->sql_build_array('UPDATE', $update) . " +					WHERE style_id = $id"; +				$this->db->sql_query($sql); -				$sql = 'UPDATE ' . USERS_TABLE . " -					SET user_style = $new_id -					WHERE user_style = $style_id"; -				$db->sql_query($sql); +				$style = array_merge($style, $update); -				$sql = 'UPDATE ' . FORUMS_TABLE . " -					SET forum_style = $new_id -					WHERE forum_style = $style_id"; -				$db->sql_query($sql); - -				if ($style_id == $config['default_style']) +				if (isset($update['style_parent_id']))  				{ -					set_config('default_style', $new_id); +					// Update styles tree +					$styles = $this->get_styles(); +					if ($this->update_styles_tree($styles, $style)) +					{ +						// Something was changed in styles tree, purge all cache +						$this->cache->purge(); +					}  				} +				add_log('admin', 'LOG_STYLE_EDIT_DETAILS', $style['style_name']); +			} -				// Remove the components -				$components = array('template', 'theme', 'imageset'); -				foreach ($components as $component) +			// Update default style +			$default = $this->request->variable('style_default', 0); +			if ($default) +			{ +				if (!$style['style_active'])  				{ -					$new_id = request_var('new_' . $component . '_id', 0); -					$component_id = $style_row[$component . '_id']; -					$this->remove_component($component, $component_id, $new_id, $style_id); +					trigger_error($this->user->lang['STYLE_DEFAULT_CHANGE_INACTIVE'] . adm_back_link($update_action), E_USER_WARNING);  				} +				set_config('default_style', $id); +				$this->cache->purge();  			} -			else -			{ -				$this->remove_component($mode, $style_id, $new_id); -			} - -			$cache->destroy('sql', STYLES_TABLE); -			add_log('admin', 'LOG_' . $l_prefix . '_DELETE', $style_row[$mode . '_name']); -			$message = ($mode != 'style') ? $l_prefix . '_DELETED_FS' : $l_prefix . '_DELETED'; -			trigger_error($user->lang[$message] . adm_back_link($this->u_action)); +			// Show styles list +			$this->frontend(); +			return;  		} -		$this->page_title = 'DELETE_' . $l_prefix; - -		$template->assign_vars(array( -			'S_DELETE'			=> true, - -			'L_TITLE'			=> $user->lang[$this->page_title], -			'L_EXPLAIN'			=> $user->lang[$this->page_title . '_EXPLAIN'], -			'L_NAME'			=> $user->lang[$l_prefix . '_NAME'], -			'L_REPLACE'			=> $user->lang['REPLACE_' . $l_prefix], -			'L_REPLACE_EXPLAIN'	=> $user->lang['REPLACE_' . $l_prefix . '_EXPLAIN'], - -			'U_ACTION'		=> $this->u_action . "&action=delete&id=$style_id", -			'U_BACK'		=> $this->u_action, +		// Show parent styles +		foreach ($list as $row) +		{ +			$this->template->assign_block_vars('parent_styles', array( +				'STYLE_ID'		=> $row['style_id'], +				'STYLE_NAME'	=> htmlspecialchars($row['style_name']), +				'LEVEL'			=> $row['level'], +				'SPACER'		=> str_repeat('  ', $row['level']), +				) +			); +		} -			'NAME'			=> $style_row[$mode . '_name'], +		// Show style details +		$this->template->assign_vars(array( +			'S_STYLE_DETAILS'	=> true, +			'STYLE_ID'			=> $style['style_id'], +			'STYLE_NAME'		=> htmlspecialchars($style['style_name']), +			'STYLE_PATH'		=> htmlspecialchars($style['style_path']), +			'STYLE_COPYRIGHT'	=> strip_tags($style['style_copyright']), +			'STYLE_PARENT'		=> $style['style_parent_id'], +			'S_STYLE_ACTIVE'	=> $style['style_active'], +			'S_STYLE_DEFAULT'	=> ($style['style_id'] == $this->default_style)  			)  		); - -		if ($mode == 'style') -		{ -			$template->assign_vars(array( -				'S_DELETE_STYLE'		=> true, -			)); -		}  	}  	/** -	* Remove template/theme/imageset entry from the database +	* List installed styles  	*/ -	function remove_component($component, $component_id, $new_id, $style_id = false) +	protected function show_installed()  	{ -		global $db; - -		if (($new_id == 0) || ($component === 'template' && ($conflicts = $this->check_inheritance($component, $component_id)))) -		{ -			// We can not delete the template, as the user wants to keep the component or an other template is inheriting from this one. -			return; -		} +		// Get all installed styles +		$styles = $this->get_styles(); -		$component_in_use = array(); -		if ($component != 'style') +		if (!count($styles))  		{ -			$component_in_use = $this->component_in_use($component, $component_id, $style_id); +			trigger_error($this->user->lang['NO_MATCHING_STYLES_FOUND'] . adm_back_link($this->u_action), E_USER_WARNING);  		} -		if (($new_id == -1) && !empty($component_in_use)) -		{ -			// We can not delete the component, as it is still in use -			return; -		} +		usort($styles, array($this, 'sort_styles')); -		if ($component == 'imageset') -		{ -			$sql = 'DELETE FROM ' . STYLES_IMAGESET_DATA_TABLE . " -				WHERE imageset_id = $component_id"; -			$db->sql_query($sql); -		} +		// Get users +		$users = $this->get_users(); -		switch ($component) +		// Add users counter to rows +		foreach ($styles as &$style)  		{ -			case 'template': -				$sql_from = STYLES_TEMPLATE_TABLE; -			break; - -			case 'theme': -				$sql_from = STYLES_THEME_TABLE; -			break; - -			case 'imageset': -				$sql_from = STYLES_IMAGESET_TABLE;; -			break; +			$style['_users'] = isset($users[$style['style_id']]) ? $users[$style['style_id']] : 0;  		} -		$sql = "DELETE FROM $sql_from -			WHERE {$component}_id = $component_id"; -		$db->sql_query($sql); - -		$sql = 'UPDATE ' . STYLES_TABLE . " -			SET {$component}_id = $new_id -			WHERE {$component}_id = $component_id"; -		$db->sql_query($sql); -	} - -	/** -	* Display the options which can be used to replace a style/template/theme/imageset -	* -	* @return boolean Returns true if the component is the only component and can not be deleted. -	*/ -	function display_component_options($component, $component_id, $style_row = false, $style_id = false) -	{ -		global $db, $template, $user; - -		$is_only_component = true; -		$component_in_use = array(); -		if ($component != 'style') -		{ -			$component_in_use = $this->component_in_use($component, $component_id, $style_id); -		} +		// Set up styles list variables +		// Addons should increase this number and update template variable +		$this->styles_list_cols = 4; +		$this->template->assign_var('STYLES_LIST_COLS', $this->styles_list_cols); -		$sql_where = ''; -		switch ($component) -		{ -			case 'style': -				$sql_from = STYLES_TABLE; -				$sql_where = 'WHERE style_active = 1'; -			break; - -			case 'template': -				$sql_from = STYLES_TEMPLATE_TABLE; -				$sql_where = 'WHERE template_inherits_id <> ' . $component_id; -			break; - -			case 'theme': -				$sql_from = STYLES_THEME_TABLE; -			break; - -			case 'imageset': -				$sql_from = STYLES_IMAGESET_TABLE; -			break; -		} +		// Show styles list +		$this->show_styles_list($styles, 0, 0); -		$s_options = ''; -		if (($component != 'style') && empty($component_in_use)) +		// Show styles with invalid inherits_id +		foreach ($styles as $style)  		{ -			// If it is not in use, there must be another component -			$is_only_component = false; - -			$sql = "SELECT {$component}_id, {$component}_name -				FROM $sql_from -				WHERE {$component}_id = {$component_id}"; -			$result = $db->sql_query($sql); -			$row = $db->sql_fetchrow($result); -			$db->sql_freeresult($result); - -			$s_options .= '<option value="-1" selected="selected">' . $user->lang['DELETE_' . strtoupper($component)] . '</option>'; -			$s_options .= '<option value="0">' . sprintf($user->lang['KEEP_' . strtoupper($component)], $row[$component . '_name']) . '</option>'; -		} -		else -		{ -			$sql = "SELECT {$component}_id, {$component}_name -				FROM $sql_from -				$sql_where -				ORDER BY {$component}_name ASC"; -			$result = $db->sql_query($sql); - -			$s_keep_option = $s_options = ''; -			while ($row = $db->sql_fetchrow($result)) -			{ -				if ($row[$component . '_id'] != $component_id) -				{ -					$is_only_component = false; -					$s_options .= '<option value="' . $row[$component . '_id'] . '">' . sprintf($user->lang['REPLACE_WITH_OPTION'], $row[$component . '_name']) . '</option>'; -				} -				else if ($component != 'style') -				{ -					$s_keep_option = '<option value="0" selected="selected">' . sprintf($user->lang['KEEP_' . strtoupper($component)], $row[$component . '_name']) . '</option>'; -				} -			} -			$db->sql_freeresult($result); -			$s_options = $s_keep_option . $s_options; -		} - -		if (!$style_row) -		{ -			$template->assign_var('S_REPLACE_' . strtoupper($component) . '_OPTIONS', $s_options); -		} -		else -		{ -			$template->assign_var('S_REPLACE_OPTIONS', $s_options); -			if ($component == 'style') +			if (empty($style['_shown']))  			{ -				$components = array('template', 'theme', 'imageset'); -				foreach ($components as $component) -				{ -					$this->display_component_options($component, $style_row[$component . '_id'], false, $component_id, true); -				} +				$style['_note'] = sprintf($this->user->lang['REQUIRES_STYLE'], htmlspecialchars($style['style_parent_tree'])); +				$this->list_style($style, 0);  			}  		} -		return $is_only_component; -	} - -	/** -	* Check whether the component is still used by another style or component -	*/ -	function component_in_use($component, $component_id, $style_id = false) -	{ -		global $db; - -		$component_in_use = array(); +		// Add buttons +		$this->template->assign_block_vars('extra_actions', array( +				'ACTION_NAME'	=> 'activate', +				'L_ACTION'		=> $this->user->lang['STYLE_ACTIVATE'], +			) +		); -		if ($style_id) -		{ -			$sql = 'SELECT style_id, style_name -				FROM ' . STYLES_TABLE . " -				WHERE {$component}_id = {$component_id} -					AND style_id <> {$style_id} -				ORDER BY style_name ASC"; -		} -		else -		{ -			$sql = 'SELECT style_id, style_name -				FROM ' . STYLES_TABLE . " -				WHERE {$component}_id = {$component_id} -				ORDER BY style_name ASC"; -		} -		$result = $db->sql_query($sql); -		while ($row = $db->sql_fetchrow($result)) -		{ -			$component_in_use[] = $row['style_name']; -		} -		$db->sql_freeresult($result); +		$this->template->assign_block_vars('extra_actions', array( +				'ACTION_NAME'	=> 'deactivate', +				'L_ACTION'		=> $this->user->lang['STYLE_DEACTIVATE'], +			) +		); -		if ($component === 'template' && ($conflicts = $this->check_inheritance($component, $component_id))) +		if (isset($this->style_counters) && $this->style_counters['total'] > 1)  		{ -			foreach ($conflicts as $temp_id => $conflict_data) -			{ -				$component_in_use[] = $conflict_data['template_name']; -			} +			$this->template->assign_block_vars('extra_actions', array( +					'ACTION_NAME'	=> 'uninstall', +					'L_ACTION'		=> $this->user->lang['STYLE_UNINSTALL'], +				) +			);  		} - -		return $component_in_use;  	}  	/** -	* Export style or style elements +	* Show list of styles that can be installed  	*/ -	function export($mode, $style_id) +	protected function show_available()  	{ -		global $db, $template, $user, $phpbb_root_path, $cache, $phpEx, $config; +		// Get list of styles +		$styles = $this->find_available(true); -		$update = (isset($_POST['update'])) ? true : false; - -		$inc_template = request_var('inc_template', 0); -		$inc_theme = request_var('inc_theme', 0); -		$inc_imageset = request_var('inc_imageset', 0); -		$store = request_var('store', 0); -		$format = request_var('format', ''); - -		$error = array(); -		$methods = array('tar'); - -		$available_methods = array('tar.gz' => 'zlib', 'tar.bz2' => 'bz2', 'zip' => 'zlib'); -		foreach ($available_methods as $type => $module) -		{ -			if (!@extension_loaded($module)) -			{ -				continue; -			} - -			$methods[] = $type; -		} - -		if (!in_array($format, $methods)) +		// Show styles +		if (empty($styles))  		{ -			$format = 'tar'; +			trigger_error($this->user->lang['NO_UNINSTALLED_STYLE'] . adm_back_link($this->u_base_action), E_USER_NOTICE);  		} -		switch ($mode) -		{ -			case 'style': -				if ($update && ($inc_template + $inc_theme + $inc_imageset) < 1) -				{ -					$error[] = $user->lang['STYLE_ERR_MORE_ELEMENTS']; -				} - -				$name = 'style_name'; - -				$sql_select = 's.style_id, s.style_name, s.style_copyright'; -				$sql_select .= ($inc_template) ? ', t.*' : ', t.template_name'; -				$sql_select .= ($inc_theme) ? ', c.*' : ', c.theme_name'; -				$sql_select .= ($inc_imageset) ? ', i.*' : ', i.imageset_name'; -				$sql_from = STYLES_TABLE . ' s, ' . STYLES_TEMPLATE_TABLE . ' t, ' . STYLES_THEME_TABLE . ' c, ' . STYLES_IMAGESET_TABLE . ' i'; -				$sql_where = "s.style_id = $style_id AND t.template_id = s.template_id AND c.theme_id = s.theme_id AND i.imageset_id = s.imageset_id"; - -				$l_prefix = 'STYLE'; -			break; - -			case 'template': -				$name = 'template_name'; - -				$sql_select = '*'; -				$sql_from = STYLES_TEMPLATE_TABLE; -				$sql_where = "template_id = $style_id"; - -				$l_prefix = 'TEMPLATE'; -			break; +		usort($styles, array($this, 'sort_styles')); -			case 'theme': -				$name = 'theme_name'; - -				$sql_select = '*'; -				$sql_from = STYLES_THEME_TABLE; -				$sql_where = "theme_id = $style_id"; - -				$l_prefix = 'THEME'; -			break; - -			case 'imageset': -				$name = 'imageset_name'; - -				$sql_select = '*'; -				$sql_from = STYLES_IMAGESET_TABLE; -				$sql_where = "imageset_id = $style_id"; - -				$l_prefix = 'IMAGESET'; -			break; -		} +		$this->styles_list_cols = 3; +		$this->template->assign_vars(array( +			'STYLES_LIST_COLS'	=> $this->styles_list_cols, +			'STYLES_LIST_HIDE_COUNT'	=> true +			) +		); -		if ($update && !sizeof($error)) +		// Show styles +		foreach ($styles as &$style)  		{ -			$sql = "SELECT $sql_select -				FROM $sql_from -				WHERE $sql_where"; -			$result = $db->sql_query($sql); -			$style_row = $db->sql_fetchrow($result); -			$db->sql_freeresult($result); - -			if (!$style_row) -			{ -				trigger_error($user->lang['NO_' . $l_prefix] . adm_back_link($this->u_action), E_USER_WARNING); -			} - -			$var_ary = array('style_id', 'style_name', 'style_copyright', 'template_id', 'template_name', 'template_path', 'template_copyright', 'template_storedb', 'template_inherits_id', 'bbcode_bitfield', 'theme_id', 'theme_name', 'theme_path', 'theme_copyright', 'theme_storedb', 'theme_mtime', 'theme_data', 'imageset_id', 'imageset_name', 'imageset_path', 'imageset_copyright'); - -			foreach ($var_ary as $var) -			{ -				if (!isset($style_row[$var])) -				{ -					$style_row[$var] = ''; -				} -			} - -			$files = $data = array(); - -			if ($mode == 'style') -			{ -				$style_cfg = str_replace(array('{MODE}', '{NAME}', '{COPYRIGHT}', '{VERSION}'), array($mode, $style_row['style_name'], $style_row['style_copyright'], $config['version']), $this->style_cfg); - -				$style_cfg .= (!$inc_template) ? "\nrequired_template = {$style_row['template_name']}" : ''; -				$style_cfg .= (!$inc_theme) ? "\nrequired_theme = {$style_row['theme_name']}" : ''; -				$style_cfg .= (!$inc_imageset) ? "\nrequired_imageset = {$style_row['imageset_name']}" : ''; - -				$data[] = array( -					'src'		=> $style_cfg, -					'prefix'	=> 'style.cfg' -				); - -				unset($style_cfg); -			} - -			// Export template core code -			if ($mode == 'template' || $inc_template) +			// Check if style has a parent style in styles list +			$has_parent = false; +			if ($style['_inherit_name'] != '')  			{ -				$use_template_name = $style_row['template_name']; - -				// Add the inherit from variable, depending on it's use... -				if ($style_row['template_inherits_id']) -				{ -					// Get the template name -					$sql = 'SELECT template_name -						FROM ' . STYLES_TEMPLATE_TABLE . ' -						WHERE template_id = ' . (int) $style_row['template_inherits_id']; -					$result = $db->sql_query($sql); -					$use_template_name = (string) $db->sql_fetchfield('template_name'); -					$db->sql_freeresult($result); -				} - -				$template_cfg = str_replace(array('{MODE}', '{NAME}', '{COPYRIGHT}', '{VERSION}', '{INHERIT_FROM}'), array($mode, $style_row['template_name'], $style_row['template_copyright'], $config['version'], $use_template_name), $this->template_cfg); - -				$template_cfg .= "\n\nbbcode_bitfield = {$style_row['bbcode_bitfield']}"; - -				$data[] = array( -					'src'		=> $template_cfg, -					'prefix'	=> 'template/template.cfg' -				); - -				// This is potentially nasty memory-wise ... -				if (!$style_row['template_storedb']) -				{ -					$files[] = array( -						'src'		=> "styles/{$style_row['template_path']}/template/", -						'prefix-'	=> "styles/{$style_row['template_path']}/", -						'prefix+'	=> false, -						'exclude'	=> 'template.cfg' -					); -				} -				else +				foreach ($styles as $parent_style)  				{ -					$sql = 'SELECT template_filename, template_data -						FROM ' . STYLES_TEMPLATE_DATA_TABLE . " -						WHERE template_id = {$style_row['template_id']}"; -					$result = $db->sql_query($sql); - -					while ($row = $db->sql_fetchrow($result)) +					if ($parent_style['style_name'] == $style['_inherit_name'] && empty($parent_style['_shown']))  					{ -						$data[] = array( -							'src' => $row['template_data'], -							'prefix' => 'template/' . $row['template_filename'] -						); +						// Show parent style first +						$has_parent = true;  					} -					$db->sql_freeresult($result);  				} -				unset($template_cfg);  			} - -			// Export theme core code -			if ($mode == 'theme' || $inc_theme) +			if (!$has_parent)  			{ -				$theme_cfg = str_replace(array('{MODE}', '{NAME}', '{COPYRIGHT}', '{VERSION}'), array($mode, $style_row['theme_name'], $style_row['theme_copyright'], $config['version']), $this->theme_cfg); - -				// Read old cfg file -				$items = $cache->obtain_cfg_items($style_row); -				$items = $items['theme']; - -				if (!isset($items['parse_css_file'])) -				{ -					$items['parse_css_file'] = 'off'; -				} - -				$theme_cfg = str_replace(array('{PARSE_CSS_FILE}'), array($items['parse_css_file']), $theme_cfg); - -				$files[] = array( -					'src'		=> "styles/{$style_row['theme_path']}/theme/", -					'prefix-'	=> "styles/{$style_row['theme_path']}/", -					'prefix+'	=> false, -					'exclude'	=> ($style_row['theme_storedb']) ? 'stylesheet.css,theme.cfg' : 'theme.cfg' -				); - -				$data[] = array( -					'src'		=> $theme_cfg, -					'prefix'	=> 'theme/theme.cfg' -				); - -				if ($style_row['theme_storedb']) -				{ -					$data[] = array( -						'src'		=> $style_row['theme_data'], -						'prefix'	=> 'theme/stylesheet.css' -					); -				} - -				unset($items, $theme_cfg); -			} - -			// Export imageset core code -			if ($mode == 'imageset' || $inc_imageset) -			{ -				$imageset_cfg = str_replace(array('{MODE}', '{NAME}', '{COPYRIGHT}', '{VERSION}'), array($mode, $style_row['imageset_name'], $style_row['imageset_copyright'], $config['version']), $this->imageset_cfg); - -				$imageset_main = array(); - -				$sql = 'SELECT image_filename, image_name, image_height, image_width -					FROM ' . STYLES_IMAGESET_DATA_TABLE . " -					WHERE imageset_id = $style_id -						AND image_lang = ''"; -				$result = $db->sql_query($sql); -				while ($row = $db->sql_fetchrow($result)) -				{ -					$imageset_main[$row['image_name']] = $row['image_filename'] . ($row['image_height'] ? '*' . $row['image_height']: '') . ($row['image_width'] ? '*' . $row['image_width']: ''); -				} -				$db->sql_freeresult($result); - -				foreach ($this->imageset_keys as $topic => $key_array) -				{ -					foreach ($key_array as $key) -					{ -						if (isset($imageset_main[$key])) -						{ -							$imageset_cfg .= "\nimg_" . $key . ' = ' . str_replace("styles/{$style_row['imageset_path']}/imageset/", '{PATH}', $imageset_main[$key]); -						} -					} -				} - -				$files[] = array( -					'src'		=> "styles/{$style_row['imageset_path']}/imageset/", -					'prefix-'	=> "styles/{$style_row['imageset_path']}/", -					'prefix+'	=> false, -					'exclude'	=> 'imageset.cfg' -				); - -				$data[] = array( -					'src'		=> trim($imageset_cfg), -					'prefix'	=> 'imageset/imageset.cfg' -				); - -				end($data); - -				$imageset_root = "{$phpbb_root_path}styles/{$style_row['imageset_path']}/imageset/"; - -				if ($dh = @opendir($imageset_root)) -				{ -					while (($fname = readdir($dh)) !== false) -					{ -						if ($fname[0] != '.' && $fname != 'CVS' && is_dir("$imageset_root$fname")) -						{ -							$files[key($files)]['exclude'] .= ',' . $fname . '/imageset.cfg'; -						} -					} -					closedir($dh); -				} - -				$imageset_lang = array(); - -				$sql = 'SELECT image_filename, image_name, image_height, image_width, image_lang -					FROM ' . STYLES_IMAGESET_DATA_TABLE . " -					WHERE imageset_id = $style_id -						AND image_lang <> ''"; -				$result = $db->sql_query($sql); -				while ($row = $db->sql_fetchrow($result)) -				{ -					$imageset_lang[$row['image_lang']][$row['image_name']] = $row['image_filename'] . ($row['image_height'] ? '*' . $row['image_height']: '') . ($row['image_width'] ? '*' . $row['image_width']: ''); -				} -				$db->sql_freeresult($result); - -				foreach ($imageset_lang as $lang => $imageset_localized) -				{ -					$imageset_cfg = str_replace(array('{MODE}', '{NAME}', '{COPYRIGHT}', '{VERSION}'), array($mode, $style_row['imageset_name'], $style_row['imageset_copyright'], $config['version']), $this->imageset_cfg); - -					foreach ($this->imageset_keys as $topic => $key_array) -					{ -						foreach ($key_array as $key) -						{ -							if (isset($imageset_localized[$key])) -							{ -								$imageset_cfg .= "\nimg_" . $key . ' = ' . str_replace("styles/{$style_row['imageset_path']}/imageset/", '{PATH}', $imageset_localized[$key]); -							} -						} -					} - -					$data[] = array( -						'src'		=> trim($imageset_cfg), -						'prefix'	=> 'imageset/' . $lang . '/imageset.cfg' -					); -				} - -				unset($imageset_cfg); -			} - -			switch ($format) -			{ -				case 'tar': -					$ext = '.tar'; -				break; - -				case 'zip': -					$ext = '.zip'; -				break; - -				case 'tar.gz': -					$ext = '.tar.gz'; -				break; - -				case 'tar.bz2': -					$ext = '.tar.bz2'; -				break; - -				default: -					$error[] = $user->lang[$l_prefix . '_ERR_ARCHIVE']; -			} - -			if (!sizeof($error)) -			{ -				include($phpbb_root_path . 'includes/functions_compress.' . $phpEx); - -				if ($mode == 'style') -				{ -					$path = preg_replace('#[^\w-]+#', '_', $style_row['style_name']); -				} -				else -				{ -					$path = $style_row[$mode . '_path']; -				} - -				if ($format == 'zip') -				{ -					$compress = new compress_zip('w', $phpbb_root_path . "store/$path$ext"); -				} -				else -				{ -					$compress = new compress_tar('w', $phpbb_root_path . "store/$path$ext", $ext); -				} - -				if (sizeof($files)) -				{ -					foreach ($files as $file_ary) -					{ -						$compress->add_file($file_ary['src'], $file_ary['prefix-'], $file_ary['prefix+'], $file_ary['exclude']); -					} -				} - -				if (sizeof($data)) -				{ -					foreach ($data as $data_ary) -					{ -						$compress->add_data($data_ary['src'], $data_ary['prefix']); -					} -				} - -				$compress->close(); - -				add_log('admin', 'LOG_' . $l_prefix . '_EXPORT', $style_row[$mode . '_name']); - -				if (!$store) -				{ -					$compress->download($path); -					@unlink("{$phpbb_root_path}store/$path$ext"); -					exit; -				} - -				trigger_error(sprintf($user->lang[$l_prefix . '_EXPORTED'], "store/$path$ext") . adm_back_link($this->u_action)); +				$this->list_style($style, 0); +				$this->show_available_child_styles($styles, $style['style_name'], 1);  			}  		} -		$sql = "SELECT {$mode}_id, {$mode}_name -			FROM " . (($mode == 'style') ? STYLES_TABLE : $sql_from) . " -			WHERE {$mode}_id = $style_id"; -		$result = $db->sql_query($sql); -		$style_row = $db->sql_fetchrow($result); -		$db->sql_freeresult($result); - -		if (!$style_row) +		// Show styles that do not have parent style in styles list +		foreach ($styles as $style)  		{ -			trigger_error($user->lang['NO_' . $l_prefix] . adm_back_link($this->u_action), E_USER_WARNING); +			if (empty($style['_shown'])) +			{ +				$this->list_style($style, 0); +			}  		} -		$this->page_title = $l_prefix . '_EXPORT'; - -		$format_buttons = ''; -		foreach ($methods as $method) +		// Add button +		if (isset($this->style_counters) && $this->style_counters['caninstall'] > 0)  		{ -			$format_buttons .= '<label><input type="radio"' . ((!$format_buttons) ? ' id="format"' : '') . ' class="radio" value="' . $method . '" name="format"' . (($method == $format) ? ' checked="checked"' : '') . ' /> ' . $method . '</label>'; +			$this->template->assign_block_vars('extra_actions', array( +					'ACTION_NAME'	=> 'install', +					'L_ACTION'		=> $this->user->lang['INSTALL_STYLES'], +				) +			);  		} - -		$template->assign_vars(array( -			'S_EXPORT'		=> true, -			'S_ERROR_MSG'	=> (sizeof($error)) ? true : false, -			'S_STYLE'		=> ($mode == 'style') ? true : false, - -			'L_TITLE'		=> $user->lang[$this->page_title], -			'L_EXPLAIN'		=> $user->lang[$this->page_title . '_EXPLAIN'], -			'L_NAME'		=> $user->lang[$l_prefix . '_NAME'], - -			'U_ACTION'		=> $this->u_action . '&action=export&id=' . $style_id, -			'U_BACK'		=> $this->u_action, - -			'ERROR_MSG'			=> (sizeof($error)) ? implode('<br />', $error) : '', -			'NAME'				=> $style_row[$mode . '_name'], -			'FORMAT_BUTTONS'	=> $format_buttons) -		);  	}  	/** -	* Display details +	* Find styles available for installation +	* +	* @param bool $all if true, function will return all installable styles. if false, function will return only styles that can be installed +	* @return array List of styles  	*/ -	function details($mode, $style_id) +	protected function find_available($all)  	{ -		global $template, $db, $config, $user, $safe_mode, $cache, $phpbb_root_path; - -		$update = (isset($_POST['update'])) ? true : false; -		$l_type = strtoupper($mode); - -		$error = array(); -		$element_ary = array('template' => STYLES_TEMPLATE_TABLE, 'theme' => STYLES_THEME_TABLE, 'imageset' => STYLES_IMAGESET_TABLE); - -		switch ($mode) -		{ -			case 'style': -				$sql_from = STYLES_TABLE; -			break; - -			case 'template': -				$sql_from = STYLES_TEMPLATE_TABLE; -			break; - -			case 'theme': -				$sql_from = STYLES_THEME_TABLE; -			break; - -			case 'imageset': -				$sql_from = STYLES_IMAGESET_TABLE; -			break; -		} - -		$sql = "SELECT * -			FROM $sql_from -			WHERE {$mode}_id = $style_id"; -		$result = $db->sql_query($sql); -		$style_row = $db->sql_fetchrow($result); -		$db->sql_freeresult($result); - -		if (!$style_row) -		{ -			trigger_error($user->lang['NO_' . $l_type] . adm_back_link($this->u_action), E_USER_WARNING); +		// Get list of installed styles +		$installed = $this->get_styles(); + +		$installed_dirs = array(); +		$installed_names = array(); +		foreach ($installed as $style) +		{ +			$installed_dirs[] = $style['style_path']; +			$installed_names[$style['style_name']] = array( +				'path'		=> $style['style_path'], +				'id'		=> $style['style_id'], +				'parent'	=> $style['style_parent_id'], +				'tree'		=> (strlen($style['style_parent_tree']) ? $style['style_parent_tree'] . '/' : '') . $style['style_path'], +			);  		} -		$style_row['style_default'] = ($mode == 'style' && $config['default_style'] == $style_id) ? 1 : 0; +		// Get list of directories +		$dirs = $this->find_style_dirs(); -		if ($update) +		// Find styles that can be installed +		$styles = array(); +		foreach ($dirs as $dir)  		{ -			$name = utf8_normalize_nfc(request_var('name', '', true)); -			$copyright = utf8_normalize_nfc(request_var('copyright', '', true)); - -			$template_id = request_var('template_id', 0); -			$theme_id = request_var('theme_id', 0); -			$imageset_id = request_var('imageset_id', 0); - -			$style_active = request_var('style_active', 0); -			$style_default = request_var('style_default', 0); -			$store_db = request_var('store_db', 0); - -			// If the admin selected the style to be the default style, but forgot to activate it... we will do it for him -			if ($style_default) -			{ -				$style_active = 1; -			} - -			$sql = "SELECT {$mode}_id, {$mode}_name -				FROM $sql_from -				WHERE {$mode}_id <> $style_id -				AND LOWER({$mode}_name) = '" . $db->sql_escape(strtolower($name)) . "'"; -			$result = $db->sql_query($sql); -			$conflict = $db->sql_fetchrow($result); -			$db->sql_freeresult($result); - -			if ($mode == 'style' && (!$template_id || !$theme_id || !$imageset_id)) +			if (in_array($dir, $installed_dirs))  			{ -				$error[] = $user->lang['STYLE_ERR_NO_IDS']; -			} - -			if ($mode == 'style' && $style_row['style_active'] && !$style_active && $config['default_style'] == $style_id) -			{ -				$error[] = $user->lang['DEACTIVATE_DEFAULT']; -			} - -			if (!$name || $conflict) -			{ -				$error[] = $user->lang[$l_type . '_ERR_STYLE_NAME']; -			} - -			if ($mode === 'theme' || $mode === 'template') -			{ -				// a rather elaborate check we have to do here once to avoid trouble later -				$check = "{$phpbb_root_path}styles/" . $style_row["{$mode}_path"] . (($mode === 'theme') ? '/theme/stylesheet.css' : '/template'); -				if (($style_row["{$mode}_storedb"] != $store_db) && !$store_db && ($safe_mode || !phpbb_is_writable($check))) -				{ -					$error[] = $user->lang['EDIT_' . strtoupper($mode) . '_STORED_DB']; -					$store_db = 1; -				} - -				// themes which have to be parsed have to go into db -				if ($mode == 'theme') -				{ -					$cfg = parse_cfg_file("{$phpbb_root_path}styles/" . $style_row["{$mode}_path"] . "/theme/theme.cfg"); - -					if (isset($cfg['parse_css_file']) && $cfg['parse_css_file'] && !$store_db) -					{ -						$error[] = $user->lang['EDIT_THEME_STORE_PARSED']; -						$store_db = 1; -					} -				} +				// Style is already installed +				continue;  			} - -			if (!sizeof($error)) +			$cfg = $this->read_style_cfg($dir); +			if ($cfg === false)  			{ -				// Check length settings -				if (utf8_strlen($name) > 30) -				{ -					$error[] = $user->lang[$l_type . '_ERR_NAME_LONG']; -				} - -				if (utf8_strlen($copyright) > 60) -				{ -					$error[] = $user->lang[$l_type . '_ERR_COPY_LONG']; -				} +				// Invalid style.cfg +				continue;  			} -		} -		if ($update && sizeof($error)) -		{ -			$style_row = array_merge($style_row, array( -				'template_id'			=> $template_id, -				'theme_id'				=> $theme_id, -				'imageset_id'			=> $imageset_id, -				'style_active'			=> $style_active, -				$mode . '_storedb'		=> $store_db, -				$mode . '_name'			=> $name, -				$mode . '_copyright'	=> $copyright) +			// Style should be available for installation +			$parent = $cfg['parent']; +			$style = array( +				'style_id'			=> 0, +				'style_name'		=> $cfg['name'], +				'style_copyright'	=> $cfg['copyright'], +				'style_active'		=> 0, +				'style_path'		=> $dir, +				'bbcode_bitfield'	=> $cfg['template_bitfield'], +				'style_parent_id'	=> 0, +				'style_parent_tree'	=> '', +				// Extra values for styles list +				// All extra variable start with _ so they won't be confused with data that can be added to styles table +				'_inherit_name'			=> $parent, +				'_available'			=> true, +				'_note'					=> '',  			); -		} -		// User has submitted form and no errors have occurred -		if ($update && !sizeof($error)) -		{ -			$sql_ary = array( -				$mode . '_name'			=> $name, -				$mode . '_copyright'	=> $copyright -			); - -			switch ($mode) +			// Check style inheritance +			if ($parent != '')  			{ -				case 'style': - -					$sql_ary += array( -						'template_id'		=> (int) $template_id, -						'theme_id'			=> (int) $theme_id, -						'imageset_id'		=> (int) $imageset_id, -						'style_active'		=> (int) $style_active, -					); -				break; - -				case 'imageset': -				break; - -				case 'theme': - -					if ($style_row['theme_storedb'] != $store_db) -					{ -						$theme_data = ''; - -						if (!$style_row['theme_storedb']) -						{ -							$theme_data = $this->db_theme_data($style_row); -						} -						else if (!$store_db && !$safe_mode && phpbb_is_writable("{$phpbb_root_path}styles/{$style_row['theme_path']}/theme/stylesheet.css")) -						{ -							$store_db = 1; -							$theme_data = $style_row['theme_data']; - -							if ($fp = @fopen("{$phpbb_root_path}styles/{$style_row['theme_path']}/theme/stylesheet.css", 'wb')) -							{ -								$store_db = (@fwrite($fp, str_replace("styles/{$style_row['theme_path']}/theme/", './', $theme_data))) ? 0 : 1; -							} -							fclose($fp); -						} - -						$sql_ary += array( -							'theme_mtime'	=> ($store_db) ? filemtime("{$phpbb_root_path}styles/{$style_row['theme_path']}/theme/stylesheet.css") : 0, -							'theme_storedb'	=> $store_db, -							'theme_data'	=> ($store_db) ? $theme_data : '', -						); -					} -				break; - -				case 'template': - -					if ($style_row['template_storedb'] != $store_db) -					{ -						if ($super = $this->get_super($mode, $style_row['template_id'])) -						{ -							$error[] = (sprintf($user->lang["{$l_type}_INHERITS"], $super['template_name'])); -							$sql_ary = array(); -						} -						else -						{ -							if (!$store_db && !$safe_mode && phpbb_is_writable("{$phpbb_root_path}styles/{$style_row['template_path']}/template")) -							{ -								$err = $this->store_in_fs('template', $style_row['template_id']); -								if ($err) -								{ -									$error += $err; -								} -							} -							else if ($store_db) -							{ -								$this->store_in_db('template', $style_row['template_id']); -							} -							else -							{ -								// We no longer store within the db, but are also not able to update the file structure -								// Since the admin want to switch this, we adhere to his decision. But we also need to remove the cache -								$sql = 'DELETE FROM ' . STYLES_TEMPLATE_DATA_TABLE . " -									WHERE template_id = $style_id"; -								$db->sql_query($sql); -							} - -							$sql_ary += array( -								'template_storedb'	=> $store_db, -							); -						} -					} -				break; -			} - -			if (sizeof($sql_ary)) -			{ -				$sql = "UPDATE $sql_from -					SET " . $db->sql_build_array('UPDATE', $sql_ary) . " -					WHERE {$mode}_id = $style_id"; -				$db->sql_query($sql); - -				// Making this the default style? -				if ($mode == 'style' && $style_default) +				if (isset($installed_names[$parent]))  				{ -					set_config('default_style', $style_id); +					// Parent style is installed +					$row = $installed_names[$parent]; +					$style['style_parent_id'] = $row['id']; +					$style['style_parent_tree'] = $row['tree'];  				} -			} - -			$cache->destroy('sql', STYLES_TABLE); - -			add_log('admin', 'LOG_' . $l_type . '_EDIT_DETAILS', $name); -			if (sizeof($error)) -			{ -				trigger_error(implode('<br />', $error) . adm_back_link($this->u_action), E_USER_WARNING); -			} -			else -			{ -				trigger_error($user->lang[$l_type . '_DETAILS_UPDATED'] . adm_back_link($this->u_action)); -			} -		} - -		if ($mode == 'style') -		{ -			foreach ($element_ary as $element => $table) -			{ -				$sql = "SELECT {$element}_id, {$element}_name -					FROM $table -					ORDER BY {$element}_id ASC"; -				$result = $db->sql_query($sql); - -				${$element . '_options'} = ''; -				while ($row = $db->sql_fetchrow($result)) +				else  				{ -					$selected = ($row[$element . '_id'] == $style_row[$element . '_id']) ? ' selected="selected"' : ''; -					${$element . '_options'} .= '<option value="' . $row[$element . '_id'] . '"' . $selected . '>' . $row[$element . '_name'] . '</option>'; +					// Parent style is not installed yet +					$style['_available'] = false; +					$style['_note'] = sprintf($this->user->lang['REQUIRES_STYLE'], htmlspecialchars($parent));  				} -				$db->sql_freeresult($result);  			} -		} -		if ($mode == 'template') -		{ -			$super = array(); -			if (isset($style_row[$mode . '_inherits_id']) && $style_row['template_inherits_id']) +			if ($all || $style['_available'])  			{ -				$super = $this->get_super($mode, $style_row['template_id']); +				$styles[] = $style;  			}  		} -		$this->page_title = 'EDIT_DETAILS_' . $l_type; - -		$template->assign_vars(array( -			'S_DETAILS'				=> true, -			'S_ERROR_MSG'			=> (sizeof($error)) ? true : false, -			'S_STYLE'				=> ($mode == 'style') ? true : false, -			'S_TEMPLATE'			=> ($mode == 'template') ? true : false, -			'S_THEME'				=> ($mode == 'theme') ? true : false, -			'S_IMAGESET'			=> ($mode == 'imageset') ? true : false, -			'S_STORE_DB'			=> (isset($style_row[$mode . '_storedb'])) ? $style_row[$mode . '_storedb'] : 0, -			'S_STORE_DB_DISABLED'	=> (isset($style_row[$mode . '_inherits_id'])) ? $style_row[$mode . '_inherits_id'] : 0, -			'S_STYLE_ACTIVE'		=> (isset($style_row['style_active'])) ? $style_row['style_active'] : 0, -			'S_STYLE_DEFAULT'		=> (isset($style_row['style_default'])) ? $style_row['style_default'] : 0, -			'S_SUPERTEMPLATE'		=> (isset($style_row[$mode . '_inherits_id']) && $style_row[$mode . '_inherits_id']) ? $super['template_name'] : 0, - -			'S_TEMPLATE_OPTIONS'	=> ($mode == 'style') ? $template_options : '', -			'S_THEME_OPTIONS'		=> ($mode == 'style') ? $theme_options : '', -			'S_IMAGESET_OPTIONS'	=> ($mode == 'style') ? $imageset_options : '', - -			'U_ACTION'		=> $this->u_action . '&action=details&id=' . $style_id, -			'U_BACK'		=> $this->u_action, - -			'L_TITLE'				=> $user->lang[$this->page_title], -			'L_EXPLAIN'				=> $user->lang[$this->page_title . '_EXPLAIN'], -			'L_NAME'				=> $user->lang[$l_type . '_NAME'], -			'L_LOCATION'			=> ($mode == 'template' || $mode == 'theme') ? $user->lang[$l_type . '_LOCATION'] : '', -			'L_LOCATION_EXPLAIN'	=> ($mode == 'template' || $mode == 'theme') ? $user->lang[$l_type . '_LOCATION_EXPLAIN'] : '', - -			'ERROR_MSG'		=> (sizeof($error)) ? implode('<br />', $error) : '', -			'NAME'			=> $style_row[$mode . '_name'], -			'COPYRIGHT'		=> $style_row[$mode . '_copyright'], -			) -		); +		return $styles;  	}  	/** -	* Load css file contents +	* Show styles list +	* +	* @param array $styles styles list +	* @param int $parent parent style id +	* @param int $level style inheritance level  	*/ -	function load_css_file($path, $filename) +	protected function show_styles_list(&$styles, $parent, $level)  	{ -		global $phpbb_root_path; - -		$file = "{$phpbb_root_path}styles/$path/theme/$filename"; - -		if (file_exists($file) && ($content = file_get_contents($file))) +		foreach ($styles as &$style)  		{ -			$content = trim($content); -		} -		else -		{ -			$content = ''; -		} -		if (defined('DEBUG')) -		{ -			$content = "/* BEGIN @include $filename */ \n $content \n /* END @include $filename */ \n"; +			if (empty($style['_shown']) && $style['style_parent_id'] == $parent) +			{ +				$this->list_style($style, $level); +				$this->show_styles_list($styles, $style['style_id'], $level + 1); +			}  		} - -		return $content;  	}  	/** -	* Returns a string containing the value that should be used for the theme_data column in the theme database table. -	* Includes contents of files loaded via @import +	* Show available styles tree  	* -	* @param array $theme_row is an associative array containing the theme's current database entry -	* @param mixed $stylesheet can either be the new content for the stylesheet or false to load from the standard file -	* @param string $root_path should only be used in case you want to use a different root path than "{$phpbb_root_path}styles/{$theme_row['theme_path']}" -	* -	* @return string Stylesheet data for theme_data column in the theme table +	* @param array $styles Styles list, passed as reference +	* @param string $name Name of parent style +	* @param string $level Styles tree level  	*/ -	function db_theme_data($theme_row, $stylesheet = false, $root_path = '') +	protected function show_available_child_styles(&$styles, $name, $level)  	{ -		global $phpbb_root_path; - -		if (!$root_path) +		foreach ($styles as &$style)  		{ -			$root_path = $phpbb_root_path . 'styles/' . $theme_row['theme_path']; -		} - -		if (!$stylesheet) -		{ -			$stylesheet = ''; -			if (file_exists($root_path . '/theme/stylesheet.css')) -			{ -				$stylesheet = file_get_contents($root_path . '/theme/stylesheet.css'); -			} -		} - -		// Match CSS imports -		$matches = array(); -		preg_match_all('/@import url\((["\'])(.*)\1\);/i', $stylesheet, $matches); - -		// remove commented stylesheets (very simple parser, allows only whitespace -		// around an @import statement) -		preg_match_all('#/\*\s*@import url\((["\'])(.*)\1\);\s\*/#i', $stylesheet, $commented); -		$matches[2] = array_diff($matches[2], $commented[2]); - -		if (sizeof($matches)) -		{ -			foreach ($matches[0] as $idx => $match) +			if (empty($style['_shown']) && $style['_inherit_name'] == $name)  			{ -				if (isset($matches[2][$idx])) -				{ -					$stylesheet = str_replace($match, acp_styles::load_css_file($theme_row['theme_path'], $matches[2][$idx]), $stylesheet); -				} +				$this->list_style($style, $level); +				$this->show_available_child_styles($styles, $style['style_name'], $level + 1);  			}  		} - -		// adjust paths -		return str_replace('./', 'styles/' . $theme_row['theme_path'] . '/theme/', $stylesheet);  	}  	/** -	* Store template files into db +	* Update styles tree +	* +	* @param array $styles Styles list, passed as reference +	* @param array $style Current style, false if root +	* @return bool True if something was updated, false if not  	*/ -	function store_templates($mode, $style_id, $template_path, $filelist) +	protected function update_styles_tree(&$styles, $style = false)  	{ -		global $phpbb_root_path, $phpEx, $db; - -		$template_path = $template_path . '/template/'; -		$includes = array(); -		foreach ($filelist as $pathfile => $file_ary) +		$parent_id = ($style === false) ? 0 : $style['style_id']; +		$parent_tree = ($style === false) ? '' : ($style['style_parent_tree'] == '' ? '' : $style['style_parent_tree']) . $style['style_path']; +		$update = false; +		$updated = false; +		foreach ($styles as &$row)  		{ -			foreach ($file_ary as $file) +			if ($row['style_parent_id'] == $parent_id)  			{ -				if (!($fp = @fopen("{$phpbb_root_path}styles/$template_path$pathfile$file", 'r'))) +				if ($row['style_parent_tree'] != $parent_tree)  				{ -					trigger_error("Could not open {$phpbb_root_path}styles/$template_path$pathfile$file", E_USER_ERROR); -				} - -				$filesize = filesize("{$phpbb_root_path}styles/$template_path$pathfile$file"); - -				if ($filesize) -				{ -					$template_data = fread($fp, $filesize); -				} - -				fclose($fp); - -				if (!$filesize) -				{ -					// File is empty -					continue; -				} - -				if (preg_match_all('#<!-- INCLUDE (.*?\.html) -->#is', $template_data, $matches)) -				{ -					foreach ($matches[1] as $match) -					{ -						$includes[trim($match)][] = $file; -					} +					$row['style_parent_tree'] = $parent_tree; +					$update = true;  				} +				$updated |= $this->update_styles_tree($styles, $row);  			}  		} - -		foreach ($filelist as $pathfile => $file_ary) +		if ($update)  		{ -			foreach ($file_ary as $file) -			{ -				// Skip index. -				if (strpos($file, 'index.') === 0) -				{ -					continue; -				} - -				// We could do this using extended inserts ... but that could be one -				// heck of a lot of data ... -				$sql_ary = array( -					'template_id'			=> (int) $style_id, -					'template_filename'		=> "$pathfile$file", -					'template_included'		=> (isset($includes[$file])) ? implode(':', $includes[$file]) . ':' : '', -					'template_mtime'		=> (int) filemtime("{$phpbb_root_path}styles/$template_path$pathfile$file"), -					'template_data'			=> (string) file_get_contents("{$phpbb_root_path}styles/$template_path$pathfile$file"), -				); - -				if ($mode == 'insert') -				{ -					$sql = 'INSERT INTO ' . STYLES_TEMPLATE_DATA_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary); -				} -				else -				{ -					$sql = 'UPDATE ' . STYLES_TEMPLATE_DATA_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . " -						WHERE template_id = $style_id -							AND template_filename = '" . $db->sql_escape("$pathfile$file") . "'"; -				} -				$db->sql_query($sql); -			} +			$sql = 'UPDATE ' . STYLES_TABLE . " +				SET style_parent_tree = '" . $this->db->sql_escape($parent_tree) . "' +				WHERE style_parent_id = {$parent_id}"; +			$this->db->sql_query($sql); +			$updated = true;  		} +		return $updated;  	}  	/** -	* Returns an array containing all template filenames for one template that are currently cached. +	* Find all possible parent styles for style  	* -	* @param string $template_path contains the name of the template's folder in /styles/ -	* -	* @return array of filenames that exist in /styles/$template_path/template/ (without extension!) +	* @param array $styles list of styles +	* @param int $id id of style +	* @param int $parent current parent style id +	* @param int $level current tree level +	* @return array Style ids, names and levels  	*/ -	function template_cache_filelist($template_path) +	protected function find_possible_parents($styles, $id = -1, $parent = 0, $level = 0)  	{ -		global $phpbb_root_path, $phpEx, $user; - -		$cache_prefix = 'tpl_' . str_replace('_', '-', $template_path); - -		if (!($dp = @opendir("{$phpbb_root_path}cache"))) -		{ -			trigger_error($user->lang['TEMPLATE_ERR_CACHE_READ'] . adm_back_link($this->u_action), E_USER_WARNING); -		} - -		$file_ary = array(); -		while ($file = readdir($dp)) -		{ -			if ($file[0] == '.') -			{ -				continue; -			} - -			if (is_file($phpbb_root_path . 'cache/' . $file) && (strpos($file, $cache_prefix) === 0)) -			{ -				$file_ary[] = str_replace('.', '/', preg_replace('#^' . preg_quote($cache_prefix, '#') . '_(.*?)\.html\.' . $phpEx . '$#i', '\1', $file)); +		$results = array(); +		foreach ($styles as $style) +		{ +			if ($style['style_id'] != $id && $style['style_parent_id'] == $parent) +			{ +				$results[] = array( +					'style_id'		=> $style['style_id'], +					'style_name'	=> $style['style_name'], +					'style_path'	=> $style['style_path'], +					'style_parent_id'	=> $style['style_parent_id'], +					'style_parent_tree'	=> $style['style_parent_tree'], +					'level'			=> $level +				); +				$results = array_merge($results, $this->find_possible_parents($styles, $id, $style['style_id'], $level + 1));  			}  		} -		closedir($dp); - -		return $file_ary; +		return $results;  	}  	/** -	* Destroys cached versions of template files +	* Show item in styles list  	* -	* @param array $template_row contains the template's row in the STYLES_TEMPLATE_TABLE database table -	* @param mixed $file_ary is optional and may contain an array of template file names which should be refreshed in the cache. -	*	The file names should be the original template file names and not the cache file names. +	* @param array $style style row +	* @param array $level style inheritance level  	*/ -	function clear_template_cache($template_row, $file_ary = false) +	protected function list_style(&$style, $level)  	{ -		global $phpbb_root_path, $phpEx, $user; - -		$cache_prefix = 'tpl_' . str_replace('_', '-', $template_row['template_path']); - -		if (!$file_ary || !is_array($file_ary)) -		{ -			$file_ary = $this->template_cache_filelist($template_row['template_path']); -			$log_file_list = $user->lang['ALL_FILES']; -		} -		else -		{ -			$log_file_list = implode(', ', $file_ary); -		} +		// Mark row as shown +		if (!empty($style['_shown'])) return; +		$style['_shown'] = true; + +		// Generate template variables +		$actions = array(); +		$row = array( +			// Style data +			'STYLE_ID'		=> $style['style_id'], +			'STYLE_NAME'	=> htmlspecialchars($style['style_name']), +			'STYLE_PATH'	=> htmlspecialchars($style['style_path']), +			'STYLE_COPYRIGHT'	=> strip_tags($style['style_copyright']), +			'STYLE_ACTIVE'	=> $style['style_active'], + +			// Additional data +			'DEFAULT'		=> ($style['style_id'] && $style['style_id'] == $this->default_style), +			'USERS'			=> (isset($style['_users'])) ? $style['_users'] : '', +			'LEVEL'			=> $level, +			'PADDING'		=> (4 + 16 * $level), +			'SHOW_COPYRIGHT'	=> ($style['style_id']) ? false : true, +			'STYLE_PATH_FULL'	=> htmlspecialchars($this->styles_path_absolute . '/' . $style['style_path']) . '/', + +			// Comment to show below style +			'COMMENT'		=> (isset($style['_note'])) ? $style['_note'] : '', + +			// The following variables should be used by hooks to add custom HTML code +			'EXTRA'			=> '', +			'EXTRA_OPTIONS'	=> '' +		); -		foreach ($file_ary as $file) +		// Status specific data +		if ($style['style_id'])  		{ -			$file = str_replace('/', '.', $file); +			// Style is installed -			$file = "{$phpbb_root_path}cache/{$cache_prefix}_$file.html.$phpEx"; -			if (file_exists($file) && is_file($file)) -			{ -				@unlink($file); -			} -		} -		unset($file_ary); - -		add_log('admin', 'LOG_TEMPLATE_CACHE_CLEARED', $template_row['template_name'], $log_file_list); -	} - -	/** -	* Install Style/Template/Theme/Imageset -	*/ -	function install($mode) -	{ -		global $phpbb_root_path, $phpEx, $config, $db, $cache, $user, $template; +			// Details +			$actions[] = array( +				'U_ACTION'	=> $this->u_action . '&action=details&id=' . $style['style_id'], +				'L_ACTION'	=> $this->user->lang['DETAILS'] +			); -		$l_type = strtoupper($mode); +			// Activate +			$actions[] = array( +				'U_ACTION'	=> $this->u_action . '&action=' . ($style['style_active'] ? 'de' : '') . 'activate&id=' . $style['style_id'], +				'L_ACTION'	=> $this->user->lang['STYLE_' . ($style['style_active'] ? 'DE' : '') . 'ACTIVATE'] +			); -		$error = $installcfg = $style_row = array(); -		$root_path = $cfg_file = ''; -		$element_ary = array('template' => STYLES_TEMPLATE_TABLE, 'theme' => STYLES_THEME_TABLE, 'imageset' => STYLES_IMAGESET_TABLE); +/*			// Export +			$actions[] = array( +				'U_ACTION'	=> $this->u_action . '&action=export&id=' . $style['style_id'], +				'L_ACTION'	=> $this->user->lang['EXPORT'] +			); */ -		$install_path = request_var('path', ''); -		$update = (isset($_POST['update'])) ? true : false; +			// Uninstall +			$actions[] = array( +				'U_ACTION'	=> $this->u_action . '&action=uninstall&id=' . $style['style_id'], +				'L_ACTION'	=> $this->user->lang['STYLE_UNINSTALL'] +			); -		// Installing, obtain cfg file contents -		if ($install_path) +			// Preview +			$actions[] = array( +				'U_ACTION'	=> append_sid($this->phpbb_root_path . 'index.' . $this->phpEx, 'style=' . $style['style_id']), +				'L_ACTION'	=> $this->user->lang['PREVIEW'] +			); +		} +		else  		{ -			$root_path = $phpbb_root_path . 'styles/' . $install_path . '/'; -			$cfg_file = ($mode == 'style') ? "$root_path$mode.cfg" : "$root_path$mode/$mode.cfg"; - -			if (!file_exists($cfg_file)) +			// Style is not installed +			if (empty($style['_available']))  			{ -				$error[] = $user->lang[$l_type . '_ERR_NOT_' . $l_type]; +				$actions[] = array( +					'HTML'		=> $this->user->lang['CANNOT_BE_INSTALLED'] +				);  			}  			else  			{ -				$installcfg = parse_cfg_file($cfg_file); +				$actions[] = array( +					'U_ACTION'	=> $this->u_action . '&action=install&dir=' . urlencode($style['style_path']), +					'L_ACTION'	=> $this->user->lang['INSTALL_STYLE'] +				);  			}  		} -		// Installing -		if (sizeof($installcfg)) -		{ -			$name		= $installcfg['name']; -			$copyright	= $installcfg['copyright']; -			$version	= $installcfg['version']; - -			$style_row = array( -				$mode . '_id'			=> 0, -				$mode . '_name'			=> '', -				$mode . '_copyright'	=> '' -			); - -			switch ($mode) -			{ -				case 'style': - -					$style_row = array( -						'style_id'			=> 0, -						'style_name'		=> $installcfg['name'], -						'style_copyright'	=> $installcfg['copyright'] -					); - -					$reqd_template = (isset($installcfg['required_template'])) ? $installcfg['required_template'] : false; -					$reqd_theme = (isset($installcfg['required_theme'])) ? $installcfg['required_theme'] : false; -					$reqd_imageset = (isset($installcfg['required_imageset'])) ? $installcfg['required_imageset'] : false; - -					// Check to see if each element is already installed, if it is grab the id -					foreach ($element_ary as $element => $table) -					{ -						$style_row = array_merge($style_row, array( -							$element . '_id'			=> 0, -							$element . '_name'			=> '', -							$element . '_copyright'		=> '') -						); - -			 			$this->test_installed($element, $error, (${'reqd_' . $element}) ? $phpbb_root_path . 'styles/' . $reqd_template . '/' : $root_path, ${'reqd_' . $element}, $style_row[$element . '_id'], $style_row[$element . '_name'], $style_row[$element . '_copyright']); +		// todo: add hook -						if (!$style_row[$element . '_name']) -						{ -							$style_row[$element . '_name'] = $reqd_template; -						} - -						// Merge other information to installcfg... if present -						$cfg_file = $phpbb_root_path . 'styles/' . $install_path . '/' . $element . '/' . $element . '.cfg'; - -						if (file_exists($cfg_file)) -						{ -							$cfg_contents = parse_cfg_file($cfg_file); - -							// Merge only specific things. We may need them later. -							foreach (array('inherit_from', 'parse_css_file') as $key) -							{ -								if (!empty($cfg_contents[$key]) && !isset($installcfg[$key])) -								{ -									$installcfg[$key] = $cfg_contents[$key]; -								} -							} -						} -					} - -				break; - -				case 'template': -					$this->test_installed('template', $error, $root_path, false, $style_row['template_id'], $style_row['template_name'], $style_row['template_copyright']); -				break; - -				case 'theme': -					$this->test_installed('theme', $error, $root_path, false, $style_row['theme_id'], $style_row['theme_name'], $style_row['theme_copyright']); -				break; - -				case 'imageset': -					$this->test_installed('imageset', $error, $root_path, false, $style_row['imageset_id'], $style_row['imageset_name'], $style_row['imageset_copyright']); -				break; -			} -		} -		else +		// Assign template variables +		$this->template->assign_block_vars('styles_list', $row); +		foreach($actions as $action)  		{ -			trigger_error($user->lang['NO_' . $l_type] . adm_back_link($this->u_action), E_USER_WARNING); +			$this->template->assign_block_vars('styles_list.actions', $action);  		} -		$style_row['store_db'] = request_var('store_db', 0); -		$style_row['style_active'] = request_var('style_active', 1); -		$style_row['style_default'] = request_var('style_default', 0); - -		// User has submitted form and no errors have occurred -		if ($update && !sizeof($error)) +		// Increase counters +		$counter = ($style['style_id']) ? ($style['style_active'] ? 'active' : 'inactive') : (empty($style['_available']) ? 'cannotinstall' : 'caninstall'); +		if (!isset($this->style_counters))  		{ -			if ($mode == 'style') -			{ -				foreach ($element_ary as $element => $table) -				{ -					${$element . '_root_path'} = (${'reqd_' . $element}) ? $phpbb_root_path . 'styles/' . ${'reqd_' . $element} . '/' : false; -					${$element . '_path'} = (${'reqd_' . $element}) ? ${'reqd_' . $element} : false; -				} -				$this->install_style($error, 'install', $root_path, $style_row['style_id'], $style_row['style_name'], $install_path, $style_row['style_copyright'], $style_row['style_active'], $style_row['style_default'], $style_row, $template_root_path, $template_path, $theme_root_path, $theme_path, $imageset_root_path, $imageset_path); -			} -			else -			{ -				$style_row['store_db'] = $this->install_element($mode, $error, 'install', $root_path, $style_row[$mode . '_id'], $style_row[$mode . '_name'], $install_path, $style_row[$mode . '_copyright'], $style_row['store_db']); -			} - -			if (!sizeof($error)) -			{ -				$cache->destroy('sql', STYLES_TABLE); - -				$message = ($style_row['store_db']) ? '_ADDED_DB' : '_ADDED'; -				trigger_error($user->lang[$l_type . $message] . adm_back_link($this->u_action)); -			} +			$this->style_counters = array( +				'total'		=> 0, +				'active'	=> 0, +				'inactive'	=> 0, +				'caninstall'	=> 0, +				'cannotinstall'	=> 0 +				);  		} - -		$this->page_title = 'INSTALL_' . $l_type; - -		$template->assign_vars(array( -			'S_DETAILS'			=> true, -			'S_INSTALL'			=> true, -			'S_ERROR_MSG'		=> (sizeof($error)) ? true : false, -			'S_LOCATION'		=> (isset($installcfg['inherit_from']) && $installcfg['inherit_from']) ? false : true, -			'S_STYLE'			=> ($mode == 'style') ? true : false, -			'S_TEMPLATE'		=> ($mode == 'template') ? true : false, -			'S_SUPERTEMPLATE'	=> (isset($installcfg['inherit_from'])) ? $installcfg['inherit_from'] : '', -			'S_THEME'			=> ($mode == 'theme') ? true : false, - -			'S_STORE_DB'			=> (isset($style_row[$mode . '_storedb'])) ? $style_row[$mode . '_storedb'] : 0, -			'S_STYLE_ACTIVE'		=> (isset($style_row['style_active'])) ? $style_row['style_active'] : 0, -			'S_STYLE_DEFAULT'		=> (isset($style_row['style_default'])) ? $style_row['style_default'] : 0, - -			'U_ACTION'			=> $this->u_action . "&action=install&path=" . urlencode($install_path), -			'U_BACK'			=> $this->u_action, - -			'L_TITLE'				=> $user->lang[$this->page_title], -			'L_EXPLAIN'				=> $user->lang[$this->page_title . '_EXPLAIN'], -			'L_NAME'				=> $user->lang[$l_type . '_NAME'], -			'L_LOCATION'			=> ($mode == 'template' || $mode == 'theme') ? $user->lang[$l_type . '_LOCATION'] : '', -			'L_LOCATION_EXPLAIN'	=> ($mode == 'template' || $mode == 'theme') ? $user->lang[$l_type . '_LOCATION_EXPLAIN'] : '', - -			'ERROR_MSG'			=> (sizeof($error)) ? implode('<br />', $error) : '', -			'NAME'				=> $style_row[$mode . '_name'], -			'COPYRIGHT'			=> $style_row[$mode . '_copyright'], -			'TEMPLATE_NAME'		=> ($mode == 'style') ? $style_row['template_name'] : '', -			'THEME_NAME'		=> ($mode == 'style') ? $style_row['theme_name'] : '', -			'IMAGESET_NAME'		=> ($mode == 'style') ? $style_row['imageset_name'] : '') -		); +		$this->style_counters[$counter]++; +		$this->style_counters['total']++;  	}  	/** -	* Add new style +	* Show welcome message +	* +	* @param string $title main title +	* @param string $description page description  	*/ -	function add($mode) +	protected function welcome_message($title, $description)  	{ -		global $phpbb_root_path, $phpEx, $config, $db, $cache, $user, $template; - -		$l_type = strtoupper($mode); -		$element_ary = array('template' => STYLES_TEMPLATE_TABLE, 'theme' => STYLES_THEME_TABLE, 'imageset' => STYLES_IMAGESET_TABLE); -		$error = array(); - -		$style_row = array( -			$mode . '_name'			=> utf8_normalize_nfc(request_var('name', '', true)), -			$mode . '_copyright'	=> utf8_normalize_nfc(request_var('copyright', '', true)), -			'template_id'			=> 0, -			'theme_id'				=> 0, -			'imageset_id'			=> 0, -			'store_db'				=> request_var('store_db', 0), -			'style_active'			=> request_var('style_active', 1), -			'style_default'			=> request_var('style_default', 0), +		$this->template->assign_vars(array( +			'L_TITLE'	=> $this->user->lang[$title], +			'L_EXPLAIN'	=> (isset($this->user->lang[$description])) ? $this->user->lang[$description] : '' +			)  		); +	} -		$basis = request_var('basis', 0); -		$update = (isset($_POST['update'])) ? true : false; - -		if ($basis) -		{ -			switch ($mode) -			{ -				case 'style': -					$sql_select = 'template_id, theme_id, imageset_id'; -					$sql_from = STYLES_TABLE; -				break; - -				case 'template': -					$sql_select = 'template_id'; -					$sql_from = STYLES_TEMPLATE_TABLE; -				break; - -				case 'theme': -					$sql_select = 'theme_id'; -					$sql_from = STYLES_THEME_TABLE; -				break; - -				case 'imageset': -					$sql_select = 'imageset_id'; -					$sql_from = STYLES_IMAGESET_TABLE; -				break; -			} - -			$sql = "SELECT $sql_select -				FROM $sql_from -				WHERE {$mode}_id = $basis"; -			$result = $db->sql_query($sql); -			$row = $db->sql_fetchrow($result); -			$db->sql_freeresult($result); - -			if (!$row) -			{ -				$error[] = $user->lang['NO_' . $l_type]; -			} - -			if (!sizeof($error)) -			{ -				$style_row['template_id']	= (isset($row['template_id'])) ? $row['template_id'] : $style_row['template_id']; -				$style_row['theme_id']		= (isset($row['theme_id'])) ? $row['theme_id'] : $style_row['theme_id']; -				$style_row['imageset_id']	= (isset($row['imageset_id'])) ? $row['imageset_id'] : $style_row['imageset_id']; -			} -		} - -		if ($update) -		{ -			$style_row['template_id'] = request_var('template_id', $style_row['template_id']); -			$style_row['theme_id'] = request_var('theme_id', $style_row['theme_id']); -			$style_row['imageset_id'] = request_var('imageset_id', $style_row['imageset_id']); - -			if ($mode == 'style' && (!$style_row['template_id'] || !$style_row['theme_id'] || !$style_row['imageset_id'])) -			{ -				$error[] = $user->lang['STYLE_ERR_NO_IDS']; -			} -		} - -		// User has submitted form and no errors have occurred -		if ($update && !sizeof($error)) -		{ -			if ($mode == 'style') -			{ -				$style_row['style_id'] = 0; - -				$this->install_style($error, 'add', '', $style_row['style_id'], $style_row['style_name'], '', $style_row['style_copyright'], $style_row['style_active'], $style_row['style_default'], $style_row); -			} - -			if (!sizeof($error)) -			{ -				$cache->destroy('sql', STYLES_TABLE); - -				$message = ($style_row['store_db']) ? '_ADDED_DB' : '_ADDED'; -				trigger_error($user->lang[$l_type . $message] . adm_back_link($this->u_action)); -			} -		} +	/** +	* Find all directories that have styles +	* +	* @return array Directory names +	*/ +	protected function find_style_dirs() +	{ +		$styles = array(); -		if ($mode == 'style') +		$dp = @opendir($this->styles_path); +		if ($dp)  		{ -			foreach ($element_ary as $element => $table) +			while (($file = readdir($dp)) !== false)  			{ -				$sql = "SELECT {$element}_id, {$element}_name -					FROM $table -					ORDER BY {$element}_id ASC"; -				$result = $db->sql_query($sql); +				$dir = $this->styles_path . $file; +				if ($file[0] == '.' || !is_dir($dir)) +				{ +					continue; +				} -				${$element . '_options'} = ''; -				while ($row = $db->sql_fetchrow($result)) +				if (file_exists("{$dir}/style.cfg"))  				{ -					$selected = ($row[$element . '_id'] == $style_row[$element . '_id']) ? ' selected="selected"' : ''; -					${$element . '_options'} .= '<option value="' . $row[$element . '_id'] . '"' . $selected . '>' . $row[$element . '_name'] . '</option>'; +					$styles[] = $file;  				} -				$db->sql_freeresult($result);  			} +			closedir($dp);  		} -		$this->page_title = 'ADD_' . $l_type; - -		$template->assign_vars(array( -			'S_DETAILS'			=> true, -			'S_ADD'				=> true, -			'S_ERROR_MSG'		=> (sizeof($error)) ? true : false, -			'S_STYLE'			=> ($mode == 'style') ? true : false, -			'S_TEMPLATE'		=> ($mode == 'template') ? true : false, -			'S_THEME'			=> ($mode == 'theme') ? true : false, -			'S_BASIS'			=> ($basis) ? true : false, - -			'S_STORE_DB'			=> (isset($style_row['storedb'])) ? $style_row['storedb'] : 0, -			'S_STYLE_ACTIVE'		=> (isset($style_row['style_active'])) ? $style_row['style_active'] : 0, -			'S_STYLE_DEFAULT'		=> (isset($style_row['style_default'])) ? $style_row['style_default'] : 0, -			'S_TEMPLATE_OPTIONS'	=> ($mode == 'style') ? $template_options : '', -			'S_THEME_OPTIONS'		=> ($mode == 'style') ? $theme_options : '', -			'S_IMAGESET_OPTIONS'	=> ($mode == 'style') ? $imageset_options : '', - -			'U_ACTION'			=> $this->u_action . '&action=add&basis=' . $basis, -			'U_BACK'			=> $this->u_action, - -			'L_TITLE'				=> $user->lang[$this->page_title], -			'L_EXPLAIN'				=> $user->lang[$this->page_title . '_EXPLAIN'], -			'L_NAME'				=> $user->lang[$l_type . '_NAME'], -			'L_LOCATION'			=> ($mode == 'template' || $mode == 'theme') ? $user->lang[$l_type . '_LOCATION'] : '', -			'L_LOCATION_EXPLAIN'	=> ($mode == 'template' || $mode == 'theme') ? $user->lang[$l_type . '_LOCATION_EXPLAIN'] : '', - -			'ERROR_MSG'			=> (sizeof($error)) ? implode('<br />', $error) : '', -			'NAME'				=> $style_row[$mode . '_name'], -			'COPYRIGHT'			=> $style_row[$mode . '_copyright']) -		); - +		return $styles;  	}  	/** - -					$reqd_template = (isset($installcfg['required_template'])) ? $installcfg['required_template'] : false; -					$reqd_theme = (isset($installcfg['required_theme'])) ? $installcfg['required_theme'] : false; -					$reqd_imageset = (isset($installcfg['required_imageset'])) ? $installcfg['required_imageset'] : false; - -					// Check to see if each element is already installed, if it is grab the id -					foreach ($element_ary as $element => $table) -					{ -						$style_row = array_merge($style_row, array( -							$element . '_id'			=> 0, -							$element . '_name'			=> '', -							$element . '_copyright'		=> '') -						); - -			 			$this->test_installed($element, $error, $root_path, ${'reqd_' . $element}, $style_row[$element . '_id'], $style_row[$element . '_name'], $style_row[$element . '_copyright']); -	* Is this element installed? If not, grab its cfg details +	* Sort styles  	*/ -	function test_installed($element, &$error, $root_path, $reqd_name, &$id, &$name, &$copyright) +	public function sort_styles($style1, $style2)  	{ -		global $db, $user; - -		switch ($element) +		if ($style1['style_active'] != $style2['style_active'])  		{ -			case 'template': -				$sql_from = STYLES_TEMPLATE_TABLE; -			break; - -			case 'theme': -				$sql_from = STYLES_THEME_TABLE; -			break; - -			case 'imageset': -				$sql_from = STYLES_IMAGESET_TABLE; -			break; +			return ($style1['style_active']) ? -1 : 1;  		} - -		$l_element = strtoupper($element); - -		$chk_name = ($reqd_name !== false) ? $reqd_name : $name; - -		$sql = "SELECT {$element}_id, {$element}_name -			FROM $sql_from -			WHERE {$element}_name = '" . $db->sql_escape($chk_name) . "'"; -		$result = $db->sql_query($sql); - -		if ($row = $db->sql_fetchrow($result)) +		if (isset($style1['_available']) && $style1['_available'] != $style2['_available'])  		{ -			$name = $row[$element . '_name']; -			$id = $row[$element . '_id']; -		} -		else -		{ -			if (!($cfg = @file("$root_path$element/$element.cfg"))) -			{ -				$error[] = sprintf($user->lang['REQUIRES_' . $l_element], $reqd_name); -				return false; -			} - -			$cfg = parse_cfg_file("$root_path$element/$element.cfg", $cfg); - -			$name = $cfg['name']; -			$copyright = $cfg['copyright']; -			$id = 0; - -			unset($cfg); +			return ($style1['_available']) ? -1 : 1;  		} -		$db->sql_freeresult($result); +		return strcasecmp(isset($style1['style_name']) ? $style1['style_name'] : $style1['name'], isset($style2['style_name']) ? $style2['style_name'] : $style2['name']);  	}  	/** -	* Install/Add style +	* Read style configuration file +	* +	* @param string $dir style directory +	* @return array|bool Style data, false on error  	*/ -	function install_style(&$error, $action, $root_path, &$id, $name, $path, $copyright, $active, $default, &$style_row, $template_root_path = false, $template_path = false, $theme_root_path = false, $theme_path = false, $imageset_root_path = false, $imageset_path = false) +	protected function read_style_cfg($dir)  	{ -		global $config, $db, $user; - -		$element_ary = array('template', 'theme', 'imageset'); - -		if (!$name) -		{ -			$error[] = $user->lang['STYLE_ERR_STYLE_NAME']; -		} - -		// Check length settings -		if (utf8_strlen($name) > 30) -		{ -			$error[] = $user->lang['STYLE_ERR_NAME_LONG']; -		} - -		if (utf8_strlen($copyright) > 60) -		{ -			$error[] = $user->lang['STYLE_ERR_COPY_LONG']; -		} - -		// Check if the name already exist -		$sql = 'SELECT style_id -			FROM ' . STYLES_TABLE . " -			WHERE style_name = '" . $db->sql_escape($name) . "'"; -		$result = $db->sql_query($sql); -		$row = $db->sql_fetchrow($result); -		$db->sql_freeresult($result); - -		if ($row) -		{ -			$error[] = $user->lang['STYLE_ERR_NAME_EXIST']; -		} - -		if (sizeof($error)) -		{ -			return false; -		} +		static $required = array('name', 'phpbb_version', 'copyright'); +		$cfg = parse_cfg_file($this->styles_path . $dir . '/style.cfg'); -		foreach ($element_ary as $element) +		// Check if it is a valid file +		foreach ($required as $key)  		{ -			// Zero id value ... need to install element ... run usual checks -			// and do the install if necessary -			if (!$style_row[$element . '_id']) +			if (!isset($cfg[$key]))  			{ -				$this->install_element($element, $error, $action, (${$element . '_root_path'}) ? ${$element . '_root_path'} : $root_path, $style_row[$element . '_id'], $style_row[$element . '_name'], (${$element . '_path'}) ? ${$element . '_path'} : $path, $style_row[$element . '_copyright']); +				return false;  			}  		} -		if (!$style_row['template_id'] || !$style_row['theme_id'] || !$style_row['imageset_id']) +		// Check data +		if (!isset($cfg['parent']) || !is_string($cfg['parent']) || $cfg['parent'] == $cfg['name'])  		{ -			$error[] = $user->lang['STYLE_ERR_NO_IDS']; +			$cfg['parent'] = '';  		} - -		if (sizeof($error)) +		if (!isset($cfg['template_bitfield']))  		{ -			return false; +			$cfg['template_bitfield'] = $this->default_bitfield();  		} -		$db->sql_transaction('begin'); - -		$sql_ary = array( -			'style_name'		=> $name, -			'style_copyright'	=> $copyright, -			'style_active'		=> (int) $active, -			'template_id'		=> (int) $style_row['template_id'], -			'theme_id'			=> (int) $style_row['theme_id'], -			'imageset_id'		=> (int) $style_row['imageset_id'], -		); - -		$sql = 'INSERT INTO ' . STYLES_TABLE . ' -			' . $db->sql_build_array('INSERT', $sql_ary); -		$db->sql_query($sql); - -		$id = $db->sql_nextid(); - -		if ($default) -		{ -			$sql = 'UPDATE ' . USERS_TABLE . " -				SET user_style = $id -				WHERE user_style = " . $config['default_style']; -			$db->sql_query($sql); - -			set_config('default_style', $id); -		} - -		$db->sql_transaction('commit'); - -		add_log('admin', 'LOG_STYLE_ADD', $name); +		return $cfg;  	}  	/** -	* Install/add an element, doing various checks as we go +	* Install style +	* +	* @param $style style data +	* @return int Style id  	*/ -	function install_element($mode, &$error, $action, $root_path, &$id, $name, $path, $copyright, $store_db = 0) +	protected function install_style($style)  	{ -		global $phpbb_root_path, $db, $user; - -		// we parse the cfg here (again) -		$cfg_data = parse_cfg_file("$root_path$mode/$mode.cfg"); - -		switch ($mode) -		{ -			case 'template': -				$sql_from = STYLES_TEMPLATE_TABLE; -			break; - -			case 'theme': -				$sql_from = STYLES_THEME_TABLE; -			break; - -			case 'imageset': -				$sql_from = STYLES_IMAGESET_TABLE; -			break; -		} - -		$l_type = strtoupper($mode); - -		if (!$name) -		{ -			$error[] = $user->lang[$l_type . '_ERR_STYLE_NAME']; -		} - -		// Check length settings -		if (utf8_strlen($name) > 30) -		{ -			$error[] = $user->lang[$l_type . '_ERR_NAME_LONG']; -		} - -		if (utf8_strlen($copyright) > 60) +		// Generate row +		$sql_ary = array(); +		foreach ($style as $key => $value)  		{ -			$error[] = $user->lang[$l_type . '_ERR_COPY_LONG']; -		} - -		// Check if the name already exist -		$sql = "SELECT {$mode}_id -			FROM $sql_from -			WHERE {$mode}_name = '" . $db->sql_escape($name) . "'"; -		$result = $db->sql_query($sql); -		$row = $db->sql_fetchrow($result); -		$db->sql_freeresult($result); - -		if ($row) -		{ -			// If it exist, we just use the style on installation -			if ($action == 'install') +			if ($key != 'style_id' && substr($key, 0, 1) != '_')  			{ -				$id = $row[$mode . '_id']; -				return false; +				$sql_ary[$key] = $value;  			} - -			$error[] = $user->lang[$l_type . '_ERR_NAME_EXIST']; -		} - -		if (isset($cfg_data['inherit_from']) && $cfg_data['inherit_from']) -		{ -			if ($mode === 'template') -			{ -				$select_bf = ', bbcode_bitfield'; -			} -			else -			{ -				$select_bf = ''; -			} - -			$sql = "SELECT {$mode}_id, {$mode}_name, {$mode}_path, {$mode}_storedb $select_bf -				FROM $sql_from -				WHERE {$mode}_name = '" . $db->sql_escape($cfg_data['inherit_from']) . "' -					AND {$mode}_inherits_id = 0"; -			$result = $db->sql_query($sql); -			$row = $db->sql_fetchrow($result); -			$db->sql_freeresult($result); -			if (!$row) -			{ -				$error[] = sprintf($user->lang[$l_type . '_ERR_REQUIRED_OR_INCOMPLETE'], $cfg_data['inherit_from']); -			} -			else -			{ -				$inherit_id = $row["{$mode}_id"]; -				$inherit_path = $row["{$mode}_path"]; -				$inherit_bf = ($mode === 'template') ? $row["bbcode_bitfield"] : false; -				$cfg_data['store_db'] = $row["{$mode}_storedb"]; -				$store_db = $row["{$mode}_storedb"]; -			} -		} -		else -		{ -			$inherit_id = 0; -			$inherit_path = ''; -			$inherit_bf = false; -		} - -		if (sizeof($error)) -		{ -			return false; -		} - -		$sql_ary = array( -			$mode . '_name'			=> $name, -			$mode . '_copyright'	=> $copyright, -			$mode . '_path'			=> $path, -		); - -		switch ($mode) -		{ -			case 'template': -				// We check if the template author defined a different bitfield -				if (!empty($cfg_data['template_bitfield'])) -				{ -					$sql_ary['bbcode_bitfield'] = $cfg_data['template_bitfield']; -				} -				else if ($inherit_bf) -				{ -					$sql_ary['bbcode_bitfield'] = $inherit_bf; -				} -				else -				{ -					$sql_ary['bbcode_bitfield'] = TEMPLATE_BITFIELD; -				} - -				// We set a pre-defined bitfield here which we may use further in 3.2 -				$sql_ary += array( -					'template_storedb'		=> $store_db, -				); -				if (isset($cfg_data['inherit_from']) && $cfg_data['inherit_from']) -				{ -					$sql_ary += array( -						'template_inherits_id'	=> $inherit_id, -						'template_inherit_path' => $inherit_path, -					); -				} -			break; - -			case 'theme': -				// We are only interested in the theme configuration for now - -				if (isset($cfg_data['parse_css_file']) && $cfg_data['parse_css_file']) -				{ -					$store_db = 1; -				} - -				$sql_ary += array( -					'theme_storedb'	=> $store_db, -					'theme_data'	=> ($store_db) ? $this->db_theme_data($sql_ary, false, $root_path) : '', -					'theme_mtime'	=> (int) filemtime("{$phpbb_root_path}styles/$path/theme/stylesheet.css") -				); -			break; - -			// all the heavy lifting is done later -			case 'imageset': -			break; -		} - -		$db->sql_transaction('begin'); - -		$sql = "INSERT INTO $sql_from -			" . $db->sql_build_array('INSERT', $sql_ary); -		$db->sql_query($sql); - -		$id = $db->sql_nextid(); - -		if ($mode == 'template' && $store_db) -		{ -			$filelist = filelist("{$root_path}template", '', 'html'); -			$this->store_templates('insert', $id, $path, $filelist);  		} -		else if ($mode == 'imageset') -		{ -			$cfg_data = parse_cfg_file("$root_path$mode/imageset.cfg"); -			$imageset_definitions = array(); -			foreach ($this->imageset_keys as $topic => $key_array) -			{ -				$imageset_definitions = array_merge($imageset_definitions, $key_array); -			} +		// Add to database +		$this->db->sql_transaction('begin'); -			foreach ($cfg_data as $key => $value) -			{ -				if (strpos($value, '*') !== false) -				{ -					if (substr($value, -1, 1) === '*') -					{ -						list($image_filename, $image_height) = explode('*', $value); -						$image_width = 0; -					} -					else -					{ -						list($image_filename, $image_height, $image_width) = explode('*', $value); -					} -				} -				else -				{ -					$image_filename = $value; -					$image_height = $image_width = 0; -				} - -				if (strpos($key, 'img_') === 0 && $image_filename) -				{ -					$key = substr($key, 4); -					if (in_array($key, $imageset_definitions)) -					{ -						$sql_ary = array( -							'image_name'		=> $key, -							'image_filename'	=> str_replace('{PATH}', "styles/$path/imageset/", trim($image_filename)), -							'image_height'		=> (int) $image_height, -							'image_width'		=> (int) $image_width, -							'imageset_id'		=> (int) $id, -							'image_lang'		=> '', -						); -						$db->sql_query('INSERT INTO ' . STYLES_IMAGESET_DATA_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary)); -					} -				} -			} -			unset($cfg_data); +		$sql = 'INSERT INTO ' . STYLES_TABLE . ' +			' . $this->db->sql_build_array('INSERT', $sql_ary); +		$this->db->sql_query($sql); -			$sql = 'SELECT lang_dir -				FROM ' . LANG_TABLE; -			$result = $db->sql_query($sql); +		$id = $this->db->sql_nextid(); -			while ($row = $db->sql_fetchrow($result)) -			{ -				if (@file_exists("$root_path$mode/{$row['lang_dir']}/imageset.cfg")) -				{ -					$cfg_data_imageset_data = parse_cfg_file("$root_path$mode/{$row['lang_dir']}/imageset.cfg"); -					foreach ($cfg_data_imageset_data as $image_name => $value) -					{ -						if (strpos($value, '*') !== false) -						{ -							if (substr($value, -1, 1) === '*') -							{ -								list($image_filename, $image_height) = explode('*', $value); -								$image_width = 0; -							} -							else -							{ -								list($image_filename, $image_height, $image_width) = explode('*', $value); -							} -						} -						else -						{ -							$image_filename = $value; -							$image_height = $image_width = 0; -						} +		$this->db->sql_transaction('commit'); -						if (strpos($image_name, 'img_') === 0 && $image_filename) -						{ -							$image_name = substr($image_name, 4); -							if (in_array($image_name, $imageset_definitions)) -							{ -								$sql_ary = array( -									'image_name'		=> $image_name, -									'image_filename'	=> $image_filename, -									'image_height'		=> (int) $image_height, -									'image_width'		=> (int) $image_width, -									'imageset_id'		=> (int) $id, -									'image_lang'		=> $row['lang_dir'], -								); -								$db->sql_query('INSERT INTO ' . STYLES_IMAGESET_DATA_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary)); -							} -						} -					} -					unset($cfg_data_imageset_data); -				} -			} -			$db->sql_freeresult($result); -		} +		add_log('admin', 'LOG_STYLE_ADD', $sql_ary['style_name']); -		$db->sql_transaction('commit'); - -		$log = ($store_db) ? 'LOG_' . $l_type . '_ADD_DB' : 'LOG_' . $l_type . '_ADD_FS'; -		add_log('admin', $log, $name); - -		// Return store_db in case it had to be altered -		return $store_db; +		return $id;  	}  	/** -	* Checks downwards dependencies +	* Lists all styles  	* -	* @access public -	* @param string $mode The element type to check - only template is supported -	* @param int $id The template id -	* @returns false if no component inherits, array with name, path and id for each subtemplate otherwise +	* @return array Rows with styles data  	*/ -	function check_inheritance($mode, $id) +	protected function get_styles()  	{ -		global $db; - -		$l_type = strtoupper($mode); - -		switch ($mode) -		{ -			case 'template': -				$sql_from = STYLES_TEMPLATE_TABLE; -			break; +		$sql = 'SELECT * +			FROM ' . STYLES_TABLE; +		$result = $this->db->sql_query($sql); -			case 'theme': -				$sql_from = STYLES_THEME_TABLE; -			break; +		$rows = $this->db->sql_fetchrowset($result); +		$this->db->sql_freeresult($result); -			case 'imageset': -				$sql_from = STYLES_IMAGESET_TABLE; -			break; -		} +		return $rows; +	} -		$sql = "SELECT {$mode}_id, {$mode}_name, {$mode}_path -			FROM $sql_from -			WHERE {$mode}_inherits_id = " . (int) $id; -		$result = $db->sql_query($sql); +	/** +	* Count users for each style +	* +	* @return array Styles in following format: [style_id] = number of users +	*/ +	protected function get_users() +	{ +		$sql = 'SELECT user_style, COUNT(user_style) AS style_count +			FROM ' . USERS_TABLE . ' +			GROUP BY user_style'; +		$result = $this->db->sql_query($sql); -		$names = array(); -		while ($row = $db->sql_fetchrow($result)) +		$style_count = array(); +		while ($row = $this->db->sql_fetchrow($result))  		{ - -			$names[$row["{$mode}_id"]] = array( -				"{$mode}_id" => $row["{$mode}_id"], -				"{$mode}_name" => $row["{$mode}_name"], -				"{$mode}_path" => $row["{$mode}_path"], -			); +			$style_count[$row['user_style']] = $row['style_count'];  		} -		$db->sql_freeresult($result); +		$this->db->sql_freeresult($result); -		if (sizeof($names)) -		{ -			return $names; -		} -		else -		{ -			return false; -		} +		return $style_count;  	}  	/** -	* Checks upwards dependencies +	* Uninstall style  	* -	* @access public -	* @param string $mode The element type to check - only template is supported -	* @param int $id The template id -	* @returns false if the component does not inherit, array with name, path and id otherwise +	* @param array $style Style data +	* @return bool|string True on success, error message on error  	*/ -	function get_super($mode, $id) +	protected function uninstall_style($style)  	{ -		global $db; - -		$l_type = strtoupper($mode); - -		switch ($mode) -		{ -			case 'template': -				$sql_from = STYLES_TEMPLATE_TABLE; -			break; +		$id = $style['style_id']; +		$path = $style['style_path']; -			case 'theme': -				$sql_from = STYLES_THEME_TABLE; -			break; - -			case 'imageset': -				$sql_from = STYLES_IMAGESET_TABLE; -			break; -		} +		// Check if style has child styles +		$sql = 'SELECT style_id +			FROM ' . STYLES_TABLE . ' +			WHERE style_parent_id = ' . (int) $id . " OR style_parent_tree = '" . $this->db->sql_escape($path) . "'"; +		$result = $this->db->sql_query($sql); -		$sql = "SELECT {$mode}_inherits_id -			FROM $sql_from -			WHERE {$mode}_id = " . (int) $id; -		$result = $db->sql_query_limit($sql, 1); +		$conflict = $this->db->sql_fetchrow($result); +		$this->db->sql_freeresult($result); -		if ($row = $db->sql_fetchrow($result)) -		{ -			$db->sql_freeresult($result); -		} -		else +		if ($conflict !== false)  		{ -			return false; +			return sprintf($this->user->lang['STYLE_UNINSTALL_DEPENDENT'], $style['style_name']);  		} -		$super_id = $row["{$mode}_inherits_id"]; - -		$sql = "SELECT {$mode}_id, {$mode}_name, {$mode}_path -			FROM $sql_from -			WHERE {$mode}_id = " . (int) $super_id; - -		$result = $db->sql_query_limit($sql, 1); -		if ($row = $db->sql_fetchrow($result)) -		{ -			$db->sql_freeresult($result); -			return $row; -		} +		// Change default style for users +		$sql = 'UPDATE ' . USERS_TABLE . ' +			SET user_style = 0 +			WHERE user_style = ' . $id; +		$this->db->sql_query($sql); -		return false; +		// Uninstall style +		$sql = 'DELETE FROM ' . STYLES_TABLE . ' +			WHERE style_id = ' . $id; +		$this->db->sql_query($sql); +		return true;  	}  	/** -	* Moves a template set and its subtemplates to the database +	* Delete all files in style directory  	* -	* @access public -	* @param string $mode The component to move - only template is supported -	* @param int $id The template id +	* @param string $path Style directory +	* @param string $dir Directory to remove inside style's directory +	* @return bool True on success, false on error  	*/ -	function store_in_db($mode, $id) +	protected function delete_style_files($path, $dir = '')  	{ -		global $db, $user; +		$dirname = $this->styles_path . $path . $dir; +		$result = true; -		$error = array(); -		$l_type = strtoupper($mode); -		if ($super = $this->get_super($mode, $id)) -		{ -			$error[] = (sprintf($user->lang["{$l_type}_INHERITS"], $super['template_name'])); -			return $error; -		} +		$dp = @opendir($dirname); -		$sql = "SELECT {$mode}_id, {$mode}_name, {$mode}_path -			FROM " . STYLES_TEMPLATE_TABLE . ' -			WHERE template_id = ' . (int) $id; - -		$result = $db->sql_query_limit($sql, 1); -		if ($row = $db->sql_fetchrow($result)) +		if ($dp)  		{ -			$db->sql_freeresult($result); -			$subs = $this->check_inheritance($mode, $id); - -			$this->_store_in_db($mode, $id, $row["{$mode}_path"]); -			if ($subs && sizeof($subs)) +			while (($file = readdir($dp)) !== false)  			{ -				foreach ($subs as $sub_id => $sub) +				if ($file == '.' || $file == '..') +				{ +					continue; +				} +				$filename = $dirname . '/' . $file; +				if (is_dir($filename)) +				{ +					if (!$this->delete_style_files($path, $dir . '/' . $file)) +					{ +						$result = false; +					} +				} +				else  				{ -					if ($err = $this->_store_in_db($mode, $sub["{$mode}_id"], $sub["{$mode}_path"])) +					if (!@unlink($filename))  					{ -						$error[] = $err; +						$result = false;  					}  				}  			} +			closedir($dp);  		} -		if (sizeof($error)) +		if (!@rmdir($dirname))  		{ -			return $error; +			return false;  		} -		return false; -	} - -	/** -	* Moves a template set to the database -	* -	* @access private -	* @param string $mode The component to move - only template is supported -	* @param int $id The template id -	* @param string $path TThe path to the template files -	*/ -	function _store_in_db($mode, $id, $path) -	{ -		global $phpbb_root_path, $db; - -		$filelist = filelist("{$phpbb_root_path}styles/{$path}/template", '', 'html'); -		$this->store_templates('insert', $id, $path, $filelist); - -		// Okay, we do the query here -shouldn't be triggered often. -		$sql = 'UPDATE ' . STYLES_TEMPLATE_TABLE . ' -						SET template_storedb = 1 -						WHERE template_id = ' . $id; -		$db->sql_query($sql); +		return $result;  	}  	/** -	* Moves a template set and its subtemplates to the filesystem +	* Get list of items from posted data  	* -	* @access public -	* @param string $mode The component to move - only template is supported -	* @param int $id The template id +	* @param string $name Variable name +	* @param string|int $default Default value for array +	* @param bool $error If true, error will be triggered if list is empty +	* @return array Items  	*/ -	function store_in_fs($mode, $id) +	protected function request_vars($name, $default, $error = false)  	{ -		global $db, $user; +		$item = $this->request->variable($name, $default); +		$items = $this->request->variable($name . 's', array($default)); -		$error = array(); -		$l_type = strtoupper($mode); -		if ($super = $this->get_super($mode, $id)) +		if (count($items) == 1 && $items[0] == $default)  		{ -			$error[] = (sprintf($user->lang["{$l_type}_INHERITS"], $super['template_name'])); -			return($error); +			$items = array();  		} -		$sql = "SELECT {$mode}_id, {$mode}_name, {$mode}_path -			FROM " . STYLES_TEMPLATE_TABLE . ' -			WHERE template_id = ' . (int) $id; - -		$result = $db->sql_query_limit($sql, 1); -		if ($row = $db->sql_fetchrow($result)) +		if ($item != $default && !count($items))  		{ -			$db->sql_freeresult($result); -			if (!sizeof($error)) -			{ -				$subs = $this->check_inheritance($mode, $id); - -				$this->_store_in_fs($mode, $id, $row["{$mode}_path"]); +			$items[] = $item; +		} -				if ($subs && sizeof($subs)) -				{ -					foreach ($subs as $sub_id => $sub) -					{ -						$this->_store_in_fs($mode, $sub["{$mode}_id"], $sub["{$mode}_path"]); -					} -				} -			} -			if (sizeof($error)) -			{ -				$this->store_in_db($id, $mode); -				return $error; -			} +		if ($error && !count($items)) +		{ +			trigger_error($this->user->lang['NO_MATCHING_STYLES_FOUND'] . adm_back_link($this->u_action), E_USER_WARNING);  		} -		return false; + +		return $items;  	}  	/** -	* Moves a template set to the filesystem +	* Generates default bitfield +	* +	* This bitfield decides which bbcodes are defined in a template.  	* -	* @access private -	* @param string $mode The component to move - only template is supported -	* @param int $id The template id -	* @param string $path The path to the template +	* @return string Bitfield  	*/ -	function _store_in_fs($mode, $id, $path) +	protected function default_bitfield()  	{ -		global $phpbb_root_path, $db, $user, $safe_mode; - -		$store_db = 0; -		$error = array(); -		if (!$safe_mode && phpbb_is_writable("{$phpbb_root_path}styles/{$path}/template")) +		static $value; +		if (isset($value))  		{ -			$sql = 'SELECT * -					FROM ' . STYLES_TEMPLATE_DATA_TABLE . " -					WHERE template_id = $id"; -			$result = $db->sql_query($sql); - -			while ($row = $db->sql_fetchrow($result)) -			{ -				if (!($fp = @fopen("{$phpbb_root_path}styles/{$path}/template/" . $row['template_filename'], 'wb'))) -				{ -					$store_db = 1; -					$error[] = $user->lang['EDIT_TEMPLATE_STORED_DB']; -					break; -				} - -				fwrite($fp, $row['template_data']); -				fclose($fp); -			} -			$db->sql_freeresult($result); - -			if (!$store_db) -			{ -				$sql = 'DELETE FROM ' . STYLES_TEMPLATE_DATA_TABLE . " -						WHERE template_id = $id"; -				$db->sql_query($sql); -			} +			return $value;  		} -		if (sizeof($error)) -		{ -			return $error; -		} -		$sql = 'UPDATE ' . STYLES_TEMPLATE_TABLE . ' -				SET template_storedb = 0 -				WHERE template_id = ' . $id; -		$db->sql_query($sql); -		return false; +		// Hardcoded template bitfield to add for new templates +		$bitfield = new bitfield(); +		$bitfield->set(0); +		$bitfield->set(1); +		$bitfield->set(2); +		$bitfield->set(3); +		$bitfield->set(4); +		$bitfield->set(8); +		$bitfield->set(9); +		$bitfield->set(11); +		$bitfield->set(12); +		$value = $bitfield->get_base64(); +		return $value;  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/acp_update.php b/phpBB/includes/acp/acp_update.php index 7e3d1a1024..f7f003781d 100644 --- a/phpBB/includes/acp/acp_update.php +++ b/phpBB/includes/acp/acp_update.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -86,5 +85,3 @@ class acp_update  		));  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/acp_users.php b/phpBB/includes/acp/acp_users.php index 363c900edc..44717452e8 100644 --- a/phpBB/includes/acp/acp_users.php +++ b/phpBB/includes/acp/acp_users.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -56,7 +55,7 @@ class acp_users  			$this->page_title = 'WHOIS';  			$this->tpl_name = 'simple_body'; -			$user_ip = request_var('user_ip', ''); +			$user_ip = phpbb_ip_normalise(request_var('user_ip', ''));  			$domain = gethostbyaddr($user_ip);  			$ipwhois = user_ipwhois($user_ip); @@ -120,7 +119,7 @@ class acp_users  		// Build modes dropdown list  		$sql = 'SELECT module_mode, module_auth  			FROM ' . MODULES_TABLE . " -			WHERE module_basename = 'users' +			WHERE module_basename = 'acp_users'  				AND module_enabled = 1  				AND module_class = 'acp'  			ORDER BY left_id, module_mode"; @@ -129,7 +128,7 @@ class acp_users  		$dropdown_modes = array();  		while ($row = $db->sql_fetchrow($result))  		{ -			if (!$this->p_master->module_auth($row['module_auth'])) +			if (!$this->p_master->module_auth_self($row['module_auth']))  			{  				continue;  			} @@ -757,7 +756,6 @@ class acp_users  						'username'			=> utf8_normalize_nfc(request_var('user', $user_row['username'], true)),  						'user_founder'		=> request_var('user_founder', ($user_row['user_type'] == USER_FOUNDER) ? 1 : 0),  						'email'				=> strtolower(request_var('user_email', $user_row['user_email'])), -						'email_confirm'		=> strtolower(request_var('email_confirm', '')),  						'new_password'		=> request_var('new_password', '', true),  						'password_confirm'	=> request_var('password_confirm', '', true),  					); @@ -789,7 +787,6 @@ class acp_users  								array('string', false, 6, 60),  								array('email', $user_row['user_email'])  							), -							'email_confirm'		=> array('string', true, 6, 60)  						);  					} @@ -800,11 +797,6 @@ class acp_users  						$error[] = 'NEW_PASSWORD_ERROR';  					} -					if ($data['email'] != $user_row['user_email'] && $data['email_confirm'] != $data['email']) -					{ -						$error[] = 'NEW_EMAIL_ERROR'; -					} -  					if (!check_form_key($form_name))  					{  						$error[] = 'FORM_INVALID'; @@ -915,7 +907,7 @@ class acp_users  					}  					// Replace "error" strings with their real, localised form -					$error = preg_replace('#^([A-Z_]+)$#e', "(!empty(\$user->lang['\\1'])) ? \$user->lang['\\1'] : '\\1'", $error); +					$error = array_map(array($user, 'lang'), $error);  				}  				if ($user_id == $user->data['user_id']) @@ -1010,8 +1002,8 @@ class acp_users  				$db->sql_freeresult($result);  				$template->assign_vars(array( -					'L_NAME_CHARS_EXPLAIN'		=> sprintf($user->lang[$config['allow_name_chars'] . '_EXPLAIN'], $config['min_name_chars'], $config['max_name_chars']), -					'L_CHANGE_PASSWORD_EXPLAIN'	=> sprintf($user->lang[$config['pass_complex'] . '_EXPLAIN'], $config['min_pass_chars'], $config['max_pass_chars']), +					'L_NAME_CHARS_EXPLAIN'		=> $user->lang($config['allow_name_chars'] . '_EXPLAIN', $user->lang('CHARACTERS', (int) $config['min_name_chars']), $user->lang('CHARACTERS', (int) $config['max_name_chars'])), +					'L_CHANGE_PASSWORD_EXPLAIN'	=> $user->lang($config['pass_complex'] . '_EXPLAIN', $user->lang('CHARACTERS', (int) $config['min_pass_chars']), $user->lang('CHARACTERS', (int) $config['max_pass_chars'])),  					'L_POSTS_IN_QUEUE'			=> $user->lang('NUM_POSTS_IN_QUEUE', $user_row['posts_in_queue']),  					'S_FOUNDER'					=> ($user->data['user_type'] == USER_FOUNDER) ? true : false, @@ -1399,7 +1391,7 @@ class acp_users  					}  					// Replace "error" strings with their real, localised form -					$error = preg_replace('#^([A-Z_]+)$#e', "(!empty(\$user->lang['\\1'])) ? \$user->lang['\\1'] : '\\1'", $error); +					$error = array_map(array($user, 'lang'), $error);  				}  				$s_birthday_day_options = '<option value="0"' . ((!$data['bday_day']) ? ' selected="selected"' : '') . '>--</option>'; @@ -1562,7 +1554,7 @@ class acp_users  								|| $user_row['user_allow_viewonline'] && !$sql_ary['user_allow_viewonline'])  							{  								// We also need to check if the user has the permission to cloak. -								$user_auth = new auth(); +								$user_auth = new phpbb_auth();  								$user_auth->acl($user_row);  								$session_sql_ary = array( @@ -1582,7 +1574,7 @@ class acp_users  					}  					// Replace "error" strings with their real, localised form -					$error = preg_replace('#^([A-Z_]+)$#e', "(!empty(\$user->lang['\\1'])) ? \$user->lang['\\1'] : '\\1'", $error); +					$error = array_map(array($user, 'lang'), $error);  				}  				$dateformat_options = ''; @@ -1708,7 +1700,7 @@ class acp_users  					}  					// Replace "error" strings with their real, localised form -					$error = preg_replace('#^([A-Z_]+)$#e', "(!empty(\$user->lang['\\1'])) ? \$user->lang['\\1'] : '\\1'", $error); +					$error = array_map(array($user, 'lang'), $error);  				}  				if (!$config['allow_avatar'] && $user_row['user_avatar_type']) @@ -1748,8 +1740,8 @@ class acp_users  					'USER_AVATAR_WIDTH'		=> $user_row['user_avatar_width'],  					'USER_AVATAR_HEIGHT'	=> $user_row['user_avatar_height'], -					'L_AVATAR_EXPLAIN'	=> sprintf($user->lang['AVATAR_EXPLAIN'], $config['avatar_max_width'], $config['avatar_max_height'], round($config['avatar_filesize'] / 1024))) -				); +					'L_AVATAR_EXPLAIN'	=> phpbb_avatar_explanation_string(), +				));  			break; @@ -1851,7 +1843,7 @@ class acp_users  					}  					// Replace "error" strings with their real, localised form -					$error = preg_replace('#^([A-Z_]+)$#e', "(!empty(\$user->lang['\\1'])) ? \$user->lang['\\1'] : '\\1'", $error); +					$error = array_map(array($user, 'lang'), $error);  				}  				$signature_preview = ''; @@ -1881,7 +1873,7 @@ class acp_users  					'FLASH_STATUS'			=> ($config['allow_sig_flash']) ? $user->lang['FLASH_IS_ON'] : $user->lang['FLASH_IS_OFF'],  					'URL_STATUS'			=> ($config['allow_sig_links']) ? $user->lang['URL_IS_ON'] : $user->lang['URL_IS_OFF'], -					'L_SIGNATURE_EXPLAIN'	=> sprintf($user->lang['SIGNATURE_EXPLAIN'], $config['max_sig_chars']), +					'L_SIGNATURE_EXPLAIN'	=> $user->lang('SIGNATURE_EXPLAIN', (int) $config['max_sig_chars']),  					'S_BBCODE_ALLOWED'		=> $config['allow_sig_bbcode'],  					'S_SMILIES_ALLOWED'		=> $config['allow_sig_smilies'], @@ -2397,5 +2389,3 @@ class acp_users  		return phpbb_optionget($user->keyoptions[$key], $var);  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/acp_words.php b/phpBB/includes/acp/acp_words.php index 88c5bbe592..d8d14ba4ad 100644 --- a/phpBB/includes/acp/acp_words.php +++ b/phpBB/includes/acp/acp_words.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -186,5 +185,3 @@ class acp_words  		$db->sql_freeresult($result);  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/auth.php b/phpBB/includes/acp/auth.php index 10d7973da6..7d9fd267ff 100644 --- a/phpBB/includes/acp/auth.php +++ b/phpBB/includes/acp/auth.php @@ -2,9 +2,8 @@  /**  *  * @package phpBB3 -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -20,7 +19,7 @@ if (!defined('IN_PHPBB'))  * ACP Permission/Auth class  * @package phpBB3  */ -class auth_admin extends auth +class auth_admin extends phpbb_auth  {  	/**  	* Init auth settings @@ -131,7 +130,7 @@ class auth_admin extends auth  			{  				if ($user->data['user_id'] != $userdata['user_id'])  				{ -					$auth2 = new auth(); +					$auth2 = new phpbb_auth();  					$auth2->acl($userdata);  				}  				else @@ -1281,5 +1280,3 @@ class auth_admin extends auth  		return true;  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/info/acp_attachments.php b/phpBB/includes/acp/info/acp_attachments.php index b77785801f..8fad241451 100644 --- a/phpBB/includes/acp/info/acp_attachments.php +++ b/phpBB/includes/acp/info/acp_attachments.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -23,7 +22,8 @@ class acp_attachments_info  				'attach'		=> array('title' => 'ACP_ATTACHMENT_SETTINGS', 'auth' => 'acl_a_attach', 'cat' => array('ACP_BOARD_CONFIGURATION', 'ACP_ATTACHMENTS')),  				'extensions'	=> array('title' => 'ACP_MANAGE_EXTENSIONS', 'auth' => 'acl_a_attach', 'cat' => array('ACP_ATTACHMENTS')),  				'ext_groups'	=> array('title' => 'ACP_EXTENSION_GROUPS', 'auth' => 'acl_a_attach', 'cat' => array('ACP_ATTACHMENTS')), -				'orphan'		=> array('title' => 'ACP_ORPHAN_ATTACHMENTS', 'auth' => 'acl_a_attach', 'cat' => array('ACP_ATTACHMENTS')) +				'orphan'		=> array('title' => 'ACP_ORPHAN_ATTACHMENTS', 'auth' => 'acl_a_attach', 'cat' => array('ACP_ATTACHMENTS')), +				'manage'		=> array('title' => 'ACP_MANAGE_ATTACHMENTS', 'auth' => 'acl_a_attach', 'cat' => array('ACP_ATTACHMENTS')),  			),  		);  	} @@ -36,5 +36,3 @@ class acp_attachments_info  	{  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/info/acp_ban.php b/phpBB/includes/acp/info/acp_ban.php index df51011ec6..37f0f021a7 100644 --- a/phpBB/includes/acp/info/acp_ban.php +++ b/phpBB/includes/acp/info/acp_ban.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -35,5 +34,3 @@ class acp_ban_info  	{  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/info/acp_bbcodes.php b/phpBB/includes/acp/info/acp_bbcodes.php index c0206432d6..5c88ca8a0f 100644 --- a/phpBB/includes/acp/info/acp_bbcodes.php +++ b/phpBB/includes/acp/info/acp_bbcodes.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -33,5 +32,3 @@ class acp_bbcodes_info  	{  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/info/acp_board.php b/phpBB/includes/acp/info/acp_board.php index 3e18f55940..50d5a4f4e1 100644 --- a/phpBB/includes/acp/info/acp_board.php +++ b/phpBB/includes/acp/info/acp_board.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -48,5 +47,3 @@ class acp_board_info  	{  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/info/acp_bots.php b/phpBB/includes/acp/info/acp_bots.php index 45087f9225..c30ab588ab 100644 --- a/phpBB/includes/acp/info/acp_bots.php +++ b/phpBB/includes/acp/info/acp_bots.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -33,6 +32,3 @@ class acp_bots_info  	{  	}  } - - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/info/acp_captcha.php b/phpBB/includes/acp/info/acp_captcha.php index b2541c252c..3f31b4c102 100644 --- a/phpBB/includes/acp/info/acp_captcha.php +++ b/phpBB/includes/acp/info/acp_captcha.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -34,5 +33,3 @@ class acp_captcha_info  	{  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/info/acp_database.php b/phpBB/includes/acp/info/acp_database.php index 85c3c8b21c..c8ad65e255 100644 --- a/phpBB/includes/acp/info/acp_database.php +++ b/phpBB/includes/acp/info/acp_database.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -34,5 +33,3 @@ class acp_database_info  	{  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/info/acp_disallow.php b/phpBB/includes/acp/info/acp_disallow.php index 41315eb716..f9dd4c32c0 100644 --- a/phpBB/includes/acp/info/acp_disallow.php +++ b/phpBB/includes/acp/info/acp_disallow.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -33,6 +32,3 @@ class acp_disallow_info  	{  	}  } - - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/info/acp_email.php b/phpBB/includes/acp/info/acp_email.php index 4ad7bca58b..620904c956 100644 --- a/phpBB/includes/acp/info/acp_email.php +++ b/phpBB/includes/acp/info/acp_email.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -33,6 +32,3 @@ class acp_email_info  	{  	}  } - - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/info/acp_forums.php b/phpBB/includes/acp/info/acp_forums.php index 8d82eaf42d..e5281a4e58 100644 --- a/phpBB/includes/acp/info/acp_forums.php +++ b/phpBB/includes/acp/info/acp_forums.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -33,5 +32,3 @@ class acp_forums_info  	{  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/info/acp_groups.php b/phpBB/includes/acp/info/acp_groups.php index 3910c24e6b..af3f4893fd 100644 --- a/phpBB/includes/acp/info/acp_groups.php +++ b/phpBB/includes/acp/info/acp_groups.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -21,6 +20,7 @@ class acp_groups_info  			'version'	=> '1.0.0',  			'modes'		=> array(  				'manage'		=> array('title' => 'ACP_GROUPS_MANAGE', 'auth' => 'acl_a_group', 'cat' => array('ACP_GROUPS')), +				'position'		=> array('title' => 'ACP_GROUPS_POSITION', 'auth' => 'acl_a_group', 'cat' => array('ACP_GROUPS')),  			),  		);  	} @@ -33,5 +33,3 @@ class acp_groups_info  	{  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/info/acp_icons.php b/phpBB/includes/acp/info/acp_icons.php index 16bf753940..e0cf05660c 100644 --- a/phpBB/includes/acp/info/acp_icons.php +++ b/phpBB/includes/acp/info/acp_icons.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -34,5 +33,3 @@ class acp_icons_info  	{  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/info/acp_inactive.php b/phpBB/includes/acp/info/acp_inactive.php index e17fbda9dd..02b1fcdaa2 100644 --- a/phpBB/includes/acp/info/acp_inactive.php +++ b/phpBB/includes/acp/info/acp_inactive.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2006 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -33,5 +32,3 @@ class acp_inactive_info  	{  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/info/acp_jabber.php b/phpBB/includes/acp/info/acp_jabber.php index 7bcf7744e1..3ad05e1a6a 100644 --- a/phpBB/includes/acp/info/acp_jabber.php +++ b/phpBB/includes/acp/info/acp_jabber.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -33,4 +32,3 @@ class acp_jabber_info  	{  	}  } -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/info/acp_language.php b/phpBB/includes/acp/info/acp_language.php index f7606631fe..85dfb119ea 100644 --- a/phpBB/includes/acp/info/acp_language.php +++ b/phpBB/includes/acp/info/acp_language.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -33,5 +32,3 @@ class acp_language_info  	{  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/info/acp_logs.php b/phpBB/includes/acp/info/acp_logs.php index f119e10b83..033f9baf50 100644 --- a/phpBB/includes/acp/info/acp_logs.php +++ b/phpBB/includes/acp/info/acp_logs.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -36,5 +35,3 @@ class acp_logs_info  	{  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/info/acp_main.php b/phpBB/includes/acp/info/acp_main.php index 5574cc40d1..4c1cb6dc0f 100644 --- a/phpBB/includes/acp/info/acp_main.php +++ b/phpBB/includes/acp/info/acp_main.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -33,5 +32,3 @@ class acp_main_info  	{  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/info/acp_modules.php b/phpBB/includes/acp/info/acp_modules.php index 886f17d628..c9d2cffa72 100644 --- a/phpBB/includes/acp/info/acp_modules.php +++ b/phpBB/includes/acp/info/acp_modules.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -35,5 +34,3 @@ class acp_modules_info  	{  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/info/acp_permission_roles.php b/phpBB/includes/acp/info/acp_permission_roles.php index 3ab2fecd53..ee2a3ee560 100644 --- a/phpBB/includes/acp/info/acp_permission_roles.php +++ b/phpBB/includes/acp/info/acp_permission_roles.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -36,5 +35,3 @@ class acp_permission_roles_info  	{  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/info/acp_permissions.php b/phpBB/includes/acp/info/acp_permissions.php index 6f341742f3..7b51b67a96 100644 --- a/phpBB/includes/acp/info/acp_permissions.php +++ b/phpBB/includes/acp/info/acp_permissions.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -50,5 +49,3 @@ class acp_permissions_info  	{  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/info/acp_php_info.php b/phpBB/includes/acp/info/acp_php_info.php index 7d716b0f83..a456e4b8b7 100644 --- a/phpBB/includes/acp/info/acp_php_info.php +++ b/phpBB/includes/acp/info/acp_php_info.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -33,5 +32,3 @@ class acp_php_info_info  	{  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/info/acp_profile.php b/phpBB/includes/acp/info/acp_profile.php index 8590226038..6fa673b094 100644 --- a/phpBB/includes/acp/info/acp_profile.php +++ b/phpBB/includes/acp/info/acp_profile.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -33,5 +32,3 @@ class acp_profile_info  	{  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/info/acp_prune.php b/phpBB/includes/acp/info/acp_prune.php index 46565c4f16..7498e46cad 100644 --- a/phpBB/includes/acp/info/acp_prune.php +++ b/phpBB/includes/acp/info/acp_prune.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -34,5 +33,3 @@ class acp_prune_info  	{  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/info/acp_ranks.php b/phpBB/includes/acp/info/acp_ranks.php index 06b9c6d284..651a86471d 100644 --- a/phpBB/includes/acp/info/acp_ranks.php +++ b/phpBB/includes/acp/info/acp_ranks.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -33,5 +32,3 @@ class acp_ranks_info  	{  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/info/acp_reasons.php b/phpBB/includes/acp/info/acp_reasons.php index 65d805ee18..9f8f2ced77 100644 --- a/phpBB/includes/acp/info/acp_reasons.php +++ b/phpBB/includes/acp/info/acp_reasons.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -33,5 +32,3 @@ class acp_reasons_info  	{  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/info/acp_search.php b/phpBB/includes/acp/info/acp_search.php index 4afd6c6994..494d8afd67 100644 --- a/phpBB/includes/acp/info/acp_search.php +++ b/phpBB/includes/acp/info/acp_search.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -34,5 +33,3 @@ class acp_search_info  	{  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/info/acp_send_statistics.php b/phpBB/includes/acp/info/acp_send_statistics.php index de5dcdb8ad..07e7f3ba5c 100644 --- a/phpBB/includes/acp/info/acp_send_statistics.php +++ b/phpBB/includes/acp/info/acp_send_statistics.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -33,5 +32,3 @@ class acp_send_statistics_info  	{  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/info/acp_styles.php b/phpBB/includes/acp/info/acp_styles.php index db67167e39..3137c4781b 100644 --- a/phpBB/includes/acp/info/acp_styles.php +++ b/phpBB/includes/acp/info/acp_styles.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -18,12 +17,11 @@ class acp_styles_info  		return array(  			'filename'	=> 'acp_styles',  			'title'		=> 'ACP_CAT_STYLES', -			'version'	=> '1.0.0', +			'version'	=> '2.0.0',  			'modes'		=> array(  				'style'		=> array('title' => 'ACP_STYLES', 'auth' => 'acl_a_styles', 'cat' => array('ACP_STYLE_MANAGEMENT')), -				'template'	=> array('title' => 'ACP_TEMPLATES', 'auth' => 'acl_a_styles', 'cat' => array('ACP_STYLE_COMPONENTS')), -				'theme'		=> array('title' => 'ACP_THEMES', 'auth' => 'acl_a_styles', 'cat' => array('ACP_STYLE_COMPONENTS')), -				'imageset'	=> array('title' => 'ACP_IMAGESETS', 'auth' => 'acl_a_styles', 'cat' => array('ACP_STYLE_COMPONENTS')), +				'install'	=> array('title' => 'ACP_STYLES_INSTALL', 'auth' => 'acl_a_styles', 'cat' => array('ACP_STYLE_MANAGEMENT')), +				'cache'		=> array('title' => 'ACP_STYLES_CACHE', 'auth' => 'acl_a_styles', 'cat' => array('ACP_STYLE_MANAGEMENT')),  			),  		);  	} @@ -36,5 +34,3 @@ class acp_styles_info  	{  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/info/acp_update.php b/phpBB/includes/acp/info/acp_update.php index 886cdc94d5..3d491216a8 100644 --- a/phpBB/includes/acp/info/acp_update.php +++ b/phpBB/includes/acp/info/acp_update.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -33,5 +32,3 @@ class acp_update_info  	{  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/info/acp_users.php b/phpBB/includes/acp/info/acp_users.php index 10081ac870..1848622a1c 100644 --- a/phpBB/includes/acp/info/acp_users.php +++ b/phpBB/includes/acp/info/acp_users.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -43,5 +42,3 @@ class acp_users_info  	{  	}  } - -?>
\ No newline at end of file diff --git a/phpBB/includes/acp/info/acp_words.php b/phpBB/includes/acp/info/acp_words.php index a2417f8a7f..48cb3fbdd1 100644 --- a/phpBB/includes/acp/info/acp_words.php +++ b/phpBB/includes/acp/info/acp_words.php @@ -2,9 +2,8 @@  /**  *  * @package acp -* @version $Id$  * @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ @@ -33,5 +32,3 @@ class acp_words_info  	{  	}  } - -?>
\ No newline at end of file | 
