diff options
Diffstat (limited to 'phpBB')
45 files changed, 1259 insertions, 391 deletions
diff --git a/phpBB/common.php b/phpBB/common.php index c7c5859c25..281eb88c4d 100644 --- a/phpBB/common.php +++ b/phpBB/common.php @@ -8,6 +8,10 @@  * Minimum Requirement: PHP 5.3.2  */ +use Symfony\Component\Config\FileLocator; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; +  /**  */  if (!defined('IN_PHPBB')) @@ -15,8 +19,6 @@ if (!defined('IN_PHPBB'))  	exit;  } -use Symfony\Component\EventDispatcher\EventDispatcher; -  require($phpbb_root_path . 'includes/startup.' . $phpEx);  if (file_exists($phpbb_root_path . 'config.' . $phpEx)) @@ -74,61 +76,61 @@ if (!empty($load_extensions) && function_exists('dl'))  // Include files  require($phpbb_root_path . 'includes/class_loader.' . $phpEx); +require($phpbb_root_path . 'includes/di/processor/interface.' . $phpEx); +require($phpbb_root_path . 'includes/di/processor/config.' . $phpEx);  require($phpbb_root_path . 'includes/functions.' . $phpEx);  require($phpbb_root_path . 'includes/functions_content.' . $phpEx);  require($phpbb_root_path . 'includes/constants.' . $phpEx); -require($phpbb_root_path . 'includes/db/' . $dbms . '.' . $phpEx); +require($phpbb_root_path . 'includes/db/' . ltrim($dbms, 'dbal_') . '.' . $phpEx);  require($phpbb_root_path . 'includes/utf/utf_tools.' . $phpEx);  // Set PHP error handler to ours  set_error_handler(defined('PHPBB_MSG_HANDLER') ? PHPBB_MSG_HANDLER : 'msg_handler'); +$phpbb_container = new ContainerBuilder(); +$loader = new YamlFileLoader($phpbb_container, new FileLocator(__DIR__.'/config')); +$loader->load('services.yml'); + +$processor = new phpbb_di_processor_config($phpbb_root_path . 'config.' . $phpEx, $phpbb_root_path, $phpEx); +$processor->process($phpbb_container); +  // Setup class loader first -$phpbb_class_loader_ext = new phpbb_class_loader('phpbb_ext_', $phpbb_root_path . 'ext/', ".$phpEx"); -$phpbb_class_loader_ext->register(); -$phpbb_class_loader = new phpbb_class_loader('phpbb_', $phpbb_root_path . 'includes/', ".$phpEx"); -$phpbb_class_loader->register(); +$phpbb_class_loader = $phpbb_container->get('class_loader'); +$phpbb_class_loader_ext = $phpbb_container->get('class_loader.ext'); + +$ids = array_keys($phpbb_container->findTaggedServiceIds('container.processor')); +foreach ($ids as $id) +{ +	$processor = $phpbb_container->get($id); +	$processor->process($phpbb_container); +}  // set up caching -$cache_factory = new phpbb_cache_factory($acm_type); -$cache = $cache_factory->get_service(); -$phpbb_class_loader_ext->set_cache($cache->get_driver()); -$phpbb_class_loader->set_cache($cache->get_driver()); +$cache = $phpbb_container->get('cache');  // Instantiate some basic classes -$phpbb_dispatcher = new phpbb_event_dispatcher(); -$request	= new phpbb_request(); -$user		= new phpbb_user(); -$auth		= new phpbb_auth(); -$db			= new $sql_db(); +$phpbb_dispatcher = $phpbb_container->get('dispatcher'); +$request	= $phpbb_container->get('request'); +$user		= $phpbb_container->get('user'); +$auth		= $phpbb_container->get('auth'); +$db			= $phpbb_container->get('dbal.conn');  // make sure request_var uses this request instance  request_var('', 0, false, false, $request); // "dependency injection" for a function -// Connect to DB -$db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false, defined('PHPBB_DB_NEW_LINK') ? PHPBB_DB_NEW_LINK : false); - -// We do not need this any longer, unset for safety purposes -unset($dbpasswd); -  // Grab global variables, re-cache if necessary -$config = new phpbb_config_db($db, $cache->get_driver(), CONFIG_TABLE); +$config = $phpbb_container->get('config');  set_config(null, null, null, $config);  set_config_count(null, null, null, $config);  // load extensions -$phpbb_extension_manager = new phpbb_extension_manager($db, EXT_TABLE, $phpbb_root_path, ".$phpEx", $cache->get_driver()); - -// Initialize style -$phpbb_style_resource_locator = new phpbb_style_resource_locator(); -$phpbb_style_path_provider = new phpbb_style_extension_path_provider($phpbb_extension_manager, new phpbb_style_path_provider()); -$template = new phpbb_template($phpbb_root_path, $phpEx, $config, $user, $phpbb_style_resource_locator); -$phpbb_style = new phpbb_style($phpbb_root_path, $phpEx, $config, $user, $phpbb_style_resource_locator, $phpbb_style_path_provider, $template); +$phpbb_extension_manager = $phpbb_container->get('ext.manager'); +$phpbb_subscriber_loader = $phpbb_container->get('event.subscriber_loader'); -$phpbb_subscriber_loader = new phpbb_event_extension_subscriber_loader($phpbb_dispatcher, $phpbb_extension_manager); -$phpbb_subscriber_loader->load(); +$template = $phpbb_container->get('template'); +$phpbb_style = $phpbb_container->get('style');  // Add own hook handler  require($phpbb_root_path . 'includes/hooks/index.' . $phpEx); @@ -141,7 +143,7 @@ foreach ($cache->obtain_hooks() as $hook)  if (!$config['use_system_cron'])  { -	$cron = new phpbb_cron_manager(new phpbb_cron_task_provider($phpbb_extension_manager), $cache->get_driver()); +	$cron = $phpbb_container->get('cron.manager');  }  /** diff --git a/phpBB/composer.json b/phpBB/composer.json index 5340fb85f2..5e88144bc4 100644 --- a/phpBB/composer.json +++ b/phpBB/composer.json @@ -1,7 +1,10 @@  {  	"minimum-stability": "beta",  	"require": { -		"symfony/event-dispatcher": "2.1.*" +		"symfony/config": "2.1.*", +		"symfony/dependency-injection": "2.1.*", +		"symfony/event-dispatcher": "2.1.*", +		"symfony/yaml": "2.1.*"  	},  	"require-dev": {  		"fabpot/goutte": "1.0.x-dev" diff --git a/phpBB/composer.lock b/phpBB/composer.lock index 99e19554ab..6b0d3584d1 100644 --- a/phpBB/composer.lock +++ b/phpBB/composer.lock @@ -1,9 +1,21 @@  { -    "hash": "b2daff7465c71d924e915e72454ac266", +    "hash": "1632798bc1d5298a4f5bd3087c972a9f",      "packages": [          { +            "package": "symfony/config", +            "version": "v2.1.0-RC1" +        }, +        { +            "package": "symfony/dependency-injection", +            "version": "v2.1.0-RC1" +        }, +        {              "package": "symfony/event-dispatcher", -            "version": "v2.1.0-BETA3" +            "version": "v2.1.0-RC1" +        }, +        { +            "package": "symfony/yaml", +            "version": "v2.1.0-RC1"          }      ],      "packages-dev": [ @@ -16,32 +28,40 @@          {              "package": "fabpot/goutte",              "version": "dev-master", -            "source-reference": "c2ea8d9a6682d14482e57ede2371001b8a5238d2", -            "commit-date": "1340264258" +            "source-reference": "6d26279344736f6983a969e46afef082ebf30a67", +            "commit-date": "1345141401" +        }, +        { +            "package": "guzzle/common", +            "version": "v2.8.4" +        }, +        { +            "package": "guzzle/http", +            "version": "v2.8.4"          },          { -            "package": "guzzle/guzzle", -            "version": "v2.6.6" +            "package": "guzzle/parser", +            "version": "v2.8.4"          },          {              "package": "symfony/browser-kit", -            "version": "v2.1.0-BETA3" +            "version": "v2.1.0-RC1"          },          {              "package": "symfony/css-selector", -            "version": "v2.1.0-BETA3" +            "version": "v2.1.0-RC1"          },          {              "package": "symfony/dom-crawler", -            "version": "v2.1.0-BETA3" +            "version": "v2.1.0-RC1"          },          {              "package": "symfony/finder", -            "version": "v2.1.0-BETA3" +            "version": "v2.1.0-RC1"          },          {              "package": "symfony/process", -            "version": "v2.1.0-BETA3" +            "version": "v2.1.0-RC1"          }      ],      "aliases": [ diff --git a/phpBB/config/.htaccess b/phpBB/config/.htaccess new file mode 100644 index 0000000000..4128d345ab --- /dev/null +++ b/phpBB/config/.htaccess @@ -0,0 +1,4 @@ +<Files *> +	Order Allow,Deny +	Deny from All +</Files> diff --git a/phpBB/config/cron_tasks.yml b/phpBB/config/cron_tasks.yml new file mode 100644 index 0000000000..74f57e449d --- /dev/null +++ b/phpBB/config/cron_tasks.yml @@ -0,0 +1,75 @@ +services: +    cron.task.core.prune_all_forums: +        class: phpbb_cron_task_core_prune_all_forums +        arguments: +            - %core.root_path% +            - %core.php_ext% +            - @config +            - @dbal.conn +        tags: +            - { name: cron.task } + +    cron.task.core.prune_forum: +        class: phpbb_cron_task_core_prune_forum +        arguments: +            - %core.root_path% +            - %core.php_ext% +            - @config +            - @dbal.conn +        tags: +            - { name: cron.task } + +    cron.task.core.queue: +        class: phpbb_cron_task_core_queue +        arguments: +            - %core.root_path% +            - %core.php_ext% +            - @config +        tags: +            - { name: cron.task } + +    cron.task.core.tidy_cache: +        class: phpbb_cron_task_core_tidy_cache +        arguments: +            - @config +            - @cache.driver +        tags: +            - { name: cron.task } + +    cron.task.core.tidy_database: +        class: phpbb_cron_task_core_tidy_database +        arguments: +            - %core.root_path% +            - %core.php_ext% +            - @config +        tags: +            - { name: cron.task } + +    cron.task.core.tidy_search: +        class: phpbb_cron_task_core_tidy_search +        arguments: +            - %core.root_path% +            - %core.php_ext% +            - @auth +            - @config +            - @dbal.conn +            - @user +        tags: +            - { name: cron.task } + +    cron.task.core.tidy_sessions: +        class: phpbb_cron_task_core_tidy_sessions +        arguments: +            - @config +            - @user +        tags: +            - { name: cron.task } + +    cron.task.core.tidy_warnings: +        class: phpbb_cron_task_core_tidy_warnings +        arguments: +            - %core.root_path% +            - %core.php_ext% +            - @config +        tags: +            - { name: cron.task } diff --git a/phpBB/config/services.yml b/phpBB/config/services.yml new file mode 100644 index 0000000000..84de37c28c --- /dev/null +++ b/phpBB/config/services.yml @@ -0,0 +1,135 @@ +imports: +    - { resource: tables.yml } +    - { resource: cron_tasks.yml } + +services: +    auth: +        class: phpbb_auth + +    cache: +        class: phpbb_cache_service +        arguments: +             - @cache.driver + +    cache.driver: +        class: %cache.driver.class% + +    cache.driver.install: +        class: phpbb_cache_driver_file + +    class_loader: +        class: phpbb_class_loader +        arguments: +            - phpbb_ +            - %core.root_path%includes/ +            - .%core.php_ext% +        calls: +            - [register, []] +            - [set_cache, [@cache.driver]] + +    class_loader.ext: +        class: phpbb_class_loader +        arguments: +            - phpbb_ext_ +            - %core.root_path%ext/ +            - .%core.php_ext% +        calls: +            - [register, []] +            - [set_cache, [@cache.driver]] + +    config: +        class: phpbb_config_db +        arguments: +            - @dbal.conn +            - @cache.driver +            - %tables.config% + +    cron.task_provider: +        class: phpbb_cron_task_provider +        arguments: +            - @container + +    cron.manager: +        class: phpbb_cron_manager +        arguments: +            - @cron.task_provider +            - %core.root_path% +            - %core.php_ext% + +    cron.lock_db: +        class: phpbb_lock_db +        arguments: +            - cron_lock +            - @config +            - @dbal.conn + +    dispatcher: +        class: phpbb_event_dispatcher + +    dbal.conn: +        class: %dbal.driver.class% +        calls: +            - [sql_connect, [%dbal.dbhost%, %dbal.dbuser%, %dbal.dbpasswd%, %dbal.dbname%, %dbal.dbport%, false, %dbal.new_link%]] + +    event.subscriber_loader: +        class: phpbb_event_extension_subscriber_loader +        arguments: +            - @dispatcher +            - @ext.manager +        calls: +            - [load, []] + +    ext.manager: +        class: phpbb_extension_manager +        arguments: +            - @dbal.conn +            - %tables.ext% +            - %core.root_path% +            - .%core.php_ext% +            - @cache.driver + +    processor.config: +        class: phpbb_di_processor_ext +        arguments: +            - @ext.manager +        tags: +            - { name: container.processor } + +    request: +        class: phpbb_request + +    style: +        class: phpbb_style +        arguments: +            - %core.root_path% +            - %core.php_ext% +            - @config +            - @user +            - @style.resource_locator +            - @style.path_provider_ext +            - @template + +    style.resource_locator: +        class: phpbb_style_resource_locator + +    style.path_provider_ext: +        class: phpbb_style_extension_path_provider +        arguments: +            - @ext.manager +            - @style.path_provider + +    style.path_provider: +        class: phpbb_style_path_provider + +    template: +        class: phpbb_template +        arguments: +            - %core.root_path% +            - %core.php_ext% +            - @config +            - @user +            - @style.resource_locator +            - @style.path_provider_ext + +    user: +        class: phpbb_user diff --git a/phpBB/config/tables.yml b/phpBB/config/tables.yml new file mode 100644 index 0000000000..cfc6dbcfed --- /dev/null +++ b/phpBB/config/tables.yml @@ -0,0 +1,3 @@ +parameters: +    tables.config: %core.table_prefix%config +    tables.ext: %core.table_prefix%ext diff --git a/phpBB/cron.php b/phpBB/cron.php index 36b771f1b7..95d2f8f9b6 100644 --- a/phpBB/cron.php +++ b/phpBB/cron.php @@ -61,7 +61,7 @@ function do_cron($cron_lock, $run_tasks)  if ($config['use_system_cron'])  { -	$cron = new phpbb_cron_manager(new phpbb_cron_task_provider($phpbb_extension_manager), $cache->get_driver()); +	$cron = $phpbb_container->get('cron.manager');  }  else  { @@ -71,7 +71,7 @@ else  	output_image();  } -$cron_lock = new phpbb_lock_db('cron_lock', $config, $db); +$cron_lock = $phpbb_container->get('cron.lock_db');  if ($cron_lock->acquire())  {  	if ($config['use_system_cron']) diff --git a/phpBB/download/file.php b/phpBB/download/file.php index c01b0789de..8766c6d030 100644 --- a/phpBB/download/file.php +++ b/phpBB/download/file.php @@ -7,6 +7,10 @@  *  */ +use Symfony\Component\Config\FileLocator; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; +  /**  * @ignore  */ @@ -14,7 +18,6 @@ define('IN_PHPBB', true);  $phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './../';  $phpEx = substr(strrchr(__FILE__, '.'), 1); -  // Thank you sun.  if (isset($_SERVER['CONTENT_TYPE']))  { @@ -39,26 +42,38 @@ if (isset($_GET['avatar']))  	}  	require($phpbb_root_path . 'includes/class_loader.' . $phpEx); +	require($phpbb_root_path . 'includes/di/processor/interface.' . $phpEx); +	require($phpbb_root_path . 'includes/di/processor/config.' . $phpEx); +  	require($phpbb_root_path . 'includes/db/' . $dbms . '.' . $phpEx);  	require($phpbb_root_path . 'includes/constants.' . $phpEx);  	require($phpbb_root_path . 'includes/functions.' . $phpEx);  	require($phpbb_root_path . 'includes/functions_download' . '.' . $phpEx);  	require($phpbb_root_path . 'includes/utf/utf_tools.' . $phpEx); -	$phpbb_class_loader_ext = new phpbb_class_loader('phpbb_ext_', $phpbb_root_path . 'ext/', ".$phpEx"); -	$phpbb_class_loader_ext->register(); -	$phpbb_class_loader = new phpbb_class_loader('phpbb_', $phpbb_root_path . 'includes/', ".$phpEx"); -	$phpbb_class_loader->register(); +	$phpbb_container = new ContainerBuilder(); +	$loader = new YamlFileLoader($phpbb_container, new FileLocator(__DIR__.'/../config')); +	$loader->load('services.yml'); + +	$processor = new phpbb_di_processor_config($phpbb_root_path . 'config.' . $phpEx, $phpbb_root_path, $phpEx); +	$processor->process($phpbb_container); + +	$phpbb_class_loader = $phpbb_container->get('class_loader'); +	$phpbb_class_loader_ext = $phpbb_container->get('class_loader.ext'); + +	$ids = array_keys($phpbb_container->findTaggedServiceIds('container.processor')); +	foreach ($ids as $id) +	{ +		$processor = $phpbb_container->get($id); +		$processor->process($phpbb_container); +	}  	// set up caching -	$cache_factory = new phpbb_cache_factory($acm_type); -	$cache = $cache_factory->get_service(); -	$phpbb_class_loader_ext->set_cache($cache->get_driver()); -	$phpbb_class_loader->set_cache($cache->get_driver()); +	$cache = $phpbb_container->get('cache'); -	$phpbb_dispatcher = new phpbb_event_dispatcher(); -	$request = new phpbb_request(); -	$db = new $sql_db(); +	$phpbb_dispatcher = $phpbb_container->get('dispatcher'); +	$request	= $phpbb_container->get('request'); +	$db			= $phpbb_container->get('dbal.conn');  	// Connect to DB  	if (!@$db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false, false)) @@ -69,18 +84,16 @@ if (isset($_GET['avatar']))  	request_var('', 0, false, false, $request); -	// worst-case default -	$browser = strtolower($request->header('User-Agent', 'msie 6.0')); - -	$config = new phpbb_config_db($db, $cache->get_driver(), CONFIG_TABLE); +	$config = $phpbb_container->get('config');  	set_config(null, null, null, $config);  	set_config_count(null, null, null, $config);  	// load extensions -	$phpbb_extension_manager = new phpbb_extension_manager($db, EXT_TABLE, $phpbb_root_path, ".$phpEx", $cache->get_driver()); +	$phpbb_extension_manager = $phpbb_container->get('ext.manager'); +	$phpbb_subscriber_loader = $phpbb_container->get('event.subscriber_loader'); -	$phpbb_subscriber_loader = new phpbb_event_extension_subscriber_loader($phpbb_dispatcher, $phpbb_extension_manager); -	$phpbb_subscriber_loader->load(); +	// worst-case default +	$browser = strtolower($request->header('User-Agent', 'msie 6.0'));  	$filename = request_var('avatar', '');  	$avatar_group = false; @@ -134,6 +147,9 @@ include($phpbb_root_path . 'common.' . $phpEx);  require($phpbb_root_path . 'includes/functions_download' . '.' . $phpEx);  $download_id = request_var('id', 0); +$topic_id = $request->variable('topic_id', 0); +$post_msg_id = $request->variable('post_msg_id', 0); +$archive = $request->variable('archive', '.tar');  $mode = request_var('mode', '');  $thumbnail = request_var('t', false); @@ -142,195 +158,268 @@ $user->session_begin(false);  $auth->acl($user->data);  $user->setup('viewtopic'); -if (!$download_id) +if (!$config['allow_attachments'] && !$config['allow_pm_attach'])  {  	send_status_line(404, 'Not Found'); -	trigger_error('NO_ATTACHMENT_SELECTED'); +	trigger_error('ATTACHMENT_FUNCTIONALITY_DISABLED');  } -if (!$config['allow_attachments'] && !$config['allow_pm_attach']) +if ($download_id) +{ +	// Attachment id (only 1 attachment) +	$sql_where = "attach_id = $download_id"; +} +else if ($post_msg_id) +{ +	// Post id or private message id (multiple attachments) +	$sql_where = "post_msg_id = $post_msg_id AND is_orphan = 0"; +} +else if ($topic_id) +{ +	// Topic id (multiple attachments) +	$sql_where = "topic_id = $topic_id AND is_orphan = 0"; +} +else  {  	send_status_line(404, 'Not Found'); -	trigger_error('ATTACHMENT_FUNCTIONALITY_DISABLED'); +	trigger_error('NO_ATTACHMENT_SELECTED');  } -$sql = 'SELECT attach_id, in_message, post_msg_id, extension, is_orphan, poster_id, filetime +$sql = 'SELECT attach_id, post_msg_id, topic_id, in_message, is_orphan, physical_filename, real_filename, extension, mimetype, filesize, filetime  	FROM ' . ATTACHMENTS_TABLE . " -	WHERE attach_id = $download_id"; -$result = $db->sql_query_limit($sql, 1); -$attachment = $db->sql_fetchrow($result); +	WHERE $sql_where"; +$result = $db->sql_query($sql); + +$attachments = $attachment_ids = array(); +while ($row = $db->sql_fetchrow($result)) +{ +	$attachment_id = (int) $row['attach_id']; + +	$row['physical_filename'] = utf8_basename($row['physical_filename']); + +	$attachment_ids[$attachment_id] = $attachment_id; +	$attachments[$attachment_id] = $row; +}  $db->sql_freeresult($result); -if (!$attachment) +// Make $attachment the first of the attachments we fetched. +$attachment = current($attachments); + +if (empty($attachments))  {  	send_status_line(404, 'Not Found');  	trigger_error('ERROR_NO_ATTACHMENT');  } - -if ((!$attachment['in_message'] && !$config['allow_attachments']) || ($attachment['in_message'] && !$config['allow_pm_attach'])) +else if (!download_allowed())  { -	send_status_line(404, 'Not Found'); -	trigger_error('ATTACHMENT_FUNCTIONALITY_DISABLED'); +	send_status_line(403, 'Forbidden'); +	trigger_error($user->lang['LINKAGE_FORBIDDEN']);  } - -$row = array(); - -if ($attachment['is_orphan']) +else if ($download_id)  { -	// We allow admins having attachment permissions to see orphan attachments... -	$own_attachment = ($auth->acl_get('a_attach') || $attachment['poster_id'] == $user->data['user_id']) ? true : false; +	// sizeof($attachments) == 1 -	if (!$own_attachment || ($attachment['in_message'] && !$auth->acl_get('u_pm_download')) || (!$attachment['in_message'] && !$auth->acl_get('u_download'))) +	if (!$attachment['in_message'] && !$config['allow_attachments'] || $attachment['in_message'] && !$config['allow_pm_attach'])  	{  		send_status_line(404, 'Not Found'); -		trigger_error('ERROR_NO_ATTACHMENT'); +		trigger_error('ATTACHMENT_FUNCTIONALITY_DISABLED');  	} -	// Obtain all extensions... -	$extensions = $cache->obtain_attach_extensions(true); -} -else -{ -	if (!$attachment['in_message']) +	if ($attachment['is_orphan'])  	{ -		// -		$sql = 'SELECT p.forum_id, f.forum_password, f.parent_id -			FROM ' . POSTS_TABLE . ' p, ' . FORUMS_TABLE . ' f -			WHERE p.post_id = ' . $attachment['post_msg_id'] . ' -				AND p.forum_id = f.forum_id'; -		$result = $db->sql_query_limit($sql, 1); -		$row = $db->sql_fetchrow($result); -		$db->sql_freeresult($result); - -		$f_download = $auth->acl_get('f_download', $row['forum_id']); - -		if ($auth->acl_get('u_download') && $f_download) -		{ -			if ($row && $row['forum_password']) -			{ -				// Do something else ... ? -				login_forum_box($row); -			} -		} -		else +		// We allow admins having attachment permissions to see orphan attachments... +		$own_attachment = ($auth->acl_get('a_attach') || $attachment['poster_id'] == $user->data['user_id']) ? true : false; + +		if (!$own_attachment || ($attachment['in_message'] && !$auth->acl_get('u_pm_download')) || (!$attachment['in_message'] && !$auth->acl_get('u_download')))  		{ -			send_status_line(403, 'Forbidden'); -			trigger_error('SORRY_AUTH_VIEW_ATTACH'); +			send_status_line(404, 'Not Found'); +			trigger_error('ERROR_NO_ATTACHMENT');  		} + +		// Obtain all extensions... +		$extensions = $cache->obtain_attach_extensions(true);  	}  	else  	{ -		$row['forum_id'] = false; -		if (!$auth->acl_get('u_pm_download')) +		if (!$attachment['in_message'])  		{ -			send_status_line(403, 'Forbidden'); -			trigger_error('SORRY_AUTH_VIEW_ATTACH'); +			phpbb_download_handle_forum_auth($db, $auth, $attachment['topic_id']); +		} +		else +		{ +			// Attachment is in a private message. +			$row['forum_id'] = false; +			phpbb_download_handle_pm_auth($db, $auth, $user->data['user_id'], $attachment['post_msg_id']); +		} + +		$extensions = array(); +		if (!extension_allowed($row['forum_id'], $attachment['extension'], $extensions)) +		{ +			send_status_line(404, 'Forbidden'); +			trigger_error(sprintf($user->lang['EXTENSION_DISABLED_AFTER_POSTING'], $attachment['extension']));  		} +	} + +	$download_mode = (int) $extensions[$attachment['extension']]['download_mode']; +	$display_cat = $extensions[$attachment['extension']]['display_cat']; + +	if (($display_cat == ATTACHMENT_CATEGORY_IMAGE || $display_cat == ATTACHMENT_CATEGORY_THUMB) && !$user->optionget('viewimg')) +	{ +		$display_cat = ATTACHMENT_CATEGORY_NONE; +	} -		// Check if the attachment is within the users scope... -		$sql = 'SELECT user_id, author_id -			FROM ' . PRIVMSGS_TO_TABLE . ' -			WHERE msg_id = ' . $attachment['post_msg_id']; -		$result = $db->sql_query($sql); +	if ($display_cat == ATTACHMENT_CATEGORY_FLASH && !$user->optionget('viewflash')) +	{ +		$display_cat = ATTACHMENT_CATEGORY_NONE; +	} -		$allowed = false; -		while ($user_row = $db->sql_fetchrow($result)) +	if ($thumbnail) +	{ +		$attachment['physical_filename'] = 'thumb_' . $attachment['physical_filename']; +	} +	else if ($display_cat == ATTACHMENT_CATEGORY_NONE && !$attachment['is_orphan'] && !phpbb_http_byte_range($attachment['filesize'])) +	{ +		// Update download count +		phpbb_increment_downloads($db, $attachment['attach_id']); +	} + +	if ($display_cat == ATTACHMENT_CATEGORY_IMAGE && $mode === 'view' && (strpos($attachment['mimetype'], 'image') === 0) && ((strpos(strtolower($user->browser), 'msie') !== false) && (strpos(strtolower($user->browser), 'msie 8.0') === false))) +	{ +		wrap_img_in_html(append_sid($phpbb_root_path . 'download/file.' . $phpEx, 'id=' . $attachment['attach_id']), $attachment['real_filename']); +		file_gc(); +	} +	else +	{ +		// Determine the 'presenting'-method +		if ($download_mode == PHYSICAL_LINK)  		{ -			if ($user->data['user_id'] == $user_row['user_id'] || $user->data['user_id'] == $user_row['author_id']) +			// This presenting method should no longer be used +			if (!@is_dir($phpbb_root_path . $config['upload_path']))  			{ -				$allowed = true; -				break; +				send_status_line(500, 'Internal Server Error'); +				trigger_error($user->lang['PHYSICAL_DOWNLOAD_NOT_POSSIBLE']);  			} -		} -		$db->sql_freeresult($result); -		if (!$allowed) +			redirect($phpbb_root_path . $config['upload_path'] . '/' . $attachment['physical_filename']); +			file_gc(); +		} +		else  		{ -			send_status_line(403, 'Forbidden'); -			trigger_error('ERROR_NO_ATTACHMENT'); +			send_file_to_browser($attachment, $config['upload_path'], $display_cat); +			file_gc();  		}  	} +} +else +{ +	// sizeof($attachments) >= 1 +	if ($attachment['in_message']) +	{ +		phpbb_download_handle_pm_auth($db, $auth, $user->data['user_id'], $attachment['post_msg_id']); +	} +	else +	{ +		phpbb_download_handle_forum_auth($db, $auth, $attachment['topic_id']); +	} -	// disallowed? -	$extensions = array(); -	if (!extension_allowed($row['forum_id'], $attachment['extension'], $extensions)) +	if (!class_exists('compress'))  	{ -		send_status_line(404, 'Forbidden'); -		trigger_error(sprintf($user->lang['EXTENSION_DISABLED_AFTER_POSTING'], $attachment['extension'])); +		require $phpbb_root_path . 'includes/functions_compress.' . $phpEx;  	} -} -if (!download_allowed()) -{ -	send_status_line(403, 'Forbidden'); -	trigger_error($user->lang['LINKAGE_FORBIDDEN']); -} +	if (!in_array($archive, compress::methods())) +	{ +		$archive = '.tar'; +	} -$download_mode = (int) $extensions[$attachment['extension']]['download_mode']; +	if ($post_msg_id) +	{ +		if ($attachment['in_message']) +		{ +			$sql = 'SELECT message_subject AS attach_subject +				FROM ' . PRIVMSGS_TABLE . " +				WHERE msg_id = $post_msg_id"; +		} +		else +		{ +			$sql = 'SELECT post_subject AS attach_subject, forum_id +				FROM ' . POSTS_TABLE . " +				WHERE post_id = $post_msg_id"; +		} +	} +	else +	{ +		$sql = 'SELECT topic_title AS attach_subject, forum_id +			FROM ' . TOPICS_TABLE . " +			WHERE topic_id = $topic_id"; +	} -// Fetching filename here to prevent sniffing of filename -$sql = 'SELECT attach_id, is_orphan, in_message, post_msg_id, extension, physical_filename, real_filename, mimetype, filesize, filetime -	FROM ' . ATTACHMENTS_TABLE . " -	WHERE attach_id = $download_id"; -$result = $db->sql_query_limit($sql, 1); -$attachment = $db->sql_fetchrow($result); -$db->sql_freeresult($result); +	$result = $db->sql_query($sql); +	$row = $db->sql_fetchrow($result); +	$db->sql_freeresult($result); -if (!$attachment) -{ -	send_status_line(404, 'Not Found'); -	trigger_error('ERROR_NO_ATTACHMENT'); -} +	if (empty($row)) +	{ +		send_status_line(404, 'Not Found'); +		trigger_error('ERROR_NO_ATTACHMENT'); +	} -$attachment['physical_filename'] = utf8_basename($attachment['physical_filename']); -$display_cat = $extensions[$attachment['extension']]['display_cat']; +	$clean_name = phpbb_download_clean_filename($row['attach_subject']); +	$suffix = '_' . (($post_msg_id) ? $post_msg_id : $topic_id) . '_' . $clean_name; +	$archive_name = 'attachments' . $suffix; -if (($display_cat == ATTACHMENT_CATEGORY_IMAGE || $display_cat == ATTACHMENT_CATEGORY_THUMB) && !$user->optionget('viewimg')) -{ -	$display_cat = ATTACHMENT_CATEGORY_NONE; -} +	$store_name = 'att_' . time() . '_' . unique_id(); +	$archive_path = "{$phpbb_root_path}store/{$store_name}{$archive}"; -if ($display_cat == ATTACHMENT_CATEGORY_FLASH && !$user->optionget('viewflash')) -{ -	$display_cat = ATTACHMENT_CATEGORY_NONE; -} +	if ($archive === '.zip') +	{ +		$compress = new compress_zip('w', $archive_path); +	} +	else +	{ +		$compress = new compress_tar('w', $archive_path, $archive); +	} -if ($thumbnail) -{ -	$attachment['physical_filename'] = 'thumb_' . $attachment['physical_filename']; -} -else if (($display_cat == ATTACHMENT_CATEGORY_NONE/* || $display_cat == ATTACHMENT_CATEGORY_IMAGE*/) && !$attachment['is_orphan'] && !phpbb_http_byte_range($attachment['filesize'])) -{ -	// Update download count -	$sql = 'UPDATE ' . ATTACHMENTS_TABLE . ' -		SET download_count = download_count + 1 -		WHERE attach_id = ' . $attachment['attach_id']; -	$db->sql_query($sql); -} +	$extensions = array(); +	$files_added = 0; +	$forum_id = ($attachment['in_message']) ? false : (int) $row['forum_id']; +	$disallowed = array(); -if ($display_cat == ATTACHMENT_CATEGORY_IMAGE && $mode === 'view' && (strpos($attachment['mimetype'], 'image') === 0) && ((strpos(strtolower($user->browser), 'msie') !== false) && (strpos(strtolower($user->browser), 'msie 8.0') === false))) -{ -	wrap_img_in_html(append_sid($phpbb_root_path . 'download/file.' . $phpEx, 'id=' . $attachment['attach_id']), $attachment['real_filename']); -	file_gc(); -} -else -{ -	// Determine the 'presenting'-method -	if ($download_mode == PHYSICAL_LINK) +	foreach ($attachments as $attach)  	{ -		// This presenting method should no longer be used -		if (!@is_dir($phpbb_root_path . $config['upload_path'])) +		if (!extension_allowed($forum_id, $attach['extension'], $extensions))  		{ -			send_status_line(500, 'Internal Server Error'); -			trigger_error($user->lang['PHYSICAL_DOWNLOAD_NOT_POSSIBLE']); +			$disallowed[$attach['extension']] = $attach['extension']; +			continue; +		} +		 +		$prefix = ''; +		if ($topic_id) +		{ +			$prefix = $attach['post_msg_id'] . '_';  		} -		redirect($phpbb_root_path . $config['upload_path'] . '/' . $attachment['physical_filename']); -		file_gc(); +		$compress->add_custom_file("{$phpbb_root_path}files/{$attach['physical_filename']}", "{$prefix}{$attach['real_filename']}"); +		$files_added++;  	} -	else + +	$compress->close(); + +	if ($files_added)  	{ -		send_file_to_browser($attachment, $config['upload_path'], $display_cat); -		file_gc(); +		phpbb_increment_downloads($db, $attachment_ids); +		$compress->download($store_name, $archive_name);  	} + +	unlink($archive_path); + +	if (!$files_added) +	{ +		// None of the attachments had a valid extension +		$disallowed = implode($user->lang['COMMA_SEPARATOR'], $disallowed); +		send_status_line(404, 'Forbidden'); +		trigger_error($user->lang('EXTENSION_DISABLED_AFTER_POSTING', $disallowed)); +	} + +	file_gc();  } diff --git a/phpBB/includes/cache/driver/memory.php b/phpBB/includes/cache/driver/memory.php index 92971c6cb2..e0771ab1d3 100644 --- a/phpBB/includes/cache/driver/memory.php +++ b/phpBB/includes/cache/driver/memory.php @@ -19,7 +19,7 @@ if (!defined('IN_PHPBB'))  * ACM Abstract Memory Class  * @package acm  */ -class phpbb_cache_driver_memory extends phpbb_cache_driver_base +abstract class phpbb_cache_driver_memory extends phpbb_cache_driver_base  {  	var $key_prefix; diff --git a/phpBB/includes/cache/driver/redis.php b/phpBB/includes/cache/driver/redis.php index a768885962..a768885962 100755..100644 --- a/phpBB/includes/cache/driver/redis.php +++ b/phpBB/includes/cache/driver/redis.php diff --git a/phpBB/includes/cache/factory.php b/phpBB/includes/cache/factory.php deleted file mode 100644 index 01c4d0b901..0000000000 --- a/phpBB/includes/cache/factory.php +++ /dev/null @@ -1,42 +0,0 @@ -<?php -/** -* -* @package acm -* @copyright (c) 2010 phpBB Group -* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 -* -*/ - -/** -* @ignore -*/ -if (!defined('IN_PHPBB')) -{ -	exit; -} - -/** -* @package acm -*/ -class phpbb_cache_factory -{ -	private $acm_type; - -	public function __construct($acm_type) -	{ -		$this->acm_type = $acm_type; -	} - -	public function get_driver() -	{ -		$class_name = 'phpbb_cache_driver_' . $this->acm_type; -		return new $class_name(); -	} - -	public function get_service() -	{ -		$driver = $this->get_driver(); -		$service = new phpbb_cache_service($driver); -		return $service; -	} -} diff --git a/phpBB/includes/cron/manager.php b/phpBB/includes/cron/manager.php index 7a78a1b054..ccaa4f3764 100644 --- a/phpBB/includes/cron/manager.php +++ b/phpBB/includes/cron/manager.php @@ -32,31 +32,35 @@ class phpbb_cron_manager  	*/  	protected $tasks = array(); +	protected $phpbb_root_path; +	protected $php_ext; +  	/**  	* Constructor. Loads all available tasks.  	* -	* @param array|Traversable $task_names Provides an iterable set of task names +	* @param array|Traversable $tasks Provides an iterable set of task names  	*/ -	public function __construct($task_names) +	public function __construct($tasks, $phpbb_root_path, $php_ext)  	{ -		$this->load_tasks($task_names); +		$this->phpbb_root_path = $phpbb_root_path; +		$this->php_ext = $php_ext; + +		$this->load_tasks($tasks);  	}  	/**  	* Loads tasks given by name, wraps them  	* and puts them into $this->tasks.  	* -	* @param array|Traversable $task_names		Array of strings +	* @param array|Traversable $tasks		Array of instances of phpbb_cron_task  	*  	* @return void  	*/ -	public function load_tasks($task_names) +	public function load_tasks($tasks)  	{ -		foreach ($task_names as $task_name) +		foreach ($tasks as $task)  		{ -			$task = new $task_name(); -			$wrapper = new phpbb_cron_task_wrapper($task); -			$this->tasks[] = $wrapper; +			$this->tasks[] = $this->wrap_task($task);  		}  	} @@ -122,25 +126,13 @@ class phpbb_cron_manager  	}  	/** -	* Creates an instance of parametrized cron task $name with args $args. -	* The constructed task is wrapped with cron task wrapper before being returned. -	* -	* @param string $name		The task name, which is the same as cron task class name. -	* @param array $args		Will be passed to the task class's constructor. +	* Wraps a task inside an instance of phpbb_cron_task_wrapper.  	* -	* @return phpbb_cron_task_wrapper|null +	* @param  phpbb_cron_task 			$task The task. +	* @return phpbb_cron_task_wrapper	The wrapped task.  	*/ -	public function instantiate_task($name, array $args) +	public function wrap_task(phpbb_cron_task $task)  	{ -		$task = $this->find_task($name); -		if ($task) -		{ -			// task here is actually an instance of cron task wrapper -			$class = $task->get_name(); -			$task = new $class($args); -			// need to wrap the new task too -			$task = new phpbb_cron_task_wrapper($task); -		} -		return $task; +		return new phpbb_cron_task_wrapper($task, $this->phpbb_root_path, $this->php_ext);  	}  } diff --git a/phpBB/includes/cron/task/base.php b/phpBB/includes/cron/task/base.php index c05fb9a87c..94a2f267b4 100644 --- a/phpBB/includes/cron/task/base.php +++ b/phpBB/includes/cron/task/base.php @@ -28,6 +28,28 @@ if (!defined('IN_PHPBB'))  */  abstract class phpbb_cron_task_base implements phpbb_cron_task  { +	private $name; + +	/** +	* Returns the name of the task. +	* +	* @return string		Name of wrapped task. +	*/ +	public function get_name() +	{ +		return $this->name; +	} + +	/** +	* Sets the name of the task. +	* +	* @param string	$name The task name +	*/ +	public function set_name($name) +	{ +		$this->name = $name; +	} +  	/**  	* Returns whether this cron task can run, given current board configuration.  	* diff --git a/phpBB/includes/cron/task/core/prune_all_forums.php b/phpBB/includes/cron/task/core/prune_all_forums.php index 15b93a9ca6..252e16e57d 100644 --- a/phpBB/includes/cron/task/core/prune_all_forums.php +++ b/phpBB/includes/cron/task/core/prune_all_forums.php @@ -26,6 +26,27 @@ if (!defined('IN_PHPBB'))  */  class phpbb_cron_task_core_prune_all_forums extends phpbb_cron_task_base  { +	protected $phpbb_root_path; +	protected $php_ext; +	protected $config; +	protected $db; + +	/** +	* Constructor. +	* +	* @param string $phpbb_root_path The root path +	* @param string $php_ext The PHP extension +	* @param phpbb_config $config The config +	* @param dbal $db The db connection +	*/ +	public function __construct($phpbb_root_path, $php_ext, phpbb_config $config, dbal $db) +	{ +		$this->phpbb_root_path = $phpbb_root_path; +		$this->php_ext = $php_ext; +		$this->config = $config; +		$this->db = $db; +	} +  	/**  	* Runs this cron task.  	* @@ -33,19 +54,17 @@ class phpbb_cron_task_core_prune_all_forums extends phpbb_cron_task_base  	*/  	public function run()  	{ -		global $phpbb_root_path, $phpEx, $db; -  		if (!function_exists('auto_prune'))  		{ -			include($phpbb_root_path . 'includes/functions_admin.' . $phpEx); +			include($this->phpbb_root_path . 'includes/functions_admin.' . $this->php_ext);  		}  		$sql = 'SELECT forum_id, prune_next, enable_prune, prune_days, prune_viewed, forum_flags, prune_freq  			FROM ' . FORUMS_TABLE . " -			WHERE enable_prune = 1  +			WHERE enable_prune = 1  				AND prune_next < " . time(); -		$result = $db->sql_query($sql); -		while ($row = $db->sql_fetchrow($result)) +		$result = $this->db->sql_query($sql); +		while ($row = $this->db->sql_fetchrow($result))  		{  			if ($row['prune_days'])  			{ @@ -57,7 +76,7 @@ class phpbb_cron_task_core_prune_all_forums extends phpbb_cron_task_base  				auto_prune($row['forum_id'], 'viewed', $row['forum_flags'], $row['prune_viewed'], $row['prune_freq']);  			}  		} -		$db->sql_freeresult($result); +		$this->db->sql_freeresult($result);  	}  	/** @@ -69,7 +88,6 @@ class phpbb_cron_task_core_prune_all_forums extends phpbb_cron_task_base  	*/  	public function is_runnable()  	{ -		global $config; -		return (bool) $config['use_system_cron']; +		return (bool) $this->config['use_system_cron'];  	}  } diff --git a/phpBB/includes/cron/task/core/prune_forum.php b/phpBB/includes/cron/task/core/prune_forum.php index 7686fd4281..41d60af921 100644 --- a/phpBB/includes/cron/task/core/prune_forum.php +++ b/phpBB/includes/cron/task/core/prune_forum.php @@ -26,31 +26,45 @@ if (!defined('IN_PHPBB'))  */  class phpbb_cron_task_core_prune_forum extends phpbb_cron_task_base implements phpbb_cron_task_parametrized  { -	private $forum_data; +	protected $phpbb_root_path; +	protected $php_ext; +	protected $config; +	protected $db;  	/** -	* Constructor. -	*  	* If $forum_data is given, it is assumed to contain necessary information  	* about a single forum that is to be pruned.  	*  	* If $forum_data is not given, forum id will be retrieved via request_var  	* and a database query will be performed to load the necessary information  	* about the forum. +	*/ +	protected $forum_data; + +	/** +	* Constructor. +	* +	* @param string $phpbb_root_path The root path +	* @param string $php_ext The PHP extension +	* @param phpbb_config $config The config +	* @param dbal $db The db connection +	*/ +	public function __construct($phpbb_root_path, $php_ext, phpbb_config $config, dbal $db) +	{ +		$this->phpbb_root_path = $phpbb_root_path; +		$this->php_ext = $php_ext; +		$this->config = $config; +		$this->db = $db; +	} + +	/** +	* Manually set forum data.  	*  	* @param array $forum_data Information about a forum to be pruned.  	*/ -	public function __construct($forum_data = null) +	public function set_forum_data($forum_data)  	{ -		global $db; -		if ($forum_data) -		{ -			$this->forum_data = $forum_data; -		} -		else -		{ -			$this->forum_data = null; -		} +		$this->forum_data = $forum_data;  	}  	/** @@ -60,10 +74,9 @@ class phpbb_cron_task_core_prune_forum extends phpbb_cron_task_base implements p  	*/  	public function run()  	{ -		global $phpbb_root_path, $phpEx;  		if (!function_exists('auto_prune'))  		{ -			include($phpbb_root_path . 'includes/functions_admin.' . $phpEx); +			include($this->phpbb_root_path . 'includes/functions_admin.' . $this->php_ext);  		}  		if ($this->forum_data['prune_days']) @@ -90,8 +103,7 @@ class phpbb_cron_task_core_prune_forum extends phpbb_cron_task_base implements p  	*/  	public function is_runnable()  	{ -		global $config; -		return !$config['use_system_cron'] && $this->forum_data; +		return !$this->config['use_system_cron'] && $this->forum_data;  	}  	/** @@ -130,8 +142,6 @@ class phpbb_cron_task_core_prune_forum extends phpbb_cron_task_base implements p  	*/  	public function parse_parameters(phpbb_request_interface $request)  	{ -		global $db; -  		$this->forum_data = null;  		if ($request->is_set('f'))  		{ @@ -140,9 +150,9 @@ class phpbb_cron_task_core_prune_forum extends phpbb_cron_task_base implements p  			$sql = 'SELECT forum_id, prune_next, enable_prune, prune_days, prune_viewed, forum_flags, prune_freq  				FROM ' . FORUMS_TABLE . "  				WHERE forum_id = $forum_id"; -			$result = $db->sql_query($sql); -			$row = $db->sql_fetchrow($result); -			$db->sql_freeresult($result); +			$result = $this->db->sql_query($sql); +			$row = $this->db->sql_fetchrow($result); +			$this->db->sql_freeresult($result);  			if ($row)  			{ diff --git a/phpBB/includes/cron/task/core/queue.php b/phpBB/includes/cron/task/core/queue.php index 1c72eec7c7..c765660906 100644 --- a/phpBB/includes/cron/task/core/queue.php +++ b/phpBB/includes/cron/task/core/queue.php @@ -22,6 +22,24 @@ if (!defined('IN_PHPBB'))  */  class phpbb_cron_task_core_queue extends phpbb_cron_task_base  { +	protected $phpbb_root_path; +	protected $php_ext; +	protected $config; + +	/** +	* Constructor. +	* +	* @param string $phpbb_root_path The root path +	* @param string $php_ext The PHP extension +	* @param phpbb_config $config The config +	*/ +	public function __construct($phpbb_root_path, $php_ext, phpbb_config $config) +	{ +		$this->phpbb_root_path = $phpbb_root_path; +		$this->php_ext = $php_ext; +		$this->config = $config; +	} +  	/**  	* Runs this cron task.  	* @@ -29,10 +47,9 @@ class phpbb_cron_task_core_queue extends phpbb_cron_task_base  	*/  	public function run()  	{ -		global $phpbb_root_path, $phpEx;  		if (!class_exists('queue'))  		{ -			include($phpbb_root_path . 'includes/functions_messenger.' . $phpEx); +			include($this->phpbb_root_path . 'includes/functions_messenger.' . $this->php_ext);  		}  		$queue = new queue();  		$queue->process(); @@ -47,8 +64,7 @@ class phpbb_cron_task_core_queue extends phpbb_cron_task_base  	*/  	public function is_runnable()  	{ -		global $phpbb_root_path, $phpEx; -		return file_exists($phpbb_root_path . 'cache/queue.' . $phpEx); +		return file_exists($this->phpbb_root_path . 'cache/queue.' . $this->php_ext);  	}  	/** @@ -61,7 +77,6 @@ class phpbb_cron_task_core_queue extends phpbb_cron_task_base  	*/  	public function should_run()  	{ -		global $config; -		return $config['last_queue_run'] < time() - $config['queue_interval_config']; +		return $this->config['last_queue_run'] < time() - $this->config['queue_interval_config'];  	}  } diff --git a/phpBB/includes/cron/task/core/tidy_cache.php b/phpBB/includes/cron/task/core/tidy_cache.php index f6cf77d01d..6017eea561 100644 --- a/phpBB/includes/cron/task/core/tidy_cache.php +++ b/phpBB/includes/cron/task/core/tidy_cache.php @@ -22,6 +22,21 @@ if (!defined('IN_PHPBB'))  */  class phpbb_cron_task_core_tidy_cache extends phpbb_cron_task_base  { +	protected $config; +	protected $cache; + +	/** +	* Constructor. +	* +	* @param phpbb_config $config The config +	* @param phpbb_cache_driver_interface $cache The cache driver +	*/ +	public function __construct(phpbb_config $config, phpbb_cache_driver_interface $cache) +	{ +		$this->config = $config; +		$this->cache = $cache; +	} +  	/**  	* Runs this cron task.  	* @@ -29,8 +44,7 @@ class phpbb_cron_task_core_tidy_cache extends phpbb_cron_task_base  	*/  	public function run()  	{ -		global $cache; -		$cache->tidy(); +		$this->cache->tidy();  	}  	/** @@ -57,7 +71,6 @@ class phpbb_cron_task_core_tidy_cache extends phpbb_cron_task_base  	*/  	public function should_run()  	{ -		global $config; -		return $config['cache_last_gc'] < time() - $config['cache_gc']; +		return $this->config['cache_last_gc'] < time() - $this->config['cache_gc'];  	}  } diff --git a/phpBB/includes/cron/task/core/tidy_database.php b/phpBB/includes/cron/task/core/tidy_database.php index 80a1901b1e..1d256f964f 100644 --- a/phpBB/includes/cron/task/core/tidy_database.php +++ b/phpBB/includes/cron/task/core/tidy_database.php @@ -22,6 +22,24 @@ if (!defined('IN_PHPBB'))  */  class phpbb_cron_task_core_tidy_database extends phpbb_cron_task_base  { +	protected $phpbb_root_path; +	protected $php_ext; +	protected $config; + +	/** +	* Constructor. +	* +	* @param string $phpbb_root_path The root path +	* @param string $php_ext The PHP extension +	* @param phpbb_config $config The config +	*/ +	public function __construct($phpbb_root_path, $php_ext, phpbb_config $config) +	{ +		$this->phpbb_root_path = $phpbb_root_path; +		$this->php_ext = $php_ext; +		$this->config = $config; +	} +  	/**  	* Runs this cron task.  	* @@ -29,10 +47,9 @@ class phpbb_cron_task_core_tidy_database extends phpbb_cron_task_base  	*/  	public function run()  	{ -		global $phpbb_root_path, $phpEx;  		if (!function_exists('tidy_database'))  		{ -			include($phpbb_root_path . 'includes/functions_admin.' . $phpEx); +			include($this->phpbb_root_path . 'includes/functions_admin.' . $this->php_ext);  		}  		tidy_database();  	} @@ -48,7 +65,6 @@ class phpbb_cron_task_core_tidy_database extends phpbb_cron_task_base  	*/  	public function should_run()  	{ -		global $config; -		return $config['database_last_gc'] < time() - $config['database_gc']; +		return $this->config['database_last_gc'] < time() - $this->config['database_gc'];  	}  } diff --git a/phpBB/includes/cron/task/core/tidy_search.php b/phpBB/includes/cron/task/core/tidy_search.php index 7855c3760a..2e5f3d79d5 100644 --- a/phpBB/includes/cron/task/core/tidy_search.php +++ b/phpBB/includes/cron/task/core/tidy_search.php @@ -24,6 +24,33 @@ if (!defined('IN_PHPBB'))  */  class phpbb_cron_task_core_tidy_search extends phpbb_cron_task_base  { +	protected $phpbb_root_path; +	protected $php_ext; +	protected $auth; +	protected $config; +	protected $db; +	protected $user; + +	/** +	* Constructor. +	* +	* @param string $phpbb_root_path The root path +	* @param string $php_ext The PHP extension +	* @param phpbb_auth $auth The auth +	* @param phpbb_config $config The config +	* @param dbal $db The db connection +	* @param phpbb_user $user The user +	*/ +	public function __construct($phpbb_root_path, $php_ext, phpbb_auth $auth, phpbb_config $config, dbal $db, phpbb_user $user) +	{ +		$this->phpbb_root_path = $phpbb_root_path; +		$this->php_ext = $php_ext; +		$this->auth = $auth; +		$this->config = $config; +		$this->db = $db; +		$this->user = $user; +	} +  	/**  	* Runs this cron task.  	* @@ -31,19 +58,17 @@ class phpbb_cron_task_core_tidy_search extends phpbb_cron_task_base  	*/  	public function run()  	{ -		global $phpbb_root_path, $phpEx, $config, $error, $auth, $db, $user; -  		// Select the search method -		$search_type = basename($config['search_type']); +		$search_type = basename($this->config['search_type']);  		if (!class_exists($search_type))  		{ -			include("{$phpbb_root_path}includes/search/$search_type.$phpEx"); +			include($this->phpbb_root_path . "includes/search/$search_type." . $this->php_ext);  		}  		// We do some additional checks in the module to ensure it can actually be utilised  		$error = false; -		$search = new $search_type($error, $phpbb_root_path, $phpEx, $auth, $config, $db, $user); +		$search = new $search_type($error, $this->phpbb_root_path, $this->php_ext, $this->auth, $this->config, $this->db, $this->user);  		if (!$error)  		{ @@ -62,12 +87,10 @@ class phpbb_cron_task_core_tidy_search extends phpbb_cron_task_base  	*/  	public function is_runnable()  	{ -		global $phpbb_root_path, $phpEx, $config; -  		// Select the search method -		$search_type = basename($config['search_type']); +		$search_type = basename($this->config['search_type']); -		return file_exists($phpbb_root_path . 'includes/search/' . $search_type . '.' . $phpEx); +		return file_exists($this->phpbb_root_path . 'includes/search/' . $search_type . '.' . $this->php_ext);  	}  	/** @@ -81,7 +104,6 @@ class phpbb_cron_task_core_tidy_search extends phpbb_cron_task_base  	*/  	public function should_run()  	{ -		global $config; -		return $config['search_last_gc'] < time() - $config['search_gc']; +		return $this->config['search_last_gc'] < time() - $this->config['search_gc'];  	}  } diff --git a/phpBB/includes/cron/task/core/tidy_sessions.php b/phpBB/includes/cron/task/core/tidy_sessions.php index ae7bb242b8..13531aa30b 100644 --- a/phpBB/includes/cron/task/core/tidy_sessions.php +++ b/phpBB/includes/cron/task/core/tidy_sessions.php @@ -22,6 +22,21 @@ if (!defined('IN_PHPBB'))  */  class phpbb_cron_task_core_tidy_sessions extends phpbb_cron_task_base  { +	protected $config; +	protected $user; + +	/** +	* Constructor. +	* +	* @param phpbb_config $config The config +	* @param phpbb_user $user The user +	*/ +	public function __construct(phpbb_config $config, phpbb_user $user) +	{ +		$this->config = $config; +		$this->user = $user; +	} +  	/**  	* Runs this cron task.  	* @@ -29,8 +44,7 @@ class phpbb_cron_task_core_tidy_sessions extends phpbb_cron_task_base  	*/  	public function run()  	{ -		global $user; -		$user->session_gc(); +		$this->user->session_gc();  	}  	/** @@ -44,7 +58,6 @@ class phpbb_cron_task_core_tidy_sessions extends phpbb_cron_task_base  	*/  	public function should_run()  	{ -		global $config; -		return $config['session_last_gc'] < time() - $config['session_gc']; +		return $this->config['session_last_gc'] < time() - $this->config['session_gc'];  	}  } diff --git a/phpBB/includes/cron/task/core/tidy_warnings.php b/phpBB/includes/cron/task/core/tidy_warnings.php index e1434e7087..8dd0674fe5 100644 --- a/phpBB/includes/cron/task/core/tidy_warnings.php +++ b/phpBB/includes/cron/task/core/tidy_warnings.php @@ -24,6 +24,24 @@ if (!defined('IN_PHPBB'))  */  class phpbb_cron_task_core_tidy_warnings extends phpbb_cron_task_base  { +	protected $phpbb_root_path; +	protected $php_ext; +	protected $config; + +	/** +	* Constructor. +	* +	* @param string $phpbb_root_path The root path +	* @param string $php_ext The PHP extension +	* @param phpbb_config $config The config +	*/ +	public function __construct($phpbb_root_path, $php_ext, phpbb_config $config) +	{ +		$this->phpbb_root_path = $phpbb_root_path; +		$this->php_ext = $php_ext; +		$this->config = $config; +	} +  	/**  	* Runs this cron task.  	* @@ -31,10 +49,9 @@ class phpbb_cron_task_core_tidy_warnings extends phpbb_cron_task_base  	*/  	public function run()  	{ -		global $phpbb_root_path, $phpEx;  		if (!function_exists('tidy_warnings'))  		{ -			include($phpbb_root_path . 'includes/functions_admin.' . $phpEx); +			include($this->phpbb_root_path . 'includes/functions_admin.' . $this->php_ext);  		}  		tidy_warnings();  	} @@ -48,8 +65,7 @@ class phpbb_cron_task_core_tidy_warnings extends phpbb_cron_task_base  	*/  	public function is_runnable()  	{ -		global $config; -		return (bool) $config['warnings_expire_days']; +		return (bool) $this->config['warnings_expire_days'];  	}  	/** @@ -63,7 +79,6 @@ class phpbb_cron_task_core_tidy_warnings extends phpbb_cron_task_base  	*/  	public function should_run()  	{ -		global $config; -		return $config['warnings_last_gc'] < time() - $config['warnings_gc']; +		return $this->config['warnings_last_gc'] < time() - $this->config['warnings_gc'];  	}  } diff --git a/phpBB/includes/cron/task/provider.php b/phpBB/includes/cron/task/provider.php index 1482051699..134723ebd1 100644 --- a/phpBB/includes/cron/task/provider.php +++ b/phpBB/includes/cron/task/provider.php @@ -15,6 +15,8 @@ if (!defined('IN_PHPBB'))  	exit;  } +use Symfony\Component\DependencyInjection\TaggedContainerInterface; +  /**  * Provides cron manager with tasks  * @@ -22,27 +24,36 @@ if (!defined('IN_PHPBB'))  *  * @package phpBB3  */ -class phpbb_cron_task_provider extends phpbb_extension_provider +class phpbb_cron_task_provider implements IteratorAggregate  { +	private $container; + +	public function __construct(TaggedContainerInterface $container) +	{ +		$this->container = $container; +	} +  	/** -	* Finds cron task names using the extension manager. -	* -	* All PHP files in includes/cron/task/core/ are considered tasks. Tasks -	* in extensions have to be located in a directory called cron or a subdir -	* of a directory called cron. The class and filename must end in a _task -	* suffix. Additionally all PHP files in includes/cron/task/core/ are -	* tasks. +	* Retrieve an iterator over all items  	* -	* @return array     List of task names +	* @return ArrayIterator An iterator for the array of cron tasks  	*/ -	protected function find() +	public function getIterator()  	{ -		$finder = $this->extension_manager->get_finder(); +		$definitions = $this->container->findTaggedServiceIds('cron.task'); + +		$tasks = array(); +		foreach ($definitions as $name => $definition) +		{ +			$task = $this->container->get($name); +			if ($task instanceof phpbb_cron_task_base) +			{ +				$task->set_name($name); +			} + +			$tasks[] = $task; +		} -		return $finder -			->extension_suffix('_task') -			->extension_directory('/cron') -			->core_path('includes/cron/task/core/') -			->get_classes(); +		return new ArrayIterator($tasks);  	}  } diff --git a/phpBB/includes/cron/task/task.php b/phpBB/includes/cron/task/task.php index 2f2a9e51f9..7b08fed413 100644 --- a/phpBB/includes/cron/task/task.php +++ b/phpBB/includes/cron/task/task.php @@ -22,6 +22,13 @@ if (!defined('IN_PHPBB'))  interface phpbb_cron_task  {  	/** +	* Returns the name of the task. +	* +	* @return string		Name of wrapped task. +	*/ +	public function get_name(); + +	/**  	* Runs this cron task.  	*  	* @return void diff --git a/phpBB/includes/cron/task/wrapper.php b/phpBB/includes/cron/task/wrapper.php index 66c45189e5..386fb5b383 100644 --- a/phpBB/includes/cron/task/wrapper.php +++ b/phpBB/includes/cron/task/wrapper.php @@ -23,6 +23,10 @@ if (!defined('IN_PHPBB'))  */  class phpbb_cron_task_wrapper  { +	protected $task; +	protected $phpbb_root_path; +	protected $php_ext; +  	/**  	* Constructor.  	* @@ -30,9 +34,11 @@ class phpbb_cron_task_wrapper  	*  	* @param phpbb_cron_task $task The cron task to wrap.  	*/ -	public function __construct(phpbb_cron_task $task) +	public function __construct(phpbb_cron_task $task, $phpbb_root_path, $php_ext)  	{  		$this->task = $task; +		$this->phpbb_root_path = $phpbb_root_path; +		$this->php_ext = $php_ext;  	}  	/** @@ -62,16 +68,6 @@ class phpbb_cron_task_wrapper  	}  	/** -	* Returns the name of wrapped task. It is the same as the wrapped class's class name. -	* -	* @return string		Class name of wrapped task. -	*/ -	public function get_name() -	{ -		return get_class($this->task); -	} - -	/**  	* Returns a url through which this task may be invoked via web.  	*  	* When system cron is not in use, running a cron task is accomplished @@ -82,8 +78,6 @@ class phpbb_cron_task_wrapper  	*/  	public function get_url()  	{ -		global $phpbb_root_path, $phpEx; -  		$name = $this->get_name();  		if ($this->is_parametrized())  		{ @@ -98,7 +92,7 @@ class phpbb_cron_task_wrapper  		{  			$extra = '';  		} -		$url = append_sid($phpbb_root_path . 'cron.' . $phpEx, 'cron_type=' . $name . $extra); +		$url = append_sid($this->phpbb_root_path . 'cron.' . $this->php_ext, 'cron_type=' . $name . $extra);  		return $url;  	} diff --git a/phpBB/includes/db/mssqlnative.php b/phpBB/includes/db/mssqlnative.php index 36ff461a29..c31f7f6892 100644 --- a/phpBB/includes/db/mssqlnative.php +++ b/phpBB/includes/db/mssqlnative.php @@ -218,7 +218,6 @@ class dbal_mssqlnative extends dbal  		$this->server = $sqlserver . (($port) ? $port_delimiter . $port : '');  		//connect to database -		error_reporting(E_ALL);  		$this->db_connect_id = sqlsrv_connect($this->server, array(  			'Database' => $this->dbname,  			'UID' => $this->user, diff --git a/phpBB/includes/di/processor/config.php b/phpBB/includes/di/processor/config.php new file mode 100644 index 0000000000..22b6252a6d --- /dev/null +++ b/phpBB/includes/di/processor/config.php @@ -0,0 +1,76 @@ +<?php +/** +* +* @package phpBB3 +* @copyright (c) 2012 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +/** +* @ignore +*/ +if (!defined('IN_PHPBB')) +{ +	exit; +} + +use Symfony\Component\DependencyInjection\ContainerBuilder; + +/** +* Configure the container for phpBB's services though +* user-defined parameters defined in the config.php file. +*/ +class phpbb_di_processor_config implements phpbb_di_processor_interface +{ +	private $config_file; +	private $phpbb_root_path; +	private $php_ext; + +	/** +	* Constructor. +	* +	* @param string $config_file The config file +	* @param string $phpbb_root_path The root path +	* @param string $php_ext The PHP extension +	*/ +	public function __construct($config_file, $phpbb_root_path, $php_ext) +	{ +		$this->config_file = $config_file; +		$this->phpbb_root_path = $phpbb_root_path; +		$this->php_ext = $php_ext; +	} + +	/** +	* @inheritdoc +	*/ +	public function process(ContainerBuilder $container) +	{ +		require $this->config_file; + +		$container->setParameter('core.root_path', $this->phpbb_root_path); +		$container->setParameter('core.php_ext', $this->php_ext); + +		$container->setParameter('core.table_prefix', $table_prefix); +		$container->setParameter('cache.driver.class', $this->fix_acm_type($acm_type)); +		$container->setParameter('dbal.driver.class', 'dbal_'.$dbms); +		$container->setParameter('dbal.dbhost', $dbhost); +		$container->setParameter('dbal.dbuser', $dbuser); +		$container->setParameter('dbal.dbpasswd', $dbpasswd); +		$container->setParameter('dbal.dbname', $dbname); +		$container->setParameter('dbal.dbport', $dbport); +		$container->setParameter('dbal.new_link', defined('PHPBB_DB_NEW_LINK') && PHPBB_DB_NEW_LINK); + +		$container->set('container', $container); +	} + +	protected function fix_acm_type($acm_type) +	{ +		if (preg_match('#^[a-z]+$#', $acm_type)) +		{ +			return 'phpbb_cache_driver_'.$acm_type; +		} + +		return $acm_type; +	} +} diff --git a/phpBB/includes/di/processor/ext.php b/phpBB/includes/di/processor/ext.php new file mode 100644 index 0000000000..e69a3d73b3 --- /dev/null +++ b/phpBB/includes/di/processor/ext.php @@ -0,0 +1,54 @@ +<?php +/** +* +* @package phpBB3 +* @copyright (c) 2012 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +/** +* @ignore +*/ +if (!defined('IN_PHPBB')) +{ +	exit; +} + +use Symfony\Component\Config\FileLocator; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; + +/** +* Load the service configurations from all extensions into the container. +*/ +class phpbb_di_processor_ext implements phpbb_di_processor_interface +{ +	private $extension_manager; + +	/** +	* Constructor. +	* +	* @param string $extension_manager The extension manager +	*/ +	public function __construct($extension_manager) +	{ +		$this->extension_manager = $extension_manager; +	} + +	/** +	* @inheritdoc +	*/ +	public function process(ContainerBuilder $container) +	{ +		$enabled_exts = $this->extension_manager->all_enabled(); +		foreach ($enabled_exts as $name => $path) +		{ +			if (file_exists($path . '/config/services.yml')) +			{ +				$loader = new YamlFileLoader($container, new FileLocator($path . '/config')); +				$loader->load('services.yml'); +			} +		} +	} +} diff --git a/phpBB/includes/di/processor/interface.php b/phpBB/includes/di/processor/interface.php new file mode 100644 index 0000000000..b8563791cc --- /dev/null +++ b/phpBB/includes/di/processor/interface.php @@ -0,0 +1,28 @@ +<?php +/** +* +* @package phpBB3 +* @copyright (c) 2012 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +/** +* @ignore +*/ +if (!defined('IN_PHPBB')) +{ +	exit; +} + +use Symfony\Component\DependencyInjection\ContainerBuilder; + +interface phpbb_di_processor_interface +{ +	/** +	* Mutate the container. +	* +	* @param ContainerBuilder $container The container +	*/ +	public function process(ContainerBuilder $container); +} diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index 9f1172e61e..834f57a38b 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -2855,7 +2855,7 @@ function check_form_key($form_name, $timespan = false, $return_page = '', $trigg  		$diff = time() - $creation_time;  		// If creation_time and the time() now is zero we can assume it was not a human doing this (the check for if ($diff)... -		if ($diff && ($diff <= $timespan || $timespan === -1)) +		if (defined('DEBUG_TEST') || $diff && ($diff <= $timespan || $timespan === -1))  		{  			$token_sid = ($user->data['user_id'] == ANONYMOUS && !empty($config['form_token_sid_guests'])) ? $user->session_id : '';  			$key = sha1($creation_time . $user->data['user_form_salt'] . $form_name . $token_sid); diff --git a/phpBB/includes/functions_display.php b/phpBB/includes/functions_display.php index 66e8459c18..881c95907b 100644 --- a/phpBB/includes/functions_display.php +++ b/phpBB/includes/functions_display.php @@ -1387,3 +1387,38 @@ function get_user_avatar($avatar, $avatar_type, $avatar_width, $avatar_height, $  	$avatar_img .= $avatar;  	return '<img src="' . (str_replace(' ', '%20', $avatar_img)) . '" width="' . $avatar_width . '" height="' . $avatar_height . '" alt="' . ((!empty($user->lang[$alt])) ? $user->lang[$alt] : $alt) . '" />';  } + +/** +* Generate a list of archive types available for compressing attachments +* +* @param string $param_key Either topic_id or post_id +* @param string $param_val The value of the topic or post id +* @param string $phpbb_root_path The root path of the phpBB installation +* @param string $phpEx The PHP extension +* +* @return array Array containing the link and the type of compression +*/ +function phpbb_gen_download_links($param_key, $param_val, $phpbb_root_path, $phpEx) +{ +	if (!class_exists('compress')) +	{ +		require $phpbb_root_path . 'includes/functions_compress.' . $phpEx; +	} + +	$methods = compress::methods(); +	$links = array(); + +	foreach ($methods as $method) +	{ +		$type = array_pop(explode('.', $method)); +		$params = array('archive' => $method); +		$params[$param_key] = $param_val; + +		$links[] = array( +			'LINK' => append_sid("{$phpbb_root_path}download/file.$phpEx", $params), +			'TYPE' => $type, +		); +	} + +	return $links; +} diff --git a/phpBB/includes/functions_download.php b/phpBB/includes/functions_download.php index 1486113013..b6371dbecc 100644 --- a/phpBB/includes/functions_download.php +++ b/phpBB/includes/functions_download.php @@ -592,3 +592,132 @@ function phpbb_parse_range_request($request_array, $filesize)  		);  	}  } + +/** +* Increments the download count of all provided attachments +* +* @param dbal $db The database object +* @param array|int $ids The attach_id of each attachment +* +* @return null +*/ +function phpbb_increment_downloads($db, $ids) +{ +	if (!is_array($ids)) +	{ +		$ids = array($ids); +	} + +	$sql = 'UPDATE ' . ATTACHMENTS_TABLE . ' +		SET download_count = download_count + 1 +		WHERE ' . $db->sql_in_set('attach_id', $ids); +	$db->sql_query($sql); +} + +/** +* Handles authentication when downloading attachments from a post or topic +* +* @param dbal $db The database object +* @param phpbb_auth $auth The authentication object +* @param int $topic_id The id of the topic that we are downloading from +* +* @return null +*/ +function phpbb_download_handle_forum_auth($db, $auth, $topic_id) +{ +	$sql = 'SELECT t.forum_id, f.forum_password, f.parent_id +		FROM ' . TOPICS_TABLE . ' t, ' . FORUMS_TABLE . " f +		WHERE t.topic_id = " . (int) $topic_id . " +			AND t.forum_id = f.forum_id"; +	$result = $db->sql_query($sql); +	$row = $db->sql_fetchrow($result); +	$db->sql_freeresult($result); + +	if ($auth->acl_get('u_download') && $auth->acl_get('f_download', $row['forum_id'])) +	{ +		if ($row && $row['forum_password']) +		{ +			// Do something else ... ? +			login_forum_box($row); +		} +	} +	else +	{ +		send_status_line(403, 'Forbidden'); +		trigger_error('SORRY_AUTH_VIEW_ATTACH'); +	} +} + +/** +* Handles authentication when downloading attachments from PMs +* +* @param dbal $db The database object +* @param phpbb_auth $auth The authentication object +* @param int $user_id The user id +* @param int $msg_id The id of the PM that we are downloading from +* +* @return null +*/ +function phpbb_download_handle_pm_auth($db, $auth, $user_id, $msg_id) +{ +	if (!$auth->acl_get('u_pm_download')) +	{ +		send_status_line(403, 'Forbidden'); +		trigger_error('SORRY_AUTH_VIEW_ATTACH'); +	} + +	$allowed = phpbb_download_check_pm_auth($db, $user_id, $msg_id); + +	if (!$allowed) +	{ +		send_status_line(403, 'Forbidden'); +		trigger_error('ERROR_NO_ATTACHMENT'); +	} +} + +/** +* Checks whether a user can download from a particular PM +* +* @param dbal $db The database object +* @param int $user_id The user id +* @param int $msg_id The id of the PM that we are downloading from +* +* @return bool Whether the user is allowed to download from that PM or not +*/ +function phpbb_download_check_pm_auth($db, $user_id, $msg_id) +{ +	// Check if the attachment is within the users scope... +	$sql = 'SELECT msg_id +		FROM ' . PRIVMSGS_TO_TABLE . ' +		WHERE msg_id = ' . (int) $msg_id . ' +			AND ( +				user_id = ' . (int) $user_id . ' +				OR author_id = ' . (int) $user_id . ' +			)'; +	$result = $db->sql_query_limit($sql, 1); +	$allowed = (bool) $db->sql_fetchfield('msg_id'); +	$db->sql_freeresult($result); + +	return $allowed; +} + +/** +* Cleans a filename of any characters that could potentially cause a problem on +* a user's filesystem. +* +* @param string $filename The filename to clean +* +* @return string The cleaned filename +*/ +function phpbb_download_clean_filename($filename) +{ +	$bad_chars = array("'", "\\", ' ', '/', ':', '*', '?', '"', '<', '>', '|'); + +	// rawurlencode to convert any potentially 'bad' characters that we missed +	$filename = rawurlencode(str_replace($bad_chars, '_', $filename)); + +	// Turn the %xx entities created by rawurlencode to _ +	$filename = preg_replace("/%(\w{2})/", '_', $filename); + +	return $filename; +} diff --git a/phpBB/includes/functions_install.php b/phpBB/includes/functions_install.php index 46541acd44..10ec13669b 100644 --- a/phpBB/includes/functions_install.php +++ b/phpBB/includes/functions_install.php @@ -522,10 +522,12 @@ function adjust_language_keys_callback($matches)  * @param	string	$dbms The name of the DBAL class to use  * @param	array	$load_extensions Array of additional extensions that should be loaded  * @param	bool	$debug If the debug constants should be enabled by default or not +* @param	bool	$debug_test If the DEBUG_TEST constant should be added +*					NOTE: Only for use within the testing framework  *  * @return	string	The output to write to the file  */ -function phpbb_create_config_file_data($data, $dbms, $load_extensions, $debug = false) +function phpbb_create_config_file_data($data, $dbms, $load_extensions, $debug = false, $debug_test = false)  {  	$load_extensions = implode(',', $load_extensions); @@ -540,7 +542,7 @@ function phpbb_create_config_file_data($data, $dbms, $load_extensions, $debug =  		'dbuser'		=> $data['dbuser'],  		'dbpasswd'		=> htmlspecialchars_decode($data['dbpasswd']),  		'table_prefix'	=> $data['table_prefix'], -		'acm_type'		=> 'file', +		'acm_type'		=> 'phpbb_cache_driver_file',  		'load_extensions'	=> $load_extensions,  	); @@ -562,5 +564,10 @@ function phpbb_create_config_file_data($data, $dbms, $load_extensions, $debug =  		$config_data .= "// @define('DEBUG_EXTRA', true);\n";  	} +	if ($debug_test) +	{ +		$config_data .= "@define('DEBUG_TEST', true);\n"; +	} +  	return $config_data;  } diff --git a/phpBB/includes/ucp/ucp_pm_viewmessage.php b/phpBB/includes/ucp/ucp_pm_viewmessage.php index 569232d878..c85b05f144 100644 --- a/phpBB/includes/ucp/ucp_pm_viewmessage.php +++ b/phpBB/includes/ucp/ucp_pm_viewmessage.php @@ -257,6 +257,7 @@ function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)  		'U_PM_ACTION'		=> $url . '&mode=compose&f=' . $folder_id . '&p=' . $message_row['msg_id'],  		'S_HAS_ATTACHMENTS'	=> (sizeof($attachments)) ? true : false, +		'S_HAS_MULTIPLE_ATTACHMENTS' => (sizeof($attachments) > 1),  		'S_DISPLAY_NOTICE'	=> $display_notice && $message_row['message_attachment'],  		'S_AUTHOR_DELETED'	=> ($author_id == ANONYMOUS) ? true : false,  		'S_SPECIAL_FOLDER'	=> in_array($folder_id, array(PRIVMSGS_NO_BOX, PRIVMSGS_OUTBOX)), @@ -301,6 +302,12 @@ function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)  	// Display not already displayed Attachments for this post, we already parsed them. ;)  	if (isset($attachments) && sizeof($attachments))  	{ +		$methods = phpbb_gen_download_links('post_msg_id', $msg_id, $phpbb_root_path, $phpEx); +		foreach ($methods as $method) +		{ +			$template->assign_block_vars('dl_method', $method); +		} +	  		foreach ($attachments as $attachment)  		{  			$template->assign_block_vars('attachment', array( diff --git a/phpBB/install/database_update.php b/phpBB/install/database_update.php index 1408db27be..502b3bb1a4 100644 --- a/phpBB/install/database_update.php +++ b/phpBB/install/database_update.php @@ -1079,6 +1079,8 @@ function database_update_info()  				),  			),  		), +		// No changes from 3.0.11-RC2 to 3.0.11 +		'3.0.11-RC2'	=> array(),  		/** @todo DROP LOGIN_ATTEMPT_TABLE.attempt_id in 3.0.12-RC1 */ @@ -2222,6 +2224,10 @@ function change_database_data(&$no_updates, $version)  		case '3.0.11-RC1':  		break; +		// No changes from 3.0.11-RC2 to 3.0.11 +		case '3.0.11-RC2': +		break; +  		// Changes from 3.1.0-dev to 3.1.0-A1  		case '3.1.0-dev': diff --git a/phpBB/install/index.php b/phpBB/install/index.php index f992b67bb7..3c1d60f554 100644 --- a/phpBB/install/index.php +++ b/phpBB/install/index.php @@ -7,6 +7,10 @@  *  */ +use Symfony\Component\Config\FileLocator; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; +  /**#@+  * @ignore  */ @@ -71,6 +75,9 @@ else  // Include essential scripts  require($phpbb_root_path . 'includes/class_loader.' . $phpEx); +require($phpbb_root_path . 'includes/di/processor/interface.' . $phpEx); +require($phpbb_root_path . 'includes/di/processor/config.' . $phpEx); +  require($phpbb_root_path . 'includes/functions.' . $phpEx);  phpbb_require_updated('includes/functions_content.' . $phpEx, true); @@ -79,19 +86,23 @@ include($phpbb_root_path . 'includes/functions_admin.' . $phpEx);  include($phpbb_root_path . 'includes/utf/utf_tools.' . $phpEx);  require($phpbb_root_path . 'includes/functions_install.' . $phpEx); -$phpbb_class_loader_ext = new phpbb_class_loader('phpbb_ext_', $phpbb_root_path . 'ext/', ".$phpEx"); -$phpbb_class_loader_ext->register(); -$phpbb_class_loader = new phpbb_class_loader('phpbb_', $phpbb_root_path . 'includes/', ".$phpEx"); -$phpbb_class_loader->register(); +$phpbb_container = new ContainerBuilder(); +$loader = new YamlFileLoader($phpbb_container, new FileLocator(__DIR__.'/../config')); +$loader->load('services.yml'); + +$phpbb_container->setParameter('core.root_path', $phpbb_root_path); +$phpbb_container->setParameter('core.php_ext', $phpEx); + +$phpbb_container->setAlias('cache.driver', 'cache.driver.install'); + +$phpbb_class_loader = $phpbb_container->get('class_loader'); +$phpbb_class_loader_ext = $phpbb_container->get('class_loader.ext');  // set up caching -$cache_factory = new phpbb_cache_factory('file'); -$cache = $cache_factory->get_service(); -$phpbb_class_loader_ext->set_cache($cache->get_driver()); -$phpbb_class_loader->set_cache($cache->get_driver()); +$cache = $phpbb_container->get('cache'); -$phpbb_dispatcher = new phpbb_event_dispatcher(); -$request = new phpbb_request(); +$phpbb_dispatcher = $phpbb_container->get('dispatcher'); +$request	= $phpbb_container->get('request');  // make sure request_var uses this request instance  request_var('', 0, false, false, $request); // "dependency injection" for a function diff --git a/phpBB/language/en/common.php b/phpBB/language/en/common.php index 33d39c3e99..e6022e3b79 100644 --- a/phpBB/language/en/common.php +++ b/phpBB/language/en/common.php @@ -161,6 +161,8 @@ $lang = array_merge($lang, array(  	'DISPLAY_MESSAGES'		=> 'Display messages from previous',  	'DISPLAY_POSTS'			=> 'Display posts from previous',  	'DISPLAY_TOPICS'		=> 'Display topics from previous', +	'DOWNLOAD_ALL'			=> 'Download all', +	'DOWNLOAD_ALL_ATTACHMENTS'	=> 'Download all attachments',  	'DOWNLOADED'			=> 'Downloaded',  	'DOWNLOADING_FILE'		=> 'Downloading file',  	'DOWNLOAD_COUNTS'		=> array( diff --git a/phpBB/language/en/ucp.php b/phpBB/language/en/ucp.php index 512a4a5c24..648de587aa 100644 --- a/phpBB/language/en/ucp.php +++ b/phpBB/language/en/ucp.php @@ -269,7 +269,7 @@ $lang = array_merge($lang, array(  	'MESSAGE_COLOURS'				=> 'Message colours',  	'MESSAGE_DELETED'				=> 'Message successfully deleted.',  	'MESSAGE_HISTORY'				=> 'Message history', -	'MESSAGE_REMOVED_FROM_OUTBOX'	=> 'This message has been removed by its author before it was delivered.', +	'MESSAGE_REMOVED_FROM_OUTBOX'	=> 'This message was deleted by its author.',  	'MESSAGE_SENT_ON'				=> 'on',  	'MESSAGE_STORED'				=> 'This message has been sent successfully.',  	'MESSAGE_TO'					=> 'To', diff --git a/phpBB/posting.php b/phpBB/posting.php index 81ef31f96c..2d3cb9ab44 100644 --- a/phpBB/posting.php +++ b/phpBB/posting.php @@ -1411,7 +1411,7 @@ $template->assign_vars(array(  	'POST_DATE'				=> ($post_data['post_time']) ? $user->format_date($post_data['post_time']) : '',  	'ERROR'					=> (sizeof($error)) ? implode('<br />', $error) : '',  	'TOPIC_TIME_LIMIT'		=> (int) $post_data['topic_time_limit'], -	'EDIT_REASON'			=> $post_data['post_edit_reason'], +	'EDIT_REASON'			=> $request->variable('edit_reason', ''),  	'U_VIEW_FORUM'			=> append_sid("{$phpbb_root_path}viewforum.$phpEx", "f=$forum_id"),  	'U_VIEW_TOPIC'			=> ($mode != 'post') ? append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id") : '',  	'U_PROGRESS_BAR'		=> append_sid("{$phpbb_root_path}posting.$phpEx", "f=$forum_id&mode=popup"), diff --git a/phpBB/styles/prosilver/template/mcp_topic.html b/phpBB/styles/prosilver/template/mcp_topic.html index a6938ee2fb..ed9307b11c 100644 --- a/phpBB/styles/prosilver/template/mcp_topic.html +++ b/phpBB/styles/prosilver/template/mcp_topic.html @@ -22,15 +22,13 @@ onload_functions.push('subPanels()');  <div id="minitabs">  	<ul> -		<li id="display-panel-tab"<!-- IF not S_MERGE_VIEW --> class="activetab"<!-- ENDIF -->	 +		<li id="display-panel-tab"<!-- IF not S_MERGE_VIEW --> class="activetab"<!-- ENDIF -->>  			<a href="#minitabs" onclick="subPanels('display-panel'); return false;"><span>{L_DISPLAY_OPTIONS}</span></a>  		</li>  		<li id="split-panel-tab"> -			  			<a href="#minitabs" onclick="subPanels('split-panel'); return false;"><span>{L_SPLIT_TOPIC}</span></a>  		</li>  		<li id="merge-panel-tab"<!-- IF S_MERGE_VIEW --> class="activetab"<!-- ENDIF -->> -			  			<a href="#minitabs" onclick="subPanels('merge-panel'); return false;"><span>{L_MERGE_POSTS}</span></a>  		</li>  	</ul> diff --git a/phpBB/styles/prosilver/template/ucp_pm_viewmessage.html b/phpBB/styles/prosilver/template/ucp_pm_viewmessage.html index 2e7a7c4ac9..b022bcd979 100644 --- a/phpBB/styles/prosilver/template/ucp_pm_viewmessage.html +++ b/phpBB/styles/prosilver/template/ucp_pm_viewmessage.html @@ -41,12 +41,24 @@  		<div class="content">{MESSAGE}</div>  		<!-- IF S_HAS_ATTACHMENTS --> -		<dl class="attachbox"> -			<dt>{L_ATTACHMENTS}</dt> -			<!-- BEGIN attachment --> -			<dd>{attachment.DISPLAY_ATTACHMENT}</dd> -			<!-- END attachment --> -		</dl> +			<dl class="attachbox"> +				<dt> +					{L_ATTACHMENTS} +					<!-- IF S_HAS_MULTIPLE_ATTACHMENTS --> +						<div class="dl_links"> +							<strong>{L_DOWNLOAD_ALL}:</strong> +							<ul> +							<!-- BEGIN dl_method --> +								<li>[ <a href="{dl_method.LINK}">{dl_method.TYPE}</a> ]</li> +							<!-- END dl_method --> +							</ul> +						</div> +					<!-- ENDIF --> +				</dt> +				<!-- BEGIN attachment --> +					<dd>{attachment.DISPLAY_ATTACHMENT}</dd> +				<!-- END attachment --> +			</dl>  		<!-- ENDIF -->  		<!-- IF S_DISPLAY_NOTICE --> diff --git a/phpBB/styles/prosilver/template/viewtopic_body.html b/phpBB/styles/prosilver/template/viewtopic_body.html index cfbf0969d9..4534dc5bcc 100644 --- a/phpBB/styles/prosilver/template/viewtopic_body.html +++ b/phpBB/styles/prosilver/template/viewtopic_body.html @@ -157,7 +157,19 @@  			<!-- IF postrow.S_HAS_ATTACHMENTS -->  				<dl class="attachbox"> -					<dt>{L_ATTACHMENTS}</dt> +					<dt> +						{L_ATTACHMENTS} +						<!-- IF postrow.S_MULTIPLE_ATTACHMENTS --> +							<div class="dl_links"> +								<strong>{L_DOWNLOAD_ALL}:</strong> +								<ul> +								<!-- BEGIN dl_method --> +									<li>[ <a href="{postrow.dl_method.LINK}">{postrow.dl_method.TYPE}</a> ]</li> +								<!-- END dl_method --> +								</ul> +							</div> +						<!-- ENDIF --> +					</dt>  					<!-- BEGIN attachment -->  						<dd>{postrow.attachment.DISPLAY_ATTACHMENT}</dd>  					<!-- END attachment --> @@ -256,6 +268,17 @@  	<!-- ENDIF -->  	</div> +	<!-- IF S_HAS_ATTACHMENTS --> +		<div class="dl_links"> +			<strong>{L_DOWNLOAD_ALL_ATTACHMENTS}:</strong> +			<ul> +			<!-- BEGIN dl_method --> +				<li>[ <a href="{dl_method.LINK}">{dl_method.TYPE}</a> ]</li> +			<!-- END dl_method --> +			</ul> +		</div> +	<!-- ENDIF --> +  	<!-- IF .pagination or TOTAL_POSTS -->  		<div class="pagination">  			{TOTAL_POSTS} •  diff --git a/phpBB/styles/prosilver/theme/content.css b/phpBB/styles/prosilver/theme/content.css index 60903911dd..b6012f8a63 100644 --- a/phpBB/styles/prosilver/theme/content.css +++ b/phpBB/styles/prosilver/theme/content.css @@ -702,3 +702,26 @@ dl.pmlist dd {  	margin-left: 61% !important;  	margin-bottom: 2px;  } + +.topic-actions div.dl_links { +	padding: 10px 0 0 10px; +} + +div.dl_links { +	display: inline-block; +	text-transform: none; +} + +.dl_links strong { +	font-weight: bold; +} + +.dl_links ul { +	list-style-type: none; +	margin: 0; +	display: inline-block; +} + +.dl_links li { +	display: inline-block; +} diff --git a/phpBB/viewforum.php b/phpBB/viewforum.php index 783c7181d2..03c2bb286f 100644 --- a/phpBB/viewforum.php +++ b/phpBB/viewforum.php @@ -193,8 +193,12 @@ if ($forum_data['forum_topics_per_page'])  // Do the forum Prune thang - cron type job ...  if (!$config['use_system_cron'])  { -	$task = $cron->instantiate_task('cron_task_core_prune_forum', $forum_data); -	if ($task && $task->is_ready()) +	$cron = $phpbb_container->get('cron.manager'); + +	$task = $cron->find_task('cron.task.core.prune_forum'); +	$task->set_forum_data($forum_data); + +	if ($task->is_ready())  	{  		$url = $task->get_url();  		$template->assign_var('RUN_CRON_TASK', '<img src="' . $url . '" width="1" height="1" alt="cron" />'); diff --git a/phpBB/viewtopic.php b/phpBB/viewtopic.php index 3dd7d8a863..3fde5b5e03 100644 --- a/phpBB/viewtopic.php +++ b/phpBB/viewtopic.php @@ -1352,6 +1352,16 @@ if (sizeof($attach_list))  	}  } +$template->assign_vars(array( +	'S_HAS_ATTACHMENTS' => !empty($attachments), +)); + +$methods = phpbb_gen_download_links('topic_id', $topic_id, $phpbb_root_path, $phpEx); +foreach ($methods as $method) +{ +	$template->assign_block_vars('dl_method', $method); +} +  // Instantiate BBCode if need be  if ($bbcode_bitfield !== '')  { @@ -1594,6 +1604,7 @@ for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)  		'POSTER_ID'			=> $poster_id,  		'S_HAS_ATTACHMENTS'	=> (!empty($attachments[$row['post_id']])) ? true : false, +		'S_MULTIPLE_ATTACHMENTS'	=> !empty($attachments[$row['post_id']]) && sizeof($attachments[$row['post_id']]) > 1,  		'S_POST_UNAPPROVED'	=> ($row['post_approved']) ? false : true,  		'S_POST_REPORTED'	=> ($row['post_reported'] && $auth->acl_get('m_report', $forum_id)) ? true : false,  		'S_DISPLAY_NOTICE'	=> $display_notice && $row['post_attachment'], @@ -1647,6 +1658,12 @@ for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)  				'DISPLAY_ATTACHMENT'	=> $attachment)  			);  		} + +		$methods = phpbb_gen_download_links('post_msg_id', $row['post_id'], $phpbb_root_path, $phpEx); +		foreach ($methods as $method) +		{ +			$template->assign_block_vars('postrow.dl_method', $method); +		}  	}  	$prev_post_id = $row['post_id'];  | 
