diff options
76 files changed, 1043 insertions, 494 deletions
| diff --git a/.travis.yml b/.travis.yml index 4d14c16977..a4e8bdedd3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,9 +8,7 @@ php:    - hhvm  env: -  - DB=mariadb    - DB=mysql -  - DB=postgres  services:    - redis-server @@ -36,5 +34,10 @@ script:    - sh -c "if [ '$TRAVIS_PHP_VERSION' = '5.5' -a '$DB' = 'mysql' -a '$TRAVIS_PULL_REQUEST' != 'false' ]; then git-tools/commit-msg-hook-range.sh origin/$TRAVIS_BRANCH..FETCH_HEAD; fi"  matrix: +  include: +    - php: 5.4 +      env: DB=mariadb +    - php: 5.4 +      env: DB=postgres    allow_failures:      - php: hhvm diff --git a/build/package.php b/build/package.php index 97bfc4ea5c..89f9d9a1ee 100755 --- a/build/package.php +++ b/build/package.php @@ -428,14 +428,22 @@ chdir($package->get('dest_dir') . '/install');  // $package->run_command('rm -v database_update.php');  $package->run_command('rm -v install_update.php'); +chdir($package->get('dest_dir')); +$package->run_command('mv -v styles/subsilver2 ../subsilver2'); +$package->run_command('cp -p docs/COPYING ../subsilver2/license.txt'); +  chdir($package->locations['package_dir']);  foreach ($compress_programs as $extension => $compress_command)  {  	$package->begin_status('Packaging phpBB for ' . $extension);  	$package->run_command('rm -v ./release_files/' . $package->get('release_filename') . ".{$extension}"); +	$package->run_command('rm -v ./release_files/subsilver2_' . $package->get('new_version_number') . ".{$extension}");  	// Build Package  	$package->run_command("$compress_command ./release_files/" . $package->get('release_filename') . '.' . $extension . ' ' . $package->get('package_name')); + +	// Build subSilver2 Package +	$package->run_command("$compress_command ./release_files/subsilver2_" . $package->get('new_version_number') . '.' . $extension . ' subsilver2');  }  // Microsoft Web PI packaging diff --git a/phpBB/adm/style/acp_ext_details.html b/phpBB/adm/style/acp_ext_details.html index af28acdc54..986aa24b1b 100644 --- a/phpBB/adm/style/acp_ext_details.html +++ b/phpBB/adm/style/acp_ext_details.html @@ -11,38 +11,38 @@  		<!-- IF META_DISPLAY_NAME -->  		<dl>  			<dt><label>{L_DISPLAY_NAME}{L_COLON}</label></dt> -			<dd><strong>{META_DISPLAY_NAME}</strong></dd> +			<dd><strong id="meta_display_name">{META_DISPLAY_NAME}</strong></dd>  		</dl>  		<!-- ENDIF -->  		<dl>  			<dt><label>{L_CLEAN_NAME}{L_COLON}</label></dt> -			<dd><strong>{META_NAME}</strong></dd> +			<dd><strong id="meta_name">{META_NAME}</strong></dd>  		</dl>  		<!-- IF META_DESCRIPTION -->  		<dl>  			<dt><label>{L_DESCRIPTION}{L_COLON}</label></dt> -			<dd><p>{META_DESCRIPTION}</p></dd> +			<dd><p id="meta_description">{META_DESCRIPTION}</p></dd>  		</dl>  		<!-- ENDIF -->  		<dl>  			<dt><label>{L_VERSION}{L_COLON}</label></dt> -			<dd><p>{META_VERSION}</p></dd> +			<dd><p id="meta_version">{META_VERSION}</p></dd>  		</dl>  		<!-- IF META_HOMEPAGE -->  		<dl>  			<dt><label>{L_HOMEPAGE}{L_COLON}</label></dt> -			<dd><strong><a href="{META_HOMEPAGE}">{META_HOMEPAGE}</a></strong></dd> +			<dd><strong id="meta_homepage"><a href="{META_HOMEPAGE}">{META_HOMEPAGE}</a></strong></dd>  		</dl>  		<!-- ENDIF -->  		<!-- IF META_TIME -->  		<dl>  			<dt><label>{L_TIME}{L_COLON}</label></dt> -			<dd><p>{META_TIME}</p></dd> +			<dd><p id="meta_time">{META_TIME}</p></dd>  		</dl>  		<!-- ENDIF -->  		<dl>  			<dt><label>{L_LICENCE}{L_COLON}</label></dt> -			<dd><p>{META_LICENCE}</p></dd> +			<dd><p id="meta_license">{META_LICENCE}</p></dd>  		</dl>  	</fieldset> @@ -52,13 +52,13 @@  		<!-- IF META_REQUIRE_PHPBB -->  		<dl<!-- IF META_REQUIRE_PHPBB_FAIL --> class="requirements_not_met"<!-- ENDIF -->>  			<dt><label>{L_PHPBB_VERSION}{L_COLON}</label></dt> -			<dd><p>{META_REQUIRE_PHPBB}</p></dd> +			<dd><p id="require_phpbb">{META_REQUIRE_PHPBB}</p></dd>  		</dl>  		<!-- ENDIF -->  		<!-- IF META_REQUIRE_PHP -->  		<dl<!-- IF META_REQUIRE_PHP_FAIL --> class="requirements_not_met"<!-- ENDIF -->>  			<dt><label>{L_PHP_VERSION}{L_COLON}</label></dt> -			<dd><p>{META_REQUIRE_PHP}</p></dd> +			<dd><p id="require_php">{META_REQUIRE_PHP}</p></dd>  		</dl>  		<!-- ENDIF -->  	</fieldset> diff --git a/phpBB/config/feed.yml b/phpBB/config/feed.yml index 7712a832f3..48bd9fe76f 100644 --- a/phpBB/config/feed.yml +++ b/phpBB/config/feed.yml @@ -5,6 +5,7 @@ services:              - @config              - @user              - %core.root_path% +            - %core.php_ext%      feed.factory:          class: phpbb\feed\factory diff --git a/phpBB/config/services.yml b/phpBB/config/services.yml index 735626810f..2cf9dbed3e 100644 --- a/phpBB/config/services.yml +++ b/phpBB/config/services.yml @@ -94,6 +94,7 @@ services:              - @template              - @user              - @config +            - @controller.provider              - %core.root_path%              - %core.php_ext% @@ -104,6 +105,13 @@ services:              - @service_container              - @template +    controller.provider: +        class: phpbb\controller\provider +        arguments: +            - @ext.finder +        calls: +            - [find, [%core.root_path%]] +      cron.task_collection:          class: phpbb\di\service_collection          arguments: @@ -262,6 +270,7 @@ services:          arguments:              - @template              - @user +            - @controller.helper      path_helper:          class: phpbb\path_helper diff --git a/phpBB/docs/sphinx.sample.conf b/phpBB/docs/sphinx.sample.conf index 620ec25761..0a210ecd1a 100644 --- a/phpBB/docs/sphinx.sample.conf +++ b/phpBB/docs/sphinx.sample.conf @@ -38,7 +38,7 @@ source source_phpbb_{SPHINX_ID}_main  	sql_attr_bool = deleted  	sql_attr_timestamp = post_time  	sql_attr_timestamp = topic_last_post_time -	sql_attr_str2ordinal = post_subject +	sql_attr_string = post_subject  }  source source_phpbb_{SPHINX_ID}_delta : source_phpbb_{SPHINX_ID}_main  { diff --git a/phpBB/feed.php b/phpBB/feed.php index 35cd7fda3f..c31a6b6b1d 100644 --- a/phpBB/feed.php +++ b/phpBB/feed.php @@ -18,6 +18,7 @@ define('IN_PHPBB', true);  $phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';  $phpEx = substr(strrchr(__FILE__, '.'), 1);  include($phpbb_root_path . 'common.' . $phpEx); +include($phpbb_root_path . 'includes/functions_display.' . $phpEx);  if (!$config['feed_enable'])  { @@ -72,6 +73,9 @@ if ($feed === false)  	trigger_error('NO_FEED');  } +// Get attachments for this feed +$feed->fetch_attachments(); +  // Open Feed  $feed->open(); @@ -107,7 +111,7 @@ while ($row = $feed->get_item())  		'title'			=> censor_text($title),  		'category'		=> ($config['feed_item_statistics'] && !empty($row['forum_id'])) ? $board_url . '/viewforum.' . $phpEx . '?f=' . $row['forum_id'] : '',  		'category_name'	=> ($config['feed_item_statistics'] && isset($row['forum_name'])) ? $row['forum_name'] : '', -		'description'	=> censor_text($phpbb_feed_helper->generate_content($row[$feed->get('text')], $row[$feed->get('bbcode_uid')], $row[$feed->get('bitfield')], $options)), +		'description'	=> censor_text($phpbb_feed_helper->generate_content($row[$feed->get('text')], $row[$feed->get('bbcode_uid')], $row[$feed->get('bitfield')], $options, $row['forum_id'], (($row['post_attachment']) ? $feed->attachments[$row['post_id']] : array()))),  		'statistics'	=> '',  	); diff --git a/phpBB/includes/captcha/captcha_gd.php b/phpBB/includes/captcha/captcha_gd.php index ab45aa9db6..3a82457c4a 100644 --- a/phpBB/includes/captcha/captcha_gd.php +++ b/phpBB/includes/captcha/captcha_gd.php @@ -2226,8 +2226,8 @@ class colour_manager  			return $this->random_colour($colour, $mode);  		} -		$rgb		= colour_manager::model_convert($colour, $mode, 'rgb'); -		$store		= ($this->mode == 'rgb') ? $rgb : colour_manager::model_convert($colour, $mode, $this->mode); +		$rgb		= $this->model_convert($colour, $mode, 'rgb'); +		$store		= ($this->mode == 'rgb') ? $rgb : $this->model_convert($colour, $mode, $this->mode);  		$resource	= imagecolorallocate($this->img, $rgb[0], $rgb[1], $rgb[2]);  		$this->colours[$resource] = $store; @@ -2345,7 +2345,7 @@ class colour_manager  			$resource = $pre;  		} -		$colour = colour_manager::model_convert($this->colours[$resource], $this->mode, $mode); +		$colour = $this->model_convert($this->colours[$resource], $this->mode, $mode);  		$results = ($include_original) ? array($resource) : array();  		$colour2 = $colour3 = $colour4 = $colour;  		$colour2[0] += 150; @@ -2380,7 +2380,7 @@ class colour_manager  			$resource = $pre;  		} -		$colour = colour_manager::model_convert($this->colours[$resource], $this->mode, $mode); +		$colour = $this->model_convert($this->colours[$resource], $this->mode, $mode);  		$results = array();  		if ($include_original) @@ -2418,11 +2418,11 @@ class colour_manager  				switch ($from_model)  				{  					case 'ahsv': -						return colour_manager::ah2h($colour); +						return $this->ah2h($colour);  					break;  					case 'rgb': -						return colour_manager::rgb2hsv($colour); +						return $this->rgb2hsv($colour);  					break;  				}  			break; @@ -2432,11 +2432,11 @@ class colour_manager  				switch ($from_model)  				{  					case 'hsv': -						return colour_manager::h2ah($colour); +						return $this->h2ah($colour);  					break;  					case 'rgb': -						return colour_manager::h2ah(colour_manager::rgb2hsv($colour)); +						return $this->h2ah($this->rgb2hsv($colour));  					break;  				}  			break; @@ -2445,11 +2445,11 @@ class colour_manager  				switch ($from_model)  				{  					case 'hsv': -						return colour_manager::hsv2rgb($colour); +						return $this->hsv2rgb($colour);  					break;  					case 'ahsv': -						return colour_manager::hsv2rgb(colour_manager::ah2h($colour)); +						return $this->hsv2rgb($this->ah2h($colour));  					break;  				}  			break; @@ -2462,7 +2462,7 @@ class colour_manager  	*/  	function hsv2rgb($hsv)  	{ -		colour_manager::normalize_hue($hsv[0]); +		$this->normalize_hue($hsv[0]);  		$h = $hsv[0];  		$s = min(1, max(0, $hsv[1] / 100)); @@ -2554,7 +2554,7 @@ class colour_manager  				break;  			}  		} -		colour_manager::normalize_hue($h); +		$this->normalize_hue($h);  		return array($h, $s * 100, $v * 100);  	} @@ -2578,10 +2578,10 @@ class colour_manager  	{  		if (is_array($ahue))  		{ -			$ahue[0] = colour_manager::ah2h($ahue[0]); +			$ahue[0] = $this->ah2h($ahue[0]);  			return $ahue;  		} -		colour_manager::normalize_hue($ahue); +		$this->normalize_hue($ahue);  		// blue through red is already ok  		if ($ahue >= 240) @@ -2612,10 +2612,10 @@ class colour_manager  	{  		if (is_array($hue))  		{ -			$hue[0] = colour_manager::h2ah($hue[0]); +			$hue[0] = $this->h2ah($hue[0]);  			return $hue;  		} -		colour_manager::normalize_hue($hue); +		$this->normalize_hue($hue);  		// blue through red is already ok  		if ($hue >= 240) diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index 11d7ea4c72..5e5f508b6b 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -368,41 +368,6 @@ function still_on_time($extra_time = 15)  }  /** -* Hash the password -* -* @deprecated 3.1.0-a2 (To be removed: 3.3.0) -* -* @param string $password Password to be hashed -* -* @return string|bool Password hash or false if something went wrong during hashing -*/ -function phpbb_hash($password) -{ -	global $phpbb_container; - -	$passwords_manager = $phpbb_container->get('passwords.manager'); -	return $passwords_manager->hash($password); -} - -/** -* Check for correct password -* -* @deprecated 3.1.0-a2 (To be removed: 3.3.0) -* -* @param string $password The password in plain text -* @param string $hash The stored password hash -* -* @return bool Returns true if the password is correct, false if not. -*/ -function phpbb_check_hash($password, $hash) -{ -	global $phpbb_container; - -	$passwords_manager = $phpbb_container->get('passwords.manager'); -	return $passwords_manager->check($password, $hash); -} - -/**  * Hashes an email address to a big integer  *  * @param string $email		Email address @@ -885,46 +850,6 @@ else  	}  } -/** -* Eliminates useless . and .. components from specified path. -* -* Deprecated, use filesystem class instead -* -* @param string $path Path to clean -* @return string Cleaned path -* -* @deprecated -*/ -function phpbb_clean_path($path) -{ -	global $phpbb_path_helper, $phpbb_container; - -	if (!$phpbb_path_helper && $phpbb_container) -	{ -		$phpbb_path_helper = $phpbb_container->get('path_helper'); -	} -	else if (!$phpbb_path_helper) -	{ -		// The container is not yet loaded, use a new instance -		if (!class_exists('\phpbb\path_helper')) -		{ -			global $phpbb_root_path, $phpEx; -			require($phpbb_root_path . 'phpbb/path_helper.' . $phpEx); -		} - -		$phpbb_path_helper = new phpbb\path_helper( -			new phpbb\symfony_request( -				new phpbb\request\request() -			), -			new phpbb\filesystem(), -			$phpbb_root_path, -			$phpEx -		); -	} - -	return $phpbb_path_helper->clean_path($path); -} -  // functions used for building option fields  /** diff --git a/phpBB/includes/functions_admin.php b/phpBB/includes/functions_admin.php index 722d3c9c67..0e28b48d8a 100644 --- a/phpBB/includes/functions_admin.php +++ b/phpBB/includes/functions_admin.php @@ -731,7 +731,32 @@ function delete_topics($where_type, $where_ids, $auto_sync = true, $post_count_s  */  function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync = true, $post_count_sync = true, $call_delete_topics = true)  { -	global $db, $config, $phpbb_root_path, $phpEx, $auth, $user, $phpbb_container; +	global $db, $config, $phpbb_root_path, $phpEx, $auth, $user, $phpbb_container, $phpbb_dispatcher; + +	// Notifications types to delete +	$delete_notifications_types = array( +		'quote', +		'bookmark', +		'post', +		'approve_post', +		'post_in_queue', +	); + +	/** +	* Perform additional actions before post(s) deletion +	* +	* @event core.delete_posts_before +	* @var	string	where_type					Variable containing posts deletion mode  +	* @var	mixed	where_ids					Array or comma separated list of posts ids to delete +	* @var	bool	auto_sync					Flag indicating if topics/forums should be synchronized +	* @var	bool	posted_sync					Flag indicating if topics_posted table should be resynchronized +	* @var	bool	post_count_sync				Flag indicating if posts count should be resynchronized +	* @var	bool	call_delete_topics			Flag indicating if topics having no posts should be deleted +	* @var	array	delete_notifications_types	Array with notifications types to delete +	* @since 3.1.0-a4 +	*/ +	$vars = array('where_type', 'where_ids', 'auto_sync', 'posted_sync', 'post_count_sync', 'call_delete_topics', 'delete_notifications_types'); +	extract($phpbb_dispatcher->trigger_event('core.delete_posts_before', compact($vars)));  	if ($where_type === 'range')  	{ @@ -874,8 +899,40 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =  	delete_attachments('post', $post_ids, false); +	/** +	* Perform additional actions during post(s) deletion +	* +	* @event core.delete_posts_in_transaction +	* @var	array	post_ids					Array with deleted posts' ids +	* @var	array	poster_ids					Array with deleted posts' author ids +	* @var	array	topic_ids					Array with deleted posts' topic ids +	* @var	array	forum_ids					Array with deleted posts' forum ids +	* @var	string	where_type					Variable containing posts deletion mode  +	* @var	mixed	where_ids					Array or comma separated list of posts ids to delete +	* @var	array	delete_notifications_types	Array with notifications types to delete +	* @since 3.1.0-a4 +	*/ +	$vars = array('post_ids', 'poster_ids', 'topic_ids', 'forum_ids', 'where_type', 'where_ids', 'delete_notifications_types'); +	extract($phpbb_dispatcher->trigger_event('core.delete_posts_in_transaction', compact($vars))); +  	$db->sql_transaction('commit'); +	/** +	* Perform additional actions after post(s) deletion +	* +	* @event core.delete_posts_after +	* @var	array	post_ids					Array with deleted posts' ids +	* @var	array	poster_ids					Array with deleted posts' author ids +	* @var	array	topic_ids					Array with deleted posts' topic ids +	* @var	array	forum_ids					Array with deleted posts' forum ids +	* @var	string	where_type					Variable containing posts deletion mode  +	* @var	mixed	where_ids					Array or comma separated list of posts ids to delete +	* @var	array	delete_notifications_types	Array with notifications types to delete +	* @since 3.1.0-a4 +	*/ +	$vars = array('post_ids', 'poster_ids', 'topic_ids', 'forum_ids', 'where_type', 'where_ids', 'delete_notifications_types'); +	extract($phpbb_dispatcher->trigger_event('core.delete_posts_after', compact($vars))); +  	// Resync topics_posted table  	if ($posted_sync)  	{ @@ -902,13 +959,7 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =  	$phpbb_notifications = $phpbb_container->get('notification_manager'); -	$phpbb_notifications->delete_notifications(array( -		'quote', -		'bookmark', -		'post', -		'approve_post', -		'post_in_queue', -	), $post_ids); +	$phpbb_notifications->delete_notifications($delete_notifications_types, $post_ids);  	return sizeof($post_ids);  } diff --git a/phpBB/includes/functions_compatibility.php b/phpBB/includes/functions_compatibility.php index 2197815087..024c656267 100644 --- a/phpBB/includes/functions_compatibility.php +++ b/phpBB/includes/functions_compatibility.php @@ -48,3 +48,78 @@ function get_user_avatar($avatar, $avatar_type, $avatar_width, $avatar_height, $  	return phpbb_get_avatar($row, $alt, $ignore_config);  } + +/** +* Hash the password +* +* @deprecated 3.1.0-a2 (To be removed: 3.3.0) +* +* @param string $password Password to be hashed +* +* @return string|bool Password hash or false if something went wrong during hashing +*/ +function phpbb_hash($password) +{ +	global $phpbb_container; + +	$passwords_manager = $phpbb_container->get('passwords.manager'); +	return $passwords_manager->hash($password); +} + +/** +* Check for correct password +* +* @deprecated 3.1.0-a2 (To be removed: 3.3.0) +* +* @param string $password The password in plain text +* @param string $hash The stored password hash +* +* @return bool Returns true if the password is correct, false if not. +*/ +function phpbb_check_hash($password, $hash) +{ +	global $phpbb_container; + +	$passwords_manager = $phpbb_container->get('passwords.manager'); +	return $passwords_manager->check($password, $hash); +} + +/** +* Eliminates useless . and .. components from specified path. +* +* Deprecated, use filesystem class instead +* +* @param string $path Path to clean +* @return string Cleaned path +* +* @deprecated +*/ +function phpbb_clean_path($path) +{ +	global $phpbb_path_helper, $phpbb_container; + +	if (!$phpbb_path_helper && $phpbb_container) +	{ +		$phpbb_path_helper = $phpbb_container->get('path_helper'); +	} +	else if (!$phpbb_path_helper) +	{ +		// The container is not yet loaded, use a new instance +		if (!class_exists('\phpbb\path_helper')) +		{ +			global $phpbb_root_path, $phpEx; +			require($phpbb_root_path . 'phpbb/path_helper.' . $phpEx); +		} + +		$phpbb_path_helper = new phpbb\path_helper( +			new phpbb\symfony_request( +				new phpbb\request\request() +			), +			new phpbb\filesystem(), +			$phpbb_root_path, +			$phpEx +		); +	} + +	return $phpbb_path_helper->clean_path($path); +} diff --git a/phpBB/includes/functions_display.php b/phpBB/includes/functions_display.php index e663ac90c5..05313e849d 100644 --- a/phpBB/includes/functions_display.php +++ b/phpBB/includes/functions_display.php @@ -962,6 +962,7 @@ function display_custom_bbcodes()  			'BBCODE_NAME'		=> "'[{$row['bbcode_tag']}]', '[/" . str_replace('=', '', $row['bbcode_tag']) . "]'",  			'BBCODE_ID'			=> $num_predefined_bbcodes + ($i * 2),  			'BBCODE_TAG'		=> $row['bbcode_tag'], +			'BBCODE_TAG_CLEAN'	=> str_replace('=', '-', $row['bbcode_tag']),  			'BBCODE_HELPLINE'	=> $row['bbcode_helpline'],  			'A_BBCODE_HELPLINE'	=> str_replace(array('&', '"', "'", '<', '>'), array('&', '"', "\'", '<', '>'), $row['bbcode_helpline']),  		); diff --git a/phpBB/includes/functions_messenger.php b/phpBB/includes/functions_messenger.php index 6ceeb50330..907252f6d8 100644 --- a/phpBB/includes/functions_messenger.php +++ b/phpBB/includes/functions_messenger.php @@ -768,13 +768,15 @@ class queue  					if (!$this->jabber->connect())  					{ -						messenger::error('JABBER', $user->lang['ERR_JAB_CONNECT']); +						$messenger = new messenger(); +						$messenger->error('JABBER', $user->lang['ERR_JAB_CONNECT']);  						continue 2;  					}  					if (!$this->jabber->login())  					{ -						messenger::error('JABBER', $user->lang['ERR_JAB_AUTH']); +						$messenger = new messenger(); +						$messenger->error('JABBER', $user->lang['ERR_JAB_AUTH']);  						continue 2;  					} @@ -807,7 +809,8 @@ class queue  						if (!$result)  						{ -							messenger::error('EMAIL', $err_msg); +							$messenger = new messenger(); +							$messenger->error('EMAIL', $err_msg);  							continue 2;  						}  					break; @@ -817,7 +820,8 @@ class queue  						{  							if ($this->jabber->send_message($address, $msg, $subject) === false)  							{ -								messenger::error('JABBER', $this->jabber->get_log()); +								$messenger = new messenger(); +								$messenger->error('JABBER', $this->jabber->get_log());  								continue 3;  							}  						} diff --git a/phpBB/includes/functions_module.php b/phpBB/includes/functions_module.php index 53055752f6..dca010518b 100644 --- a/phpBB/includes/functions_module.php +++ b/phpBB/includes/functions_module.php @@ -495,7 +495,7 @@ class p_master  		if ($this->active_module === false)  		{ -			trigger_error('Module not accessible', E_USER_ERROR); +			trigger_error('MODULE_NOT_ACCESS', E_USER_ERROR);  		}  		// new modules use the full class names, old ones are always called <type>_<name>, e.g. acp_board @@ -503,14 +503,14 @@ class p_master  		{  			if (!file_exists("$module_path/{$this->p_name}.$phpEx"))  			{ -				trigger_error("Cannot find module $module_path/{$this->p_name}.$phpEx", E_USER_ERROR); +				trigger_error($user->lang('MODULE_NOT_FIND', "$module_path/{$this->p_name}.$phpEx"), E_USER_ERROR);  			}  			include("$module_path/{$this->p_name}.$phpEx");  			if (!class_exists($this->p_name))  			{ -				trigger_error("Module file $module_path/{$this->p_name}.$phpEx does not contain correct class [{$this->p_name}]", E_USER_ERROR); +				trigger_error($user->lang('MODULE_FILE_INCORRECT_CLASS', "$module_path/{$this->p_name}.$phpEx", $this->p_name), E_USER_ERROR);  			}  		} diff --git a/phpBB/includes/functions_transfer.php b/phpBB/includes/functions_transfer.php index 9bec17ca8f..17b458d2cb 100644 --- a/phpBB/includes/functions_transfer.php +++ b/phpBB/includes/functions_transfer.php @@ -279,7 +279,7 @@ class ftp extends transfer  		}  		// Init some needed values -		transfer::transfer(); +		$this->transfer();  		return;  	} @@ -533,7 +533,7 @@ class ftp_fsock extends transfer  		}  		// Init some needed values -		transfer::transfer(); +		$this->transfer();  		return;  	} diff --git a/phpBB/includes/functions_url_matcher.php b/phpBB/includes/functions_url_matcher.php index c5d6815119..8e5ae20f93 100644 --- a/phpBB/includes/functions_url_matcher.php +++ b/phpBB/includes/functions_url_matcher.php @@ -53,8 +53,8 @@ function phpbb_get_url_matcher(\phpbb\extension\finder $finder, RequestContext $  */  function phpbb_create_dumped_url_matcher(\phpbb\extension\finder $finder, $root_path, $php_ext)  { -	$provider = new \phpbb\controller\provider(); -	$routes = $provider->import_paths_from_finder($finder)->find($root_path); +	$provider = new \phpbb\controller\provider($finder); +	$routes = $provider->find($root_path)->get_routes();  	$dumper = new PhpMatcherDumper($routes);  	$cached_url_matcher_dump = $dumper->dump(array(  		'class'			=> 'phpbb_url_matcher', @@ -72,8 +72,8 @@ function phpbb_create_dumped_url_matcher(\phpbb\extension\finder $finder, $root_  */  function phpbb_create_url_matcher(\phpbb\extension\finder $finder, RequestContext $context, $root_path)  { -	$provider = new \phpbb\controller\provider(); -	$routes = $provider->import_paths_from_finder($finder)->find($root_path); +	$provider = new \phpbb\controller\provider($finder); +	$routes = $provider->find($root_path)->get_routes();  	return new UrlMatcher($routes, $context);  } diff --git a/phpBB/install/schemas/schema_data.sql b/phpBB/install/schemas/schema_data.sql index 4f1f26e835..33470eca20 100644 --- a/phpBB/install/schemas/schema_data.sql +++ b/phpBB/install/schemas/schema_data.sql @@ -171,10 +171,10 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('limit_load', '0');  INSERT INTO phpbb_config (config_name, config_value) VALUES ('limit_search_load', '0');  INSERT INTO phpbb_config (config_name, config_value) VALUES ('load_anon_lastread', '0');  INSERT INTO phpbb_config (config_name, config_value) VALUES ('load_birthdays', '1'); -INSERT INTO phpbb_config (config_name, config_value) VALUES ('load_cpf_memberlist', '0'); -INSERT INTO phpbb_config (config_name, config_value) VALUES ('load_cpf_pm', '0'); +INSERT INTO phpbb_config (config_name, config_value) VALUES ('load_cpf_memberlist', '1'); +INSERT INTO phpbb_config (config_name, config_value) VALUES ('load_cpf_pm', '1');  INSERT INTO phpbb_config (config_name, config_value) VALUES ('load_cpf_viewprofile', '1'); -INSERT INTO phpbb_config (config_name, config_value) VALUES ('load_cpf_viewtopic', '0'); +INSERT INTO phpbb_config (config_name, config_value) VALUES ('load_cpf_viewtopic', '1');  INSERT INTO phpbb_config (config_name, config_value) VALUES ('load_db_lastread', '1');  INSERT INTO phpbb_config (config_name, config_value) VALUES ('load_db_track', '1');  INSERT INTO phpbb_config (config_name, config_value) VALUES ('load_jquery_url', '//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js'); @@ -790,12 +790,12 @@ INSERT INTO phpbb_extensions (group_id, extension) VALUES (9, 'ogm');  # Add default profile fields  INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_location', 'profilefields.type.string', 'phpbb_location', '20', '2', '100', '', '', '.*', 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, '', '');  INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_website', 'profilefields.type.url', 'phpbb_website', '40', '12', '255', '', '', '', 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 2, 1, 'VISIT_WEBSITE', '%s'); -INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_interests', 'profilefields.type.text', 'phpbb_interests', '3|30', '2', '500', '', '', '.*', 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 3, 0, '', ''); -INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_occupation', 'profilefields.type.text', 'phpbb_occupation', '3|30', '2', '500', '', '', '.*', 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 4, 0, '', ''); -INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_icq', 'profilefields.type.string', 'phpbb_icq', '20', '3', '15', '', '', '[0-9]+', 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 5, 1, 'SEND_ICQ_MESSAGE', 'https://www.icq.com/people/%s/'); -INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_wlm', 'profilefields.type.string', 'phpbb_wlm', '40', '5', '255', '', '', '.*', 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 6, 1, '', ''); -INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_yahoo', 'profilefields.type.string', 'phpbb_yahoo', '40', '5', '255', '', '', '.*', 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 7, 1, 'SEND_YIM_MESSAGE', 'http://edit.yahoo.com/config/send_webmesg?.target=%s&.src=pg'); -INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_aol', 'profilefields.type.string', 'phpbb_aol', '40', '5', '255', '', '', '.*', 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 8, 1, '', ''); +INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_interests', 'profilefields.type.text', 'phpbb_interests', '3|30', '2', '500', '', '', '.*', 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, '', ''); +INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_occupation', 'profilefields.type.text', 'phpbb_occupation', '3|30', '2', '500', '', '', '.*', 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, '', ''); +INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_aol', 'profilefields.type.string', 'phpbb_aol', '40', '5', '255', '', '', '.*', 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 5, 1, '', ''); +INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_icq', 'profilefields.type.string', 'phpbb_icq', '20', '3', '15', '', '', '[0-9]+', 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 6, 1, 'SEND_ICQ_MESSAGE', 'https://www.icq.com/people/%s/'); +INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_wlm', 'profilefields.type.string', 'phpbb_wlm', '40', '5', '255', '', '', '.*', 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 7, 1, '', ''); +INSERT INTO phpbb_profile_fields (field_name, field_type, field_ident, field_length, field_minlen, field_maxlen, field_novalue, field_default_value, field_validation, field_required, field_show_novalue, field_show_on_reg, field_show_on_pm, field_show_on_vt, field_show_on_ml, field_show_profile, field_hide, field_no_view, field_active, field_order, field_is_contact, field_contact_desc, field_contact_url) VALUES ('phpbb_yahoo', 'profilefields.type.string', 'phpbb_yahoo', '40', '5', '255', '', '', '.*', 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 8, 1, 'SEND_YIM_MESSAGE', 'http://edit.yahoo.com/config/send_webmesg?.target=%s&.src=pg');  # User Notification Options (for first user)  INSERT INTO phpbb_user_notifications (item_type, item_id, user_id, method) VALUES('post', 0, 2, ''); diff --git a/phpBB/language/en/acp/board.php b/phpBB/language/en/acp/board.php index 8ca937a58d..18968d6c97 100644 --- a/phpBB/language/en/acp/board.php +++ b/phpBB/language/en/acp/board.php @@ -45,7 +45,7 @@ $lang = array_merge($lang, array(  	'DEFAULT_LANGUAGE'				=> 'Default language',  	'DEFAULT_STYLE'					=> 'Default style',  	'DISABLE_BOARD'					=> 'Disable board', -	'DISABLE_BOARD_EXPLAIN'			=> 'This will make the board unavailable to users. You can also enter a short (255 character) message to display if you wish.', +	'DISABLE_BOARD_EXPLAIN'			=> 'This will make the board unavailable to users who are neither administrators nor moderators. You can also enter a short (255 character) message to display if you wish.',  	'DISPLAY_LAST_SUBJECT'			=> 'Display subject of last added post on forum list',  	'DISPLAY_LAST_SUBJECT_EXPLAIN'	=> 'The subject of the last added post will be displayed in the forum list with a hyperlink to the post. Subjects from password protected forums and forums in which user doesn’t have read access are not shown.',  	'OVERRIDE_STYLE'				=> 'Override user style', diff --git a/phpBB/language/en/acp/common.php b/phpBB/language/en/acp/common.php index 0e867c64a9..5f004287ff 100644 --- a/phpBB/language/en/acp/common.php +++ b/phpBB/language/en/acp/common.php @@ -83,7 +83,7 @@ $lang = array_merge($lang, array(  	'ACP_EMAIL_SETTINGS'		=> 'Email settings',  	'ACP_EXTENSION_GROUPS'		=> 'Manage attachment extension groups',  	'ACP_EXTENSION_MANAGEMENT'	=> 'Extension management', -	'ACP_EXTENSIONS'			=> 'Extensions', +	'ACP_EXTENSIONS'			=> 'Manage extensions',  	'ACP_FORUM_BASED_PERMISSIONS'	=> 'Forum based permissions', diff --git a/phpBB/language/en/acp/profile.php b/phpBB/language/en/acp/profile.php index 93162daa45..dc42693ca7 100644 --- a/phpBB/language/en/acp/profile.php +++ b/phpBB/language/en/acp/profile.php @@ -39,6 +39,7 @@ $lang = array_merge($lang, array(  	'ADDED_PROFILE_FIELD'	=> 'Successfully added custom profile field.',  	'ALPHA_ONLY'			=> 'Alphanumeric only',  	'ALPHA_SPACERS'			=> 'Alphanumeric and spacers', +	'ALPHA_UNDERSCORE'		=> 'Alphanumeric and underscores',  	'ALWAYS_TODAY'			=> 'Always the current date',  	'BOOL_ENTRIES_EXPLAIN'	=> 'Enter your options now', diff --git a/phpBB/language/en/common.php b/phpBB/language/en/common.php index 5ab420cf76..ed6525313f 100644 --- a/phpBB/language/en/common.php +++ b/phpBB/language/en/common.php @@ -402,6 +402,9 @@ $lang = array_merge($lang, array(  	'MODERATE'				=> 'Moderate',  	'MODERATOR'				=> 'Moderator',  	'MODERATORS'			=> 'Moderators', +	'MODULE_NOT_ACCESS'		=> 'Module not accessible', +	'MODULE_NOT_FIND'		=> 'Cannot find module %s', +	'MODULE_FILE_INCORRECT_CLASS'	=> 'Module file %s does not contain correct class [%s]',  	'MONTH'					=> 'Month',  	'MOVE'					=> 'Move', diff --git a/phpBB/language/en/ucp.php b/phpBB/language/en/ucp.php index a0f7a32116..58bb1d4b3a 100644 --- a/phpBB/language/en/ucp.php +++ b/phpBB/language/en/ucp.php @@ -205,9 +205,11 @@ $lang = array_merge($lang, array(  	),  	'FIELD_TOO_SMALL'					=> 'The value of “%2$s” is too small, a minimum value of %1$d is required.',  	'FIELD_TOO_LARGE'					=> 'The value of “%2$s” is too large, a maximum value of %1$d is allowed.', +	'FIELD_INVALID_CHARS_INVALID'		=> 'The field “%s” has invalid characters.',  	'FIELD_INVALID_CHARS_NUMBERS_ONLY'	=> 'The field “%s” has invalid characters, only numbers are allowed.',  	'FIELD_INVALID_CHARS_ALPHA_ONLY'	=> 'The field “%s” has invalid characters, only alphanumeric characters are allowed.', -	'FIELD_INVALID_CHARS_SPACERS_ONLY'	=> 'The field “%s” has invalid characters, only alphanumeric, space or -+_[] characters are allowed.', +	'FIELD_INVALID_CHARS_ALPHA_SPACERS'	=> 'The field “%s” has invalid characters, only alphanumeric, space or -+_[] characters are allowed.', +	'FIELD_INVALID_CHARS_ALPHA_UNDERSCORE'	=> 'The field “%s” has invalid characters, only alphanumeric or _ characters are allowed.',  	'FIELD_INVALID_DATE'				=> 'The field “%s” has an invalid date.',  	'FIELD_INVALID_URL'					=> 'The field “%s” has an invalid url.',  	'FIELD_INVALID_VALUE'				=> 'The field “%s” has an invalid value.', diff --git a/phpBB/phpbb/content_visibility.php b/phpBB/phpbb/content_visibility.php index 874889015a..f18ee0fd73 100644 --- a/phpBB/phpbb/content_visibility.php +++ b/phpBB/phpbb/content_visibility.php @@ -528,16 +528,16 @@ class content_visibility  		if (!$force_update_all && $original_topic_data['topic_delete_time'] && $original_topic_data['topic_visibility'] == ITEM_DELETED && $visibility == ITEM_APPROVED)  		{  			// If we're restoring a topic we only restore posts, that were soft deleted through the topic soft deletion. -			self::set_post_visibility($visibility, false, $topic_id, $forum_id, $user_id, $time, '', true, true, $original_topic_data['topic_visibility'], $original_topic_data['topic_delete_time']); +			$this->set_post_visibility($visibility, false, $topic_id, $forum_id, $user_id, $time, '', true, true, $original_topic_data['topic_visibility'], $original_topic_data['topic_delete_time']);  		}  		else if (!$force_update_all && $original_topic_data['topic_visibility'] == ITEM_APPROVED && $visibility == ITEM_DELETED)  		{  			// If we're soft deleting a topic we only approved posts are soft deleted. -			self::set_post_visibility($visibility, false, $topic_id, $forum_id, $user_id, $time, '', true, true, $original_topic_data['topic_visibility']); +			$this->set_post_visibility($visibility, false, $topic_id, $forum_id, $user_id, $time, '', true, true, $original_topic_data['topic_visibility']);  		}  		else  		{ -			self::set_post_visibility($visibility, false, $topic_id, $forum_id, $user_id, $time, '', true, true); +			$this->set_post_visibility($visibility, false, $topic_id, $forum_id, $user_id, $time, '', true, true);  		}  		return $data; diff --git a/phpBB/phpbb/controller/helper.php b/phpBB/phpbb/controller/helper.php index 05a05d1e57..10fdbb1375 100644 --- a/phpBB/phpbb/controller/helper.php +++ b/phpBB/phpbb/controller/helper.php @@ -10,6 +10,8 @@  namespace phpbb\controller;  use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\Routing\Generator\UrlGenerator; +use Symfony\Component\Routing\RequestContext;  /**  * Controller helper class, contains methods that do things for controllers @@ -51,18 +53,20 @@ class helper  	* Constructor  	*  	* @param \phpbb\template\template $template Template object -    * @param \phpbb\user $user User object -    * @param \phpbb\config\config $config Config object +	* @param \phpbb\user $user User object +	* @param \phpbb\config\config $config Config object +	* @param \phpbb\controller\provider $provider Path provider  	* @param string $phpbb_root_path phpBB root path  	* @param string $php_ext PHP extension  	*/ -	public function __construct(\phpbb\template\template $template, \phpbb\user $user, \phpbb\config\config $config, $phpbb_root_path, $php_ext) +	public function __construct(\phpbb\template\template $template, \phpbb\user $user, \phpbb\config\config $config, \phpbb\controller\provider $provider, $phpbb_root_path, $php_ext)  	{  		$this->template = $template;  		$this->user = $user;  		$this->config = $config;  		$this->phpbb_root_path = $phpbb_root_path;  		$this->php_ext = $php_ext; +		$this->route_collection = $provider->get_routes();  	}  	/** @@ -87,21 +91,33 @@ class helper  	}  	/** -	* Generate a URL +	* Generate a URL to a route  	* -	* @param string	$route		The route to travel -	* @param mixed	$params		String or array of additional url parameters +	* @param string	$route		Name of the route to travel +	* @param array	$params		String or array of additional url parameters  	* @param bool	$is_amp		Is url using & (true) or & (false)  	* @param string	$session_id	Possibility to use a custom session id instead of the global one  	* @return string The URL already passed through append_sid()  	*/ -	public function url($route, $params = false, $is_amp = true, $session_id = false) +	public function route($route, array $params = array(), $is_amp = true, $session_id = false)  	{ -		$route_params = ''; -		if (($route_delim = strpos($route, '?')) !== false) +		$anchor = ''; +		if (isset($params['#']))  		{ -			$route_params = substr($route, $route_delim); -			$route = substr($route, 0, $route_delim); +			$anchor = '#' . $params['#']; +			unset($params['#']); +		} +		$url_generator = new UrlGenerator($this->route_collection, new RequestContext()); +		$route_url = $url_generator->generate($route, $params); + +		if (strpos($route_url, '/') === 0) +		{ +			$route_url = substr($route_url, 1); +		} + +		if ($is_amp) +		{ +			$route_url = str_replace(array('&', '&'), array('&', '&'), $route_url);  		}  		// If enable_mod_rewrite is false, we need to include app.php @@ -111,7 +127,7 @@ class helper  			$route_prefix .= 'app.' . $this->php_ext . '/';  		} -		return append_sid($route_prefix . "$route" . $route_params, $params, $is_amp, $session_id); +		return append_sid($route_prefix . $route_url . $anchor, false, $is_amp, $session_id);  	}  	/** diff --git a/phpBB/phpbb/controller/provider.php b/phpBB/phpbb/controller/provider.php index fde51696e8..9df8130210 100644 --- a/phpBB/phpbb/controller/provider.php +++ b/phpBB/phpbb/controller/provider.php @@ -26,50 +26,58 @@ class provider  	protected $routing_files;  	/** +	* Collection of the routes in phpBB and all found extensions +	* @var RouteCollection +	*/ +	protected $routes; + +	/**  	* Construct method  	*  	* @param array() $routing_files Array of strings containing paths  	*							to YAML files holding route information  	*/ -	public function __construct($routing_files = array()) +	public function __construct(\phpbb\extension\finder $finder = null, $routing_files = array())  	{  		$this->routing_files = $routing_files; -	} - -	/** -	* Locate paths containing routing files -	* This sets an internal property but does not return the paths. -	* -	* @return The current instance of this object for method chaining -	*/ -	public function import_paths_from_finder(\phpbb\extension\finder $finder) -	{ -		// We hardcode the path to the core config directory -		// because the finder cannot find it -		$this->routing_files = array_merge(array('config/routing.yml'), array_keys($finder -			->directory('config') -			->suffix('routing.yml') -			->find() -		)); -		return $this; +		if ($finder) +		{ +			// We hardcode the path to the core config directory +			// because the finder cannot find it +			$this->routing_files = array_merge($this->routing_files, array('config/routing.yml'), array_keys($finder +					->directory('config') +					->suffix('routing.yml') +					->find() +			)); +		}  	}  	/** -	* Get a list of controllers and return it +	* Find a list of controllers and return it  	*  	* @param string $base_path Base path to prepend to file paths -	* @return array Array of controllers and their route information +	* @return null  	*/  	public function find($base_path = '')  	{ -		$routes = new RouteCollection; +		$this->routes = new RouteCollection;  		foreach ($this->routing_files as $file_path)  		{  			$loader = new YamlFileLoader(new FileLocator($base_path)); -			$routes->addCollection($loader->load($file_path)); +			$this->routes->addCollection($loader->load($file_path));  		} -		return $routes; +		return $this; +	} + +	/** +	* Get the list of routes +	* +	* @return RouteCollection Get the route collection +	*/ +	public function get_routes() +	{ +		return $this->routes;  	}  } diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_change_load_settings.php b/phpBB/phpbb/db/migration/data/v310/profilefield_change_load_settings.php new file mode 100644 index 0000000000..7d09d8149a --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_change_load_settings.php @@ -0,0 +1,30 @@ +<?php +/** +* +* @package migration +* @copyright (c) 2014 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_change_load_settings extends \phpbb\db\migration\migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_aol_cleanup', +		); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('load_cpf_memberlist', '1')), +			array('config.update', array('load_cpf_pm', '1')), +			array('config.update', array('load_cpf_viewprofile', '1')), +			array('config.update', array('load_cpf_viewtopic', '1')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_icq.php b/phpBB/phpbb/db/migration/data/v310/profilefield_icq.php index 0b8344333a..2c8c8c511f 100644 --- a/phpBB/phpbb/db/migration/data/v310/profilefield_icq.php +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_icq.php @@ -3,7 +3,7 @@  *  * @package migration  * @copyright (c) 2014 phpBB Group - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_icq_cleanup.php b/phpBB/phpbb/db/migration/data/v310/profilefield_icq_cleanup.php index c073b191a1..0129a7248f 100644 --- a/phpBB/phpbb/db/migration/data/v310/profilefield_icq_cleanup.php +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_icq_cleanup.php @@ -3,7 +3,7 @@  *  * @package migration  * @copyright (c) 2014 phpBB Group - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_website_cleanup.php b/phpBB/phpbb/db/migration/data/v310/profilefield_website_cleanup.php index 9a4d724347..35cc92199e 100644 --- a/phpBB/phpbb/db/migration/data/v310/profilefield_website_cleanup.php +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_website_cleanup.php @@ -3,7 +3,7 @@  *  * @package migration  * @copyright (c) 2014 phpBB Group - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_wlm_cleanup.php b/phpBB/phpbb/db/migration/data/v310/profilefield_wlm_cleanup.php index ac03287121..98b92eb188 100644 --- a/phpBB/phpbb/db/migration/data/v310/profilefield_wlm_cleanup.php +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_wlm_cleanup.php @@ -3,7 +3,7 @@  *  * @package migration  * @copyright (c) 2014 phpBB Group - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_yahoo_cleanup.php b/phpBB/phpbb/db/migration/data/v310/profilefield_yahoo_cleanup.php index 4747c1c3d4..c11d06576f 100644 --- a/phpBB/phpbb/db/migration/data/v310/profilefield_yahoo_cleanup.php +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_yahoo_cleanup.php @@ -3,7 +3,7 @@  *  * @package migration  * @copyright (c) 2014 phpBB Group - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2  *  */ diff --git a/phpBB/phpbb/db/migration/data/v310/soft_delete_mod_convert.php b/phpBB/phpbb/db/migration/data/v310/soft_delete_mod_convert.php new file mode 100644 index 0000000000..c9255d88ee --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/soft_delete_mod_convert.php @@ -0,0 +1,128 @@ +<?php +/** +* +* @package migration +* @copyright (c) 2014 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +namespace phpbb\db\migration\data\v310; + +/** + * Migration to convert the Soft Delete MOD for 3.0 + * + * https://www.phpbb.com/customise/db/mod/soft_delete/ + */ +class soft_delete_mod_convert extends \phpbb\db\migration\migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\alpha3', +		); +	} + +	public function effectively_installed() +	{ +		return !$this->db_tools->sql_column_exists($this->table_prefix . 'posts', 'post_deleted'); +	} + +	public function update_data() +	{ +		return array( +			array('permission.remove', array('m_harddelete', true)), +			array('permission.remove', array('m_harddelete', false)), + +			array('custom', array(array($this, 'convert_posts'))), +			array('custom', array(array($this, 'convert_topics'))), +		); +	} + +	public function convert_posts($start) +	{ +		$content_visibility = $this->get_content_visibility(); + +		$limit = 250; +		$i = 0; + +		$sql = 'SELECT p.*, t.topic_first_post_id, t.topic_last_post_id +			FROM ' . $this->table_prefix . 'posts p, ' . $this->table_prefix . 'topics t +			WHERE p.post_deleted > 0 +				AND t.topic_id = p.topic_id'; +		$result = $this->db->sql_query_limit($sql, $limit, $start); + +		while ($row = $this->db->sql_fetchrow($result)) +		{ +			$content_visibility->set_post_visibility( +				ITEM_DELETED, +				$row['post_id'], +				$row['topic_id'], +				$row['forum_id'], +				$row['post_deleted'], +				$row['post_deleted_time'], +				'', +				($row['post_id'] == $row['topic_first_post_id']) ? true : false, +				($row['post_id'] == $row['topic_last_post_id']) ? true : false +			); + +			$i++; +		} + +		$this->db->sql_freeresult($result); + +		if ($i == $limit) +		{ +			return $start + $i; +		} +	} + +	public function convert_topics($start) +	{ +		$content_visibility = $this->get_content_visibility(); + +		$limit = 100; +		$i = 0; + +		$sql = 'SELECT * +			FROM ' . $this->table_prefix . 'topics +			WHERE topic_deleted > 0'; +		$result = $this->db->sql_query_limit($sql, $limit, $start); + +		while ($row = $this->db->sql_fetchrow($result)) +		{ +			$content_visibility->set_topic_visibility( +				ITEM_DELETED, +				$row['topic_id'], +				$row['forum_id'], +				$row['topic_deleted'], +				$row['topic_deleted_time'], +				'' +			); + +			$i++; +		} + +		$this->db->sql_freeresult($result); + +		if ($i == $limit) +		{ +			return $start + $i; +		} +	} + +	protected function get_content_visibility() +	{ +		return new \phpbb\content_visibility( +			new \phpbb\auth\auth(), +			$this->db, +			new \phpbb\user(), +			$this->phpbb_root_path, +			$this->php_ext, +			$this->table_prefix . 'forums', +			$this->table_prefix . 'posts', +			$this->table_prefix . 'topics', +			$this->table_prefix . 'users' +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/soft_delete_mod_convert2.php b/phpBB/phpbb/db/migration/data/v310/soft_delete_mod_convert2.php new file mode 100644 index 0000000000..ab4be269e6 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/soft_delete_mod_convert2.php @@ -0,0 +1,62 @@ +<?php +/** +* +* @package migration +* @copyright (c) 2014 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +namespace phpbb\db\migration\data\v310; + +/** + * Migration to convert the Soft Delete MOD for 3.0 + * + * https://www.phpbb.com/customise/db/mod/soft_delete/ + */ +class soft_delete_mod_convert2 extends \phpbb\db\migration\migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\soft_delete_mod_convert', +		); +	} + +	public function effectively_installed() +	{ +		return !$this->db_tools->sql_column_exists($this->table_prefix . 'posts', 'post_deleted'); +	} + +	public function update_schema() +	{ +		return array( +			'drop_columns'		=> array( +				$this->table_prefix . 'forums'			=> array('forum_deleted_topic_count', 'forum_deleted_reply_count'), +				$this->table_prefix . 'posts'			=> array('post_deleted', 'post_deleted_time'), +				$this->table_prefix . 'topics'			=> array('topic_deleted', 'topic_deleted_time', 'topic_deleted_reply_count'), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'add_columns'		=> array( +				$this->table_prefix . 'forums'			=> array( +					'forum_deleted_topic_count'		=> array('UINT', 0), +					'forum_deleted_reply_count'		=> array('UINT', 0), +				), +				$this->table_prefix . 'posts'			=> array( +					'post_deleted'					=> array('UINT', 0), +					'post_deleted_time'				=> array('TIMESTAMP', 0), +				), +				$this->table_prefix . 'topics'			=> array( +					'topic_deleted'					=> array('UINT', 0), +					'topic_deleted_time'			=> array('TIMESTAMP', 0), +					'topic_deleted_reply_count'		=> array('UINT', 0), +				), +			), +		); +	} +} diff --git a/phpBB/phpbb/feed/forum.php b/phpBB/phpbb/feed/forum.php index 8026824ab7..85ecb60f7e 100644 --- a/phpBB/phpbb/feed/forum.php +++ b/phpBB/phpbb/feed/forum.php @@ -109,7 +109,7 @@ class forum extends \phpbb\feed\post_base  		}  		$this->sql = array( -			'SELECT'	=>	'p.post_id, p.topic_id, p.post_time, p.post_edit_time, p.post_visibility, p.post_subject, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, ' . +			'SELECT'	=>	'p.post_id, p.topic_id, p.post_time, p.post_edit_time, p.post_visibility, p.post_subject, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, p.post_attachment, ' .  							'u.username, u.user_id',  			'FROM'		=> array(  				POSTS_TABLE		=> 'p', diff --git a/phpBB/phpbb/feed/helper.php b/phpBB/phpbb/feed/helper.php index 3f2759b85e..12acf997ac 100644 --- a/phpBB/phpbb/feed/helper.php +++ b/phpBB/phpbb/feed/helper.php @@ -24,6 +24,9 @@ class helper  	/** @var string */  	protected $phpbb_root_path; +	/** @var string */ +	protected $phpEx; +  	/**  	* Constructor  	* @@ -32,11 +35,12 @@ class helper  	* @param	string	$phpbb_root_path	Root path  	* @return	null  	*/ -	public function __construct(\phpbb\config\config $config, \phpbb\user $user, $phpbb_root_path) +	public function __construct(\phpbb\config\config $config, \phpbb\user $user, $phpbb_root_path, $phpEx)  	{  		$this->config = $config;  		$this->user = $user;  		$this->phpbb_root_path = $phpbb_root_path; +		$this->phpEx = $phpEx;  	}  	/** @@ -81,8 +85,16 @@ class helper  	/**  	* Generate text content +	* +	* @param string $content is feed text content +	* @param string $uid is bbcode_uid +	* @param string $bitfield is bbcode bitfield +	* @param int $options bbcode flag options +	* @param int $forum_id is the forum id +	* @param array $post_attachments is an array containing the attachments and their respective info +	* @return string the html content to be printed for the feed  	*/ -	public function generate_content($content, $uid, $bitfield, $options) +	public function generate_content($content, $uid, $bitfield, $options, $forum_id, $post_attachments)  	{  		if (empty($content))  		{ @@ -129,8 +141,21 @@ class helper  		// Remove some specials html tag, because somewhere there are a mod to allow html tags ;)  		$content	= preg_replace( '#<(script|iframe)([^[]+)\1>#siU', ' <strong>$1</strong> ', $content); +		// Parse inline images to display with the feed +		if (!empty($post_attachments)) +		{ +			$update_count = array(); +			parse_attachments($forum_id, $content, $post_attachments, $update_count); +			$post_attachments = implode('<br />', $post_attachments); + +			// Convert attachments' relative path to absolute path +			$post_attachments = str_replace($this->phpbb_root_path . 'download/file.' . $this->phpEx, $this->get_board_url() . '/download/file.' . $this->phpEx, $post_attachments); + +			$content .= $post_attachments; +		} +  		// Remove Comments from inline attachments [ia] -		$content	= preg_replace('#<div class="(inline-attachment|attachtitle)">(.*?)<!-- ia(.*?) -->(.*?)<!-- ia(.*?) -->(.*?)</div>#si','$4',$content); +		$content = preg_replace('#<dd>(.*?)</dd>#','',$content);  		// Replace some entities with their unicode counterpart  		$entities = array( diff --git a/phpBB/phpbb/feed/news.php b/phpBB/phpbb/feed/news.php index 7888e73239..1b7c452a92 100644 --- a/phpBB/phpbb/feed/news.php +++ b/phpBB/phpbb/feed/news.php @@ -85,7 +85,7 @@ class news extends \phpbb\feed\topic_base  		$this->sql = array(  			'SELECT'	=> 'f.forum_id, f.forum_name,  							t.topic_id, t.topic_title, t.topic_poster, t.topic_first_poster_name, t.topic_posts_approved, t.topic_posts_unapproved, t.topic_posts_softdeleted, t.topic_views, t.topic_time, t.topic_last_post_time, -							p.post_id, p.post_time, p.post_edit_time, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url', +							p.post_id, p.post_time, p.post_edit_time, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, p.post_attachment',  			'FROM'		=> array(  				TOPICS_TABLE	=> 't',  				POSTS_TABLE		=> 'p', diff --git a/phpBB/phpbb/feed/overall.php b/phpBB/phpbb/feed/overall.php index 4545ba5c64..d99200475e 100644 --- a/phpBB/phpbb/feed/overall.php +++ b/phpBB/phpbb/feed/overall.php @@ -53,7 +53,7 @@ class overall extends \phpbb\feed\post_base  		// Get the actual data  		$this->sql = array(  			'SELECT'	=>	'f.forum_id, f.forum_name, ' . -							'p.post_id, p.topic_id, p.post_time, p.post_edit_time, p.post_visibility, p.post_subject, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, ' . +							'p.post_id, p.topic_id, p.post_time, p.post_edit_time, p.post_visibility, p.post_subject, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, p.post_attachment, ' .  							'u.username, u.user_id',  			'FROM'		=> array(  				USERS_TABLE		=> 'u', diff --git a/phpBB/phpbb/feed/post_base.php b/phpBB/phpbb/feed/post_base.php index 42c5eea9e3..c797d6a8ca 100644 --- a/phpBB/phpbb/feed/post_base.php +++ b/phpBB/phpbb/feed/post_base.php @@ -17,6 +17,7 @@ namespace phpbb\feed;  abstract class post_base extends \phpbb\feed\base  {  	var $num_items = 'feed_limit_post'; +	var $attachments = array();  	function set_keys()  	{ @@ -48,4 +49,41 @@ abstract class post_base extends \phpbb\feed\base  				. (($this->is_moderator_approve_forum($row['forum_id']) && $row['post_visibility'] !== ITEM_APPROVED) ? ' ' . $this->separator_stats . ' ' . $this->user->lang['POST_UNAPPROVED'] : '');  		}  	} + +	function fetch_attachments() +	{ +		$sql_array = array( +			'SELECT'	=> 'a.*', +			'FROM'		=> array( +				ATTACHMENTS_TABLE	=>	'a' +			), +			'WHERE'		=> 'a.in_message = 0 ', +			'ORDER_BY'	=> 'a.filetime DESC, a.post_msg_id ASC', +		); + +		if (isset($this->topic_id)) +		{ +			$sql_array['WHERE'] .= 'AND a.topic_id = ' . (int) $this->topic_id; +		} +		else if (isset($this->forum_id)) +		{ +			$sql_array['LEFT_JOIN'] = array( +				array( +					'FROM'  => array(TOPICS_TABLE => 't'), +					'ON'    => 'a.topic_id = t.topic_id', +				) +			); +			$sql_array['WHERE'] .= 'AND t.forum_id = ' . (int) $this->forum_id; +		} + +		$sql = $this->db->sql_build_query('SELECT', $sql_array); +		$result = $this->db->sql_query($sql); + +		// Set attachments in feed items +		while ($row = $this->db->sql_fetchrow($result)) +		{ +			$this->attachments[$row['post_msg_id']][] = $row; +		} +		$this->db->sql_freeresult($result); +	}  } diff --git a/phpBB/phpbb/feed/topic.php b/phpBB/phpbb/feed/topic.php index 09f377dd10..a7acfb502f 100644 --- a/phpBB/phpbb/feed/topic.php +++ b/phpBB/phpbb/feed/topic.php @@ -88,7 +88,7 @@ class topic extends \phpbb\feed\post_base  	function get_sql()  	{  		$this->sql = array( -			'SELECT'	=>	'p.post_id, p.post_time, p.post_edit_time, p.post_visibility, p.post_subject, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, ' . +			'SELECT'	=>	'p.post_id, p.post_time, p.post_edit_time, p.post_visibility, p.post_subject, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, p.post_attachment, ' .  							'u.username, u.user_id',  			'FROM'		=> array(  				POSTS_TABLE		=> 'p', diff --git a/phpBB/phpbb/feed/topics.php b/phpBB/phpbb/feed/topics.php index bdc858e947..e8b9f6de6c 100644 --- a/phpBB/phpbb/feed/topics.php +++ b/phpBB/phpbb/feed/topics.php @@ -57,7 +57,7 @@ class topics extends \phpbb\feed\topic_base  		$this->sql = array(  			'SELECT'	=> 'f.forum_id, f.forum_name,  							t.topic_id, t.topic_title, t.topic_poster, t.topic_first_poster_name, t.topic_posts_approved, t.topic_posts_unapproved, t.topic_posts_softdeleted, t.topic_views, t.topic_time, t.topic_last_post_time, -							p.post_id, p.post_time, p.post_edit_time, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url', +							p.post_id, p.post_time, p.post_edit_time, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, p.post_attachment',  			'FROM'		=> array(  				TOPICS_TABLE	=> 't',  				POSTS_TABLE		=> 'p', diff --git a/phpBB/phpbb/feed/topics_active.php b/phpBB/phpbb/feed/topics_active.php index cc0adac2eb..809a536c2a 100644 --- a/phpBB/phpbb/feed/topics_active.php +++ b/phpBB/phpbb/feed/topics_active.php @@ -74,7 +74,7 @@ class topics_active extends \phpbb\feed\topic_base  			'SELECT'	=> 'f.forum_id, f.forum_name,  							t.topic_id, t.topic_title, t.topic_posts_approved, t.topic_posts_unapproved, t.topic_posts_softdeleted, t.topic_views,  							t.topic_last_poster_id, t.topic_last_poster_name, t.topic_last_post_time, -							p.post_id, p.post_time, p.post_edit_time, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url', +							p.post_id, p.post_time, p.post_edit_time, p.post_text, p.bbcode_bitfield, p.bbcode_uid, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, p.post_attachment',  			'FROM'		=> array(  				TOPICS_TABLE	=> 't',  				POSTS_TABLE		=> 'p', diff --git a/phpBB/phpbb/notification/type/admin_activate_user.php b/phpBB/phpbb/notification/type/admin_activate_user.php index 5f146e18ff..426da4db03 100644 --- a/phpBB/phpbb/notification/type/admin_activate_user.php +++ b/phpBB/phpbb/notification/type/admin_activate_user.php @@ -81,7 +81,7 @@ class admin_activate_user extends \phpbb\notification\type\base  			WHERE user_type = ' . USER_FOUNDER;  		$result = $this->db->sql_query($sql); -		while ($row = $this->db->sql_fetchrow($sql)) +		while ($row = $this->db->sql_fetchrow($result))  		{  			$users[] = (int) $row['user_id'];  		} diff --git a/phpBB/phpbb/pagination.php b/phpBB/phpbb/pagination.php index 57e7932341..6a7631c89d 100644 --- a/phpBB/phpbb/pagination.php +++ b/phpBB/phpbb/pagination.php @@ -22,11 +22,13 @@ class pagination  	*  	* @param	\phpbb\template\template	$template  	* @param	\phpbb\user					$user +	* @param	\phpbb\controller\helper	$helper  	*/ -	public function __construct(\phpbb\template\template $template, \phpbb\user $user) +	public function __construct(\phpbb\template\template $template, \phpbb\user $user, \phpbb\controller\helper $helper)  	{  		$this->template = $template;  		$this->user = $user; +		$this->helper = $helper;  	}  	/** @@ -44,9 +46,26 @@ class pagination  	*/  	protected function generate_page_link($base_url, $on_page, $start_name, $per_page)  	{ -		if (strpos($start_name, '%d') !== false) +		if (!is_string($base_url))  		{ -			return ($on_page > 1) ? sprintf($base_url, (int) $on_page) : str_replace($start_name, '', $base_url); +			if (is_array($base_url['routes'])) +			{ +				$route = ($on_page > 1) ? $base_url['routes'][1] : $base_url['routes'][0]; +			} +			else +			{ +				$route = $base_url['routes']; +			} +			$params = (isset($base_url['params'])) ? $base_url['params'] : array(); +			$is_amp = (isset($base_url['is_amp'])) ? $base_url['is_amp'] : true; +			$session_id = (isset($base_url['session_id'])) ? $base_url['session_id'] : false; + +			if ($on_page > 1 || !is_array($base_url['routes'])) +			{ +				$params[$start_name] = (int) $on_page; +			} + +			return $this->helper->route($route, $params, $is_amp, $session_id);  		}  		else  		{ @@ -194,7 +213,8 @@ class pagination  		$tpl_prefix = ($tpl_prefix == 'PAGINATION') ? '' : $tpl_prefix . '_';  		$template_array = array( -			$tpl_prefix . 'BASE_URL'		=> $base_url, +			$tpl_prefix . 'BASE_URL'		=> is_string($base_url) ? $base_url : '',//@todo: Fix this for routes +			$tpl_prefix . 'START_NAME'		=> $start_name,  			$tpl_prefix . 'PER_PAGE'		=> $per_page,  			'U_' . $tpl_prefix . 'PREVIOUS_PAGE'	=> ($on_page != 1) ? $u_previous_page : '',  			'U_' . $tpl_prefix . 'NEXT_PAGE'		=> ($on_page != $total_pages) ? $u_next_page : '', diff --git a/phpBB/phpbb/profilefields/type/type_string_common.php b/phpBB/phpbb/profilefields/type/type_string_common.php index f060fb1054..0738cbdafd 100644 --- a/phpBB/phpbb/profilefields/type/type_string_common.php +++ b/phpBB/phpbb/profilefields/type/type_string_common.php @@ -11,15 +11,21 @@ namespace phpbb\profilefields\type;  abstract class type_string_common extends type_base  { +	protected $validation_options = array( +		'CHARS_ANY'			=> '.*', +		'NUMBERS_ONLY'		=> '[0-9]+', +		'ALPHA_ONLY'		=> '[\w]+', +		'ALPHA_UNDERSCORE'	=> '[\w_]+', +		'ALPHA_SPACERS'		=> '[\w_\+\. \-\[\]]+', +	); +  	/**  	* Return possible validation options  	*/ -	function validate_options($field_data) +	public function validate_options($field_data)  	{ -		$validate_ary = array('CHARS_ANY' => '.*', 'NUMBERS_ONLY' => '[0-9]+', 'ALPHA_ONLY' => '[\w]+', 'ALPHA_SPACERS' => '[\w_\+\. \-\[\]]+'); -  		$validate_options = ''; -		foreach ($validate_ary as $lang => $value) +		foreach ($this->validation_options as $lang => $value)  		{  			$selected = ($field_data['field_validation'] == $value) ? ' selected="selected"' : '';  			$validate_options .= '<option value="' . $value . '"' . $selected . '>' . $this->user->lang[$lang] . '</option>'; @@ -69,17 +75,12 @@ abstract class type_string_common extends type_base  			$field_validate = ($field_type != 'text') ? $field_value : bbcode_nl2br($field_value);  			if (!preg_match('#^' . str_replace('\\\\', '\\', $field_data['field_validation']) . '$#i', $field_validate))  			{ -				switch ($field_data['field_validation']) +				$validation = array_search($field_data['field_validation'], $this->validation_options); +				if ($validation)  				{ -					case '[0-9]+': -						return $this->user->lang('FIELD_INVALID_CHARS_NUMBERS_ONLY', $this->get_field_name($field_data['lang_name'])); - -					case '[\w]+': -						return $this->user->lang('FIELD_INVALID_CHARS_ALPHA_ONLY', $this->get_field_name($field_data['lang_name'])); - -					case '[\w_\+\. \-\[\]]+': -						return $this->user->lang('FIELD_INVALID_CHARS_SPACERS_ONLY', $this->get_field_name($field_data['lang_name'])); +					return $this->user->lang('FIELD_INVALID_CHARS_' . $validation, $this->get_field_name($field_data['lang_name']));  				} +				return $this->user->lang('FIELD_INVALID_CHARS_INVALID', $this->get_field_name($field_data['lang_name']));  			}  		} diff --git a/phpBB/phpbb/search/fulltext_native.php b/phpBB/phpbb/search/fulltext_native.php index 1a89182978..60180f1728 100644 --- a/phpBB/phpbb/search/fulltext_native.php +++ b/phpBB/phpbb/search/fulltext_native.php @@ -325,7 +325,12 @@ class fulltext_native extends \phpbb\search\base  			}  			$this->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); @@ -451,39 +456,21 @@ class fulltext_native extends \phpbb\search\base  					$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($this->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;  		} @@ -518,6 +505,12 @@ class fulltext_native extends \phpbb\search\base  			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/phpbb/search/fulltext_sphinx.php b/phpBB/phpbb/search/fulltext_sphinx.php index acbfad9474..d86a394326 100644 --- a/phpBB/phpbb/search/fulltext_sphinx.php +++ b/phpBB/phpbb/search/fulltext_sphinx.php @@ -282,9 +282,9 @@ class fulltext_sphinx  				array('sql_attr_uint',				'post_visibility'),  				array('sql_attr_bool',				'topic_first_post'),  				array('sql_attr_bool',				'deleted'), -				array('sql_attr_timestamp'	,		'post_time'), -				array('sql_attr_timestamp'	,		'topic_last_post_time'), -				array('sql_attr_str2ordinal',		'post_subject'), +				array('sql_attr_timestamp',			'post_time'), +				array('sql_attr_timestamp',			'topic_last_post_time'), +				array('sql_attr_string',			'post_subject'),  			),  			'source source_phpbb_' . $this->id . '_delta : source_phpbb_' . $this->id . '_main' => array(  				array('sql_query_pre',				''), diff --git a/phpBB/phpbb/template/base.php b/phpBB/phpbb/template/base.php index 6044effa1f..5bce79fd85 100644 --- a/phpBB/phpbb/template/base.php +++ b/phpBB/phpbb/template/base.php @@ -113,6 +113,16 @@ abstract class base implements template  	/**  	* {@inheritdoc}  	*/ +	public function assign_block_vars_array($blockname, array $block_vars_array) +	{ +		$this->context->assign_block_vars_array($blockname, $block_vars_array); + +		return $this; +	} + +	/** +	* {@inheritdoc} +	*/  	public function alter_block_array($blockname, array $vararray, $key = false, $mode = 'insert')  	{  		return $this->context->alter_block_array($blockname, $vararray, $key, $mode); diff --git a/phpBB/phpbb/template/context.php b/phpBB/phpbb/template/context.php index 0b929f4934..a222fbb69e 100644 --- a/phpBB/phpbb/template/context.php +++ b/phpBB/phpbb/template/context.php @@ -200,6 +200,22 @@ class context  	}  	/** +	* Assign key variable pairs from an array to a whole specified block loop +	* +	* @param string $blockname Name of block to assign $block_vars_array to +	* @param array $block_vars_array An array of hashes of variable name => value pairs +	*/ +	public function assign_block_vars_array($blockname, array $block_vars_array) +	{ +		foreach ($block_vars_array as $vararray) +		{ +			$this->assign_block_vars($blockname, $vararray); +		} + +		return true; +	} + +	/**  	* Change already assigned key variable pair (one-dimensional - single loop entry)  	*  	* An example of how to use this function: diff --git a/phpBB/phpbb/template/template.php b/phpBB/phpbb/template/template.php index d95b0a822c..87ae7a9766 100644 --- a/phpBB/phpbb/template/template.php +++ b/phpBB/phpbb/template/template.php @@ -132,6 +132,14 @@ interface template  	public function assign_block_vars($blockname, array $vararray);  	/** +	* Assign key variable pairs from an array to a whole specified block loop +	* @param string $blockname Name of block to assign $block_vars_array to +	* @param array $block_vars_array An array of hashes of variable name => value pairs +	* @return \phpbb\template\template $this +	*/ +	public function assign_block_vars_array($blockname, array $block_vars_array); + +	/**  	* Change already assigned key variable pair (one-dimensional - single loop entry)  	*  	* An example of how to use this function: diff --git a/phpBB/phpbb/tree/nestedset.php b/phpBB/phpbb/tree/nestedset.php index 13184cf41c..2bfb65732d 100644 --- a/phpBB/phpbb/tree/nestedset.php +++ b/phpBB/phpbb/tree/nestedset.php @@ -664,6 +664,32 @@ abstract class nestedset implements \phpbb\tree\tree_interface  	}  	/** +	* Get all items from the tree +	* +	* @param bool		$order_asc		Order the items ascending by their left_id +	* @return array			Array of items (containing all columns from the item table) +	*							ID => Item data +	*/ +	public function get_all_tree_data($order_asc = true) +	{ +		$rows = array(); + +		$sql = 'SELECT * +			FROM ' . $this->table_name . ' ' . +			$this->get_sql_where('WHERE') . ' +			ORDER BY ' . $this->column_left_id . ' ' . ($order_asc ? 'ASC' : 'DESC'); +		$result = $this->db->sql_query($sql); + +		while ($row = $this->db->sql_fetchrow($result)) +		{ +			$rows[(int) $row[$this->column_item_id]] = $row; +		} +		$this->db->sql_freeresult($result); + +		return $rows; +	} + +	/**  	* Remove a subset from the nested set  	*  	* @param array	$subset_items		Subset of items to remove diff --git a/phpBB/search.php b/phpBB/search.php index 2d516502ed..d03cef5e14 100644 --- a/phpBB/search.php +++ b/phpBB/search.php @@ -527,12 +527,6 @@ if ($keywords || $author || $author_id || $search_id || $submit)  		$total_match_count = $search->author_search($show_results, $firstpost_only, $sort_by_sql, $sort_key, $sort_dir, $sort_days, $ex_fid_ary, $m_approve_posts_fid_sql, $topic_id, $author_id_ary, $sql_author_match, $id_ary, $start, $per_page);  	} -	// For some searches we need to print out the "no results" page directly to allow re-sorting/refining the search options. -	if (!sizeof($id_ary) && !$search_id) -	{ -		trigger_error('NO_SEARCH_RESULTS'); -	} -  	$sql_where = '';  	if (sizeof($id_ary)) diff --git a/phpBB/styles/prosilver/template/forum_fn.js b/phpBB/styles/prosilver/template/forum_fn.js index 408c9b9b8c..de51b54e9b 100644 --- a/phpBB/styles/prosilver/template/forum_fn.js +++ b/phpBB/styles/prosilver/template/forum_fn.js @@ -37,17 +37,14 @@ function jumpto(item) {  		on_page = item.attr('data-on-page'),  		per_page = item.attr('data-per-page'),  		base_url = item.attr('data-base-url'), +		start_name = item.attr('data-start-name'),  		page = prompt(jump_page, on_page);  	if (page !== null && !isNaN(page) && page == Math.floor(page) && page > 0) { -		if (base_url.indexOf('%d') === -1) { -			if (base_url.indexOf('?') === -1) { -				document.location.href = base_url + '?start=' + ((page - 1) * per_page); -			} else { -				document.location.href = base_url.replace(/&/g, '&') + '&start=' + ((page - 1) * per_page); -			} +		if (base_url.indexOf('?') === -1) { +			document.location.href = base_url + '?' + start_name + '=' + ((page - 1) * per_page);  		} else { -			document.location.href = base_url.replace('%d', page); +			document.location.href = base_url.replace(/&/g, '&') + '&' + start_name + '=' + ((page - 1) * per_page);  		}  	}  } diff --git a/phpBB/styles/prosilver/template/pagination.html b/phpBB/styles/prosilver/template/pagination.html index cb54193c3f..e27a90900a 100644 --- a/phpBB/styles/prosilver/template/pagination.html +++ b/phpBB/styles/prosilver/template/pagination.html @@ -1,4 +1,8 @@ -					<a href="#" class="pagination-trigger" title="{L_JUMP_TO_PAGE}" data-lang-jump-page="{L_JUMP_PAGE|e('html_attr')}{L_COLON}" data-on-page="{CURRENT_PAGE}" data-per-page="{PER_PAGE}" data-base-url="{BASE_URL|e('html_attr')}">{PAGE_NUMBER}</a> • +					<!-- IF BASE_URL --> +					<a href="#" class="pagination-trigger" title="{L_JUMP_TO_PAGE}" data-lang-jump-page="{L_JUMP_PAGE|e('html_attr')}{L_COLON}" data-on-page="{CURRENT_PAGE}" data-per-page="{PER_PAGE}" data-base-url="{BASE_URL|e('html_attr')}" data-base-is-route="{BASE_IS_ROUTE}" data-start-name="{START_NAME}">{PAGE_NUMBER}</a> • +					<!-- ELSE --> +					{PAGE_NUMBER} • +					<!-- ENDIF -->  					<ul>  					<!-- BEGIN pagination -->  						<!-- IF pagination.S_IS_PREV --> diff --git a/phpBB/styles/prosilver/template/posting_buttons.html b/phpBB/styles/prosilver/template/posting_buttons.html index 137970bbdf..1164b2ffbe 100644 --- a/phpBB/styles/prosilver/template/posting_buttons.html +++ b/phpBB/styles/prosilver/template/posting_buttons.html @@ -61,26 +61,26 @@  <!-- EVENT posting_editor_buttons_before -->  <div id="format-buttons"> -	<input type="button" class="button2" accesskey="b" name="addbbcode0" value=" B " style="font-weight:bold; width: 30px" onclick="bbstyle(0)" title="{L_BBCODE_B_HELP}" /> -	<input type="button" class="button2" accesskey="i" name="addbbcode2" value=" i " style="font-style:italic; width: 30px" onclick="bbstyle(2)" title="{L_BBCODE_I_HELP}" /> -	<input type="button" class="button2" accesskey="u" name="addbbcode4" value=" u " style="text-decoration: underline; width: 30px" onclick="bbstyle(4)" title="{L_BBCODE_U_HELP}" /> +	<input type="button" class="button2 bbcode-b" accesskey="b" name="addbbcode0" value=" B " style="font-weight:bold; width: 30px" onclick="bbstyle(0)" title="{L_BBCODE_B_HELP}" /> +	<input type="button" class="button2 bbcode-i" accesskey="i" name="addbbcode2" value=" i " style="font-style:italic; width: 30px" onclick="bbstyle(2)" title="{L_BBCODE_I_HELP}" /> +	<input type="button" class="button2 bbcode-u" accesskey="u" name="addbbcode4" value=" u " style="text-decoration: underline; width: 30px" onclick="bbstyle(4)" title="{L_BBCODE_U_HELP}" />  	<!-- IF S_BBCODE_QUOTE --> -		<input type="button" class="button2" accesskey="q" name="addbbcode6" value="Quote" style="width: 50px" onclick="bbstyle(6)" title="{L_BBCODE_Q_HELP}" /> +		<input type="button" class="button2 bbcode-quote" accesskey="q" name="addbbcode6" value="Quote" style="width: 50px" onclick="bbstyle(6)" title="{L_BBCODE_Q_HELP}" />  	<!-- ENDIF --> -	<input type="button" class="button2" accesskey="c" name="addbbcode8" value="Code" style="width: 40px" onclick="bbstyle(8)" title="{L_BBCODE_C_HELP}" /> -	<input type="button" class="button2" accesskey="l" name="addbbcode10" value="List" style="width: 40px" onclick="bbstyle(10)" title="{L_BBCODE_L_HELP}" /> -	<input type="button" class="button2" accesskey="o" name="addbbcode12" value="List=" style="width: 40px" onclick="bbstyle(12)" title="{L_BBCODE_O_HELP}" /> -	<input type="button" class="button2" accesskey="y" name="addlistitem" value="[*]" style="width: 40px" onclick="bbstyle(-1)" title="{L_BBCODE_LISTITEM_HELP}" /> +	<input type="button" class="button2 bbcode-code" accesskey="c" name="addbbcode8" value="Code" style="width: 40px" onclick="bbstyle(8)" title="{L_BBCODE_C_HELP}" /> +	<input type="button" class="button2 bbcode-list" accesskey="l" name="addbbcode10" value="List" style="width: 40px" onclick="bbstyle(10)" title="{L_BBCODE_L_HELP}" /> +	<input type="button" class="button2 bbcode-list-" accesskey="o" name="addbbcode12" value="List=" style="width: 40px" onclick="bbstyle(12)" title="{L_BBCODE_O_HELP}" /> +	<input type="button" class="button2 bbcode-asterisk" accesskey="y" name="addlistitem" value="[*]" style="width: 40px" onclick="bbstyle(-1)" title="{L_BBCODE_LISTITEM_HELP}" />  	<!-- IF S_BBCODE_IMG --> -		<input type="button" class="button2" accesskey="p" name="addbbcode14" value="Img" style="width: 40px" onclick="bbstyle(14)" title="{L_BBCODE_P_HELP}" /> +		<input type="button" class="button2 bbcode-img" accesskey="p" name="addbbcode14" value="Img" style="width: 40px" onclick="bbstyle(14)" title="{L_BBCODE_P_HELP}" />  	<!-- ENDIF -->  	<!-- IF S_LINKS_ALLOWED --> -		<input type="button" class="button2" accesskey="w" name="addbbcode16" value="URL" style="text-decoration: underline; width: 40px" onclick="bbstyle(16)" title="{L_BBCODE_W_HELP}" /> +		<input type="button" class="button2 bbcode-url" accesskey="w" name="addbbcode16" value="URL" style="text-decoration: underline; width: 40px" onclick="bbstyle(16)" title="{L_BBCODE_W_HELP}" />  	<!-- ENDIF -->  	<!-- IF S_BBCODE_FLASH --> -		<input type="button" class="button2" accesskey="d" name="addbbcode18" value="Flash" onclick="bbstyle(18)" title="{L_BBCODE_D_HELP}" /> +		<input type="button" class="button2 bbcode-flash" accesskey="d" name="addbbcode18" value="Flash" onclick="bbstyle(18)" title="{L_BBCODE_D_HELP}" />  	<!-- ENDIF --> -	<select name="addbbcode20" onchange="bbfontstyle('[size=' + this.form.addbbcode20.options[this.form.addbbcode20.selectedIndex].value + ']', '[/size]');this.form.addbbcode20.selectedIndex = 2;" title="{L_BBCODE_F_HELP}"> +	<select name="addbbcode20" class="bbcode-size" onchange="bbfontstyle('[size=' + this.form.addbbcode20.options[this.form.addbbcode20.selectedIndex].value + ']', '[/size]');this.form.addbbcode20.selectedIndex = 2;" title="{L_BBCODE_F_HELP}">  		<option value="50">{L_FONT_TINY}</option>  		<option value="85">{L_FONT_SMALL}</option>  		<option value="100" selected="selected">{L_FONT_NORMAL}</option> @@ -91,9 +91,9 @@  			<!-- ENDIF -->  		<!-- ENDIF -->  	</select> -	<input type="button" class="button2" name="bbpalette" id="bbpalette" value="{L_FONT_COLOR}" onclick="change_palette();" title="{L_BBCODE_S_HELP}" /> +	<input type="button" class="button2 bbcode-color" name="bbpalette" id="bbpalette" value="{L_FONT_COLOR}" onclick="change_palette();" title="{L_BBCODE_S_HELP}" />  	<!-- BEGIN custom_tags --> -		<input type="button" class="button2" name="addbbcode{custom_tags.BBCODE_ID}" value="{custom_tags.BBCODE_TAG}" onclick="bbstyle({custom_tags.BBCODE_ID})" title="{custom_tags.BBCODE_HELPLINE}" /> +		<input type="button" class="button2 bbcode-{custom_tags.BBCODE_TAG_CLEAN}" name="addbbcode{custom_tags.BBCODE_ID}" value="{custom_tags.BBCODE_TAG}" onclick="bbstyle({custom_tags.BBCODE_ID})" title="{custom_tags.BBCODE_HELPLINE}" />  	<!-- END custom_tags -->  </div>  <!-- EVENT posting_editor_buttons_after --> diff --git a/phpBB/styles/subsilver2/template/pagination.html b/phpBB/styles/subsilver2/template/pagination.html index a2e023ac22..550b28d305 100644 --- a/phpBB/styles/subsilver2/template/pagination.html +++ b/phpBB/styles/subsilver2/template/pagination.html @@ -1,5 +1,5 @@  <!-- IF .pagination --> -	<b><a href="#" onclick="jumpto(); return false;" title="{L_JUMP_TO_PAGE}">{L_GOTO_PAGE}</a>  +	<!-- IF BASE_URL --><b><a href="#" onclick="jumpto(); return false;" title="{L_JUMP_TO_PAGE}">{L_GOTO_PAGE}</a></b><!-- ENDIF -->  	<!-- BEGIN pagination -->  		<!-- IF pagination.S_IS_PREV --><a href="{pagination.PAGE_URL}">{L_PREVIOUS}</a>  		<!-- ELSEIF pagination.S_IS_CURRENT --><strong>{pagination.PAGE_NUMBER}</strong> diff --git a/phpBB/styles/subsilver2/template/posting_buttons.html b/phpBB/styles/subsilver2/template/posting_buttons.html index 2c60913fc0..d1c0f79a16 100644 --- a/phpBB/styles/subsilver2/template/posting_buttons.html +++ b/phpBB/styles/subsilver2/template/posting_buttons.html @@ -38,26 +38,26 @@  <!-- IF S_BBCODE_ALLOWED -->  	<!-- EVENT posting_editor_buttons_before -->  	<div id="core-bbcode-buttons"> -		<input type="button" class="btnbbcode" accesskey="b" name="addbbcode0" value=" B " style="font-weight:bold; width: 30px;" onclick="bbstyle(0)" onmouseover="helpline('b')" onmouseout="helpline('tip')" /> -		<input type="button" class="btnbbcode" accesskey="i" name="addbbcode2" value=" i " style="font-style:italic; width: 30px;" onclick="bbstyle(2)" onmouseover="helpline('i')" onmouseout="helpline('tip')" /> -		<input type="button" class="btnbbcode" accesskey="u" name="addbbcode4" value=" u " style="text-decoration: underline; width: 30px;" onclick="bbstyle(4)" onmouseover="helpline('u')" onmouseout="helpline('tip')" /> +		<input type="button" class="btnbbcode bbcode-b" accesskey="b" name="addbbcode0" value=" B " style="font-weight:bold; width: 30px;" onclick="bbstyle(0)" onmouseover="helpline('b')" onmouseout="helpline('tip')" /> +		<input type="button" class="btnbbcode bbcode-i" accesskey="i" name="addbbcode2" value=" i " style="font-style:italic; width: 30px;" onclick="bbstyle(2)" onmouseover="helpline('i')" onmouseout="helpline('tip')" /> +		<input type="button" class="btnbbcode bbcode-u" accesskey="u" name="addbbcode4" value=" u " style="text-decoration: underline; width: 30px;" onclick="bbstyle(4)" onmouseover="helpline('u')" onmouseout="helpline('tip')" />  		<!-- IF S_BBCODE_QUOTE --> -			<input type="button" class="btnbbcode" accesskey="q" name="addbbcode6" value="Quote" style="width: 50px" onclick="bbstyle(6)" onmouseover="helpline('q')" onmouseout="helpline('tip')" /> +			<input type="button" class="btnbbcode bbcode-quote" accesskey="q" name="addbbcode6" value="Quote" style="width: 50px" onclick="bbstyle(6)" onmouseover="helpline('q')" onmouseout="helpline('tip')" />  		<!-- ENDIF --> -		<input type="button" class="btnbbcode" accesskey="c" name="addbbcode8" value="Code" style="width: 40px" onclick="bbstyle(8)" onmouseover="helpline('c')" onmouseout="helpline('tip')" /> -		<input type="button" class="btnbbcode" accesskey="l" name="addbbcode10" value="List" style="width: 40px" onclick="bbstyle(10)" onmouseover="helpline('l')" onmouseout="helpline('tip')" /> -		<input type="button" class="btnbbcode" accesskey="o" name="addbbcode12" value="List=" style="width: 40px" onclick="bbstyle(12)" onmouseover="helpline('o')" onmouseout="helpline('tip')" /> -		<input type="button" class="btnbbcode" accesskey="y" name="addlistitem" value="[*]" style="width: 40px" onclick="bbstyle(-1)" onmouseover="helpline('e')" onmouseout="helpline('tip')" />				 +		<input type="button" class="btnbbcode bbcode-code" accesskey="c" name="addbbcode8" value="Code" style="width: 40px" onclick="bbstyle(8)" onmouseover="helpline('c')" onmouseout="helpline('tip')" /> +		<input type="button" class="btnbbcode bbcode-list" accesskey="l" name="addbbcode10" value="List" style="width: 40px" onclick="bbstyle(10)" onmouseover="helpline('l')" onmouseout="helpline('tip')" /> +		<input type="button" class="btnbbcode bbcode-list-" accesskey="o" name="addbbcode12" value="List=" style="width: 40px" onclick="bbstyle(12)" onmouseover="helpline('o')" onmouseout="helpline('tip')" /> +		<input type="button" class="btnbbcode bbcode-asterisk" accesskey="y" name="addlistitem" value="[*]" style="width: 40px" onclick="bbstyle(-1)" onmouseover="helpline('e')" onmouseout="helpline('tip')" />				  		<!-- IF S_BBCODE_IMG --> -			<input type="button" class="btnbbcode" accesskey="p" name="addbbcode14" value="Img" style="width: 40px" onclick="bbstyle(14)" onmouseover="helpline('p')" onmouseout="helpline('tip')" /> +			<input type="button" class="btnbbcode bbcode-img" accesskey="p" name="addbbcode14" value="Img" style="width: 40px" onclick="bbstyle(14)" onmouseover="helpline('p')" onmouseout="helpline('tip')" />  		<!-- ENDIF -->  		<!-- IF S_LINKS_ALLOWED --> -			<input type="button" class="btnbbcode" accesskey="w" name="addbbcode16" value="URL" style="text-decoration: underline; width: 40px" onclick="bbstyle(16)" onmouseover="helpline('w')" onmouseout="helpline('tip')" /> +			<input type="button" class="btnbbcode bbcode-url" accesskey="w" name="addbbcode16" value="URL" style="text-decoration: underline; width: 40px" onclick="bbstyle(16)" onmouseover="helpline('w')" onmouseout="helpline('tip')" />  		<!-- ENDIF -->  		<!-- IF S_BBCODE_FLASH --> -			<input type="button" class="btnbbcode" accesskey="d" name="addbbcode18" value="Flash" onclick="bbstyle(18)" onmouseover="helpline('d')" onmouseout="helpline('tip')" /> +			<input type="button" class="btnbbcode bbcode-flash" accesskey="d" name="addbbcode18" value="Flash" onclick="bbstyle(18)" onmouseover="helpline('d')" onmouseout="helpline('tip')" />  		<!-- ENDIF --> -		<span class="genmed nowrap">{L_FONT_SIZE}{L_COLON} <select class="gensmall" name="addbbcode20" onchange="bbfontstyle('[size=' + this.form.addbbcode20.options[this.form.addbbcode20.selectedIndex].value + ']', '[/size]');this.form.addbbcode20.selectedIndex = 2;" onmouseover="helpline('f')" onmouseout="helpline('tip')"> +		<span class="genmed nowrap">{L_FONT_SIZE}{L_COLON} <select class="gensmall bbcode-size" name="addbbcode20" onchange="bbfontstyle('[size=' + this.form.addbbcode20.options[this.form.addbbcode20.selectedIndex].value + ']', '[/size]');this.form.addbbcode20.selectedIndex = 2;" onmouseover="helpline('f')" onmouseout="helpline('tip')">  			<option value="50">{L_FONT_TINY}</option>  			<option value="85">{L_FONT_SMALL}</option>  			<option value="100" selected="selected">{L_FONT_NORMAL}</option> @@ -78,7 +78,7 @@  		<td colspan="2">  		<div id="custom-bbcode-buttons">  		<!-- BEGIN custom_tags --> -			<input type="button" class="btnbbcode" name="addbbcode{custom_tags.BBCODE_ID}" value="{custom_tags.BBCODE_TAG}" onclick="bbstyle({custom_tags.BBCODE_ID})"<!-- IF custom_tags.BBCODE_HELPLINE !== '' --> onmouseover="helpline('cb_{custom_tags.BBCODE_ID}')" onmouseout="helpline('tip')"<!-- ENDIF --> /> +			<input type="button" class="btnbbcode bbcode-{custom_tags.BBCODE_TAG_CLEAN}" name="addbbcode{custom_tags.BBCODE_ID}" value="{custom_tags.BBCODE_TAG}" onclick="bbstyle({custom_tags.BBCODE_ID})"<!-- IF custom_tags.BBCODE_HELPLINE !== '' --> onmouseover="helpline('cb_{custom_tags.BBCODE_ID}')" onmouseout="helpline('tip')"<!-- ENDIF --> />  		<!-- END custom_tags -->  		</div>  		</td> diff --git a/tests/controller/controller_test.php b/tests/controller/controller_test.php index 588adbcfb1..550679ff07 100644 --- a/tests/controller/controller_test.php +++ b/tests/controller/controller_test.php @@ -21,20 +21,18 @@ class phpbb_controller_controller_test extends phpbb_test_case  		$this->extension_manager = new phpbb_mock_extension_manager(  			dirname(__FILE__) . '/',  			array( -				'foo' => array( -					'ext_name' => 'foo', +				'vendor2/foo' => array( +					'ext_name' => 'vendor2/foo',  					'ext_active' => '1', -					'ext_path' => 'ext/foo/', +					'ext_path' => 'ext/vendor2/foo/',  				),  			));  	}  	public function test_provider()  	{ -		$provider = new \phpbb\controller\provider; -		$routes = $provider -			->import_paths_from_finder($this->extension_manager->get_finder()) -			->find(__DIR__); +		$provider = new \phpbb\controller\provider($this->extension_manager->get_finder()); +		$routes = $provider->find(__DIR__)->get_routes();  		// This will need to be updated if any new routes are defined  		$this->assertInstanceOf('Symfony\Component\Routing\Route', $routes->get('core_controller')); @@ -52,7 +50,7 @@ class phpbb_controller_controller_test extends phpbb_test_case  		$container = new ContainerBuilder();  		// YamlFileLoader only uses one path at a time, so we need to loop  		// through all of the ones we are using. -		foreach (array(__DIR__.'/config', __DIR__.'/ext/foo/config') as $path) +		foreach (array(__DIR__.'/config', __DIR__ . '/ext/vendor2/foo/config') as $path)  		{  			$loader = new YamlFileLoader($container, new FileLocator($path));  			$loader->load('services.yml'); @@ -60,9 +58,9 @@ class phpbb_controller_controller_test extends phpbb_test_case  		// Autoloading classes within the tests folder does not work  		// so I'll include them manually. -		if (!class_exists('foo\\controller')) +		if (!class_exists('vendor2\\foo\\controller'))  		{ -			include(__DIR__.'/ext/foo/controller.php'); +			include(__DIR__ . '/ext/vendor2/foo/controller.php');  		}  		if (!class_exists('phpbb\\controller\\foo'))  		{ diff --git a/tests/controller/ext/foo/config/routing_2.yml b/tests/controller/ext/foo/config/routing_2.yml deleted file mode 100644 index 35fff27037..0000000000 --- a/tests/controller/ext/foo/config/routing_2.yml +++ /dev/null @@ -1,3 +0,0 @@ -controller2: -    pattern: /bar -    defaults: { _controller: foo.controller:handle } diff --git a/tests/controller/ext/foo/config/routing.yml b/tests/controller/ext/vendor2/foo/config/routing.yml index 6cc275d96d..6cc275d96d 100644 --- a/tests/controller/ext/foo/config/routing.yml +++ b/tests/controller/ext/vendor2/foo/config/routing.yml diff --git a/tests/controller/ext/vendor2/foo/config/routing_2.yml b/tests/controller/ext/vendor2/foo/config/routing_2.yml new file mode 100644 index 0000000000..d987a65aea --- /dev/null +++ b/tests/controller/ext/vendor2/foo/config/routing_2.yml @@ -0,0 +1,6 @@ +controller2: +    pattern: /bar +    defaults: { _controller: foo.controller:handle } +controller3: +    pattern: /bar/p-{p} +    defaults: { _controller: foo.controller:handle } diff --git a/tests/controller/ext/foo/config/services.yml b/tests/controller/ext/vendor2/foo/config/services.yml index 9ed67d5bc2..9ed67d5bc2 100644 --- a/tests/controller/ext/foo/config/services.yml +++ b/tests/controller/ext/vendor2/foo/config/services.yml diff --git a/tests/controller/ext/foo/controller.php b/tests/controller/ext/vendor2/foo/controller.php index ce2233b3c9..ce2233b3c9 100644 --- a/tests/controller/ext/foo/controller.php +++ b/tests/controller/ext/vendor2/foo/controller.php diff --git a/tests/controller/helper_route_test.php b/tests/controller/helper_route_test.php new file mode 100644 index 0000000000..5264c788c7 --- /dev/null +++ b/tests/controller/helper_route_test.php @@ -0,0 +1,128 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2013 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php'; + +class phpbb_controller_helper_route_test extends phpbb_test_case +{ +	public function setUp() +	{ +		global $phpbb_dispatcher, $phpbb_root_path, $phpEx; + +		$phpbb_dispatcher = new phpbb_mock_event_dispatcher; +		$this->user = $this->getMock('\phpbb\user'); +		$phpbb_path_helper = new \phpbb\path_helper( +			new \phpbb\symfony_request( +				new phpbb_mock_request() +			), +			new \phpbb\filesystem(), +			$phpbb_root_path, +			$phpEx +		); +		$this->config = new \phpbb\config\config(array('enable_mod_rewrite' => '0')); +		$this->template = new phpbb\template\twig\twig($phpbb_path_helper, $this->config, $this->user, new \phpbb\template\context()); + +		$finder = new \phpbb\extension\finder( +			new phpbb_mock_extension_manager( +				dirname(__FILE__) . '/', +				array( +					'vendor2/foo' => array( +						'ext_name' => 'vendor2/foo', +						'ext_active' => '1', +						'ext_path' => 'ext/vendor2/foo/', +					), +				) +			), +			new \phpbb\filesystem(), +			dirname(__FILE__) . '/', +			new phpbb_mock_cache() +		); +		$this->provider = new \phpbb\controller\provider($finder); +		$this->provider->find(dirname(__FILE__) . '/'); +	} + +	public function helper_url_data_no_rewrite() +	{ +		return array( +			array('controller2', array('t' => 1, 'f' => 2), true, false, 'app.php/foo/bar?t=1&f=2', 'parameters in params-argument as array'), +			array('controller2', array('t' => 1, 'f' => 2), false, false, 'app.php/foo/bar?t=1&f=2', 'parameters in params-argument as array'), +			array('controller3', array('p' => 3, 't' => 1, 'f' => 2), true, false, 'app.php/foo/bar/p-3?t=1&f=2', 'parameters in params-argument as array'), +			array('controller3', array('p' => 3, 't' => 1, 'f' => 2), false, false, 'app.php/foo/bar/p-3?t=1&f=2', 'parameters in params-argument as array'), + +			// Custom sid parameter +			array('controller2', array('t' => 1, 'f' => 2), true, 'custom-sid', 'app.php/foo/bar?t=1&f=2&sid=custom-sid', 'params-argument (array) using session_id'), +			array('controller2', array('t' => 1, 'f' => 2), false, 'custom-sid', 'app.php/foo/bar?t=1&f=2&sid=custom-sid', 'params-argument (array) using session_id'), +			array('controller3', array('p' => 3, 't' => 1, 'f' => 2), true, 'custom-sid', 'app.php/foo/bar/p-3?t=1&f=2&sid=custom-sid', 'params-argument (array) using session_id'), + +			// Testing anchors +			array('controller2', array('t' => 1, 'f' => 2, '#' => 'anchor'), true, false, 'app.php/foo/bar?t=1&f=2#anchor', 'anchor in params-argument (array)'), +			array('controller2', array('t' => 1, 'f' => 2, '#' => 'anchor'), false, false, 'app.php/foo/bar?t=1&f=2#anchor', 'anchor in params-argument (array)'), +			array('controller3', array('p' => 3, 't' => 1, 'f' => 2, '#' => 'anchor'), true, false, 'app.php/foo/bar/p-3?t=1&f=2#anchor', 'anchor in params-argument (array)'), + +			// Anchors and custom sid +			array('controller2', array('t' => 1, 'f' => 2, '#' => 'anchor'), true, 'custom-sid', 'app.php/foo/bar?t=1&f=2&sid=custom-sid#anchor', 'anchor in params-argument (array) using session_id'), +			array('controller2', array('t' => 1, 'f' => 2, '#' => 'anchor'), false, 'custom-sid', 'app.php/foo/bar?t=1&f=2&sid=custom-sid#anchor', 'anchor in params-argument (array) using session_id'), +			array('controller3', array('p' => 3, 't' => 1, 'f' => 2, '#' => 'anchor'), true, 'custom-sid', 'app.php/foo/bar/p-3?t=1&f=2&sid=custom-sid#anchor', 'anchor in params-argument (array) using session_id'), + +			// Empty parameters should not append the & or ? +			array('controller2', array(), true, false, 'app.php/foo/bar', 'no params using empty array'), +			array('controller2', array(), false, false, 'app.php/foo/bar', 'no params using empty array'), +			array('controller3', array('p' => 3), true, false, 'app.php/foo/bar/p-3', 'no params using empty array'), +		); +	} + +	/** +	* @dataProvider helper_url_data_no_rewrite() +	*/ +	public function test_helper_url_no_rewrite($route, $params, $is_amp, $session_id, $expected, $description) +	{ +		$this->helper = new \phpbb\controller\helper($this->template, $this->user, $this->config, $this->provider, '', 'php'); +		$this->assertEquals($expected, $this->helper->route($route, $params, $is_amp, $session_id)); +	} + +	public function helper_url_data_with_rewrite() +	{ +		return array( +			array('controller2', array('t' => 1, 'f' => 2), true, false, 'foo/bar?t=1&f=2', 'parameters in params-argument as array'), +			array('controller2', array('t' => 1, 'f' => 2), false, false, 'foo/bar?t=1&f=2', 'parameters in params-argument as array'), +			array('controller3', array('p' => 3, 't' => 1, 'f' => 2), true, false, 'foo/bar/p-3?t=1&f=2', 'parameters in params-argument as array'), +			array('controller3', array('p' => 3, 't' => 1, 'f' => 2), false, false, 'foo/bar/p-3?t=1&f=2', 'parameters in params-argument as array'), + +			// Custom sid parameter +			array('controller2', array('t' => 1, 'f' => 2), true, 'custom-sid', 'foo/bar?t=1&f=2&sid=custom-sid', 'params-argument (array) using session_id'), +			array('controller2', array('t' => 1, 'f' => 2), false, 'custom-sid', 'foo/bar?t=1&f=2&sid=custom-sid', 'params-argument (array) using session_id'), +			array('controller3', array('p' => 3, 't' => 1, 'f' => 2), true, 'custom-sid', 'foo/bar/p-3?t=1&f=2&sid=custom-sid', 'params-argument (array) using session_id'), + +			// Testing anchors +			array('controller2', array('t' => 1, 'f' => 2, '#' => 'anchor'), true, false, 'foo/bar?t=1&f=2#anchor', 'anchor in params-argument (array)'), +			array('controller2', array('t' => 1, 'f' => 2, '#' => 'anchor'), false, false, 'foo/bar?t=1&f=2#anchor', 'anchor in params-argument (array)'), +			array('controller3', array('p' => 3, 't' => 1, 'f' => 2, '#' => 'anchor'), true, false, 'foo/bar/p-3?t=1&f=2#anchor', 'anchor in params-argument (array)'), + +			// Anchors and custom sid +			array('controller2', array('t' => 1, 'f' => 2, '#' => 'anchor'), true, 'custom-sid', 'foo/bar?t=1&f=2&sid=custom-sid#anchor', 'anchor in params-argument (array) using session_id'), +			array('controller2', array('t' => 1, 'f' => 2, '#' => 'anchor'), false, 'custom-sid', 'foo/bar?t=1&f=2&sid=custom-sid#anchor', 'anchor in params-argument (array) using session_id'), +			array('controller3', array('p' => 3, 't' => 1, 'f' => 2, '#' => 'anchor'), true, 'custom-sid', 'foo/bar/p-3?t=1&f=2&sid=custom-sid#anchor', 'anchor in params-argument (array) using session_id'), + +			// Empty parameters should not append the & or ? +			array('controller2', array(), true, false, 'foo/bar', 'no params using empty array'), +			array('controller2', array(), false, false, 'foo/bar', 'no params using empty array'), +			array('controller3', array('p' => 3), true, false, 'foo/bar/p-3', 'no params using empty array'), +		); +	} + +	/** +	* @dataProvider helper_url_data_with_rewrite() +	*/ +	public function test_helper_url_with_rewrite($route, $params, $is_amp, $session_id, $expected, $description) +	{ +		$this->config = new \phpbb\config\config(array('enable_mod_rewrite' => '1')); +		$this->helper = new \phpbb\controller\helper($this->template, $this->user, $this->config, $this->provider, '', 'php'); +		$this->assertEquals($expected, $this->helper->route($route, $params, $is_amp, $session_id)); +	} +} diff --git a/tests/controller/helper_url_test.php b/tests/controller/helper_url_test.php deleted file mode 100644 index 33fc6c4f1b..0000000000 --- a/tests/controller/helper_url_test.php +++ /dev/null @@ -1,119 +0,0 @@ -<?php -/** -* -* @package testing -* @copyright (c) 2013 phpBB Group -* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 -* -*/ - -require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php'; - -class phpbb_controller_helper_url_test extends phpbb_test_case -{ - -	public function helper_url_data_no_rewrite() -	{ -		return array( -			array('foo/bar?t=1&f=2', false, true, false, 'app.php/foo/bar?t=1&f=2', 'parameters in url-argument'), -			array('foo/bar', 't=1&f=2', true, false, 'app.php/foo/bar?t=1&f=2', 'parameters in params-argument using amp'), -			array('foo/bar', 't=1&f=2', false, false, 'app.php/foo/bar?t=1&f=2', 'parameters in params-argument using &'), -			array('foo/bar', array('t' => 1, 'f' => 2), true, false, 'app.php/foo/bar?t=1&f=2', 'parameters in params-argument as array'), - -			// Custom sid parameter -			array('foo/bar', 't=1&f=2', true, 'custom-sid', 'app.php/foo/bar?t=1&f=2&sid=custom-sid', 'using session_id'), - -			// Testing anchors -			array('foo/bar?t=1&f=2#anchor', false, true, false, 'app.php/foo/bar?t=1&f=2#anchor', 'anchor in url-argument'), -			array('foo/bar', 't=1&f=2#anchor', true, false, 'app.php/foo/bar?t=1&f=2#anchor', 'anchor in params-argument'), -			array('foo/bar', array('t' => 1, 'f' => 2, '#' => 'anchor'), true, false, 'app.php/foo/bar?t=1&f=2#anchor', 'anchor in params-argument (array)'), - -			// Anchors and custom sid -			array('foo/bar?t=1&f=2#anchor', false, true, 'custom-sid', 'app.php/foo/bar?t=1&f=2&sid=custom-sid#anchor', 'anchor in url-argument using session_id'), -			array('foo/bar', 't=1&f=2#anchor', true, 'custom-sid', 'app.php/foo/bar?t=1&f=2&sid=custom-sid#anchor', 'anchor in params-argument using session_id'), -			array('foo/bar', array('t' => 1, 'f' => 2, '#' => 'anchor'), true, 'custom-sid', 'app.php/foo/bar?t=1&f=2&sid=custom-sid#anchor', 'anchor in params-argument (array) using session_id'), - -			// Empty parameters should not append the & -			array('foo/bar', false, true, false, 'app.php/foo/bar', 'no params using bool false'), -			array('foo/bar', '', true, false, 'app.php/foo/bar', 'no params using empty string'), -			array('foo/bar', array(), true, false, 'app.php/foo/bar', 'no params using empty array'), -		); -	} - -	/** -	* @dataProvider helper_url_data_no_rewrite() -	*/ -	public function test_helper_url_no_rewrite($route, $params, $is_amp, $session_id, $expected, $description) -	{ -		global $phpbb_dispatcher, $phpbb_root_path, $phpEx; - -		$phpbb_dispatcher = new phpbb_mock_event_dispatcher; -		$this->user = $this->getMock('\phpbb\user'); -		$phpbb_path_helper = new \phpbb\path_helper( -			new \phpbb\symfony_request( -				new phpbb_mock_request() -			), -			new \phpbb\filesystem(), -			$phpbb_root_path, -			$phpEx -		); -		$this->template = new phpbb\template\twig\twig($phpbb_path_helper, $config, $this->user, new \phpbb\template\context()); - -		// We don't use mod_rewrite in these tests -		$config = new \phpbb\config\config(array('enable_mod_rewrite' => '0')); -		$helper = new \phpbb\controller\helper($this->template, $this->user, $config, '', 'php'); -		$this->assertEquals($helper->url($route, $params, $is_amp, $session_id), $expected); -	} - -	public function helper_url_data_with_rewrite() -	{ -		return array( -			array('foo/bar?t=1&f=2', false, true, false, 'foo/bar?t=1&f=2', 'parameters in url-argument'), -			array('foo/bar', 't=1&f=2', true, false, 'foo/bar?t=1&f=2', 'parameters in params-argument using amp'), -			array('foo/bar', 't=1&f=2', false, false, 'foo/bar?t=1&f=2', 'parameters in params-argument using &'), -			array('foo/bar', array('t' => 1, 'f' => 2), true, false, 'foo/bar?t=1&f=2', 'parameters in params-argument as array'), - -			// Custom sid parameter -			array('foo/bar', 't=1&f=2', true, 'custom-sid', 'foo/bar?t=1&f=2&sid=custom-sid', 'using session_id'), - -			// Testing anchors -			array('foo/bar?t=1&f=2#anchor', false, true, false, 'foo/bar?t=1&f=2#anchor', 'anchor in url-argument'), -			array('foo/bar', 't=1&f=2#anchor', true, false, 'foo/bar?t=1&f=2#anchor', 'anchor in params-argument'), -			array('foo/bar', array('t' => 1, 'f' => 2, '#' => 'anchor'), true, false, 'foo/bar?t=1&f=2#anchor', 'anchor in params-argument (array)'), - -			// Anchors and custom sid -			array('foo/bar?t=1&f=2#anchor', false, true, 'custom-sid', 'foo/bar?t=1&f=2&sid=custom-sid#anchor', 'anchor in url-argument using session_id'), -			array('foo/bar', 't=1&f=2#anchor', true, 'custom-sid', 'foo/bar?t=1&f=2&sid=custom-sid#anchor', 'anchor in params-argument using session_id'), -			array('foo/bar', array('t' => 1, 'f' => 2, '#' => 'anchor'), true, 'custom-sid', 'foo/bar?t=1&f=2&sid=custom-sid#anchor', 'anchor in params-argument (array) using session_id'), - -			// Empty parameters should not append the & -			array('foo/bar', false, true, false, 'foo/bar', 'no params using bool false'), -			array('foo/bar', '', true, false, 'foo/bar', 'no params using empty string'), -			array('foo/bar', array(), true, false, 'foo/bar', 'no params using empty array'), -		); -	} - -	/** -	* @dataProvider helper_url_data_with_rewrite() -	*/ -	public function test_helper_url_with_rewrite($route, $params, $is_amp, $session_id, $expected, $description) -	{ -		global $phpbb_dispatcher, $phpbb_root_path, $phpEx; - -		$phpbb_dispatcher = new phpbb_mock_event_dispatcher; -		$this->user = $this->getMock('\phpbb\user'); -		$phpbb_path_helper = new \phpbb\path_helper( -			new \phpbb\symfony_request( -				new phpbb_mock_request() -			), -			new \phpbb\filesystem(), -			$phpbb_root_path, -			$phpEx -		); -		$this->template = new \phpbb\template\twig\twig($phpbb_path_helper, $config, $this->user, new \phpbb\template\context()); - -		$config = new \phpbb\config\config(array('enable_mod_rewrite' => '1')); -		$helper = new \phpbb\controller\helper($this->template, $this->user, $config, '', 'php'); -		$this->assertEquals($helper->url($route, $params, $is_amp, $session_id), $expected); -	} -} diff --git a/tests/functional/fixtures/ext/foo/bar/config/routing.yml b/tests/functional/fixtures/ext/foo/bar/config/routing.yml index a24d1cb986..08bc73038f 100644 --- a/tests/functional/fixtures/ext/foo/bar/config/routing.yml +++ b/tests/functional/fixtures/ext/foo/bar/config/routing.yml @@ -21,3 +21,15 @@ foo_login_redirect_controller:  foo_redirect_controller:      pattern: /foo/redirect      defaults: { _controller: foo_bar.controller:redirect } + +foo_index_controller: +    pattern: /index +    defaults: { _controller: foo_bar.controller:redirect } + +foo_tests_index_controller: +    pattern: /tests/index +    defaults: { _controller: foo_bar.controller:redirect } + +foo_tests_dotdot_index_controller: +    pattern: /tests/../index +    defaults: { _controller: foo_bar.controller:redirect } diff --git a/tests/functional/fixtures/ext/foo/bar/controller/controller.php b/tests/functional/fixtures/ext/foo/bar/controller/controller.php index 3b365bcfee..47d856a5df 100644 --- a/tests/functional/fixtures/ext/foo/bar/controller/controller.php +++ b/tests/functional/fixtures/ext/foo/bar/controller/controller.php @@ -77,40 +77,19 @@ class controller  				'tests/index.php',  			),  			array( -				$this->helper->url('index'), +				$this->helper->route('foo_index_controller'),  				$rewrite_prefix . 'index',  			),  			array( -				$this->helper->url('tests/index'), +				$this->helper->route('foo_tests_index_controller'),  				$rewrite_prefix . 'tests/index',  			), +			/** +			* Symfony does not allow /../ in routes  			array( -				$this->helper->url('tests/../index'), +				$this->helper->route('foo_tests_dotdot_index_controller'),  				$rewrite_prefix . 'index',  			), -			/* -			// helper URLs starting with  ../ are prone to failure. -			// Do not test them right now. -			array( -				$this->helper->url('../index'), -				'../index', -			), -			array( -				$this->helper->url('../../index'), -				'../index', -			), -			array( -				$this->helper->url('../tests/index'), -				$rewrite_prefix . '../tests/index', -			), -			array( -				$this->helper->url('../tests/../index'), -				'../index', -			), -			array( -				$this->helper->url('../../tests/index'), -				'../tests/index', -			),  			*/  		); diff --git a/tests/functional/search/mysql_test.php b/tests/functional/search/mysql_test.php index 7af8051417..52a7b14f40 100644 --- a/tests/functional/search/mysql_test.php +++ b/tests/functional/search/mysql_test.php @@ -16,8 +16,4 @@ class phpbb_functional_search_mysql_test extends phpbb_functional_search_base  {  	protected $search_backend = '\phpbb\search\fulltext_mysql'; -	protected function assert_search_not_found($keywords) -	{ -		$this->markTestIncomplete('MySQL search when fails doesn\'t show the search query'); -	}  } diff --git a/tests/functional/search/native_test.php b/tests/functional/search/native_test.php index ce568df616..512c6f2830 100644 --- a/tests/functional/search/native_test.php +++ b/tests/functional/search/native_test.php @@ -15,9 +15,4 @@ require_once dirname(__FILE__) . '/base.php';  class phpbb_functional_search_native_test extends phpbb_functional_search_base  {  	protected $search_backend = '\phpbb\search\fulltext_native'; - -	protected function assert_search_not_found($keywords) -	{ -		$this->markTestIncomplete('Native search when fails doesn\'t show the search query'); -	}  } diff --git a/tests/functional/search/postgres_test.php b/tests/functional/search/postgres_test.php index 487b8aeebb..974b417659 100644 --- a/tests/functional/search/postgres_test.php +++ b/tests/functional/search/postgres_test.php @@ -16,8 +16,4 @@ class phpbb_functional_search_postgres_test extends phpbb_functional_search_base  {  	protected $search_backend = '\phpbb\search\fulltext_postgres'; -	protected function assert_search_not_found($keywords) -	{ -		$this->markTestIncomplete('Postgres search when fails doesn\'t show the search query'); -	}  } diff --git a/tests/pagination/config/routing.yml b/tests/pagination/config/routing.yml new file mode 100644 index 0000000000..dd667274cd --- /dev/null +++ b/tests/pagination/config/routing.yml @@ -0,0 +1,6 @@ +core_controller: +    pattern: /test +    defaults: { _controller: core_foo.controller:bar, page: 1} +core_page_controller: +    pattern: /test/page/{page} +    defaults: { _controller: core_foo.controller:bar} diff --git a/tests/pagination/pagination_test.php b/tests/pagination/pagination_test.php index b7a4f101aa..71206dff58 100644 --- a/tests/pagination/pagination_test.php +++ b/tests/pagination/pagination_test.php @@ -21,11 +21,27 @@ class phpbb_pagination_pagination_test extends phpbb_template_template_test_case  	public function setUp()  	{  		parent::setUp(); -		$user = $this->getMock('\phpbb\user'); -		$user->expects($this->any()) + +		global $phpbb_dispatcher; + +		$phpbb_dispatcher = new phpbb_mock_event_dispatcher; +		$this->user = $this->getMock('\phpbb\user'); +		$this->user->expects($this->any())  			->method('lang')  			->will($this->returnCallback(array($this, 'return_callback_implode'))); -		$this->pagination = new \phpbb\pagination($this->template, $user); + +		$this->finder = new \phpbb\extension\finder( +			new phpbb_mock_extension_manager(dirname(__FILE__) . '/', array()), +			new \phpbb\filesystem(), +			dirname(__FILE__) . '/', +			new phpbb_mock_cache() +		); + +		$this->config = new \phpbb\config\config(array('enable_mod_rewrite' => '1')); +		$provider = new \phpbb\controller\provider($this->finder); +		$provider->find(dirname(__FILE__) . '/'); +		$this->helper = new \phpbb\controller\helper($this->template, $this->user, $this->config, $provider, '', 'php'); +		$this->pagination = new \phpbb\pagination($this->template, $this->user, $this->helper);  	}  	public function generate_template_pagination_data() @@ -77,15 +93,18 @@ class phpbb_pagination_pagination_test extends phpbb_template_template_test_case  				:u_next:page.php?start=30',  			),  			array( -				'test/page/%d', -				'/page/%d', +				array('routes' => array( +					'core_controller', +					'core_page_controller', +				)), +				'page',  				95,  				10,  				10,  				'pagination  				:per_page:10  				:current_page:2 -				:base_url:test/page/%d +				:base_url:  				:previous::test  				:else:1:test  				:current:2:test/page/2 @@ -99,15 +118,18 @@ class phpbb_pagination_pagination_test extends phpbb_template_template_test_case  				:u_next:test/page/3',  			),  			array( -				'test/page/%d', -				'/page/%d', +				array('routes' => array( +					'core_controller', +					'core_page_controller', +				)), +				'page',  				95,  				10,  				20,  				'pagination  				:per_page:10  				:current_page:3 -				:base_url:test/page/%d +				:base_url:  				:previous::test/page/2  				:else:1:test  				:else:2:test/page/2 diff --git a/tests/search/native_test.php b/tests/search/native_test.php index 18c6df2445..e860a4f89a 100644 --- a/tests/search/native_test.php +++ b/tests/search/native_test.php @@ -106,17 +106,66 @@ class phpbb_search_native_test extends phpbb_search_test_case  			array(  				'-foo',  				'all', -				false, -				null, -				null, +				true, +				array(), +				array(1),  				array(),  			),  			array(  				'-foo -bar',  				'all', -				false, -				null, -				null, +				true, +				array(), +				array(1, 2), +				array(), +			), +			array( +				'foo -foo', +				'all', +				true, +				array(1), +				array(1), +				array(), +			), +			array( +				'-foo foo', +				'all', +				true, +				array(1), +				array(1), +				array(), +			), +			// some creative edge cases +			array( +				'foo foo-', +				'all', +				true, +				array(1), +				array(), +				array(), +			), +			array( +				'foo- foo', +				'all', +				true, +				array(1), +				array(), +				array(), +			), +			array( +				'foo-bar', +				'all', +				true, +				array(1, 2), +				array(), +				array(), +			), +			array( +				'foo-bar-foo', +				'all', +				true, +				array(1, 2), +				array(),  				array(),  			),  			// all common diff --git a/tests/security/hash_test.php b/tests/security/hash_test.php index bc1bebd87a..32aa234316 100644 --- a/tests/security/hash_test.php +++ b/tests/security/hash_test.php @@ -7,7 +7,7 @@  *  */ -require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php'; +require_once dirname(__FILE__) . '/../../phpBB/includes/functions_compatibility.php';  class phpbb_security_hash_test extends phpbb_test_case  { diff --git a/tests/security/redirect_test.php b/tests/security/redirect_test.php index 77dc955c26..e5ff3b1541 100644 --- a/tests/security/redirect_test.php +++ b/tests/security/redirect_test.php @@ -15,11 +15,8 @@ class phpbb_security_redirect_test extends phpbb_security_test_base  {  	protected $path_helper; -	protected $controller_helper; -  	public function provider()  	{ -		$this->controller_helper = $this->get_controller_helper();  		// array(Input -> redirect(), expected triggered error (else false), expected returned result url (else false))  		return array(  			array('data://x', false, false, 'http://localhost/phpBB'), @@ -38,8 +35,8 @@ class phpbb_security_redirect_test extends phpbb_security_test_base  			array('./../foo/bar', false, false, 'http://localhost/foo/bar'),  			array('./../foo/bar', true, false, 'http://localhost/foo/bar'),  			array('app.php/', false, false, 'http://localhost/phpBB/app.php/'), -			array($this->controller_helper->url('a'), false, false, 'http://localhost/phpBB/app.php/a'), -			array($this->controller_helper->url(''), false, false, 'http://localhost/phpBB/app.php/'), +			array('app.php/a', false, false, 'http://localhost/phpBB/app.php/a'), +			array('app.php/a/b', false, false, 'http://localhost/phpBB/app.php/a/b'),  			array('./app.php/', false, false, 'http://localhost/phpBB/app.php/'),  			array('foobar', false, false, 'http://localhost/phpBB/foobar'),  			array('./foobar', false, false, 'http://localhost/phpBB/foobar'), @@ -69,31 +66,6 @@ class phpbb_security_redirect_test extends phpbb_security_test_base  		return $this->path_helper;  	} -	protected function get_controller_helper() -	{ -		if (!($this->controller_helper instanceof \phpbb\controller\helper)) -		{ -			global $phpbb_dispatcher; - -			$phpbb_dispatcher = new phpbb_mock_event_dispatcher; -			$this->user = $this->getMock('\phpbb\user'); -			$phpbb_path_helper = new \phpbb\path_helper( -				new \phpbb\symfony_request( -					new phpbb_mock_request() -				), -				new \phpbb\filesystem(), -				$phpbb_root_path, -				$phpEx -			); -			$this->template = new phpbb\template\twig\twig($phpbb_path_helper, $config, $this->user, new \phpbb\template\context()); - -			// We don't use mod_rewrite in these tests -			$config = new \phpbb\config\config(array('enable_mod_rewrite' => '0')); -			$this->controller_helper = new \phpbb\controller\helper($this->template, $this->user, $config, '', 'php'); -		} -		return $this->controller_helper; -	} -  	protected function setUp()  	{  		parent::setUp(); @@ -103,7 +75,6 @@ class phpbb_security_redirect_test extends phpbb_security_test_base  		);  		$this->path_helper = $this->get_path_helper(); -		$this->controller_helper = $this->get_controller_helper();  	}  	/** diff --git a/tests/template/template_test.php b/tests/template/template_test.php index 6e9b7d3ee9..aaf55fd15c 100644 --- a/tests/template/template_test.php +++ b/tests/template/template_test.php @@ -562,6 +562,40 @@ EOT  		$this->assertEquals($expect, str_replace(array("\n", "\r", "\t"), '', $this->display('test')), 'Ensuring S_NUM_ROWS is correct after modification');  	} +	public function assign_block_vars_array_data() +	{ +		return array( +			array( +				array( +					'outer' => array( +						array('VARIABLE' => 'Test assigning block vars array loop 0:'), +						array('VARIABLE' => 'Test assigning block vars array loop 1:'), +					), +					'outer.middle' => array( +						array('VARIABLE' => '1st iteration',), +						array('VARIABLE' => '2nd iteration',), +						array('VARIABLE' => '3rd iteration',), +					), +				) +			) +		); +	} + +	/** +	* @dataProvider assign_block_vars_array_data +	*/ +	public function test_assign_block_vars_array($block_data) +	{ +		$this->template->set_filenames(array('test' => 'loop_nested.html')); + +		foreach ($block_data as $blockname => $block_vars_array) +		{ +			$this->template->assign_block_vars_array($blockname, $block_vars_array); +		} + +		$this->assertEquals("outer - 0 - Test assigning block vars array loop 0:outer - 1 - Test assigning block vars array loop 1:middle - 0 - 1st iterationmiddle - 1 - 2nd iterationmiddle - 2 - 3rd iteration", $this->display('test'), 'Ensuring assigning block vars array to template is working correctly'); +	} +  	/**  	* @expectedException Twig_Error_Syntax  	*/ diff --git a/tests/tree/nestedset_forum_get_data_test.php b/tests/tree/nestedset_forum_get_data_test.php index ca1863e55e..a0d0778e82 100644 --- a/tests/tree/nestedset_forum_get_data_test.php +++ b/tests/tree/nestedset_forum_get_data_test.php @@ -116,4 +116,20 @@ class phpbb_tests_tree_nestedset_forum_get_data_test extends phpbb_tests_tree_ne  		$forum_data['forum_parents'] = $forum_parents;  		$this->assertEquals($expected, array_keys($this->set->get_path_basic_data($forum_data)));  	} + +	public function get_all_tree_data_data() +	{ +		return array( +			array(true, array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)), +			array(false, array(11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)), +		); +	} + +	/** +	* @dataProvider get_all_tree_data_data +	*/ +	public function test_get_all_tree_data($order_asc, $expected) +	{ +		$this->assertEquals($expected, array_keys($this->set->get_all_tree_data($order_asc))); +	}  } | 
