diff options
Diffstat (limited to 'phpBB/includes')
32 files changed, 354 insertions, 149 deletions
| diff --git a/phpBB/includes/acm/acm_memory.php b/phpBB/includes/acm/acm_memory.php index 2936ea0bae..9b68585d24 100644 --- a/phpBB/includes/acm/acm_memory.php +++ b/phpBB/includes/acm/acm_memory.php @@ -292,12 +292,24 @@ class acm_memory  		// determine which tables this query belongs to  		// Some queries use backticks, namely the get_database_size() query  		// don't check for conformity, the SQL would error and not reach here. -		if (!preg_match('/FROM \\(?(`?\\w+`?(?: \\w+)?(?:, ?`?\\w+`?(?: \\w+)?)*)\\)?/', $query, $regs)) +		if (!preg_match_all('/(?:FROM \\(?(`?\\w+`?(?: \\w+)?(?:, ?`?\\w+`?(?: \\w+)?)*)\\)?)|(?:JOIN (`?\\w+`?(?: \\w+)?))/', $query, $regs, PREG_SET_ORDER))  		{  			// Bail out if the match fails.  			return;  		} -		$tables = array_map('trim', explode(',', $regs[1])); + +		$tables = array(); +		foreach ($regs as $match) +		{ +			if ($match[0][0] == 'F') +			{ +				$tables = array_merge($tables, array_map('trim', explode(',', $match[1]))); +			} +			else +			{ +				$tables[] = $match[2]; +			} +		}  		foreach ($tables as $table_name)  		{ diff --git a/phpBB/includes/acp/acp_attachments.php b/phpBB/includes/acp/acp_attachments.php index fc5f44e14f..bffe6f7db3 100644 --- a/phpBB/includes/acp/acp_attachments.php +++ b/phpBB/includes/acp/acp_attachments.php @@ -127,7 +127,7 @@ class acp_attachments  						'img_create_thumbnail'		=> array('lang' => 'CREATE_THUMBNAIL',		'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => true),  						'img_max_thumb_width'		=> array('lang' => 'MAX_THUMB_WIDTH',		'validate' => 'int',	'type' => 'text:7:15', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']),  						'img_min_thumb_filesize'	=> array('lang' => 'MIN_THUMB_FILESIZE',	'validate' => 'int',	'type' => 'text:7:15', 'explain' => true, 'append' => ' ' . $user->lang['BYTES']), -						'img_imagick'				=> array('lang' => 'IMAGICK_PATH',			'validate' => 'string',	'type' => 'text:20:200', 'explain' => true, 'append' => '  <span>[ <a href="' . $this->u_action . '&action=imgmagick">' . $user->lang['SEARCH_IMAGICK'] . '</a> ]</span>'), +						'img_imagick'				=> array('lang' => 'IMAGICK_PATH',			'validate' => 'absolute_path',	'type' => 'text:20:200', 'explain' => true, 'append' => '  <span>[ <a href="' . $this->u_action . '&action=imgmagick">' . $user->lang['SEARCH_IMAGICK'] . '</a> ]</span>'),  						'img_max'					=> array('lang' => 'MAX_IMAGE_SIZE',		'validate' => 'int',	'type' => 'dimension:3:4', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']),  						'img_link'					=> array('lang' => 'IMAGE_LINK_SIZE',		'validate' => 'int',	'type' => 'dimension:3:4', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']),  					) diff --git a/phpBB/includes/acp/acp_board.php b/phpBB/includes/acp/acp_board.php index ebbf66657e..526d8e05da 100644 --- a/phpBB/includes/acp/acp_board.php +++ b/phpBB/includes/acp/acp_board.php @@ -123,7 +123,7 @@ class acp_board  						'avatar_filesize'		=> array('lang' => 'MAX_FILESIZE',			'validate' => 'int:0',	'type' => 'text:4:10', 'explain' => true, 'append' => ' ' . $user->lang['BYTES']),  						'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_path'			=> array('lang' => 'AVATAR_STORAGE_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)  					)  				); diff --git a/phpBB/includes/acp/acp_forums.php b/phpBB/includes/acp/acp_forums.php index 50e12a0f15..dc2e6b75fb 100644 --- a/phpBB/includes/acp/acp_forums.php +++ b/phpBB/includes/acp/acp_forums.php @@ -56,7 +56,6 @@ class acp_forums  				$total = request_var('total', 0);  				$this->display_progress_bar($start, $total); -				exit;  			break;  			case 'delete': diff --git a/phpBB/includes/acp/acp_main.php b/phpBB/includes/acp/acp_main.php index d80b0d1532..79557bb5fd 100644 --- a/phpBB/includes/acp/acp_main.php +++ b/phpBB/includes/acp/acp_main.php @@ -606,8 +606,8 @@ class acp_main  				'S_MBSTRING_LOADED'						=> true,  				'S_MBSTRING_FUNC_OVERLOAD_FAIL'			=> (intval(@ini_get('mbstring.func_overload')) & (MB_OVERLOAD_MAIL | MB_OVERLOAD_STRING)),  				'S_MBSTRING_ENCODING_TRANSLATION_FAIL'	=> (@ini_get('mbstring.encoding_translation') != 0), -				'S_MBSTRING_HTTP_INPUT_FAIL'			=> (@ini_get('mbstring.http_input') != 'pass'), -				'S_MBSTRING_HTTP_OUTPUT_FAIL'			=> (@ini_get('mbstring.http_output') != 'pass'), +				'S_MBSTRING_HTTP_INPUT_FAIL'			=> !in_array(@ini_get('mbstring.http_input'), array('pass', '')), +				'S_MBSTRING_HTTP_OUTPUT_FAIL'			=> !in_array(@ini_get('mbstring.http_output'), array('pass', '')),  			));  		} diff --git a/phpBB/includes/acp/acp_php_info.php b/phpBB/includes/acp/acp_php_info.php index 7dd345971a..88e2ac3f8d 100644 --- a/phpBB/includes/acp/acp_php_info.php +++ b/phpBB/includes/acp/acp_php_info.php @@ -47,7 +47,7 @@ class acp_php_info  		// for this was nabbed from the PHP annotated manual  		preg_match_all('#<body[^>]*>(.*)</body>#si', $phpinfo, $output); -		if (empty($phpinfo) || empty($output)) +		if (empty($phpinfo) || empty($output[1][0]))  		{  			trigger_error('NO_PHPINFO_AVAILABLE', E_USER_WARNING);  		} diff --git a/phpBB/includes/acp/acp_update.php b/phpBB/includes/acp/acp_update.php index 5d3e9abcea..87d5c51b56 100644 --- a/phpBB/includes/acp/acp_update.php +++ b/phpBB/includes/acp/acp_update.php @@ -34,10 +34,7 @@ class acp_update  		$this->page_title = 'ACP_VERSION_CHECK';  		// Get current and latest version -		$errstr = ''; -		$errno = 0; - -		$info = obtain_latest_version_info(request_var('versioncheck_force', false)); +		$info = htmlspecialchars(obtain_latest_version_info(request_var('versioncheck_force', false)));  		if (empty($info))  		{ diff --git a/phpBB/includes/acp/acp_users.php b/phpBB/includes/acp/acp_users.php index 70e08f79f2..b82be8887c 100644 --- a/phpBB/includes/acp/acp_users.php +++ b/phpBB/includes/acp/acp_users.php @@ -172,8 +172,7 @@ class acp_users  				if ($submit)  				{ -					// You can't delete the founder -					if ($delete && $user_row['user_type'] != USER_FOUNDER) +					if ($delete)  					{  						if (!$auth->acl_get('a_userdel'))  						{ @@ -186,6 +185,12 @@ class acp_users  							trigger_error($user->lang['CANNOT_REMOVE_ANONYMOUS'] . adm_back_link($this->u_action . '&u=' . $user_id), E_USER_WARNING);  						} +						// Founders can not be deleted. +						if ($user_row['user_type'] == USER_FOUNDER) +						{ +							trigger_error($user->lang['CANNOT_REMOVE_FOUNDER'] . adm_back_link($this->u_action . '&u=' . $user_id), E_USER_WARNING); +						} +  						if ($user_id == $user->data['user_id'])  						{  							trigger_error($user->lang['CANNOT_REMOVE_YOURSELF'] . adm_back_link($this->u_action . '&u=' . $user_id), E_USER_WARNING); @@ -1032,6 +1037,7 @@ class acp_users  					'U_SHOW_IP'		=> $this->u_action . "&u=$user_id&ip=" . (($ip == 'ip') ? 'hostname' : 'ip'),  					'U_WHOIS'		=> $this->u_action . "&action=whois&user_ip={$user_row['user_ip']}",  					'U_MCP_QUEUE'	=> ($auth->acl_getf_global('m_approve')) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue', true, $user->session_id) : '', +					'U_SEARCH_USER'	=> ($config['load_search'] && $auth->acl_get('u_search')) ? append_sid("{$phpbb_root_path}search.$phpEx", "author_id={$user_row['user_id']}&sr=posts") : '',  					'U_SWITCH_PERMISSIONS'	=> ($auth->acl_get('a_switchperm') && $user->data['user_id'] != $user_row['user_id']) ? append_sid("{$phpbb_root_path}ucp.$phpEx", "mode=switch_perm&u={$user_row['user_id']}&hash=" . generate_link_hash('switchperm')) : '', @@ -2009,7 +2015,7 @@ class acp_users  					WHERE a.poster_id = ' . $user_id . "  						AND a.is_orphan = 0  					ORDER BY $order_by"; -				$result = $db->sql_query_limit($sql, $config['posts_per_page'], $start); +				$result = $db->sql_query_limit($sql, $config['topics_per_page'], $start);  				while ($row = $db->sql_fetchrow($result))  				{ diff --git a/phpBB/includes/bbcode.php b/phpBB/includes/bbcode.php index 9356e3e9b4..3c25fd6587 100644 --- a/phpBB/includes/bbcode.php +++ b/phpBB/includes/bbcode.php @@ -135,6 +135,11 @@ class bbcode  			$this->template_bitfield = new bitfield($user->theme['bbcode_bitfield']);  			$this->template_filename = $phpbb_root_path . 'styles/' . $user->theme['template_path'] . '/template/bbcode.html'; +			if (empty($user->theme['template_inherits_id']) && !empty($template->orig_tpl_inherits_id)) +			{ +				$user->theme['template_inherits_id'] = $template->orig_tpl_inherits_id; +			} +  			if (!@file_exists($this->template_filename))  			{  				if (isset($user->theme['template_inherits_id']) && $user->theme['template_inherits_id']) @@ -376,7 +381,7 @@ class bbcode  						}  						// Replace {L_*} lang strings -						$bbcode_tpl = preg_replace('/{L_([A-Z_]+)}/e', "(!empty(\$user->lang['\$1'])) ? \$user->lang['\$1'] : ucwords(strtolower(str_replace('_', ' ', '\$1')))", $bbcode_tpl); +						$bbcode_tpl = preg_replace('/{L_([A-Z0-9_]+)}/e', "(!empty(\$user->lang['\$1'])) ? \$user->lang['\$1'] : ucwords(strtolower(str_replace('_', ' ', '\$1')))", $bbcode_tpl);  						if (!empty($rowset[$bbcode_id]['second_pass_replace']))  						{ @@ -480,7 +485,7 @@ class bbcode  			'email'					=> array('{EMAIL}'		=> '$1', '{DESCRIPTION}'	=> '$2')  		); -		$tpl = preg_replace('/{L_([A-Z_]+)}/e', "(!empty(\$user->lang['\$1'])) ? \$user->lang['\$1'] : ucwords(strtolower(str_replace('_', ' ', '\$1')))", $tpl); +		$tpl = preg_replace('/{L_([A-Z0-9_]+)}/e', "(!empty(\$user->lang['\$1'])) ? \$user->lang['\$1'] : ucwords(strtolower(str_replace('_', ' ', '\$1')))", $tpl);  		if (!empty($replacements[$tpl_name]))  		{ diff --git a/phpBB/includes/constants.php b/phpBB/includes/constants.php index 3533c49d46..e8a3191280 100644 --- a/phpBB/includes/constants.php +++ b/phpBB/includes/constants.php @@ -25,7 +25,7 @@ if (!defined('IN_PHPBB'))  */  // phpBB Version -define('PHPBB_VERSION', '3.0.12'); +define('PHPBB_VERSION', '3.0.14');  // QA-related  // define('PHPBB_QA', 1); diff --git a/phpBB/includes/db/db_tools.php b/phpBB/includes/db/db_tools.php index f63ff18cbe..6913960185 100644 --- a/phpBB/includes/db/db_tools.php +++ b/phpBB/includes/db/db_tools.php @@ -452,9 +452,6 @@ class phpbb_db_tools  		// Determine if we have created a PRIMARY KEY in the earliest  		$primary_key_gen = false; -		// Determine if the table must be created with TEXTIMAGE -		$create_textimage = false; -  		// Determine if the table requires a sequence  		$create_sequence = false; @@ -471,13 +468,22 @@ class phpbb_db_tools  			break;  		} +		if ($this->sql_layer == 'mssql' || $this->sql_layer == 'mssqlnative') +		{ +			if (!isset($table_data['PRIMARY_KEY'])) +			{ +				$table_data['COLUMNS']['mssqlindex'] = array('UINT', null, 'auto_increment'); +				$table_data['PRIMARY_KEY'] = 'mssqlindex'; +			} +		} +  		// Iterate through the columns to create a table  		foreach ($table_data['COLUMNS'] as $column_name => $column_data)  		{  			// here lies an array, filled with information compiled on the column's data  			$prepared_column = $this->sql_prepare_column_data($table_name, $column_name, $column_data); -			if (isset($prepared_column['auto_increment']) && strlen($column_name) > 26) // "${column_name}_gen" +			if (isset($prepared_column['auto_increment']) && $prepared_column['auto_increment'] && strlen($column_name) > 26) // "${column_name}_gen"  			{  				trigger_error("Index name '${column_name}_gen' on table '$table_name' is too long. The maximum auto increment column length is 26 characters.", E_USER_ERROR);  			} @@ -501,12 +507,6 @@ class phpbb_db_tools  				$primary_key_gen = isset($prepared_column['primary_key_set']) && $prepared_column['primary_key_set'];  			} -			// create textimage DDL based off of the existance of certain column types -			if (!$create_textimage) -			{ -				$create_textimage = isset($prepared_column['textimage']) && $prepared_column['textimage']; -			} -  			// create sequence DDL based off of the existance of auto incrementing columns  			if (!$create_sequence && isset($prepared_column['auto_increment']) && $prepared_column['auto_increment'])  			{ @@ -521,13 +521,9 @@ class phpbb_db_tools  		switch ($this->sql_layer)  		{  			case 'firebird': -				$table_sql .= "\n);"; -				$statements[] = $table_sql; -			break; -  			case 'mssql':  			case 'mssqlnative': -				$table_sql .= "\n) ON [PRIMARY]" . (($create_textimage) ? ' TEXTIMAGE_ON [PRIMARY]' : ''); +				$table_sql .= "\n);";  				$statements[] = $table_sql;  			break;  		} @@ -879,7 +875,7 @@ class phpbb_db_tools  			}  		} -		// Add unqiue indexes? +		// Add unique indexes?  		if (!empty($schema_changes['add_unique_index']))  		{  			foreach ($schema_changes['add_unique_index'] as $table => $index_array) @@ -1290,7 +1286,7 @@ class phpbb_db_tools  	}  	/** -	* Check if a specified index exists in table. Does not return PRIMARY KEY and UNIQUE indexes. +	* Check if a specified index exists in table. Does not return PRIMARY KEY indexes.  	*  	* @param string	$table_name		Table to check the index at  	* @param string	$index_name		The index name to check @@ -1819,22 +1815,49 @@ class phpbb_db_tools  			case 'mssql':  			case 'mssqlnative': -				// remove default cosntraints first -				// http://msdn.microsoft.com/en-us/library/aa175912%28v=sql.80%29.aspx -				$statements[] = "DECLARE @drop_default_name VARCHAR(100), @cmd VARCHAR(1000) -					SET @drop_default_name = -						(SELECT so.name FROM sysobjects so -						JOIN sysconstraints sc ON so.id = sc.constid -						WHERE object_name(so.parent_obj) = '{$table_name}' -							AND so.xtype = 'D' -							AND sc.colid = (SELECT colid FROM syscolumns -								WHERE id = object_id('{$table_name}') -									AND name = '{$column_name}')) -					IF @drop_default_name <> '' -					BEGIN -						SET @cmd = 'ALTER TABLE [{$table_name}] DROP CONSTRAINT [' + @drop_default_name + ']' -						EXEC(@cmd) -					END"; +				$sql = "SELECT CAST(SERVERPROPERTY('productversion') AS VARCHAR(25)) AS mssql_version"; +				$result = $this->db->sql_query($sql); +				$row = $this->db->sql_fetchrow($result); +				$this->db->sql_freeresult($result); + +				// Remove default constraints +				if ($row['mssql_version'][0] == '8')	// SQL Server 2000 +				{ +					// http://msdn.microsoft.com/en-us/library/aa175912%28v=sql.80%29.aspx +					// Deprecated in SQL Server 2005 +					$statements[] = "DECLARE @drop_default_name VARCHAR(100), @cmd VARCHAR(1000) +						SET @drop_default_name = +							(SELECT so.name FROM sysobjects so +							JOIN sysconstraints sc ON so.id = sc.constid +							WHERE object_name(so.parent_obj) = '{$table_name}' +								AND so.xtype = 'D' +								AND sc.colid = (SELECT colid FROM syscolumns +									WHERE id = object_id('{$table_name}') +										AND name = '{$column_name}')) +						IF @drop_default_name <> '' +						BEGIN +							SET @cmd = 'ALTER TABLE [{$table_name}] DROP CONSTRAINT [' + @drop_default_name + ']' +							EXEC(@cmd) +						END"; +				} +				else +				{ +					$sql = "SELECT dobj.name AS def_name +					FROM sys.columns col  +						LEFT OUTER JOIN sys.objects dobj ON (dobj.object_id = col.default_object_id AND dobj.type = 'D') +					WHERE col.object_id = object_id('{$table_name}')  +					AND col.name = '{$column_name}' +					AND dobj.name IS NOT NULL"; +					$result = $this->db->sql_query($sql); +					$row = $this->db->sql_fetchrow($result); +					$this->db->sql_freeresult($result); + +					if ($row) +					{ +						$statements[] = 'ALTER TABLE [' . $table_name . '] DROP CONSTRAINT [' . $row['def_name'] . ']'; +					} +				} +  				$statements[] = 'ALTER TABLE [' . $table_name . '] DROP COLUMN [' . $column_name . ']';  			break; @@ -2038,7 +2061,7 @@ class phpbb_db_tools  				$sql = "ALTER TABLE [{$table_name}] WITH NOCHECK ADD ";  				$sql .= "CONSTRAINT [PK_{$table_name}] PRIMARY KEY  CLUSTERED (";  				$sql .= '[' . implode("],\n\t\t[", $column) . ']'; -				$sql .= ') ON [PRIMARY]'; +				$sql .= ')';  				$statements[] = $sql;  			break; @@ -2136,7 +2159,7 @@ class phpbb_db_tools  			case 'mssql':  			case 'mssqlnative': -				$statements[] = 'CREATE UNIQUE INDEX ' . $index_name . ' ON ' . $table_name . '(' . implode(', ', $column) . ') ON [PRIMARY]'; +				$statements[] = 'CREATE UNIQUE INDEX ' . $index_name . ' ON ' . $table_name . '(' . implode(', ', $column) . ')';  			break;  		} @@ -2189,7 +2212,7 @@ class phpbb_db_tools  			case 'mssql':  			case 'mssqlnative': -				$statements[] = 'CREATE INDEX ' . $index_name . ' ON ' . $table_name . '(' . implode(', ', $column) . ') ON [PRIMARY]'; +				$statements[] = 'CREATE INDEX ' . $index_name . ' ON ' . $table_name . '(' . implode(', ', $column) . ')';  			break;  		} @@ -2321,23 +2344,48 @@ class phpbb_db_tools  				if (!empty($column_data['default']))  				{ +					$sql = "SELECT CAST(SERVERPROPERTY('productversion') AS VARCHAR(25)) AS mssql_version"; +					$result = $this->db->sql_query($sql); +					$row = $this->db->sql_fetchrow($result); +					$this->db->sql_freeresult($result); +  					// Using TRANSACT-SQL for this statement because we do not want to have colliding data if statements are executed at a later stage -					$statements[] = "DECLARE @drop_default_name VARCHAR(100), @cmd VARCHAR(1000) -						SET @drop_default_name = -							(SELECT so.name FROM sysobjects so -							JOIN sysconstraints sc ON so.id = sc.constid -							WHERE object_name(so.parent_obj) = '{$table_name}' -								AND so.xtype = 'D' -								AND sc.colid = (SELECT colid FROM syscolumns -									WHERE id = object_id('{$table_name}') -										AND name = '{$column_name}')) -						IF @drop_default_name <> '' -						BEGIN -							SET @cmd = 'ALTER TABLE [{$table_name}] DROP CONSTRAINT [' + @drop_default_name + ']' -							EXEC(@cmd) -						END -						SET @cmd = 'ALTER TABLE [{$table_name}] ADD CONSTRAINT [DF_{$table_name}_{$column_name}_1] {$column_data['default']} FOR [{$column_name}]' -						EXEC(@cmd)"; +					if ($row['mssql_version'][0] == '8')	// SQL Server 2000 +					{ +						$statements[] = "DECLARE @drop_default_name VARCHAR(100), @cmd VARCHAR(1000) +							SET @drop_default_name = +								(SELECT so.name FROM sysobjects so +								JOIN sysconstraints sc ON so.id = sc.constid +								WHERE object_name(so.parent_obj) = '{$table_name}' +									AND so.xtype = 'D' +									AND sc.colid = (SELECT colid FROM syscolumns +										WHERE id = object_id('{$table_name}') +											AND name = '{$column_name}')) +							IF @drop_default_name <> '' +							BEGIN +								SET @cmd = 'ALTER TABLE [{$table_name}] DROP CONSTRAINT [' + @drop_default_name + ']' +								EXEC(@cmd) +							END +							SET @cmd = 'ALTER TABLE [{$table_name}] ADD CONSTRAINT [DF_{$table_name}_{$column_name}_1] {$column_data['default']} FOR [{$column_name}]' +							EXEC(@cmd)"; +					} +					else +					{ +						$statements[] = "DECLARE @drop_default_name VARCHAR(100), @cmd VARCHAR(1000) +							SET @drop_default_name = +								(SELECT dobj.name FROM sys.columns col  +									LEFT OUTER JOIN sys.objects dobj ON (dobj.object_id = col.default_object_id AND dobj.type = 'D') +								WHERE col.object_id = object_id('{$table_name}')  +								AND col.name = '{$column_name}' +								AND dobj.name IS NOT NULL) +							IF @drop_default_name <> '' +							BEGIN +								SET @cmd = 'ALTER TABLE [{$table_name}] DROP CONSTRAINT [' + @drop_default_name + ']' +								EXEC(@cmd) +							END +							SET @cmd = 'ALTER TABLE [{$table_name}] ADD CONSTRAINT [DF_{$table_name}_{$column_name}_1] {$column_data['default']} FOR [{$column_name}]' +							EXEC(@cmd)"; +					}  				}  			break; diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index eef4ade4e7..2cef973a28 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -2492,7 +2492,7 @@ function redirect($url, $return = false, $disable_cd_check = false)  		// Attention: only able to redirect within the same domain if $disable_cd_check is false (yourdomain.com -> www.yourdomain.com will not work)  		if (!$disable_cd_check && $url_parts['host'] !== $user->host)  		{ -			$url = generate_board_url(); +			trigger_error('Tried to redirect to potentially insecure url.', E_USER_ERROR);  		}  	}  	else if ($url[0] == '/') @@ -2579,6 +2579,12 @@ function redirect($url, $return = false, $disable_cd_check = false)  		}  	} +	// Make sure we don't redirect to external URLs +	if (!$disable_cd_check && strpos($url, generate_board_url(true) . '/') !== 0) +	{ +		trigger_error('Tried to redirect to potentially insecure url.', E_USER_ERROR); +	} +  	// Make sure no linebreaks are there... to prevent http response splitting for PHP < 4.4.2  	if (strpos(urldecode($url), "\n") !== false || strpos(urldecode($url), "\r") !== false || strpos($url, ';') !== false)  	{ @@ -2782,7 +2788,7 @@ function send_status_line($code, $message)  	}  	else  	{ -		if (!empty($_SERVER['SERVER_PROTOCOL'])) +		if (!empty($_SERVER['SERVER_PROTOCOL']) && is_string($_SERVER['SERVER_PROTOCOL']) && preg_match('#^HTTP/[0-9]\.[0-9]$#', $_SERVER['SERVER_PROTOCOL']))  		{  			$version = $_SERVER['SERVER_PROTOCOL'];  		} @@ -3367,7 +3373,7 @@ function parse_cfg_file($filename, $lines = false)  		}  		// Determine first occurrence, since in values the equal sign is allowed -		$key = strtolower(trim(substr($line, 0, $delim_pos))); +		$key = htmlspecialchars(strtolower(trim(substr($line, 0, $delim_pos))));  		$value = trim(substr($line, $delim_pos + 1));  		if (in_array($value, array('off', 'false', '0'))) @@ -3384,7 +3390,11 @@ function parse_cfg_file($filename, $lines = false)  		}  		else if (($value[0] == "'" && $value[sizeof($value) - 1] == "'") || ($value[0] == '"' && $value[sizeof($value) - 1] == '"'))  		{ -			$value = substr($value, 1, sizeof($value)-2); +			$value = htmlspecialchars(substr($value, 1, sizeof($value)-2)); +		} +		else +		{ +			$value = htmlspecialchars($value);  		}  		$parsed_items[$key] = $value; diff --git a/phpBB/includes/functions_admin.php b/phpBB/includes/functions_admin.php index 2f73858ea2..3e69a997a2 100644 --- a/phpBB/includes/functions_admin.php +++ b/phpBB/includes/functions_admin.php @@ -3057,8 +3057,24 @@ function get_database_size()  		case 'mssql':  		case 'mssql_odbc':  		case 'mssqlnative': +			$sql = 'SELECT @@VERSION AS mssql_version'; +			$result = $db->sql_query($sql); +			$row = $db->sql_fetchrow($result); +			$db->sql_freeresult($result); +			  			$sql = 'SELECT ((SUM(size) * 8.0) * 1024.0) as dbsize  				FROM sysfiles'; + +			if ($row) +			{ +				// Azure stats are stored elsewhere +				if (strpos($row['mssql_version'], 'SQL Azure') !== false) +				{ +					$sql = 'SELECT ((SUM(reserved_page_count) * 8.0) * 1024.0) as dbsize  +					FROM sys.dm_db_partition_stats'; +				} +			} +  			$result = $db->sql_query($sql, 7200);  			$database_size = ($row = $db->sql_fetchrow($result)) ? $row['dbsize'] : false;  			$db->sql_freeresult($result); diff --git a/phpBB/includes/functions_content.php b/phpBB/includes/functions_content.php index b7650ecd6a..19459239d5 100644 --- a/phpBB/includes/functions_content.php +++ b/phpBB/includes/functions_content.php @@ -21,6 +21,7 @@ if (!defined('IN_PHPBB'))  * make_jumpbox()  * bump_topic_allowed()  * get_context() +* phpbb_clean_search_string()  * decode_message()  * strip_bbcode()  * generate_text_for_display() @@ -361,6 +362,23 @@ function get_context($text, $words, $length = 400)  }  /** +* Cleans a search string by removing single wildcards from it and replacing multiple spaces with a single one. +* +* @param string $search_string The full search string which should be cleaned. +* +* @return string The cleaned search string without any wildcards and multiple spaces. +*/ +function phpbb_clean_search_string($search_string) +{ +	// This regular expressions matches every single wildcard. +	// That means one after a whitespace or the beginning of the string or one before a whitespace or the end of the string. +	$search_string = preg_replace('#(?<=^|\s)\*+(?=\s|$)#', '', $search_string); +	$search_string = trim($search_string); +	$search_string = preg_replace(array('#\s+#u', '#\*+#u'), array(' ', '*'), $search_string); +	return $search_string; +} + +/**  * Decode text whereby text is coming from the db and expected to be pre-parsed content  * We are placing this outside of the message parser because we are often in need of it...  */ @@ -413,7 +431,7 @@ function generate_text_for_display($text, $uid, $bitfield, $flags)  {  	static $bbcode; -	if (!$text) +	if ($text === '')  	{  		return '';  	} @@ -459,7 +477,7 @@ function generate_text_for_storage(&$text, &$uid, &$bitfield, &$flags, $allow_bb  	$uid = $bitfield = '';  	$flags = (($allow_bbcode) ? OPTION_FLAG_BBCODE : 0) + (($allow_smilies) ? OPTION_FLAG_SMILIES : 0) + (($allow_urls) ? OPTION_FLAG_LINKS : 0); -	if (!$text) +	if ($text === '')  	{  		return;  	} diff --git a/phpBB/includes/functions_install.php b/phpBB/includes/functions_install.php index 47f4eac627..21dd8bfebe 100644 --- a/phpBB/includes/functions_install.php +++ b/phpBB/includes/functions_install.php @@ -309,7 +309,7 @@ function connect_check_db($error_connect, &$error, $dbms_details, $table_prefix,  	if (is_array($db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false, true)))  	{  		$db_error = $db->sql_error(); -		$error[] = $lang['INST_ERR_DB_CONNECT'] . '<br />' . (($db_error['message']) ? $db_error['message'] : $lang['INST_ERR_DB_NO_ERROR']); +		$error[] = $lang['INST_ERR_DB_CONNECT'] . '<br />' . (($db_error['message']) ? utf8_convert_message($db_error['message']) : $lang['INST_ERR_DB_NO_ERROR']);  	}  	else  	{ diff --git a/phpBB/includes/functions_module.php b/phpBB/includes/functions_module.php index d0e7c8cfc8..0cc2425b28 100644 --- a/phpBB/includes/functions_module.php +++ b/phpBB/includes/functions_module.php @@ -436,21 +436,21 @@ class p_master  		if ($this->active_module === false)  		{ -			trigger_error('Module not accessible', E_USER_ERROR); +			trigger_error('MODULE_NOT_ACCESS', E_USER_ERROR);  		}  		if (!class_exists("{$this->p_class}_$this->p_name"))  		{  			if (!file_exists("$module_path/{$this->p_class}_$this->p_name.$phpEx"))  			{ -				trigger_error("Cannot find module $module_path/{$this->p_class}_$this->p_name.$phpEx", E_USER_ERROR); +				trigger_error($user->lang('MODULE_NOT_FIND', "$module_path/{$this->p_class}_$this->p_name.$phpEx"), E_USER_ERROR);  			}  			include("$module_path/{$this->p_class}_$this->p_name.$phpEx");  			if (!class_exists("{$this->p_class}_$this->p_name"))  			{ -				trigger_error("Module file $module_path/{$this->p_class}_$this->p_name.$phpEx does not contain correct class [{$this->p_class}_$this->p_name]", E_USER_ERROR); +				trigger_error($user->lang('MODULE_FILE_INCORRECT_CLASS', "$module_path/{$this->p_class}_$this->p_name.$phpEx", "{$this->p_class}_$this->p_name"), E_USER_ERROR);  			}  			if (!empty($mode)) diff --git a/phpBB/includes/functions_posting.php b/phpBB/includes/functions_posting.php index 11a5067ef9..3f0a78a7cb 100644 --- a/phpBB/includes/functions_posting.php +++ b/phpBB/includes/functions_posting.php @@ -394,6 +394,10 @@ function upload_attachment($form_name, $forum_id, $local = false, $local_storage  	{  		$upload->set_disallowed_content(explode('|', $config['mime_triggers']));  	} +	else if (!$config['check_attachment_content']) +	{ +		$upload->set_disallowed_content(array()); +	}  	if (!$local)  	{ diff --git a/phpBB/includes/functions_privmsgs.php b/phpBB/includes/functions_privmsgs.php index b08d6e7f5c..c99f40d453 100644 --- a/phpBB/includes/functions_privmsgs.php +++ b/phpBB/includes/functions_privmsgs.php @@ -208,7 +208,7 @@ function get_folder($user_id, $folder_id = false)  		);  	} -	if ($folder_id !== false && !isset($folder[$folder_id])) +	if ($folder_id !== false && $folder_id !== PRIVMSGS_HOLD_BOX && !isset($folder[$folder_id]))  	{  		trigger_error('UNKNOWN_FOLDER');  	} diff --git a/phpBB/includes/functions_profile_fields.php b/phpBB/includes/functions_profile_fields.php index 8573533c2c..a2c0656ca4 100644 --- a/phpBB/includes/functions_profile_fields.php +++ b/phpBB/includes/functions_profile_fields.php @@ -532,7 +532,7 @@ class custom_profile  		switch ($this->profile_types[$field_type])  		{  			case 'int': -				if ($value === '' && !$ident_ary['data']['field_show_novalue']) +				if (($value === '' || $value === null) && !$ident_ary['data']['field_show_novalue'])  				{  					return NULL;  				} diff --git a/phpBB/includes/functions_upload.php b/phpBB/includes/functions_upload.php index 73ac1df2d2..69f10911ec 100644 --- a/phpBB/includes/functions_upload.php +++ b/phpBB/includes/functions_upload.php @@ -466,6 +466,9 @@ class fileupload  	var $max_height = 0;  	var $error_prefix = ''; +	/** @var int Timeout for remote upload */ +	var $upload_timeout = 6; +  	/**  	* Init file upload class.  	* @@ -795,13 +798,28 @@ class fileupload  		fputs($fsock, "HOST: " . $host . "\r\n");  		fputs($fsock, "Connection: close\r\n\r\n"); +		// Set a proper timeout for the socket +		socket_set_timeout($fsock, $this->upload_timeout); +  		$get_info = false;  		$data = ''; -		while (!@feof($fsock)) +		$length = false; +		$timer_stop = time() + $this->upload_timeout; + +		while ((!$length || $filesize < $length) && !@feof($fsock))  		{  			if ($get_info)  			{ -				$block = @fread($fsock, 1024); +				if ($length) +				{ +					// Don't attempt to read past end of file if server indicated length +					$block = @fread($fsock, min($length - $filesize, 1024)); +				} +				else +				{ +					$block = @fread($fsock, 1024); +				} +  				$filesize += strlen($block);  				if ($remote_max_filesize && $filesize > $remote_max_filesize) @@ -847,6 +865,15 @@ class fileupload  					}  				}  			} + +			$stream_meta_data = stream_get_meta_data($fsock); + +			// Cancel upload if we exceed timeout +			if (!empty($stream_meta_data['timed_out']) || time() >= $timer_stop) +			{ +				$file = new fileerror($user->lang[$this->error_prefix . 'REMOTE_UPLOAD_TIMEOUT']); +				return $file; +			}  		}  		@fclose($fsock); diff --git a/phpBB/includes/functions_user.php b/phpBB/includes/functions_user.php index cd8339d58a..40b06836a4 100644 --- a/phpBB/includes/functions_user.php +++ b/phpBB/includes/functions_user.php @@ -332,11 +332,16 @@ function user_add($user_row, $cp_data = false)  }  /** -* Remove User -*/ + * Remove User + * + * @param string	$mode		'retain' or 'remove' + * @param int		$user_id + * @param mixed		$post_username + * @return bool + */  function user_delete($mode, $user_id, $post_username = false)  { -	global $cache, $config, $db, $user, $auth; +	global $cache, $config, $db, $user;  	global $phpbb_root_path, $phpEx;  	$sql = 'SELECT * @@ -442,11 +447,6 @@ function user_delete($mode, $user_id, $post_username = false)  					WHERE poster_id = $user_id";  				$db->sql_query($sql); -				$sql = 'UPDATE ' . POSTS_TABLE . ' -					SET post_edit_user = ' . ANONYMOUS . " -					WHERE post_edit_user = $user_id"; -				$db->sql_query($sql); -  				$sql = 'UPDATE ' . TOPICS_TABLE . '  					SET topic_poster = ' . ANONYMOUS . ", topic_first_poster_name = '" . $db->sql_escape($post_username) . "', topic_first_poster_colour = ''  					WHERE topic_poster = $user_id"; @@ -504,6 +504,18 @@ function user_delete($mode, $user_id, $post_username = false)  	$cache->destroy('sql', MODERATOR_CACHE_TABLE); +	// Change user_id to anonymous for posts edited by this user +	$sql = 'UPDATE ' . POSTS_TABLE . ' +		SET post_edit_user = ' . ANONYMOUS . ' +		WHERE post_edit_user = ' . $user_id; +	$db->sql_query($sql); + +	// Change user_id to anonymous for pms edited by this user +	$sql = 'UPDATE ' . PRIVMSGS_TABLE . ' +		SET message_edit_user = ' . ANONYMOUS . ' +		WHERE message_edit_user = ' . $user_id; +	$db->sql_query($sql); +  	// Delete user log entries about this user  	$sql = 'DELETE FROM ' . LOG_TABLE . '  		WHERE reportee_id = ' . $user_id; diff --git a/phpBB/includes/mcp/info/mcp_pm_reports.php b/phpBB/includes/mcp/info/mcp_pm_reports.php index 103f560597..84f15b7107 100644 --- a/phpBB/includes/mcp/info/mcp_pm_reports.php +++ b/phpBB/includes/mcp/info/mcp_pm_reports.php @@ -20,7 +20,7 @@ class mcp_pm_reports_info  			'title'		=> 'MCP_PM_REPORTS',  			'version'	=> '1.0.0',  			'modes'		=> array( -				'pm_reports'			=> array('title' => 'MCP_PM_REPORTS_OPEN', 'auth' => 'aclf_m_report', 'cat' => array('MCP_REPORTS')), +				'pm_reports'		=> array('title' => 'MCP_PM_REPORTS_OPEN', 'auth' => 'aclf_m_report', 'cat' => array('MCP_REPORTS')),  				'pm_reports_closed'	=> array('title' => 'MCP_PM_REPORTS_CLOSED', 'auth' => 'aclf_m_report', 'cat' => array('MCP_REPORTS')),  				'pm_report_details'	=> array('title' => 'MCP_PM_REPORT_DETAILS', 'auth' => 'aclf_m_report', 'cat' => array('MCP_REPORTS')),  			), diff --git a/phpBB/includes/mcp/mcp_pm_reports.php b/phpBB/includes/mcp/mcp_pm_reports.php index 77bc7680e6..0a33c80a90 100644 --- a/phpBB/includes/mcp/mcp_pm_reports.php +++ b/phpBB/includes/mcp/mcp_pm_reports.php @@ -166,6 +166,7 @@ class mcp_pm_reports  					'S_CLOSE_ACTION'		=> append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=pm_reports&mode=pm_report_details&r=' . $report_id),  					'S_CAN_VIEWIP'			=> $auth->acl_getf_global('m_info'),  					'S_POST_REPORTED'		=> $pm_info['message_reported'], +					'S_REPORT_CLOSED'		=> $report['report_closed'],  					'S_USER_NOTES'			=> true,  					'U_MCP_REPORT'				=> append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=pm_reports&mode=pm_report_details&r=' . $report_id), diff --git a/phpBB/includes/mcp/mcp_post.php b/phpBB/includes/mcp/mcp_post.php index ba45037a18..df5dc27996 100644 --- a/phpBB/includes/mcp/mcp_post.php +++ b/phpBB/includes/mcp/mcp_post.php @@ -157,6 +157,7 @@ function mcp_post_details($id, $mode, $action)  		if (sizeof($attachments))  		{ +			$user->add_lang('viewtopic');  			$update_count = array();  			parse_attachments($post_info['forum_id'], $message, $attachments, $update_count);  		} diff --git a/phpBB/includes/mcp/mcp_queue.php b/phpBB/includes/mcp/mcp_queue.php index 764461fa53..acf344fd3c 100644 --- a/phpBB/includes/mcp/mcp_queue.php +++ b/phpBB/includes/mcp/mcp_queue.php @@ -660,15 +660,17 @@ function approve_post($post_id_list, $id, $mode)  		foreach ($post_info as $post_id => $post_data)  		{ +			$username = ($post_data['post_username']) ? $post_data['post_username'] : $post_data['username']; +  			if ($post_id == $post_data['topic_first_post_id'] && $post_id == $post_data['topic_last_post_id'])  			{  				// Forum Notifications -				user_notification('post', $post_data['topic_title'], $post_data['topic_title'], $post_data['forum_name'], $post_data['forum_id'], $post_data['topic_id'], $post_id); +				user_notification('post', $post_data['topic_title'], $post_data['topic_title'], $post_data['forum_name'], $post_data['forum_id'], $post_data['topic_id'], $post_id, $username);  			}  			else  			{  				// Topic Notifications -				user_notification('reply', $post_data['post_subject'], $post_data['topic_title'], $post_data['forum_name'], $post_data['forum_id'], $post_data['topic_id'], $post_id); +				user_notification('reply', $post_data['post_subject'], $post_data['topic_title'], $post_data['forum_name'], $post_data['forum_id'], $post_data['topic_id'], $post_id, $username);  			}  		} diff --git a/phpBB/includes/mcp/mcp_reports.php b/phpBB/includes/mcp/mcp_reports.php index def5422be2..b13c8b20c6 100644 --- a/phpBB/includes/mcp/mcp_reports.php +++ b/phpBB/includes/mcp/mcp_reports.php @@ -192,6 +192,7 @@ class mcp_reports  					'S_POST_REPORTED'		=> $post_info['post_reported'],  					'S_POST_UNAPPROVED'		=> !$post_info['post_approved'],  					'S_POST_LOCKED'			=> $post_info['post_edit_locked'], +					'S_REPORT_CLOSED'		=> $report['report_closed'],  					'S_USER_NOTES'			=> true,  					'U_EDIT'					=> ($auth->acl_get('m_edit', $post_info['forum_id'])) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=edit&f={$post_info['forum_id']}&p={$post_info['post_id']}") : '', diff --git a/phpBB/includes/search/fulltext_native.php b/phpBB/includes/search/fulltext_native.php index dc961f3c8a..948911bbfe 100644 --- a/phpBB/includes/search/fulltext_native.php +++ b/phpBB/includes/search/fulltext_native.php @@ -204,7 +204,7 @@ class fulltext_native extends search_backend  		$this->search_query = $keywords;  		$exact_words = array(); -		preg_match_all('#([^\\s+\\-|*()]+)(?:$|[\\s+\\-|()])#u', $keywords, $exact_words); +		preg_match_all('#([^\\s+\\-|()]+)(?:$|[\\s+\\-|()])#u', $keywords, $exact_words);  		$exact_words = $exact_words[1];  		$common_ids = $words = array(); @@ -231,7 +231,12 @@ class fulltext_native extends search_backend  			}  			$db->sql_freeresult($result);  		} -		unset($exact_words); + +		// Handle +, - without preceeding whitespace character +		$match		= array('#(\S)\+#', '#(\S)-#'); +		$replace	= array('$1 +', '$1 +'); + +		$keywords = preg_replace($match, $replace, $keywords);  		// now analyse the search query, first split it using the spaces  		$query = explode(' ', $keywords); @@ -357,39 +362,21 @@ class fulltext_native extends search_backend  					$this->{$mode . '_ids'}[] = $words[$word];  				}  			} -			// throw an error if we shall not ignore unexistant words -			else if (!$ignore_no_id) +			else  			{  				if (!isset($common_ids[$word]))  				{  					$len = utf8_strlen($word); -					if ($len >= $this->word_length['min'] && $len <= $this->word_length['max']) -					{ -						trigger_error(sprintf($user->lang['WORD_IN_NO_POST'], $word)); -					} -					else +					if ($len < $this->word_length['min'] || $len > $this->word_length['max'])  					{  						$this->common_words[] = $word;  					}  				}  			} -			else -			{ -				$len = utf8_strlen($word); -				if ($len < $this->word_length['min'] || $len > $this->word_length['max']) -				{ -					$this->common_words[] = $word; -				} -			} -		} - -		// we can't search for negatives only -		if (!sizeof($this->must_contain_ids)) -		{ -			return false;  		} -		if (!empty($this->search_query)) +		// Return true if all words are not common words +		if (sizeof($exact_words) - sizeof($this->common_words) > 0)  		{  			return true;  		} @@ -428,6 +415,12 @@ class fulltext_native extends search_backend  			return false;  		} +		// we can't search for negatives only +		if (empty($this->must_contain_ids)) +		{ +			return false; +		} +  		$must_contain_ids = $this->must_contain_ids;  		$must_not_contain_ids = $this->must_not_contain_ids;  		$must_exclude_one_ids = $this->must_exclude_one_ids; diff --git a/phpBB/includes/session.php b/phpBB/includes/session.php index fe5357f32e..04b15b17d3 100644 --- a/phpBB/includes/session.php +++ b/phpBB/includes/session.php @@ -121,6 +121,8 @@ class session  		$script_path .= (substr($script_path, -1, 1) == '/') ? '' : '/';  		$root_script_path .= (substr($root_script_path, -1, 1) == '/') ? '' : '/'; +		$forum_id = (isset($_REQUEST['f']) && $_REQUEST['f'] > 0 && $_REQUEST['f'] < 16777215) ? (int) $_REQUEST['f'] : 0; +  		$page_array += array(  			'page_name'			=> $page_name,  			'page_dir'			=> $page_dir, @@ -130,7 +132,7 @@ class session  			'root_script_path'	=> str_replace(' ', '%20', htmlspecialchars($root_script_path)),  			'page'				=> $page, -			'forum'				=> (isset($_REQUEST['f']) && $_REQUEST['f'] > 0) ? (int) $_REQUEST['f'] : 0, +			'forum'				=> $forum_id,  		);  		return $page_array; @@ -556,7 +558,12 @@ class session  		$method = 'autologin_' . $method;  		if (function_exists($method))  		{ -			$this->data = $method(); +			$user_data = $method(); + +			if ($user_id === false || (isset($user_data['user_id']) && $user_id == $user_data['user_id'])) +			{ +				$this->data = $user_data; +			}  			if (sizeof($this->data))  			{ @@ -576,11 +583,18 @@ class session  					AND k.user_id = u.user_id  					AND k.key_id = '" . $db->sql_escape(md5($this->cookie_data['k'])) . "'";  			$result = $db->sql_query($sql); -			$this->data = $db->sql_fetchrow($result); +			$user_data = $db->sql_fetchrow($result); + +			if ($user_id === false || (isset($user_data['user_id']) && $user_id == $user_data['user_id'])) +			{ +				$this->data = $user_data; +				$bot = false; +			} +  			$db->sql_freeresult($result); -			$bot = false;  		} -		else if ($user_id !== false && !sizeof($this->data)) + +		if ($user_id !== false && !sizeof($this->data))  		{  			$this->cookie_data['k'] = '';  			$this->cookie_data['u'] = $user_id; @@ -1037,7 +1051,7 @@ class session  		$name_data = rawurlencode($config['cookie_name'] . '_' . $name) . '=' . rawurlencode($cookiedata);  		$expire = gmdate('D, d-M-Y H:i:s \\G\\M\\T', $cookietime); -		$domain = (!$config['cookie_domain'] || $config['cookie_domain'] == 'localhost' || $config['cookie_domain'] == '127.0.0.1') ? '' : '; domain=' . $config['cookie_domain']; +		$domain = (!$config['cookie_domain'] || $config['cookie_domain'] == '127.0.0.1' || strpos($config['cookie_domain'], '.') === false) ? '' : '; domain=' . $config['cookie_domain'];  		header('Set-Cookie: ' . $name_data . (($cookietime) ? '; expires=' . $expire : '') . '; path=' . $config['cookie_path'] . $domain . ((!$config['cookie_secure']) ? '' : '; secure') . '; HttpOnly', false);  	} diff --git a/phpBB/includes/startup.php b/phpBB/includes/startup.php index cf216a65db..008651c236 100644 --- a/phpBB/includes/startup.php +++ b/phpBB/includes/startup.php @@ -80,31 +80,13 @@ function deregister_globals()  	{  		if (isset($not_unset[$varname]))  		{ -			// Hacking attempt. No point in continuing unless it's a COOKIE (so a cookie called GLOBALS doesn't lock users out completely) -			if ($varname !== 'GLOBALS' || isset($_GET['GLOBALS']) || isset($_POST['GLOBALS']) || isset($_SERVER['GLOBALS']) || isset($_SESSION['GLOBALS']) || isset($_ENV['GLOBALS']) || isset($_FILES['GLOBALS'])) +			// Hacking attempt. No point in continuing. +			if (isset($_COOKIE[$varname]))  			{ -				exit; -			} -			else -			{ -				$cookie = &$_COOKIE; -				while (isset($cookie['GLOBALS'])) -				{ -					if (!is_array($cookie['GLOBALS'])) -					{ -						break; -					} - -					foreach ($cookie['GLOBALS'] as $registered_var => $value) -					{ -						if (!isset($not_unset[$registered_var])) -						{ -							unset($GLOBALS[$registered_var]); -						} -					} -					$cookie = &$cookie['GLOBALS']; -				} +				echo "Clear your cookies. ";  			} +			echo "Malicious variable name detected. Contact the administrator and ask them to disable register_globals."; +			exit;  		}  		unset($GLOBALS[$varname]); @@ -113,6 +95,54 @@ function deregister_globals()  	unset($input);  } +/** + * Check if requested page uses a trailing path + * + * @param string $phpEx PHP extension + * + * @return bool True if trailing path is used, false if not + */ +function phpbb_has_trailing_path($phpEx) +{ +	// Check if path_info is being used +	if (!empty($_SERVER['PATH_INFO']) || (!empty($_SERVER['ORIG_PATH_INFO']) && $_SERVER['SCRIPT_NAME'] != $_SERVER['ORIG_PATH_INFO'])) +	{ +		return true; +	} + +	// Match any trailing path appended to a php script in the REQUEST_URI. +	// It is assumed that only actual PHP scripts use names like foo.php. Due +	// to this, any phpBB board inside a directory that has the php extension +	// appended to its name will stop working, i.e. if the board is at +	// example.com/phpBB/test.php/ or example.com/test.php/ +	if (preg_match('#^[^?]+\.' . preg_quote($phpEx, '#') . '/#', $_SERVER['REQUEST_URI'])) +	{ +		return true; +	} + +	return false; +} + +// Check if trailing path is used +if (phpbb_has_trailing_path($phpEx)) +{ +	if (substr(strtolower(@php_sapi_name()), 0, 3) === 'cgi') +	{ +		$prefix = 'Status:'; +	} +	else if (!empty($_SERVER['SERVER_PROTOCOL']) && is_string($_SERVER['SERVER_PROTOCOL']) && preg_match('#^HTTP/[0-9]\.[0-9]$#', $_SERVER['SERVER_PROTOCOL'])) +	{ +		$prefix = $_SERVER['SERVER_PROTOCOL']; +	} +	else +	{ +		$prefix = 'HTTP/1.0'; +	} +	header("$prefix 404 Not Found", true, 404); +	echo 'Trailing paths and PATH_INFO is not supported by phpBB 3.0'; +	exit; +} +  // Register globals and magic quotes have been dropped in PHP 5.4  if (version_compare(PHP_VERSION, '5.4.0-dev', '>='))  { diff --git a/phpBB/includes/ucp/ucp_pm_options.php b/phpBB/includes/ucp/ucp_pm_options.php index efa390ed87..1d5c0ecce3 100644 --- a/phpBB/includes/ucp/ucp_pm_options.php +++ b/phpBB/includes/ucp/ucp_pm_options.php @@ -29,7 +29,11 @@ function message_options($id, $mode, $global_privmsgs_rules, $global_rule_condit  	// Change "full folder" setting - what to do if folder is full  	if (isset($_POST['fullfolder']))  	{ -		check_form_key('ucp_pm_options', $config['form_token_lifetime'], $redirect_url); +		if (!check_form_key('ucp_pm_options')) +		{ +			trigger_error('FORM_INVALID'); +		} +  		$full_action = request_var('full_action', 0);  		$set_folder_id = 0; diff --git a/phpBB/includes/ucp/ucp_profile.php b/phpBB/includes/ucp/ucp_profile.php index d35d13b6c1..847311058b 100644 --- a/phpBB/includes/ucp/ucp_profile.php +++ b/phpBB/includes/ucp/ucp_profile.php @@ -548,6 +548,9 @@ class ucp_profile  				// Build custom bbcodes array  				display_custom_bbcodes(); +				// Generate smiley listing +				generate_smilies('inline', 0); +  			break;  			case 'avatar': diff --git a/phpBB/includes/ucp/ucp_remind.php b/phpBB/includes/ucp/ucp_remind.php index cb89ad99be..bcb21cbedc 100644 --- a/phpBB/includes/ucp/ucp_remind.php +++ b/phpBB/includes/ucp/ucp_remind.php @@ -98,6 +98,8 @@ class ucp_remind  			$messenger->to($user_row['user_email'], $user_row['username']);  			$messenger->im($user_row['user_jabber'], $user_row['username']); +			$messenger->anti_abuse_headers($config, $user); +  			$messenger->assign_vars(array(  				'USERNAME'		=> htmlspecialchars_decode($user_row['username']),  				'PASSWORD'		=> htmlspecialchars_decode($user_password), | 
