aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/phpbb
diff options
context:
space:
mode:
authorMarc Alexander <admin@m-a-styles.de>2013-12-29 13:46:42 +0100
committerMarc Alexander <admin@m-a-styles.de>2013-12-29 13:46:42 +0100
commit382317b1352db90605d6555eaf2fbc4238c2d547 (patch)
treebfdf6980f9a19ad54842f5c50d210da5061ebab7 /phpBB/phpbb
parentac131a51592f5e45e5a555ae0ac04543d02f9c31 (diff)
parentdb94f80c5ba117ca410bb2aafa3ae5c02dcf11c8 (diff)
downloadforums-382317b1352db90605d6555eaf2fbc4238c2d547.tar
forums-382317b1352db90605d6555eaf2fbc4238c2d547.tar.gz
forums-382317b1352db90605d6555eaf2fbc4238c2d547.tar.bz2
forums-382317b1352db90605d6555eaf2fbc4238c2d547.tar.xz
forums-382317b1352db90605d6555eaf2fbc4238c2d547.zip
Merge branch 'develop' of https://github.com/phpbb/phpbb into feature/passwords
Conflicts: phpBB/config/services.yml
Diffstat (limited to 'phpBB/phpbb')
-rw-r--r--phpBB/phpbb/auth/auth.php8
-rw-r--r--phpBB/phpbb/auth/provider/apache.php8
-rw-r--r--phpBB/phpbb/auth/provider/base.php8
-rw-r--r--phpBB/phpbb/auth/provider/db.php8
-rw-r--r--phpBB/phpbb/auth/provider/ldap.php9
-rw-r--r--phpBB/phpbb/auth/provider/oauth/oauth.php20
-rw-r--r--phpBB/phpbb/auth/provider/oauth/service/base.php8
-rw-r--r--phpBB/phpbb/auth/provider/oauth/service/bitly.php8
-rw-r--r--phpBB/phpbb/auth/provider/oauth/service/exception.php10
-rw-r--r--phpBB/phpbb/auth/provider/oauth/service/facebook.php8
-rw-r--r--phpBB/phpbb/auth/provider/oauth/service/google.php8
-rw-r--r--phpBB/phpbb/auth/provider/oauth/service/service_interface.php8
-rw-r--r--phpBB/phpbb/auth/provider/oauth/token_storage.php12
-rw-r--r--phpBB/phpbb/auth/provider/provider_interface.php8
-rw-r--r--phpBB/phpbb/avatar/driver/driver.php29
-rw-r--r--phpBB/phpbb/avatar/driver/driver_interface.php8
-rw-r--r--phpBB/phpbb/avatar/driver/gravatar.php16
-rw-r--r--phpBB/phpbb/avatar/driver/local.php18
-rw-r--r--phpBB/phpbb/avatar/driver/remote.php47
-rw-r--r--phpBB/phpbb/avatar/driver/upload.php18
-rw-r--r--phpBB/phpbb/avatar/manager.php76
-rw-r--r--phpBB/phpbb/cache/driver/apc.php8
-rw-r--r--phpBB/phpbb/cache/driver/base.php8
-rw-r--r--phpBB/phpbb/cache/driver/driver_interface.php8
-rw-r--r--phpBB/phpbb/cache/driver/eaccelerator.php8
-rw-r--r--phpBB/phpbb/cache/driver/file.php8
-rw-r--r--phpBB/phpbb/cache/driver/memcache.php8
-rw-r--r--phpBB/phpbb/cache/driver/memory.php8
-rw-r--r--phpBB/phpbb/cache/driver/null.php8
-rw-r--r--phpBB/phpbb/cache/driver/redis.php8
-rw-r--r--phpBB/phpbb/cache/driver/wincache.php8
-rw-r--r--phpBB/phpbb/cache/driver/xcache.php8
-rw-r--r--phpBB/phpbb/cache/service.php8
-rw-r--r--phpBB/phpbb/class_loader.php10
-rw-r--r--phpBB/phpbb/config/config.php8
-rw-r--r--phpBB/phpbb/config/db.php8
-rw-r--r--phpBB/phpbb/config/db_text.php8
-rw-r--r--phpBB/phpbb/console/application.php23
-rw-r--r--phpBB/phpbb/console/command/command.php14
-rw-r--r--phpBB/phpbb/console/command/extension/command.php22
-rw-r--r--phpBB/phpbb/console/command/extension/disable.php47
-rw-r--r--phpBB/phpbb/console/command/extension/enable.php47
-rw-r--r--phpBB/phpbb/console/command/extension/purge.php47
-rw-r--r--phpBB/phpbb/console/command/extension/show.php58
-rw-r--r--phpBB/phpbb/console/command/fixup/recalculate_email_hash.php71
-rw-r--r--phpBB/phpbb/content_visibility.php14
-rw-r--r--phpBB/phpbb/controller/exception.php8
-rw-r--r--phpBB/phpbb/controller/helper.php8
-rw-r--r--phpBB/phpbb/controller/provider.php29
-rw-r--r--phpBB/phpbb/controller/resolver.php8
-rw-r--r--phpBB/phpbb/cron/manager.php8
-rw-r--r--phpBB/phpbb/cron/task/base.php8
-rw-r--r--phpBB/phpbb/cron/task/core/prune_all_forums.php8
-rw-r--r--phpBB/phpbb/cron/task/core/prune_forum.php8
-rw-r--r--phpBB/phpbb/cron/task/core/prune_notifications.php16
-rw-r--r--phpBB/phpbb/cron/task/core/queue.php8
-rw-r--r--phpBB/phpbb/cron/task/core/tidy_cache.php8
-rw-r--r--phpBB/phpbb/cron/task/core/tidy_database.php8
-rw-r--r--phpBB/phpbb/cron/task/core/tidy_plupload.php116
-rw-r--r--phpBB/phpbb/cron/task/core/tidy_search.php8
-rw-r--r--phpBB/phpbb/cron/task/core/tidy_sessions.php8
-rw-r--r--phpBB/phpbb/cron/task/core/tidy_warnings.php8
-rw-r--r--phpBB/phpbb/cron/task/parametrized.php8
-rw-r--r--phpBB/phpbb/cron/task/task.php8
-rw-r--r--phpBB/phpbb/cron/task/wrapper.php8
-rw-r--r--phpBB/phpbb/datetime.php4
-rw-r--r--phpBB/phpbb/db/driver/driver.php12
-rw-r--r--phpBB/phpbb/db/driver/firebird.php10
-rw-r--r--phpBB/phpbb/db/driver/mssql.php16
-rw-r--r--phpBB/phpbb/db/driver/mssql_base.php8
-rw-r--r--phpBB/phpbb/db/driver/mssql_odbc.php10
-rw-r--r--phpBB/phpbb/db/driver/mssqlnative.php184
-rw-r--r--phpBB/phpbb/db/driver/mysql.php10
-rw-r--r--phpBB/phpbb/db/driver/mysql_base.php8
-rw-r--r--phpBB/phpbb/db/driver/mysqli.php16
-rw-r--r--phpBB/phpbb/db/driver/oracle.php10
-rw-r--r--phpBB/phpbb/db/driver/postgres.php16
-rw-r--r--phpBB/phpbb/db/driver/sqlite.php10
-rw-r--r--phpBB/phpbb/db/migration/data/v30x/release_3_0_12.php33
-rw-r--r--phpBB/phpbb/db/migration/data/v30x/release_3_0_12_rc2.php33
-rw-r--r--phpBB/phpbb/db/migration/data/v30x/release_3_0_12_rc3.php33
-rw-r--r--phpBB/phpbb/db/migration/data/v310/acp_style_components_module.php42
-rw-r--r--phpBB/phpbb/db/migration/data/v310/allow_cdn.php33
-rw-r--r--phpBB/phpbb/db/migration/data/v310/alpha1.php44
-rw-r--r--phpBB/phpbb/db/migration/data/v310/alpha2.php28
-rw-r--r--phpBB/phpbb/db/migration/data/v310/avatar_types.php60
-rw-r--r--phpBB/phpbb/db/migration/data/v310/mysql_fulltext_drop.php47
-rw-r--r--phpBB/phpbb/db/migration/data/v310/namespaces.php2
-rw-r--r--phpBB/phpbb/db/migration/data/v310/notifications.php2
-rw-r--r--phpBB/phpbb/db/migration/data/v310/notifications_cron_p2.php27
-rw-r--r--phpBB/phpbb/db/migration/data/v310/notifications_schema_fix.php6
-rw-r--r--phpBB/phpbb/db/migration/data/v310/plupload.php32
-rw-r--r--phpBB/phpbb/db/migration/data/v310/signature_module_auth.php2
-rw-r--r--phpBB/phpbb/db/migration/data/v310/softdelete_p2.php6
-rw-r--r--phpBB/phpbb/db/migration/data/v310/style_update_p2.php24
-rw-r--r--phpBB/phpbb/db/migration/data/v310/teampage.php2
-rw-r--r--phpBB/phpbb/db/migration/data/v310/ucp_popuppm_module.php42
-rw-r--r--phpBB/phpbb/db/migration/exception.php8
-rw-r--r--phpBB/phpbb/db/migration/migration.php8
-rw-r--r--phpBB/phpbb/db/migration/tool/config.php4
-rw-r--r--phpBB/phpbb/db/migration/tool/module.php7
-rw-r--r--phpBB/phpbb/db/migrator.php24
-rw-r--r--phpBB/phpbb/db/sql_insert_buffer.php8
-rw-r--r--phpBB/phpbb/db/tools.php10
-rw-r--r--phpBB/phpbb/di/extension/config.php10
-rw-r--r--phpBB/phpbb/di/extension/core.php8
-rw-r--r--phpBB/phpbb/di/extension/ext.php8
-rw-r--r--phpBB/phpbb/di/pass/collection_pass.php8
-rw-r--r--phpBB/phpbb/di/pass/kernel_pass.php8
-rw-r--r--phpBB/phpbb/di/service_collection.php8
-rw-r--r--phpBB/phpbb/error_collector.php8
-rw-r--r--phpBB/phpbb/event/data.php100
-rw-r--r--phpBB/phpbb/event/dispatcher.php8
-rw-r--r--phpBB/phpbb/event/extension_subscriber_loader.php28
-rw-r--r--phpBB/phpbb/event/kernel_exception_subscriber.php9
-rw-r--r--phpBB/phpbb/event/kernel_request_subscriber.php8
-rw-r--r--phpBB/phpbb/event/kernel_terminate_subscriber.php8
-rw-r--r--phpBB/phpbb/extension/base.php8
-rw-r--r--phpBB/phpbb/extension/exception.php8
-rw-r--r--phpBB/phpbb/extension/extension_interface.php8
-rw-r--r--phpBB/phpbb/extension/finder.php8
-rw-r--r--phpBB/phpbb/extension/manager.php29
-rw-r--r--phpBB/phpbb/extension/metadata_manager.php98
-rw-r--r--phpBB/phpbb/extension/provider.php8
-rw-r--r--phpBB/phpbb/feed/base.php10
-rw-r--r--phpBB/phpbb/feed/factory.php8
-rw-r--r--phpBB/phpbb/feed/forum.php10
-rw-r--r--phpBB/phpbb/feed/forums.php8
-rw-r--r--phpBB/phpbb/feed/helper.php8
-rw-r--r--phpBB/phpbb/feed/news.php8
-rw-r--r--phpBB/phpbb/feed/overall.php8
-rw-r--r--phpBB/phpbb/feed/post_base.php8
-rw-r--r--phpBB/phpbb/feed/topic.php8
-rw-r--r--phpBB/phpbb/feed/topic_base.php8
-rw-r--r--phpBB/phpbb/feed/topics.php8
-rw-r--r--phpBB/phpbb/feed/topics_active.php8
-rw-r--r--phpBB/phpbb/filesystem.php8
-rw-r--r--phpBB/phpbb/groupposition/exception.php8
-rw-r--r--phpBB/phpbb/groupposition/groupposition_interface.php8
-rw-r--r--phpBB/phpbb/groupposition/legend.php8
-rw-r--r--phpBB/phpbb/groupposition/teampage.php8
-rw-r--r--phpBB/phpbb/hook/finder.php8
-rw-r--r--phpBB/phpbb/json_response.php8
-rw-r--r--phpBB/phpbb/lock/db.php8
-rw-r--r--phpBB/phpbb/lock/flock.php8
-rw-r--r--phpBB/phpbb/log/log.php8
-rw-r--r--phpBB/phpbb/log/log_interface.php8
-rw-r--r--phpBB/phpbb/log/null.php8
-rw-r--r--phpBB/phpbb/mimetype/content_guesser.php33
-rw-r--r--phpBB/phpbb/mimetype/extension_guesser.php509
-rw-r--r--phpBB/phpbb/mimetype/guesser.php130
-rw-r--r--phpBB/phpbb/mimetype/guesser_base.php38
-rw-r--r--phpBB/phpbb/mimetype/guesser_interface.php49
-rw-r--r--phpBB/phpbb/notification/exception.php8
-rw-r--r--phpBB/phpbb/notification/manager.php27
-rw-r--r--phpBB/phpbb/notification/method/base.php8
-rw-r--r--phpBB/phpbb/notification/method/email.php8
-rw-r--r--phpBB/phpbb/notification/method/jabber.php8
-rw-r--r--phpBB/phpbb/notification/method/messenger_base.php8
-rw-r--r--phpBB/phpbb/notification/method/method_interface.php8
-rw-r--r--phpBB/phpbb/notification/type/admin_activate_user.php166
-rw-r--r--phpBB/phpbb/notification/type/approve_post.php8
-rw-r--r--phpBB/phpbb/notification/type/approve_topic.php10
-rw-r--r--phpBB/phpbb/notification/type/base.php8
-rw-r--r--phpBB/phpbb/notification/type/bookmark.php8
-rw-r--r--phpBB/phpbb/notification/type/disapprove_post.php8
-rw-r--r--phpBB/phpbb/notification/type/disapprove_topic.php8
-rw-r--r--phpBB/phpbb/notification/type/group_request.php8
-rw-r--r--phpBB/phpbb/notification/type/group_request_approved.php8
-rw-r--r--phpBB/phpbb/notification/type/pm.php8
-rw-r--r--phpBB/phpbb/notification/type/post.php43
-rw-r--r--phpBB/phpbb/notification/type/post_in_queue.php8
-rw-r--r--phpBB/phpbb/notification/type/quote.php10
-rw-r--r--phpBB/phpbb/notification/type/report_pm.php10
-rw-r--r--phpBB/phpbb/notification/type/report_pm_closed.php8
-rw-r--r--phpBB/phpbb/notification/type/report_post.php8
-rw-r--r--phpBB/phpbb/notification/type/report_post_closed.php8
-rw-r--r--phpBB/phpbb/notification/type/topic.php8
-rw-r--r--phpBB/phpbb/notification/type/topic_in_queue.php8
-rw-r--r--phpBB/phpbb/notification/type/type_interface.php8
-rw-r--r--phpBB/phpbb/pagination.php306
-rw-r--r--phpBB/phpbb/path_helper.php20
-rw-r--r--phpBB/phpbb/permissions.php8
-rw-r--r--phpBB/phpbb/php/ini.php8
-rw-r--r--phpBB/phpbb/plupload/plupload.php371
-rw-r--r--phpBB/phpbb/request/deactivated_super_global.php8
-rw-r--r--phpBB/phpbb/request/request.php10
-rw-r--r--phpBB/phpbb/request/request_interface.php8
-rw-r--r--phpBB/phpbb/request/type_cast_helper.php8
-rw-r--r--phpBB/phpbb/request/type_cast_helper_interface.php8
-rw-r--r--phpBB/phpbb/search/base.php8
-rw-r--r--phpBB/phpbb/search/fulltext_mysql.php29
-rw-r--r--phpBB/phpbb/search/fulltext_native.php17
-rw-r--r--phpBB/phpbb/search/fulltext_postgres.php8
-rw-r--r--phpBB/phpbb/search/fulltext_sphinx.php10
-rw-r--r--phpBB/phpbb/search/sphinx/config.php8
-rw-r--r--phpBB/phpbb/search/sphinx/config_comment.php8
-rw-r--r--phpBB/phpbb/search/sphinx/config_section.php8
-rw-r--r--phpBB/phpbb/search/sphinx/config_variable.php8
-rw-r--r--phpBB/phpbb/session.php29
-rw-r--r--phpBB/phpbb/symfony_request.php8
-rw-r--r--phpBB/phpbb/template/asset.php8
-rw-r--r--phpBB/phpbb/template/base.php8
-rw-r--r--phpBB/phpbb/template/context.php12
-rw-r--r--phpBB/phpbb/template/template.php8
-rw-r--r--phpBB/phpbb/template/twig/definition.php8
-rw-r--r--phpBB/phpbb/template/twig/environment.php8
-rw-r--r--phpBB/phpbb/template/twig/extension.php82
-rw-r--r--phpBB/phpbb/template/twig/lexer.php66
-rw-r--r--phpBB/phpbb/template/twig/loader.php8
-rw-r--r--phpBB/phpbb/template/twig/node/definenode.php8
-rw-r--r--phpBB/phpbb/template/twig/node/event.php18
-rw-r--r--phpBB/phpbb/template/twig/node/expression/binary/equalequal.php8
-rw-r--r--phpBB/phpbb/template/twig/node/expression/binary/notequalequal.php8
-rw-r--r--phpBB/phpbb/template/twig/node/includenode.php8
-rw-r--r--phpBB/phpbb/template/twig/node/includephp.php10
-rw-r--r--phpBB/phpbb/template/twig/node/php.php8
-rw-r--r--phpBB/phpbb/template/twig/tokenparser/defineparser.php15
-rw-r--r--phpBB/phpbb/template/twig/tokenparser/event.php8
-rw-r--r--phpBB/phpbb/template/twig/tokenparser/includejs.php8
-rw-r--r--phpBB/phpbb/template/twig/tokenparser/includeparser.php8
-rw-r--r--phpBB/phpbb/template/twig/tokenparser/includephp.php10
-rw-r--r--phpBB/phpbb/template/twig/tokenparser/php.php10
-rw-r--r--phpBB/phpbb/template/twig/twig.php8
-rw-r--r--phpBB/phpbb/tree/nestedset.php8
-rw-r--r--phpBB/phpbb/tree/nestedset_forum.php8
-rw-r--r--phpBB/phpbb/tree/tree_interface.php8
-rw-r--r--phpBB/phpbb/user.php11
-rw-r--r--phpBB/phpbb/user_loader.php7
229 files changed, 3024 insertions, 2018 deletions
diff --git a/phpBB/phpbb/auth/auth.php b/phpBB/phpbb/auth/auth.php
index b5cc675838..81676e75fc 100644
--- a/phpBB/phpbb/auth/auth.php
+++ b/phpBB/phpbb/auth/auth.php
@@ -10,14 +10,6 @@
namespace phpbb\auth;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Permission/Auth class
* @package phpBB3
*/
diff --git a/phpBB/phpbb/auth/provider/apache.php b/phpBB/phpbb/auth/provider/apache.php
index 9bd738c3e9..23cdc89829 100644
--- a/phpBB/phpbb/auth/provider/apache.php
+++ b/phpBB/phpbb/auth/provider/apache.php
@@ -10,14 +10,6 @@
namespace phpbb\auth\provider;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Apache authentication provider for phpBB3
*
* @package auth
diff --git a/phpBB/phpbb/auth/provider/base.php b/phpBB/phpbb/auth/provider/base.php
index 2222d8c1b6..78a3289356 100644
--- a/phpBB/phpbb/auth/provider/base.php
+++ b/phpBB/phpbb/auth/provider/base.php
@@ -10,14 +10,6 @@
namespace phpbb\auth\provider;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Base authentication provider class that all other providers should implement
*
* @package auth
diff --git a/phpBB/phpbb/auth/provider/db.php b/phpBB/phpbb/auth/provider/db.php
index aa597c8e9f..6bbbc0be16 100644
--- a/phpBB/phpbb/auth/provider/db.php
+++ b/phpBB/phpbb/auth/provider/db.php
@@ -10,14 +10,6 @@
namespace phpbb\auth\provider;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Database authentication provider for phpBB3
*
* This is for authentication via the integrated user table
diff --git a/phpBB/phpbb/auth/provider/ldap.php b/phpBB/phpbb/auth/provider/ldap.php
index 00beeea21b..e92a227e16 100644
--- a/phpBB/phpbb/auth/provider/ldap.php
+++ b/phpBB/phpbb/auth/provider/ldap.php
@@ -10,14 +10,6 @@
namespace phpbb\auth\provider;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Database authentication provider for phpBB3
*
* This is for authentication via the integrated user table
@@ -106,7 +98,6 @@ class ldap extends \phpbb\auth\provider\base
@ldap_close($ldap);
-
if (!is_array($result) || sizeof($result) < 2)
{
return sprintf($this->user->lang['LDAP_NO_IDENTITY'], $this->user->data['username']);
diff --git a/phpBB/phpbb/auth/provider/oauth/oauth.php b/phpBB/phpbb/auth/provider/oauth/oauth.php
index de81ac0d04..2749661269 100644
--- a/phpBB/phpbb/auth/provider/oauth/oauth.php
+++ b/phpBB/phpbb/auth/provider/oauth/oauth.php
@@ -9,14 +9,6 @@
namespace phpbb\auth\provider\oauth;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
use OAuth\Common\Consumer\Credentials;
use OAuth\Common\Http\Uri\Uri;
@@ -179,7 +171,7 @@ class oauth extends \phpbb\auth\provider\base
$storage = new \phpbb\auth\provider\oauth\token_storage($this->db, $this->user, $this->auth_provider_oauth_token_storage_table);
$query = 'mode=login&login=external&oauth_service=' . $service_name_original;
- $service = $this->get_service($service_name_original, $storage, $service_credentials, $this->service_providers[$service_name]->get_auth_scope(), $query);
+ $service = $this->get_service($service_name_original, $storage, $service_credentials, $query, $this->service_providers[$service_name]->get_auth_scope());
if ($this->request->is_set('code', \phpbb\request\request_interface::GET))
{
@@ -273,13 +265,13 @@ class oauth extends \phpbb\auth\provider\base
* @param string $service_name The name of the service
* @param \phpbb\auth\provider\oauth\token_storage $storage
* @param array $service_credentials {@see \phpbb\auth\provider\oauth\oauth::get_service_credentials}
- * @param array $scope The scope of the request against
- * the api.
* @param string $query The query string of the
* current_uri used in redirection
+ * @param array $scope The scope of the request against
+ * the api.
* @return \OAuth\Common\Service\ServiceInterface
*/
- protected function get_service($service_name, \phpbb\auth\provider\oauth\token_storage $storage, array $service_credentials, array $scopes = array(), $query)
+ protected function get_service($service_name, \phpbb\auth\provider\oauth\token_storage $storage, array $service_credentials, $query, array $scopes = array())
{
$current_uri = $this->get_current_uri($service_name, $query);
@@ -458,7 +450,7 @@ class oauth extends \phpbb\auth\provider\base
// Prepare for an authentication request
$service_credentials = $this->service_providers[$service_name]->get_service_credentials();
$scopes = $this->service_providers[$service_name]->get_auth_scope();
- $service = $this->get_service(strtolower($link_data['oauth_service']), $storage, $service_credentials, $scopes, $query);
+ $service = $this->get_service(strtolower($link_data['oauth_service']), $storage, $service_credentials, $query, $scopes);
$this->service_providers[$service_name]->set_external_service_provider($service);
// The user has already authenticated successfully, request to authenticate again
@@ -491,7 +483,7 @@ class oauth extends \phpbb\auth\provider\base
$query = 'i=ucp_auth_link&mode=auth_link&link=1&oauth_service=' . strtolower($link_data['oauth_service']);
$service_credentials = $this->service_providers[$service_name]->get_service_credentials();
$scopes = $this->service_providers[$service_name]->get_auth_scope();
- $service = $this->get_service(strtolower($link_data['oauth_service']), $storage, $service_credentials, $scopes, $query);
+ $service = $this->get_service(strtolower($link_data['oauth_service']), $storage, $service_credentials, $query, $scopes);
if ($this->request->is_set('code', \phpbb\request\request_interface::GET))
{
diff --git a/phpBB/phpbb/auth/provider/oauth/service/base.php b/phpBB/phpbb/auth/provider/oauth/service/base.php
index 61deb48695..7a144d2f51 100644
--- a/phpBB/phpbb/auth/provider/oauth/service/base.php
+++ b/phpBB/phpbb/auth/provider/oauth/service/base.php
@@ -10,14 +10,6 @@
namespace phpbb\auth\provider\oauth\service;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Base OAuth abstract class that all OAuth services should implement
*
* @package auth
diff --git a/phpBB/phpbb/auth/provider/oauth/service/bitly.php b/phpBB/phpbb/auth/provider/oauth/service/bitly.php
index 47cf7ee380..b4050033a6 100644
--- a/phpBB/phpbb/auth/provider/oauth/service/bitly.php
+++ b/phpBB/phpbb/auth/provider/oauth/service/bitly.php
@@ -10,14 +10,6 @@
namespace phpbb\auth\provider\oauth\service;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Bitly OAuth service
*
* @package auth
diff --git a/phpBB/phpbb/auth/provider/oauth/service/exception.php b/phpBB/phpbb/auth/provider/oauth/service/exception.php
index 23d3387951..3bc93be01e 100644
--- a/phpBB/phpbb/auth/provider/oauth/service/exception.php
+++ b/phpBB/phpbb/auth/provider/oauth/service/exception.php
@@ -7,19 +7,13 @@
*
*/
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
+namespace phpbb\auth\provider\oauth\service;
/**
* OAuth service exception class
*
* @package auth
*/
-class phpbb_auth_provider_oauth_service_exception extends RuntimeException
+class exception extends \RuntimeException
{
}
diff --git a/phpBB/phpbb/auth/provider/oauth/service/facebook.php b/phpBB/phpbb/auth/provider/oauth/service/facebook.php
index 4a4eeba6d5..2698be8b18 100644
--- a/phpBB/phpbb/auth/provider/oauth/service/facebook.php
+++ b/phpBB/phpbb/auth/provider/oauth/service/facebook.php
@@ -10,14 +10,6 @@
namespace phpbb\auth\provider\oauth\service;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Facebook OAuth service
*
* @package auth
diff --git a/phpBB/phpbb/auth/provider/oauth/service/google.php b/phpBB/phpbb/auth/provider/oauth/service/google.php
index 2449bbf523..08cb025c2d 100644
--- a/phpBB/phpbb/auth/provider/oauth/service/google.php
+++ b/phpBB/phpbb/auth/provider/oauth/service/google.php
@@ -10,14 +10,6 @@
namespace phpbb\auth\provider\oauth\service;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Google OAuth service
*
* @package auth
diff --git a/phpBB/phpbb/auth/provider/oauth/service/service_interface.php b/phpBB/phpbb/auth/provider/oauth/service/service_interface.php
index ab69fe6ef3..eee3a51cac 100644
--- a/phpBB/phpbb/auth/provider/oauth/service/service_interface.php
+++ b/phpBB/phpbb/auth/provider/oauth/service/service_interface.php
@@ -10,14 +10,6 @@
namespace phpbb\auth\provider\oauth\service;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* OAuth service interface
*
* @package auth
diff --git a/phpBB/phpbb/auth/provider/oauth/token_storage.php b/phpBB/phpbb/auth/provider/oauth/token_storage.php
index 2ce0e32da3..43574288dc 100644
--- a/phpBB/phpbb/auth/provider/oauth/token_storage.php
+++ b/phpBB/phpbb/auth/provider/oauth/token_storage.php
@@ -9,14 +9,6 @@
namespace phpbb\auth\provider\oauth;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
use OAuth\OAuth1\Token\StdOAuth1Token;
use OAuth\Common\Token\TokenInterface;
@@ -78,7 +70,7 @@ class token_storage implements TokenStorageInterface
{
$service = $this->get_service_name_for_db($service);
- if ($this->cachedToken instanceOf TokenInterface)
+ if ($this->cachedToken instanceof TokenInterface)
{
return $this->cachedToken;
}
@@ -238,7 +230,7 @@ class token_storage implements TokenStorageInterface
{
$service = $this->get_service_name_for_db($service);
- if ($this->cachedToken instanceOf TokenInterface) {
+ if ($this->cachedToken instanceof TokenInterface) {
return $this->cachedToken;
}
diff --git a/phpBB/phpbb/auth/provider/provider_interface.php b/phpBB/phpbb/auth/provider/provider_interface.php
index 1bb209c821..946731f52d 100644
--- a/phpBB/phpbb/auth/provider/provider_interface.php
+++ b/phpBB/phpbb/auth/provider/provider_interface.php
@@ -10,14 +10,6 @@
namespace phpbb\auth\provider;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* The interface authentication provider classes have to implement.
*
* @package auth
diff --git a/phpBB/phpbb/avatar/driver/driver.php b/phpBB/phpbb/avatar/driver/driver.php
index 0c54951cbd..dd55f09119 100644
--- a/phpBB/phpbb/avatar/driver/driver.php
+++ b/phpBB/phpbb/avatar/driver/driver.php
@@ -10,14 +10,6 @@
namespace phpbb\avatar\driver;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Base class for avatar drivers
* @package phpBB3
*/
@@ -48,6 +40,12 @@ abstract class driver implements \phpbb\avatar\driver\driver_interface
protected $php_ext;
/**
+ * Path Helper
+ * @var \phpbb\path_helper
+ */
+ protected $path_helper;
+
+ /**
* Cache driver
* @var \phpbb\cache\driver\driver_interface
*/
@@ -75,13 +73,15 @@ abstract class driver implements \phpbb\avatar\driver\driver_interface
* @param \phpbb\request\request $request Request object
* @param string $phpbb_root_path Path to the phpBB root
* @param string $php_ext PHP file extension
+ * @param \phpbb_path_helper $path_helper phpBB path helper
* @param \phpbb\cache\driver\driver_interface $cache Cache driver
*/
- public function __construct(\phpbb\config\config $config, $phpbb_root_path, $php_ext, \phpbb\cache\driver\driver_interface $cache = null)
+ public function __construct(\phpbb\config\config $config, $phpbb_root_path, $php_ext, \phpbb\path_helper $path_helper, \phpbb\cache\driver\driver_interface $cache = null)
{
$this->config = $config;
$this->phpbb_root_path = $phpbb_root_path;
$this->php_ext = $php_ext;
+ $this->path_helper = $path_helper;
$this->cache = $cache;
}
@@ -112,17 +112,6 @@ abstract class driver implements \phpbb\avatar\driver\driver_interface
/**
* @inheritdoc
*/
- public function get_template_name()
- {
- $driver = preg_replace('#^phpbb\\\\avatar\\\\driver\\\\#', '', get_class($this));
- $template = "ucp_avatar_options_$driver.html";
-
- return $template;
- }
-
- /**
- * @inheritdoc
- */
public function get_name()
{
return $this->name;
diff --git a/phpBB/phpbb/avatar/driver/driver_interface.php b/phpBB/phpbb/avatar/driver/driver_interface.php
index d9540c19db..7f049469a2 100644
--- a/phpBB/phpbb/avatar/driver/driver_interface.php
+++ b/phpBB/phpbb/avatar/driver/driver_interface.php
@@ -10,14 +10,6 @@
namespace phpbb\avatar\driver;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Interface for avatar drivers
* @package phpBB3
*/
diff --git a/phpBB/phpbb/avatar/driver/gravatar.php b/phpBB/phpbb/avatar/driver/gravatar.php
index 3ad783932e..9f14b7f468 100644
--- a/phpBB/phpbb/avatar/driver/gravatar.php
+++ b/phpBB/phpbb/avatar/driver/gravatar.php
@@ -10,14 +10,6 @@
namespace phpbb\avatar\driver;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Handles avatars hosted at gravatar.com
* @package phpBB3
*/
@@ -155,6 +147,14 @@ class gravatar extends \phpbb\avatar\driver\driver
}
/**
+ * @inheritdoc
+ */
+ public function get_template_name()
+ {
+ return 'ucp_avatar_options_gravatar.html';
+ }
+
+ /**
* Build gravatar URL for output on page
*
* @return string Gravatar URL
diff --git a/phpBB/phpbb/avatar/driver/local.php b/phpBB/phpbb/avatar/driver/local.php
index d779099c46..611a44cb3d 100644
--- a/phpBB/phpbb/avatar/driver/local.php
+++ b/phpBB/phpbb/avatar/driver/local.php
@@ -10,14 +10,6 @@
namespace phpbb\avatar\driver;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Handles avatars selected from the board gallery
* @package phpBB3
*/
@@ -29,7 +21,7 @@ class local extends \phpbb\avatar\driver\driver
public function get_data($row)
{
return array(
- 'src' => $this->phpbb_root_path . $this->config['avatar_gallery_path'] . '/' . $row['avatar'],
+ 'src' => $this->path_helper->get_web_root_path() . $this->config['avatar_gallery_path'] . '/' . $row['avatar'],
'width' => $row['avatar_width'],
'height' => $row['avatar_height'],
);
@@ -143,6 +135,14 @@ class local extends \phpbb\avatar\driver\driver
}
/**
+ * @inheritdoc
+ */
+ public function get_template_name()
+ {
+ return 'ucp_avatar_options_local.html';
+ }
+
+ /**
* Get a list of avatars that are locally available
* Results get cached for 24 hours (86400 seconds)
*
diff --git a/phpBB/phpbb/avatar/driver/remote.php b/phpBB/phpbb/avatar/driver/remote.php
index 1aa638dfe5..36623942df 100644
--- a/phpBB/phpbb/avatar/driver/remote.php
+++ b/phpBB/phpbb/avatar/driver/remote.php
@@ -10,14 +10,6 @@
namespace phpbb\avatar\driver;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Handles avatars hosted remotely
* @package phpBB3
*/
@@ -125,6 +117,37 @@ class remote extends \phpbb\avatar\driver\driver
$types = \fileupload::image_types();
$extension = strtolower(\filespec::get_extension($url));
+ // Check if this is actually an image
+ if ($file_stream = @fopen($url, 'r'))
+ {
+ // Timeout after 1 second
+ stream_set_timeout($file_stream, 1);
+ $meta = stream_get_meta_data($file_stream);
+ foreach ($meta['wrapper_data'] as $header)
+ {
+ $header = preg_split('/ /', $header, 2);
+ if (strtr(strtolower(trim($header[0], ':')), '_', '-') === 'content-type')
+ {
+ if (strpos($header[1], 'image/') !== 0)
+ {
+ $error[] = 'AVATAR_URL_INVALID';
+ fclose($file_stream);
+ return false;
+ }
+ else
+ {
+ fclose($file_stream);
+ break;
+ }
+ }
+ }
+ }
+ else
+ {
+ $error[] = 'AVATAR_URL_INVALID';
+ return false;
+ }
+
if (!empty($image_data) && (!isset($types[$image_data[2]]) || !in_array($extension, $types[$image_data[2]])))
{
if (!isset($types[$image_data[2]]))
@@ -163,4 +186,12 @@ class remote extends \phpbb\avatar\driver\driver
'avatar_height' => $height,
);
}
+
+ /**
+ * @inheritdoc
+ */
+ public function get_template_name()
+ {
+ return 'ucp_avatar_options_remote.html';
+ }
}
diff --git a/phpBB/phpbb/avatar/driver/upload.php b/phpBB/phpbb/avatar/driver/upload.php
index 377c9a0b04..1e50e135e4 100644
--- a/phpBB/phpbb/avatar/driver/upload.php
+++ b/phpBB/phpbb/avatar/driver/upload.php
@@ -10,14 +10,6 @@
namespace phpbb\avatar\driver;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Handles avatars uploaded to the board
* @package phpBB3
*/
@@ -29,7 +21,7 @@ class upload extends \phpbb\avatar\driver\driver
public function get_data($row, $ignore_config = false)
{
return array(
- 'src' => $this->phpbb_root_path . 'download/file.' . $this->php_ext . '?avatar=' . $row['avatar'],
+ 'src' => $this->path_helper->get_web_root_path() . 'download/file.' . $this->php_ext . '?avatar=' . $row['avatar'],
'width' => $row['avatar_width'],
'height' => $row['avatar_height'],
);
@@ -176,6 +168,14 @@ class upload extends \phpbb\avatar\driver\driver
}
/**
+ * @inheritdoc
+ */
+ public function get_template_name()
+ {
+ return 'ucp_avatar_options_upload.html';
+ }
+
+ /**
* Check if user is able to upload an avatar
*
* @return bool True if user can upload, false if not
diff --git a/phpBB/phpbb/avatar/manager.php b/phpBB/phpbb/avatar/manager.php
index c28380a401..6ce924d2eb 100644
--- a/phpBB/phpbb/avatar/manager.php
+++ b/phpBB/phpbb/avatar/manager.php
@@ -10,14 +10,6 @@
namespace phpbb\avatar;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* @package avatar
*/
class manager
@@ -42,12 +34,6 @@ class manager
protected $avatar_drivers;
/**
- * Service container object
- * @var object
- */
- protected $container;
-
- /**
* Default avatar data row
* @var array
*/
@@ -63,13 +49,27 @@ class manager
*
* @param \phpbb\config\config $config phpBB configuration
* @param array $avatar_drivers Avatar drivers passed via the service container
- * @param object $container Container object
*/
- public function __construct(\phpbb\config\config $config, $avatar_drivers, $container)
+ public function __construct(\phpbb\config\config $config, $avatar_drivers)
{
$this->config = $config;
- $this->avatar_drivers = $avatar_drivers;
- $this->container = $container;
+ $this->register_avatar_drivers($avatar_drivers);
+ }
+
+ /**
+ * Register avatar drivers
+ *
+ * @param array $avatar_drivers Service collection of avatar drivers
+ */
+ protected function register_avatar_drivers($avatar_drivers)
+ {
+ if (!empty($avatar_drivers))
+ {
+ foreach ($avatar_drivers as $driver)
+ {
+ $this->avatar_drivers[$driver->get_name()] = $driver;
+ }
+ }
}
/**
@@ -112,7 +112,7 @@ class manager
* There is no need to handle invalid avatar types as the following code
* will cause a ServiceNotFoundException if the type does not exist
*/
- $driver = $this->container->get($avatar_type);
+ $driver = $this->avatar_drivers[$avatar_type];
return $driver;
}
@@ -178,14 +178,16 @@ class manager
}
/**
- * Strip out user_ and group_ prefixes from keys
+ * Strip out user_, group_, or other prefixes from array keys
*
- * @param array $row User data or group data
+ * @param array $row User data or group data
+ * @param string $prefix Prefix of data keys (e.g. user), should not include the trailing underscore
*
- * @return array User data or group data with keys that have been
- * stripped from the preceding "user_" or "group_"
+ * @return array User or group data with keys that have been
+ * stripped from the preceding "user_" or "group_"
+ * Also the group id is prefixed with g, when the prefix group is removed.
*/
- static public function clean_row($row)
+ static public function clean_row($row, $prefix = '')
{
// Upon creation of a user/group $row might be empty
if (empty($row))
@@ -193,23 +195,19 @@ class manager
return self::$default_row;
}
- $keys = array_keys($row);
- $values = array_values($row);
-
- $keys = array_map(array('\phpbb\avatar\manager', 'strip_prefix'), $keys);
+ $output = array();
+ foreach ($row as $key => $value)
+ {
+ $key = preg_replace("#^(?:{$prefix}_)#", '', $key);
+ $output[$key] = $value;
+ }
- return array_combine($keys, $values);
- }
+ if ($prefix === 'group' && isset($output['id']))
+ {
+ $output['id'] = 'g' . $output['id'];
+ }
- /**
- * Strip prepending user_ or group_ prefix from key
- *
- * @param string Array key
- * @return string Key that has been stripped from its prefix
- */
- static protected function strip_prefix($key)
- {
- return preg_replace('#^(?:user_|group_)#', '', $key);
+ return $output;
}
/**
diff --git a/phpBB/phpbb/cache/driver/apc.php b/phpBB/phpbb/cache/driver/apc.php
index ce72ec6134..a28d91c00a 100644
--- a/phpBB/phpbb/cache/driver/apc.php
+++ b/phpBB/phpbb/cache/driver/apc.php
@@ -10,14 +10,6 @@
namespace phpbb\cache\driver;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* ACM for APC
* @package acm
*/
diff --git a/phpBB/phpbb/cache/driver/base.php b/phpBB/phpbb/cache/driver/base.php
index 90185a00d2..feaca25a5b 100644
--- a/phpBB/phpbb/cache/driver/base.php
+++ b/phpBB/phpbb/cache/driver/base.php
@@ -10,14 +10,6 @@
namespace phpbb\cache\driver;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* @package acm
*/
abstract class base implements \phpbb\cache\driver\driver_interface
diff --git a/phpBB/phpbb/cache/driver/driver_interface.php b/phpBB/phpbb/cache/driver/driver_interface.php
index 34c60b5935..0715a4b934 100644
--- a/phpBB/phpbb/cache/driver/driver_interface.php
+++ b/phpBB/phpbb/cache/driver/driver_interface.php
@@ -10,14 +10,6 @@
namespace phpbb\cache\driver;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* An interface that all cache drivers must implement
*
* @package acm
diff --git a/phpBB/phpbb/cache/driver/eaccelerator.php b/phpBB/phpbb/cache/driver/eaccelerator.php
index 72c0d77d02..2629cb53e5 100644
--- a/phpBB/phpbb/cache/driver/eaccelerator.php
+++ b/phpBB/phpbb/cache/driver/eaccelerator.php
@@ -10,14 +10,6 @@
namespace phpbb\cache\driver;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* ACM for eAccelerator
* @package acm
* @todo Missing locks from destroy() talk with David
diff --git a/phpBB/phpbb/cache/driver/file.php b/phpBB/phpbb/cache/driver/file.php
index a64232400b..6686da6953 100644
--- a/phpBB/phpbb/cache/driver/file.php
+++ b/phpBB/phpbb/cache/driver/file.php
@@ -10,14 +10,6 @@
namespace phpbb\cache\driver;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* ACM File Based Caching
* @package acm
*/
diff --git a/phpBB/phpbb/cache/driver/memcache.php b/phpBB/phpbb/cache/driver/memcache.php
index 84fe68ae49..c725ec0fb0 100644
--- a/phpBB/phpbb/cache/driver/memcache.php
+++ b/phpBB/phpbb/cache/driver/memcache.php
@@ -9,14 +9,6 @@
namespace phpbb\cache\driver;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
if (!defined('PHPBB_ACM_MEMCACHE_PORT'))
{
define('PHPBB_ACM_MEMCACHE_PORT', 11211);
diff --git a/phpBB/phpbb/cache/driver/memory.php b/phpBB/phpbb/cache/driver/memory.php
index 5a9861913f..292024212b 100644
--- a/phpBB/phpbb/cache/driver/memory.php
+++ b/phpBB/phpbb/cache/driver/memory.php
@@ -10,14 +10,6 @@
namespace phpbb\cache\driver;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* ACM Abstract Memory Class
* @package acm
*/
diff --git a/phpBB/phpbb/cache/driver/null.php b/phpBB/phpbb/cache/driver/null.php
index c03319ad61..ea535ca1e1 100644
--- a/phpBB/phpbb/cache/driver/null.php
+++ b/phpBB/phpbb/cache/driver/null.php
@@ -10,14 +10,6 @@
namespace phpbb\cache\driver;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* ACM Null Caching
* @package acm
*/
diff --git a/phpBB/phpbb/cache/driver/redis.php b/phpBB/phpbb/cache/driver/redis.php
index 317d07428a..3c6cb0e138 100644
--- a/phpBB/phpbb/cache/driver/redis.php
+++ b/phpBB/phpbb/cache/driver/redis.php
@@ -9,14 +9,6 @@
namespace phpbb\cache\driver;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
if (!defined('PHPBB_ACM_REDIS_PORT'))
{
define('PHPBB_ACM_REDIS_PORT', 6379);
diff --git a/phpBB/phpbb/cache/driver/wincache.php b/phpBB/phpbb/cache/driver/wincache.php
index a0b24e4a1f..1f040e9ab2 100644
--- a/phpBB/phpbb/cache/driver/wincache.php
+++ b/phpBB/phpbb/cache/driver/wincache.php
@@ -10,14 +10,6 @@
namespace phpbb\cache\driver;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* ACM for WinCache
* @package acm
*/
diff --git a/phpBB/phpbb/cache/driver/xcache.php b/phpBB/phpbb/cache/driver/xcache.php
index fdcbf7e4b5..4d0d683b3d 100644
--- a/phpBB/phpbb/cache/driver/xcache.php
+++ b/phpBB/phpbb/cache/driver/xcache.php
@@ -10,14 +10,6 @@
namespace phpbb\cache\driver;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* ACM for XCache
* @package acm
*
diff --git a/phpBB/phpbb/cache/service.php b/phpBB/phpbb/cache/service.php
index da8f4eb8d8..ebbcfb8cdb 100644
--- a/phpBB/phpbb/cache/service.php
+++ b/phpBB/phpbb/cache/service.php
@@ -10,14 +10,6 @@
namespace phpbb\cache;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Class for grabbing/handling cached entries
* @package acm
*/
diff --git a/phpBB/phpbb/class_loader.php b/phpBB/phpbb/class_loader.php
index 769f28b4f1..37b62fff24 100644
--- a/phpBB/phpbb/class_loader.php
+++ b/phpBB/phpbb/class_loader.php
@@ -10,14 +10,6 @@
namespace phpbb;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* The class loader resolves class names to file system paths and loads them if
* necessary.
*
@@ -55,7 +47,7 @@ class class_loader
* @param \phpbb\cache\driver\driver_interface $cache An implementation of the phpBB cache interface.
*/
public function __construct($namespace, $path, $php_ext = 'php', \phpbb\cache\driver\driver_interface $cache = null)
- {
+ {
if ($namespace[0] !== '\\')
{
$namespace = '\\' . $namespace;
diff --git a/phpBB/phpbb/config/config.php b/phpBB/phpbb/config/config.php
index dc865df707..d37922acf1 100644
--- a/phpBB/phpbb/config/config.php
+++ b/phpBB/phpbb/config/config.php
@@ -10,14 +10,6 @@
namespace phpbb\config;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Configuration container class
* @package phpBB3
*/
diff --git a/phpBB/phpbb/config/db.php b/phpBB/phpbb/config/db.php
index 0a490af14f..c1a3630a14 100644
--- a/phpBB/phpbb/config/db.php
+++ b/phpBB/phpbb/config/db.php
@@ -10,14 +10,6 @@
namespace phpbb\config;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Configuration container class
* @package phpBB3
*/
diff --git a/phpBB/phpbb/config/db_text.php b/phpBB/phpbb/config/db_text.php
index 3ee3351e19..b1ea112b53 100644
--- a/phpBB/phpbb/config/db_text.php
+++ b/phpBB/phpbb/config/db_text.php
@@ -10,14 +10,6 @@
namespace phpbb\config;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Manages configuration options with an arbitrary length value stored in a TEXT
* column. In constrast to class \phpbb\config\db, values are never cached and
* prefetched, but every get operation sends a query to the database.
diff --git a/phpBB/phpbb/console/application.php b/phpBB/phpbb/console/application.php
new file mode 100644
index 0000000000..fdcd9d42f6
--- /dev/null
+++ b/phpBB/phpbb/console/application.php
@@ -0,0 +1,23 @@
+<?php
+/**
+*
+* @package phpBB3
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+namespace phpbb\console;
+
+use Symfony\Component\DependencyInjection\TaggedContainerInterface;
+
+class application extends \Symfony\Component\Console\Application
+{
+ function register_container_commands(TaggedContainerInterface $container, $tag = 'console.command')
+ {
+ foreach($container->findTaggedServiceIds($tag) as $id => $void)
+ {
+ $this->add($container->get($id));
+ }
+ }
+}
diff --git a/phpBB/phpbb/console/command/command.php b/phpBB/phpbb/console/command/command.php
new file mode 100644
index 0000000000..6abbdd203c
--- /dev/null
+++ b/phpBB/phpbb/console/command/command.php
@@ -0,0 +1,14 @@
+<?php
+/**
+*
+* @package phpBB3
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+namespace phpbb\console\command;
+
+abstract class command extends \Symfony\Component\Console\Command\Command
+{
+}
diff --git a/phpBB/phpbb/console/command/extension/command.php b/phpBB/phpbb/console/command/extension/command.php
new file mode 100644
index 0000000000..edde7ce2e2
--- /dev/null
+++ b/phpBB/phpbb/console/command/extension/command.php
@@ -0,0 +1,22 @@
+<?php
+/**
+*
+* @package phpBB3
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+namespace phpbb\console\command\extension;
+
+abstract class command extends \phpbb\console\command\command
+{
+ /** @var \phpbb\extension\manager */
+ protected $manager;
+
+ function __construct(\phpbb\extension\manager $manager)
+ {
+ $this->manager = $manager;
+
+ parent::__construct();
+ }
+}
diff --git a/phpBB/phpbb/console/command/extension/disable.php b/phpBB/phpbb/console/command/extension/disable.php
new file mode 100644
index 0000000000..e4de70ca34
--- /dev/null
+++ b/phpBB/phpbb/console/command/extension/disable.php
@@ -0,0 +1,47 @@
+<?php
+/**
+*
+* @package phpBB3
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+namespace phpbb\console\command\extension;
+
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class disable extends command
+{
+ protected function configure()
+ {
+ $this
+ ->setName('extension:disable')
+ ->setDescription('Disables the specified extension.')
+ ->addArgument(
+ 'extension-name',
+ InputArgument::REQUIRED,
+ 'Name of the extension'
+ )
+ ;
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output)
+ {
+ $name = $input->getArgument('extension-name');
+ $this->manager->disable($name);
+ $this->manager->load_extensions();
+
+ if ($this->manager->enabled($name))
+ {
+ $output->writeln("<error>Could not disable extension $name</error>");
+ return 1;
+ }
+ else
+ {
+ $output->writeln("<info>Successfully disabled extension $name</info>");
+ return 0;
+ }
+ }
+}
diff --git a/phpBB/phpbb/console/command/extension/enable.php b/phpBB/phpbb/console/command/extension/enable.php
new file mode 100644
index 0000000000..ee7dae76aa
--- /dev/null
+++ b/phpBB/phpbb/console/command/extension/enable.php
@@ -0,0 +1,47 @@
+<?php
+/**
+*
+* @package phpBB3
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+namespace phpbb\console\command\extension;
+
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class enable extends command
+{
+ protected function configure()
+ {
+ $this
+ ->setName('extension:enable')
+ ->setDescription('Enables the specified extension.')
+ ->addArgument(
+ 'extension-name',
+ InputArgument::REQUIRED,
+ 'Name of the extension'
+ )
+ ;
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output)
+ {
+ $name = $input->getArgument('extension-name');
+ $this->manager->enable($name);
+ $this->manager->load_extensions();
+
+ if ($this->manager->enabled($name))
+ {
+ $output->writeln("<info>Successfully enabled extension $name</info>");
+ return 0;
+ }
+ else
+ {
+ $output->writeln("<error>Could not enable extension $name</error>");
+ return 1;
+ }
+ }
+}
diff --git a/phpBB/phpbb/console/command/extension/purge.php b/phpBB/phpbb/console/command/extension/purge.php
new file mode 100644
index 0000000000..c2e1d2928c
--- /dev/null
+++ b/phpBB/phpbb/console/command/extension/purge.php
@@ -0,0 +1,47 @@
+<?php
+/**
+*
+* @package phpBB3
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+namespace phpbb\console\command\extension;
+
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class purge extends command
+{
+ protected function configure()
+ {
+ $this
+ ->setName('extension:purge')
+ ->setDescription('Purges the specified extension.')
+ ->addArgument(
+ 'extension-name',
+ InputArgument::REQUIRED,
+ 'Name of the extension'
+ )
+ ;
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output)
+ {
+ $name = $input->getArgument('extension-name');
+ $this->manager->purge($name);
+ $this->manager->load_extensions();
+
+ if ($this->manager->enabled($name))
+ {
+ $output->writeln("<error>Could not purge extension $name</error>");
+ return 1;
+ }
+ else
+ {
+ $output->writeln("<info>Successfully purge extension $name</info>");
+ return 0;
+ }
+ }
+}
diff --git a/phpBB/phpbb/console/command/extension/show.php b/phpBB/phpbb/console/command/extension/show.php
new file mode 100644
index 0000000000..0f48ac2379
--- /dev/null
+++ b/phpBB/phpbb/console/command/extension/show.php
@@ -0,0 +1,58 @@
+<?php
+/**
+*
+* @package phpBB3
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+namespace phpbb\console\command\extension;
+
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class show extends command
+{
+ protected function configure()
+ {
+ $this
+ ->setName('extension:show')
+ ->setDescription('Lists all extensions in the database and on the filesystem.')
+ ;
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output)
+ {
+ $this->manager->load_extensions();
+ $all = array_keys($this->manager->all_available());
+
+ if (empty($all))
+ {
+ $output->writeln('<comment>No extensions were found.</comment>');
+ return 3;
+ }
+
+ $enabled = array_keys($this->manager->all_enabled());
+ $this->print_extension_list($output, 'Enabled', $enabled);
+
+ $output->writeln('');
+
+ $disabled = array_keys($this->manager->all_disabled());
+ $this->print_extension_list($output, 'Disabled', $disabled);
+
+ $output->writeln('');
+
+ $purged = array_diff($all, $enabled, $disabled);
+ $this->print_extension_list($output, 'Available', $purged);
+ }
+
+ protected function print_extension_list(OutputInterface $output, $type, array $extensions)
+ {
+ $output->writeln("<info>$type:</info>");
+
+ foreach ($extensions as $extension)
+ {
+ $output->writeln(" - $extension");
+ }
+ }
+}
diff --git a/phpBB/phpbb/console/command/fixup/recalculate_email_hash.php b/phpBB/phpbb/console/command/fixup/recalculate_email_hash.php
new file mode 100644
index 0000000000..04db880091
--- /dev/null
+++ b/phpBB/phpbb/console/command/fixup/recalculate_email_hash.php
@@ -0,0 +1,71 @@
+<?php
+/**
+*
+* @package phpBB3
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+namespace phpbb\console\command\fixup;
+
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class recalculate_email_hash extends \phpbb\console\command\command
+{
+ /** @var \phpbb\db\driver\driver */
+ protected $db;
+
+ function __construct(\phpbb\db\driver\driver $db)
+ {
+ $this->db = $db;
+
+ parent::__construct();
+ }
+
+ protected function configure()
+ {
+ $this
+ ->setName('fixup:recalculate-email-hash')
+ ->setDescription('Recalculates the user_email_hash column of the users table.')
+ ;
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output)
+ {
+ $sql = 'SELECT user_id, user_email, user_email_hash
+ FROM ' . USERS_TABLE . '
+ WHERE user_type <> ' . USER_IGNORE . "
+ AND user_email <> ''";
+ $result = $this->db->sql_query($sql);
+
+ while ($row = $this->db->sql_fetchrow($result))
+ {
+ $user_email_hash = phpbb_email_hash($row['user_email']);
+ if ($user_email_hash !== $row['user_email_hash'])
+ {
+ $sql_ary = array(
+ 'user_email_hash' => $user_email_hash,
+ );
+
+ $sql = 'UPDATE ' . USERS_TABLE . '
+ SET ' . $this->db->sql_build_array('UPDATE', $sql_ary) . '
+ WHERE user_id = ' . (int) $row['user_id'];
+ $this->db->sql_query($sql);
+
+ if ($output->getVerbosity() >= OutputInterface::VERBOSITY_DEBUG)
+ {
+ $output->writeln(sprintf(
+ 'user_id %d, email %s => %s',
+ $row['user_id'],
+ $row['user_email'],
+ $user_email_hash
+ ));
+ }
+ }
+ }
+ $this->db->sql_freeresult($result);
+
+ $output->writeln('<info>Successfully recalculated all email hashes.</info>');
+ }
+}
diff --git a/phpBB/phpbb/content_visibility.php b/phpBB/phpbb/content_visibility.php
index bf720957bc..874889015a 100644
--- a/phpBB/phpbb/content_visibility.php
+++ b/phpBB/phpbb/content_visibility.php
@@ -10,14 +10,6 @@
namespace phpbb;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* phpbb_visibility
* Handle fetching and setting the visibility for topics and posts
* @package phpbb
@@ -556,7 +548,7 @@ class content_visibility
*
* @param $data array Contains information from the topics table about given topic
* @param $sql_data array Populated with the SQL changes, may be empty at call time
- * @return void
+ * @return null
*/
public function add_post_to_statistic($data, &$sql_data)
{
@@ -577,7 +569,7 @@ class content_visibility
*
* @param $data array Contains information from the topics table about given topic
* @param $sql_data array Populated with the SQL changes, may be empty at call time
- * @return void
+ * @return null
*/
public function remove_post_from_statistic($data, &$sql_data)
{
@@ -599,7 +591,7 @@ class content_visibility
* @param $forum_id int Forum where the topic is found
* @param $topic_row array Contains information from the topic, may be empty at call time
* @param $sql_data array Populated with the SQL changes, may be empty at call time
- * @return void
+ * @return null
*/
public function remove_topic_from_statistic($topic_id, $forum_id, &$topic_row, &$sql_data)
{
diff --git a/phpBB/phpbb/controller/exception.php b/phpBB/phpbb/controller/exception.php
index e8694b8bcf..06ece8d1d5 100644
--- a/phpBB/phpbb/controller/exception.php
+++ b/phpBB/phpbb/controller/exception.php
@@ -10,14 +10,6 @@
namespace phpbb\controller;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Controller exception class
* @package phpBB3
*/
diff --git a/phpBB/phpbb/controller/helper.php b/phpBB/phpbb/controller/helper.php
index 07483a91eb..05a05d1e57 100644
--- a/phpBB/phpbb/controller/helper.php
+++ b/phpBB/phpbb/controller/helper.php
@@ -9,14 +9,6 @@
namespace phpbb\controller;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
use Symfony\Component\HttpFoundation\Response;
/**
diff --git a/phpBB/phpbb/controller/provider.php b/phpBB/phpbb/controller/provider.php
index 3aad08e3aa..fde51696e8 100644
--- a/phpBB/phpbb/controller/provider.php
+++ b/phpBB/phpbb/controller/provider.php
@@ -9,14 +9,6 @@
namespace phpbb\controller;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Loader\YamlFileLoader;
use Symfony\Component\Config\FileLocator;
@@ -31,17 +23,17 @@ class provider
* YAML file(s) containing route information
* @var array
*/
- protected $routing_paths;
+ protected $routing_files;
/**
* Construct method
*
- * @param array() $routing_paths Array of strings containing paths
+ * @param array() $routing_files Array of strings containing paths
* to YAML files holding route information
*/
- public function __construct($routing_paths = array())
+ public function __construct($routing_files = array())
{
- $this->routing_paths = $routing_paths;
+ $this->routing_files = $routing_files;
}
/**
@@ -54,12 +46,11 @@ class provider
{
// We hardcode the path to the core config directory
// because the finder cannot find it
- $this->routing_paths = array_merge(array('config'), array_map('dirname', array_keys($finder
+ $this->routing_files = array_merge(array('config/routing.yml'), array_keys($finder
->directory('config')
- ->prefix('routing')
- ->suffix('yml')
+ ->suffix('routing.yml')
->find()
- )));
+ ));
return $this;
}
@@ -73,10 +64,10 @@ class provider
public function find($base_path = '')
{
$routes = new RouteCollection;
- foreach ($this->routing_paths as $path)
+ foreach ($this->routing_files as $file_path)
{
- $loader = new YamlFileLoader(new FileLocator($base_path . $path));
- $routes->addCollection($loader->load('routing.yml'));
+ $loader = new YamlFileLoader(new FileLocator($base_path));
+ $routes->addCollection($loader->load($file_path));
}
return $routes;
diff --git a/phpBB/phpbb/controller/resolver.php b/phpBB/phpbb/controller/resolver.php
index 1cc8981105..233179e343 100644
--- a/phpBB/phpbb/controller/resolver.php
+++ b/phpBB/phpbb/controller/resolver.php
@@ -9,14 +9,6 @@
namespace phpbb\controller;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Request;
diff --git a/phpBB/phpbb/cron/manager.php b/phpBB/phpbb/cron/manager.php
index f58ba64a3d..b6af07aff7 100644
--- a/phpBB/phpbb/cron/manager.php
+++ b/phpBB/phpbb/cron/manager.php
@@ -10,14 +10,6 @@
namespace phpbb\cron;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Cron manager class.
*
* Finds installed cron tasks, stores task objects, provides task selection.
diff --git a/phpBB/phpbb/cron/task/base.php b/phpBB/phpbb/cron/task/base.php
index f30c9daf1b..63f0407bcd 100644
--- a/phpBB/phpbb/cron/task/base.php
+++ b/phpBB/phpbb/cron/task/base.php
@@ -10,14 +10,6 @@
namespace phpbb\cron\task;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Cron task base class. Provides sensible defaults for cron tasks
* and partially implements cron task interface, making writing cron tasks easier.
*
diff --git a/phpBB/phpbb/cron/task/core/prune_all_forums.php b/phpBB/phpbb/cron/task/core/prune_all_forums.php
index 8e3ef25ce6..90b9a5914b 100644
--- a/phpBB/phpbb/cron/task/core/prune_all_forums.php
+++ b/phpBB/phpbb/cron/task/core/prune_all_forums.php
@@ -10,14 +10,6 @@
namespace phpbb\cron\task\core;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Prune all forums cron task.
*
* It is intended to be invoked from system cron.
diff --git a/phpBB/phpbb/cron/task/core/prune_forum.php b/phpBB/phpbb/cron/task/core/prune_forum.php
index f14ab7b702..e0d8b067c5 100644
--- a/phpBB/phpbb/cron/task/core/prune_forum.php
+++ b/phpBB/phpbb/cron/task/core/prune_forum.php
@@ -10,14 +10,6 @@
namespace phpbb\cron\task\core;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Prune one forum cron task.
*
* It is intended to be used when cron is invoked via web.
diff --git a/phpBB/phpbb/cron/task/core/prune_notifications.php b/phpBB/phpbb/cron/task/core/prune_notifications.php
index 296c0ae64f..9f67c54e1c 100644
--- a/phpBB/phpbb/cron/task/core/prune_notifications.php
+++ b/phpBB/phpbb/cron/task/core/prune_notifications.php
@@ -7,20 +7,14 @@
*
*/
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
+namespace phpbb\cron\task\core;
/**
* Prune notifications cron task.
*
* @package phpBB3
*/
-class phpbb_cron_task_core_prune_notifications extends phpbb_cron_task_base
+class prune_notifications extends \phpbb\cron\task\base
{
protected $config;
protected $notification_manager;
@@ -28,10 +22,10 @@ class phpbb_cron_task_core_prune_notifications extends phpbb_cron_task_base
/**
* Constructor.
*
- * @param phpbb_config $config The config
- * @param phpbb_notification_manager $notification_manager Notification manager
+ * @param \phpbb\config\config $config The config
+ * @param \phpbb\notification\manager $notification_manager Notification manager
*/
- public function __construct(phpbb_config $config, phpbb_notification_manager $notification_manager)
+ public function __construct(\phpbb\config\config $config, \phpbb\notification\manager $notification_manager)
{
$this->config = $config;
$this->notification_manager = $notification_manager;
diff --git a/phpBB/phpbb/cron/task/core/queue.php b/phpBB/phpbb/cron/task/core/queue.php
index cb13df86df..cd799b8024 100644
--- a/phpBB/phpbb/cron/task/core/queue.php
+++ b/phpBB/phpbb/cron/task/core/queue.php
@@ -10,14 +10,6 @@
namespace phpbb\cron\task\core;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Queue cron task. Sends email and jabber messages queued by other scripts.
*
* @package phpBB3
diff --git a/phpBB/phpbb/cron/task/core/tidy_cache.php b/phpBB/phpbb/cron/task/core/tidy_cache.php
index 021d5fd8a3..a94a85db53 100644
--- a/phpBB/phpbb/cron/task/core/tidy_cache.php
+++ b/phpBB/phpbb/cron/task/core/tidy_cache.php
@@ -10,14 +10,6 @@
namespace phpbb\cron\task\core;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Tidy cache cron task.
*
* @package phpBB3
diff --git a/phpBB/phpbb/cron/task/core/tidy_database.php b/phpBB/phpbb/cron/task/core/tidy_database.php
index d03cba1d86..f712a5047c 100644
--- a/phpBB/phpbb/cron/task/core/tidy_database.php
+++ b/phpBB/phpbb/cron/task/core/tidy_database.php
@@ -10,14 +10,6 @@
namespace phpbb\cron\task\core;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Tidy database cron task.
*
* @package phpBB3
diff --git a/phpBB/phpbb/cron/task/core/tidy_plupload.php b/phpBB/phpbb/cron/task/core/tidy_plupload.php
new file mode 100644
index 0000000000..5a98e0bd7b
--- /dev/null
+++ b/phpBB/phpbb/cron/task/core/tidy_plupload.php
@@ -0,0 +1,116 @@
+<?php
+/**
+*
+* @package phpBB3
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+namespace phpbb\cron\task\core;
+
+/**
+* Cron task for cleaning plupload's temporary upload directory.
+*
+* @package phpBB3
+*/
+class tidy_plupload extends \phpbb\cron\task\base
+{
+ /**
+ * How old a file must be (in seconds) before it is deleted.
+ * @var int
+ */
+ protected $max_file_age = 86400;
+
+ /**
+ * How often we run the cron (in seconds).
+ * @var int
+ */
+ protected $cron_frequency = 86400;
+
+ /**
+ * phpBB root path
+ * @var string
+ */
+ protected $phpbb_root_path;
+
+ /**
+ * Config object
+ * @var \phpbb\config\config
+ */
+ protected $config;
+
+ /**
+ * Directory where plupload stores temporary files.
+ * @var string
+ */
+ protected $plupload_upload_path;
+
+ /**
+ * Constructor.
+ *
+ * @param string $phpbb_root_path The root path
+ * @param \phpbb\config\config $config The config
+ */
+ public function __construct($phpbb_root_path, \phpbb\config\config $config)
+ {
+ $this->phpbb_root_path = $phpbb_root_path;
+ $this->config = $config;
+
+ $this->plupload_upload_path = $this->phpbb_root_path . $this->config['upload_path'] . '/plupload';
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function run()
+ {
+ // Remove old temporary file (perhaps failed uploads?)
+ $last_valid_timestamp = time() - $this->max_file_age;
+ try
+ {
+ $iterator = new \DirectoryIterator($this->plupload_upload_path);
+ foreach ($iterator as $file)
+ {
+ if (strpos($file->getBasename(), $this->config['plupload_salt']) !== 0)
+ {
+ // Skip over any non-plupload files.
+ continue;
+ }
+
+ if ($file->getMTime() < $last_valid_timestamp)
+ {
+ @unlink($file->getPathname());
+ }
+ }
+ }
+ catch (\UnexpectedValueException $e)
+ {
+ add_log(
+ 'critical',
+ 'LOG_PLUPLOAD_TIDY_FAILED',
+ $this->plupload_upload_path,
+ $e->getMessage(),
+ $e->getTraceAsString()
+ );
+ }
+
+ $this->config->set('plupload_last_gc', time(), true);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function is_runnable()
+ {
+ return !empty($this->config['plupload_salt']) && is_dir($this->plupload_upload_path);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function should_run()
+ {
+ return $this->config['plupload_last_gc'] < time() - $this->cron_frequency;
+ }
+}
diff --git a/phpBB/phpbb/cron/task/core/tidy_search.php b/phpBB/phpbb/cron/task/core/tidy_search.php
index ebd0d86cbc..42f7df308f 100644
--- a/phpBB/phpbb/cron/task/core/tidy_search.php
+++ b/phpBB/phpbb/cron/task/core/tidy_search.php
@@ -10,14 +10,6 @@
namespace phpbb\cron\task\core;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Tidy search cron task.
*
* Will only run when the currently selected search backend supports tidying.
diff --git a/phpBB/phpbb/cron/task/core/tidy_sessions.php b/phpBB/phpbb/cron/task/core/tidy_sessions.php
index 5df019ae46..68094af1f7 100644
--- a/phpBB/phpbb/cron/task/core/tidy_sessions.php
+++ b/phpBB/phpbb/cron/task/core/tidy_sessions.php
@@ -10,14 +10,6 @@
namespace phpbb\cron\task\core;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Tidy sessions cron task.
*
* @package phpBB3
diff --git a/phpBB/phpbb/cron/task/core/tidy_warnings.php b/phpBB/phpbb/cron/task/core/tidy_warnings.php
index 1cc0abbe88..a0ff23fc57 100644
--- a/phpBB/phpbb/cron/task/core/tidy_warnings.php
+++ b/phpBB/phpbb/cron/task/core/tidy_warnings.php
@@ -10,14 +10,6 @@
namespace phpbb\cron\task\core;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Tidy warnings cron task.
*
* Will only run when warnings are configured to expire.
diff --git a/phpBB/phpbb/cron/task/parametrized.php b/phpBB/phpbb/cron/task/parametrized.php
index 1d2f449c58..1aeead0399 100644
--- a/phpBB/phpbb/cron/task/parametrized.php
+++ b/phpBB/phpbb/cron/task/parametrized.php
@@ -10,14 +10,6 @@
namespace phpbb\cron\task;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Parametrized cron task interface.
*
* Parametrized cron tasks are somewhat of a cross between regular cron tasks and
diff --git a/phpBB/phpbb/cron/task/task.php b/phpBB/phpbb/cron/task/task.php
index 84218c4fc9..3ce3de9598 100644
--- a/phpBB/phpbb/cron/task/task.php
+++ b/phpBB/phpbb/cron/task/task.php
@@ -10,14 +10,6 @@
namespace phpbb\cron\task;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Cron task interface
* @package phpBB3
*/
diff --git a/phpBB/phpbb/cron/task/wrapper.php b/phpBB/phpbb/cron/task/wrapper.php
index aa015966c6..fc3f897206 100644
--- a/phpBB/phpbb/cron/task/wrapper.php
+++ b/phpBB/phpbb/cron/task/wrapper.php
@@ -10,14 +10,6 @@
namespace phpbb\cron\task;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Cron task wrapper class.
* Enhances cron tasks with convenience methods that work identically for all tasks.
*
diff --git a/phpBB/phpbb/datetime.php b/phpBB/phpbb/datetime.php
index 84b13202af..dfa21976e0 100644
--- a/phpBB/phpbb/datetime.php
+++ b/phpBB/phpbb/datetime.php
@@ -74,8 +74,8 @@ class datetime extends \DateTime
* finally check that relative dates are supported by the language pack
*/
if ($delta <= 3600 && $delta > -60 &&
- ($delta >= -5 || (($now_ts / 60) % 60) == (($timestamp / 60) % 60))
- && isset($this->user->lang['datetime']['AGO']))
+ ($delta >= -5 || (($now_ts / 60) % 60) == (($timestamp / 60) % 60))
+ && isset($this->user->lang['datetime']['AGO']))
{
return $this->user->lang(array('datetime', 'AGO'), max(0, (int) floor($delta / 60)));
}
diff --git a/phpBB/phpbb/db/driver/driver.php b/phpBB/phpbb/db/driver/driver.php
index 53d39e9127..d721ed2eb7 100644
--- a/phpBB/phpbb/db/driver/driver.php
+++ b/phpBB/phpbb/db/driver/driver.php
@@ -10,14 +10,6 @@
namespace phpbb\db\driver;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Database Abstraction Layer
* @package dbal
*/
@@ -824,7 +816,7 @@ class driver
*/
function sql_report($mode, $query = '')
{
- global $cache, $starttime, $phpbb_root_path, $phpbb_admin_path, $user;
+ global $cache, $starttime, $phpbb_root_path, $phpbb_path_helper, $user;
global $request;
if (is_object($request) && !$request->variable('explain', false))
@@ -854,7 +846,7 @@ class driver
<head>
<meta charset="utf-8">
<title>SQL Report</title>
- <link href="' . htmlspecialchars($phpbb_admin_path) . 'style/admin.css" rel="stylesheet" type="text/css" media="screen" />
+ <link href="' . htmlspecialchars($phpbb_path_helper->update_web_root_path($phpbb_root_path) . $phpbb_path_helper->get_adm_relative_path()) . 'style/admin.css" rel="stylesheet" type="text/css" media="screen" />
</head>
<body id="errorpage">
<div id="wrap">
diff --git a/phpBB/phpbb/db/driver/firebird.php b/phpBB/phpbb/db/driver/firebird.php
index 2df5eaf369..ed56a5d154 100644
--- a/phpBB/phpbb/db/driver/firebird.php
+++ b/phpBB/phpbb/db/driver/firebird.php
@@ -10,14 +10,6 @@
namespace phpbb\db\driver;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Firebird/Interbase Database Abstraction Layer
* Minimum Requirement is Firebird 2.1
* @package dbal
@@ -398,7 +390,7 @@ class firebird extends \phpbb\db\driver\driver
$query_id = $this->query_result;
}
- if ($cache && $cache->sql_exists($query_id))
+ if ($cache && !is_object($query_id) && $cache->sql_exists($query_id))
{
return $cache->sql_freeresult($query_id);
}
diff --git a/phpBB/phpbb/db/driver/mssql.php b/phpBB/phpbb/db/driver/mssql.php
index 4d2cd287da..6ebc891673 100644
--- a/phpBB/phpbb/db/driver/mssql.php
+++ b/phpBB/phpbb/db/driver/mssql.php
@@ -10,14 +10,6 @@
namespace phpbb\db\driver;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* MSSQL Database Abstraction Layer
* Minimum Requirement is MSSQL 2000+
* @package dbal
@@ -259,7 +251,7 @@ class mssql extends \phpbb\db\driver\driver
{
foreach ($row as $key => $value)
{
- $row[$key] = ($value === ' ' || $value === NULL) ? '' : $value;
+ $row[$key] = ($value === ' ' || $value === null) ? '' : $value;
}
}
@@ -318,14 +310,14 @@ class mssql extends \phpbb\db\driver\driver
$query_id = $this->query_result;
}
- if ($cache && $cache->sql_exists($query_id))
+ if ($cache && !is_object($query_id) && $cache->sql_exists($query_id))
{
return $cache->sql_freeresult($query_id);
}
- if (isset($this->open_queries[$query_id]))
+ if (isset($this->open_queries[(int) $query_id]))
{
- unset($this->open_queries[$query_id]);
+ unset($this->open_queries[(int) $query_id]);
return @mssql_free_result($query_id);
}
diff --git a/phpBB/phpbb/db/driver/mssql_base.php b/phpBB/phpbb/db/driver/mssql_base.php
index 57c4e0f1fd..113f1c6902 100644
--- a/phpBB/phpbb/db/driver/mssql_base.php
+++ b/phpBB/phpbb/db/driver/mssql_base.php
@@ -10,14 +10,6 @@
namespace phpbb\db\driver;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* MSSQL Database Base Abstraction Layer
* @package dbal
*/
diff --git a/phpBB/phpbb/db/driver/mssql_odbc.php b/phpBB/phpbb/db/driver/mssql_odbc.php
index 9db34a69fb..f8c70f1cd7 100644
--- a/phpBB/phpbb/db/driver/mssql_odbc.php
+++ b/phpBB/phpbb/db/driver/mssql_odbc.php
@@ -10,14 +10,6 @@
namespace phpbb\db\driver;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Unified ODBC functions
* Unified ODBC functions support any database having ODBC driver, for example Adabas D, IBM DB2, iODBC, Solid, Sybase SQL Anywhere...
* Here we only support MSSQL Server 2000+ because of the provided schema
@@ -305,7 +297,7 @@ class mssql_odbc extends \phpbb\db\driver\mssql_base
$query_id = $this->query_result;
}
- if ($cache && $cache->sql_exists($query_id))
+ if ($cache && !is_object($query_id) && $cache->sql_exists($query_id))
{
return $cache->sql_freeresult($query_id);
}
diff --git a/phpBB/phpbb/db/driver/mssqlnative.php b/phpBB/phpbb/db/driver/mssqlnative.php
index e6002fe1a3..125db9c8d4 100644
--- a/phpBB/phpbb/db/driver/mssqlnative.php
+++ b/phpBB/phpbb/db/driver/mssqlnative.php
@@ -14,188 +14,11 @@
namespace phpbb\db\driver;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
- * Prior to version 1.1 the SQL Server Native PHP driver didn't support sqlsrv_num_rows, or cursor based seeking so we recall all rows into an array
- * and maintain our own cursor index into that array.
- */
-class result_mssqlnative
-{
- public function result_mssqlnative($queryresult = false)
- {
- $this->m_cursor = 0;
- $this->m_rows = array();
- $this->m_num_fields = sqlsrv_num_fields($queryresult);
- $this->m_field_meta = sqlsrv_field_metadata($queryresult);
-
- while ($row = sqlsrv_fetch_array($queryresult, SQLSRV_FETCH_ASSOC))
- {
- if ($row !== null)
- {
- foreach($row as $k => $v)
- {
- if (is_object($v) && method_exists($v, 'format'))
- {
- $row[$k] = $v->format("Y-m-d\TH:i:s\Z");
- }
- }
- $this->m_rows[] = $row;//read results into memory, cursors are not supported
- }
- }
-
- $this->m_row_count = sizeof($this->m_rows);
- }
-
- private function array_to_obj($array, &$obj)
- {
- foreach ($array as $key => $value)
- {
- if (is_array($value))
- {
- $obj->$key = new \stdClass();
- array_to_obj($value, $obj->$key);
- }
- else
- {
- $obj->$key = $value;
- }
- }
- return $obj;
- }
-
- public function fetch($mode = SQLSRV_FETCH_BOTH, $object_class = 'stdClass')
- {
- if ($this->m_cursor >= $this->m_row_count || $this->m_row_count == 0)
- {
- return false;
- }
-
- $ret = false;
- $arr_num = array();
-
- if ($mode == SQLSRV_FETCH_NUMERIC || $mode == SQLSRV_FETCH_BOTH)
- {
- foreach($this->m_rows[$this->m_cursor] as $key => $value)
- {
- $arr_num[] = $value;
- }
- }
-
- switch ($mode)
- {
- case SQLSRV_FETCH_ASSOC:
- $ret = $this->m_rows[$this->m_cursor];
- break;
- case SQLSRV_FETCH_NUMERIC:
- $ret = $arr_num;
- break;
- case 'OBJECT':
- $ret = $this->array_to_obj($this->m_rows[$this->m_cursor], $o = new $object_class);
- break;
- case SQLSRV_FETCH_BOTH:
- default:
- $ret = $this->m_rows[$this->m_cursor] + $arr_num;
- break;
- }
- $this->m_cursor++;
- return $ret;
- }
-
- public function get($pos, $fld)
- {
- return $this->m_rows[$pos][$fld];
- }
-
- public function num_rows()
- {
- return $this->m_row_count;
- }
-
- public function seek($iRow)
- {
- $this->m_cursor = min($iRow, $this->m_row_count);
- }
-
- public function num_fields()
- {
- return $this->m_num_fields;
- }
-
- public function field_name($nr)
- {
- $arr_keys = array_keys($this->m_rows[0]);
- return $arr_keys[$nr];
- }
-
- public function field_type($nr)
- {
- $i = 0;
- $int_type = -1;
- $str_type = '';
-
- foreach ($this->m_field_meta as $meta)
- {
- if ($nr == $i)
- {
- $int_type = $meta['Type'];
- break;
- }
- $i++;
- }
-
- //http://msdn.microsoft.com/en-us/library/cc296183.aspx contains type table
- switch ($int_type)
- {
- case SQLSRV_SQLTYPE_BIGINT: $str_type = 'bigint'; break;
- case SQLSRV_SQLTYPE_BINARY: $str_type = 'binary'; break;
- case SQLSRV_SQLTYPE_BIT: $str_type = 'bit'; break;
- case SQLSRV_SQLTYPE_CHAR: $str_type = 'char'; break;
- case SQLSRV_SQLTYPE_DATETIME: $str_type = 'datetime'; break;
- case SQLSRV_SQLTYPE_DECIMAL/*($precision, $scale)*/: $str_type = 'decimal'; break;
- case SQLSRV_SQLTYPE_FLOAT: $str_type = 'float'; break;
- case SQLSRV_SQLTYPE_IMAGE: $str_type = 'image'; break;
- case SQLSRV_SQLTYPE_INT: $str_type = 'int'; break;
- case SQLSRV_SQLTYPE_MONEY: $str_type = 'money'; break;
- case SQLSRV_SQLTYPE_NCHAR/*($charCount)*/: $str_type = 'nchar'; break;
- case SQLSRV_SQLTYPE_NUMERIC/*($precision, $scale)*/: $str_type = 'numeric'; break;
- case SQLSRV_SQLTYPE_NVARCHAR/*($charCount)*/: $str_type = 'nvarchar'; break;
- case SQLSRV_SQLTYPE_NTEXT: $str_type = 'ntext'; break;
- case SQLSRV_SQLTYPE_REAL: $str_type = 'real'; break;
- case SQLSRV_SQLTYPE_SMALLDATETIME: $str_type = 'smalldatetime'; break;
- case SQLSRV_SQLTYPE_SMALLINT: $str_type = 'smallint'; break;
- case SQLSRV_SQLTYPE_SMALLMONEY: $str_type = 'smallmoney'; break;
- case SQLSRV_SQLTYPE_TEXT: $str_type = 'text'; break;
- case SQLSRV_SQLTYPE_TIMESTAMP: $str_type = 'timestamp'; break;
- case SQLSRV_SQLTYPE_TINYINT: $str_type = 'tinyint'; break;
- case SQLSRV_SQLTYPE_UNIQUEIDENTIFIER: $str_type = 'uniqueidentifier'; break;
- case SQLSRV_SQLTYPE_UDT: $str_type = 'UDT'; break;
- case SQLSRV_SQLTYPE_VARBINARY/*($byteCount)*/: $str_type = 'varbinary'; break;
- case SQLSRV_SQLTYPE_VARCHAR/*($charCount)*/: $str_type = 'varchar'; break;
- case SQLSRV_SQLTYPE_XML: $str_type = 'xml'; break;
- default: $str_type = $int_type;
- }
- return $str_type;
- }
-
- public function free()
- {
- unset($this->m_rows);
- return;
- }
-}
-
-/**
* @package dbal
*/
class mssqlnative extends \phpbb\db\driver\mssql_base
{
- var $m_insert_id = NULL;
+ var $m_insert_id = null;
var $last_query_text = '';
var $query_options = array();
var $connect_error = '';
@@ -427,7 +250,7 @@ class mssqlnative extends \phpbb\db\driver\mssql_base
{
foreach ($row as $key => $value)
{
- $row[$key] = ($value === ' ' || $value === NULL) ? '' : $value;
+ $row[$key] = ($value === ' ' || $value === null) ? '' : $value;
}
// remove helper values from LIMIT queries
@@ -471,7 +294,7 @@ class mssqlnative extends \phpbb\db\driver\mssql_base
$query_id = $this->query_result;
}
- if ($cache->sql_exists($query_id))
+ if ($cache && !is_object($query_id) && $cache->sql_exists($query_id))
{
return $cache->sql_freeresult($query_id);
}
@@ -481,6 +304,7 @@ class mssqlnative extends \phpbb\db\driver\mssql_base
unset($this->open_queries[(int) $query_id]);
return @sqlsrv_free_stmt($query_id);
}
+
return false;
}
diff --git a/phpBB/phpbb/db/driver/mysql.php b/phpBB/phpbb/db/driver/mysql.php
index c76126763d..e311f0dd74 100644
--- a/phpBB/phpbb/db/driver/mysql.php
+++ b/phpBB/phpbb/db/driver/mysql.php
@@ -10,14 +10,6 @@
namespace phpbb\db\driver;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* MySQL4 Database Abstraction Layer
* Compatible with:
* MySQL 3.23+
@@ -289,7 +281,7 @@ class mysql extends \phpbb\db\driver\mysql_base
$query_id = $this->query_result;
}
- if ($cache && $cache->sql_exists($query_id))
+ if ($cache && !is_object($query_id) && $cache->sql_exists($query_id))
{
return $cache->sql_freeresult($query_id);
}
diff --git a/phpBB/phpbb/db/driver/mysql_base.php b/phpBB/phpbb/db/driver/mysql_base.php
index 8f2f66674b..87b6d153a9 100644
--- a/phpBB/phpbb/db/driver/mysql_base.php
+++ b/phpBB/phpbb/db/driver/mysql_base.php
@@ -10,14 +10,6 @@
namespace phpbb\db\driver;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Abstract MySQL Database Base Abstraction Layer
* @package dbal
*/
diff --git a/phpBB/phpbb/db/driver/mysqli.php b/phpBB/phpbb/db/driver/mysqli.php
index 4d0e43b464..adc8f96302 100644
--- a/phpBB/phpbb/db/driver/mysqli.php
+++ b/phpBB/phpbb/db/driver/mysqli.php
@@ -10,14 +10,6 @@
namespace phpbb\db\driver;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* MySQLi Database Abstraction Layer
* mysqli-extension has to be compiled with:
* MySQL 4.1+ or MySQL 5.0+
@@ -31,7 +23,7 @@ class mysqli extends \phpbb\db\driver\mysql_base
/**
* Connect to server
*/
- function sql_connect($sqlserver, $sqluser, $sqlpassword, $database, $port = false, $persistency = false , $new_link = false)
+ function sql_connect($sqlserver, $sqluser, $sqlpassword, $database, $port = false, $persistency = false, $new_link = false)
{
if (!function_exists('mysqli_connect'))
{
@@ -47,11 +39,11 @@ class mysqli extends \phpbb\db\driver\mysql_base
$this->server = ($this->persistency) ? 'p:' . (($sqlserver) ? $sqlserver : 'localhost') : $sqlserver;
$this->dbname = $database;
- $port = (!$port) ? NULL : $port;
+ $port = (!$port) ? null : $port;
// If port is set and it is not numeric, most likely mysqli socket is set.
// Try to map it to the $socket parameter.
- $socket = NULL;
+ $socket = null;
if ($port)
{
if (is_numeric($port))
@@ -61,7 +53,7 @@ class mysqli extends \phpbb\db\driver\mysql_base
else
{
$socket = $port;
- $port = NULL;
+ $port = null;
}
}
diff --git a/phpBB/phpbb/db/driver/oracle.php b/phpBB/phpbb/db/driver/oracle.php
index 5dfab21455..36ed43d4a7 100644
--- a/phpBB/phpbb/db/driver/oracle.php
+++ b/phpBB/phpbb/db/driver/oracle.php
@@ -10,14 +10,6 @@
namespace phpbb\db\driver;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Oracle Database Abstraction Layer
* @package dbal
*/
@@ -621,7 +613,7 @@ class oracle extends \phpbb\db\driver\driver
$query_id = $this->query_result;
}
- if ($cache && $cache->sql_exists($query_id))
+ if ($cache && !is_object($query_id) && $cache->sql_exists($query_id))
{
return $cache->sql_freeresult($query_id);
}
diff --git a/phpBB/phpbb/db/driver/postgres.php b/phpBB/phpbb/db/driver/postgres.php
index 7a98b90c73..5dbd1ca74f 100644
--- a/phpBB/phpbb/db/driver/postgres.php
+++ b/phpBB/phpbb/db/driver/postgres.php
@@ -10,14 +10,6 @@
namespace phpbb\db\driver;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* PostgreSQL Database Abstraction Layer
* Minimum Requirement is Version 7.3+
* @package dbal
@@ -328,7 +320,7 @@ class postgres extends \phpbb\db\driver\driver
return false;
}
- $temp_result = @pg_fetch_assoc($temp_q_id, NULL);
+ $temp_result = @pg_fetch_assoc($temp_q_id, null);
@pg_free_result($query_id);
return ($temp_result) ? $temp_result['last_value'] : false;
@@ -350,7 +342,7 @@ class postgres extends \phpbb\db\driver\driver
$query_id = $this->query_result;
}
- if ($cache && $cache->sql_exists($query_id))
+ if ($cache && !is_object($query_id) && $cache->sql_exists($query_id))
{
return $cache->sql_freeresult($query_id);
}
@@ -456,7 +448,7 @@ class postgres extends \phpbb\db\driver\driver
if ($result = @pg_query($this->db_connect_id, "EXPLAIN $explain_query"))
{
- while ($row = @pg_fetch_assoc($result, NULL))
+ while ($row = @pg_fetch_assoc($result, null))
{
$html_table = $this->sql_report('add_select_row', $query, $html_table, $row);
}
@@ -476,7 +468,7 @@ class postgres extends \phpbb\db\driver\driver
$endtime = $endtime[0] + $endtime[1];
$result = @pg_query($this->db_connect_id, $query);
- while ($void = @pg_fetch_assoc($result, NULL))
+ while ($void = @pg_fetch_assoc($result, null))
{
// Take the time spent on parsing rows into account
}
diff --git a/phpBB/phpbb/db/driver/sqlite.php b/phpBB/phpbb/db/driver/sqlite.php
index a548fd2618..59ec895c0f 100644
--- a/phpBB/phpbb/db/driver/sqlite.php
+++ b/phpBB/phpbb/db/driver/sqlite.php
@@ -10,14 +10,6 @@
namespace phpbb\db\driver;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Sqlite Database Abstraction Layer
* Minimum Requirement: 2.8.2+
* @package dbal
@@ -261,7 +253,7 @@ class sqlite extends \phpbb\db\driver\driver
$query_id = $this->query_result;
}
- if ($cache && $cache->sql_exists($query_id))
+ if ($cache && !is_object($query_id) && $cache->sql_exists($query_id))
{
return $cache->sql_freeresult($query_id);
}
diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_12.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_12.php
new file mode 100644
index 0000000000..5a2d569724
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_12.php
@@ -0,0 +1,33 @@
+<?php
+/**
+*
+* @package migration
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-license.php GNU Public License v2
+*
+*/
+
+namespace phpbb\db\migration\data\v30x;
+
+class release_3_0_12 extends \phpbb\db\migration\migration
+{
+ public function effectively_installed()
+ {
+ return phpbb_version_compare($this->config['version'], '3.0.12', '>=') && phpbb_version_compare($this->config['version'], '3.1.0-dev', '<');
+ }
+
+ static public function depends_on()
+ {
+ return array('\phpbb\db\migration\data\v30x\release_3_0_12_rc3');
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('if', array(
+ phpbb_version_compare($this->config['version'], '3.0.12', '<'),
+ array('config.update', array('version', '3.0.12')),
+ )),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_12_rc2.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_12_rc2.php
new file mode 100644
index 0000000000..3edb578fc8
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_12_rc2.php
@@ -0,0 +1,33 @@
+<?php
+/**
+*
+* @package migration
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-license.php GNU Public License v2
+*
+*/
+
+namespace phpbb\db\migration\data\v30x;
+
+class release_3_0_12_rc2 extends \phpbb\db\migration\migration
+{
+ public function effectively_installed()
+ {
+ return phpbb_version_compare($this->config['version'], '3.0.12-RC2', '>=') && phpbb_version_compare($this->config['version'], '3.1.0-dev', '<');
+ }
+
+ static public function depends_on()
+ {
+ return array('\phpbb\db\migration\data\v30x\release_3_0_12_rc1');
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('if', array(
+ phpbb_version_compare($this->config['version'], '3.0.12-RC2', '<'),
+ array('config.update', array('version', '3.0.12-RC2')),
+ )),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_12_rc3.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_12_rc3.php
new file mode 100644
index 0000000000..510693a5b7
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_12_rc3.php
@@ -0,0 +1,33 @@
+<?php
+/**
+*
+* @package migration
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-license.php GNU Public License v2
+*
+*/
+
+namespace phpbb\db\migration\data\v30x;
+
+class release_3_0_12_rc3 extends \phpbb\db\migration\migration
+{
+ public function effectively_installed()
+ {
+ return phpbb_version_compare($this->config['version'], '3.0.12-RC3', '>=') && phpbb_version_compare($this->config['version'], '3.1.0-dev', '<');
+ }
+
+ static public function depends_on()
+ {
+ return array('\phpbb\db\migration\data\v30x\release_3_0_12_rc2');
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('if', array(
+ phpbb_version_compare($this->config['version'], '3.0.12-RC3', '<'),
+ array('config.update', array('version', '3.0.12-RC3')),
+ )),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v310/acp_style_components_module.php b/phpBB/phpbb/db/migration/data/v310/acp_style_components_module.php
new file mode 100644
index 0000000000..9f168f4fd6
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v310/acp_style_components_module.php
@@ -0,0 +1,42 @@
+<?php
+/**
+*
+* @package migration
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+namespace phpbb\db\migration\data\v310;
+
+class acp_style_components_module extends \phpbb\db\migration\migration
+{
+ public function effectively_installed()
+ {
+ $sql = 'SELECT module_id
+ FROM ' . MODULES_TABLE . "
+ WHERE module_class = 'acp'
+ AND module_langname = 'ACP_STYLE_COMPONENTS'";
+ $result = $this->db->sql_query($sql);
+ $module_id = $this->db->sql_fetchfield('module_id');
+ $this->db->sql_freeresult($result);
+
+ return $module_id == false;
+ }
+
+ static public function depends_on()
+ {
+ return array('\phpbb\db\migration\data\v310\dev');
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('module.remove', array(
+ 'acp',
+ false,
+ 'ACP_STYLE_COMPONENTS',
+ )),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v310/allow_cdn.php b/phpBB/phpbb/db/migration/data/v310/allow_cdn.php
new file mode 100644
index 0000000000..aa471df6e7
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v310/allow_cdn.php
@@ -0,0 +1,33 @@
+<?php
+/**
+*
+* @package migration
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-license.php GNU Public License v2
+*
+*/
+
+namespace phpbb\db\migration\data\v310;
+
+class allow_cdn extends \phpbb\db\migration\migration
+{
+ public function effectively_installed()
+ {
+ return isset($this->config['allow_cdn']);
+ }
+
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v310\jquery_update',
+ );
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('config.add', array('allow_cdn', (int) $this->config['load_jquery_cdn'])),
+ array('config.remove', array('load_jquery_cdn')),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v310/alpha1.php b/phpBB/phpbb/db/migration/data/v310/alpha1.php
new file mode 100644
index 0000000000..403e301e64
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v310/alpha1.php
@@ -0,0 +1,44 @@
+<?php
+/**
+*
+* @package migration
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-license.php GNU Public License v2
+*
+*/
+
+namespace phpbb\db\migration\data\v310;
+
+class alpha1 extends \phpbb\db\migration\migration
+{
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v30x\local_url_bbcode',
+ '\phpbb\db\migration\data\v30x\release_3_0_12',
+ '\phpbb\db\migration\data\v310\acp_style_components_module',
+ '\phpbb\db\migration\data\v310\allow_cdn',
+ '\phpbb\db\migration\data\v310\auth_provider_oauth',
+ '\phpbb\db\migration\data\v310\avatars',
+ '\phpbb\db\migration\data\v310\boardindex',
+ '\phpbb\db\migration\data\v310\config_db_text',
+ '\phpbb\db\migration\data\v310\forgot_password',
+ '\phpbb\db\migration\data\v310\mod_rewrite',
+ '\phpbb\db\migration\data\v310\mysql_fulltext_drop',
+ '\phpbb\db\migration\data\v310\namespaces',
+ '\phpbb\db\migration\data\v310\notifications_cron',
+ '\phpbb\db\migration\data\v310\notification_options_reconvert',
+ '\phpbb\db\migration\data\v310\plupload',
+ '\phpbb\db\migration\data\v310\signature_module_auth',
+ '\phpbb\db\migration\data\v310\softdelete_mcp_modules',
+ '\phpbb\db\migration\data\v310\teampage',
+ );
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('config.update', array('version', '3.1.0-a1')),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v310/alpha2.php b/phpBB/phpbb/db/migration/data/v310/alpha2.php
new file mode 100644
index 0000000000..3c0853f924
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v310/alpha2.php
@@ -0,0 +1,28 @@
+<?php
+/**
+*
+* @package migration
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU Public License v2
+*
+*/
+
+namespace phpbb\db\migration\data\v310;
+
+class alpha2 extends \phpbb\db\migration\migration
+{
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v310\alpha1',
+ '\phpbb\db\migration\data\v310\notifications_cron_p2',
+ );
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('config.update', array('version', '3.1.0-a2')),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v310/avatar_types.php b/phpBB/phpbb/db/migration/data/v310/avatar_types.php
new file mode 100644
index 0000000000..bdbdccf0c5
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v310/avatar_types.php
@@ -0,0 +1,60 @@
+<?php
+/**
+*
+* @package migration
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-license.php GNU Public License v2
+*
+*/
+
+namespace phpbb\db\migration\data\v310;
+
+class avatar_types extends \phpbb\db\migration\migration
+{
+ /**
+ * @var avatar type map
+ */
+ protected $avatar_type_map = array(
+ AVATAR_UPLOAD => 'avatar.driver.upload',
+ AVATAR_REMOTE => 'avatar.driver.remote',
+ AVATAR_GALLERY => 'avatar.driver.local',
+ );
+
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v310\dev',
+ '\phpbb\db\migration\data\v310\avatars',
+ );
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('custom', array(array($this, 'update_user_avatar_type'))),
+ array('custom', array(array($this, 'update_group_avatar_type'))),
+ );
+ }
+
+ public function update_user_avatar_type()
+ {
+ foreach ($this->avatar_type_map as $old => $new)
+ {
+ $sql = 'UPDATE ' . $this->table_prefix . "users
+ SET user_avatar_type = '$new'
+ WHERE user_avatar_type = '$old'";
+ $this->db->sql_query($sql);
+ }
+ }
+
+ public function update_group_avatar_type()
+ {
+ foreach ($this->avatar_type_map as $old => $new)
+ {
+ $sql = 'UPDATE ' . $this->table_prefix . "groups
+ SET group_avatar_type = '$new'
+ WHERE group_avatar_type = '$old'";
+ $this->db->sql_query($sql);
+ }
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v310/mysql_fulltext_drop.php b/phpBB/phpbb/db/migration/data/v310/mysql_fulltext_drop.php
new file mode 100644
index 0000000000..97d174d4bc
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v310/mysql_fulltext_drop.php
@@ -0,0 +1,47 @@
+<?php
+/**
+*
+* @package migration
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+namespace phpbb\db\migration\data\v310;
+
+class mysql_fulltext_drop extends \phpbb\db\migration\migration
+{
+ public function effectively_installed()
+ {
+ // This migration is irrelevant for all non-MySQL DBMSes.
+ return strpos($this->db->sql_layer, 'mysql') === false;
+ }
+
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v310\dev',
+ );
+ }
+
+ public function update_schema()
+ {
+ /*
+ * Drop FULLTEXT indexes related to MySQL fulltext search.
+ * Doing so is equivalent to dropping the search index from the ACP.
+ * Possibly time-consuming recreation of the search index (i.e.
+ * FULLTEXT indexes) is left as a task to the admin to not
+ * unnecessarily stall the upgrade process. The new search index will
+ * then require about 40% less table space (also see PHPBB3-11621).
+ */
+ return array(
+ 'drop_keys' => array(
+ $this->table_prefix . 'posts' => array(
+ 'post_subject',
+ 'post_text',
+ 'post_content',
+ ),
+ ),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v310/namespaces.php b/phpBB/phpbb/db/migration/data/v310/namespaces.php
index 9b182f88b8..f74ecbd874 100644
--- a/phpBB/phpbb/db/migration/data/v310/namespaces.php
+++ b/phpBB/phpbb/db/migration/data/v310/namespaces.php
@@ -23,7 +23,7 @@ class namespaces extends \phpbb\db\migration\migration
return array(
array('if', array(
(preg_match('#^phpbb_search_#', $this->config['search_type'])),
- array('config.update', array('search_type', str_replace('phpbb_search_', 'phpbb\\search\\', $this->config['search_type']))),
+ array('config.update', array('search_type', str_replace('phpbb_search_', '\\phpbb\\search\\', $this->config['search_type']))),
)),
);
}
diff --git a/phpBB/phpbb/db/migration/data/v310/notifications.php b/phpBB/phpbb/db/migration/data/v310/notifications.php
index 10f1392094..61be25bb5f 100644
--- a/phpBB/phpbb/db/migration/data/v310/notifications.php
+++ b/phpBB/phpbb/db/migration/data/v310/notifications.php
@@ -34,7 +34,7 @@ class notifications extends \phpbb\db\migration\migration
),
$this->table_prefix . 'notifications' => array(
'COLUMNS' => array(
- 'notification_id' => array('UINT', NULL, 'auto_increment'),
+ 'notification_id' => array('UINT', null, 'auto_increment'),
'item_type' => array('VCHAR:255', ''),
'item_id' => array('UINT', 0),
'item_parent_id' => array('UINT', 0),
diff --git a/phpBB/phpbb/db/migration/data/v310/notifications_cron_p2.php b/phpBB/phpbb/db/migration/data/v310/notifications_cron_p2.php
new file mode 100644
index 0000000000..050e679cc0
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v310/notifications_cron_p2.php
@@ -0,0 +1,27 @@
+<?php
+/**
+*
+* @package migration
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+namespace phpbb\db\migration\data\v310;
+
+class notifications_cron_p2 extends \phpbb\db\migration\migration
+{
+ static public function depends_on()
+ {
+ return array('\phpbb\db\migration\data\v310\notifications_cron');
+ }
+
+ public function update_data()
+ {
+ return array(
+ // Make read_notification_last_gc dynamic.
+ array('config.remove', array('read_notification_last_gc')),
+ array('config.add', array('read_notification_last_gc', 0, 1)),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v310/notifications_schema_fix.php b/phpBB/phpbb/db/migration/data/v310/notifications_schema_fix.php
index 8ed626d8a6..eb2eb361ee 100644
--- a/phpBB/phpbb/db/migration/data/v310/notifications_schema_fix.php
+++ b/phpBB/phpbb/db/migration/data/v310/notifications_schema_fix.php
@@ -26,7 +26,7 @@ class notifications_schema_fix extends \phpbb\db\migration\migration
'add_tables' => array(
$this->table_prefix . 'notification_types' => array(
'COLUMNS' => array(
- 'notification_type_id' => array('USINT', NULL, 'auto_increment'),
+ 'notification_type_id' => array('USINT', null, 'auto_increment'),
'notification_type_name' => array('VCHAR:255', ''),
'notification_type_enabled' => array('BOOL', 1),
),
@@ -37,7 +37,7 @@ class notifications_schema_fix extends \phpbb\db\migration\migration
),
$this->table_prefix . 'notifications' => array(
'COLUMNS' => array(
- 'notification_id' => array('UINT:10', NULL, 'auto_increment'),
+ 'notification_id' => array('UINT:10', null, 'auto_increment'),
'notification_type_id' => array('USINT', 0),
'item_id' => array('UINT', 0),
'item_parent_id' => array('UINT', 0),
@@ -73,7 +73,7 @@ class notifications_schema_fix extends \phpbb\db\migration\migration
),
$this->table_prefix . 'notifications' => array(
'COLUMNS' => array(
- 'notification_id' => array('UINT', NULL, 'auto_increment'),
+ 'notification_id' => array('UINT', null, 'auto_increment'),
'item_type' => array('VCHAR:255', ''),
'item_id' => array('UINT', 0),
'item_parent_id' => array('UINT', 0),
diff --git a/phpBB/phpbb/db/migration/data/v310/plupload.php b/phpBB/phpbb/db/migration/data/v310/plupload.php
new file mode 100644
index 0000000000..7cdba507a2
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v310/plupload.php
@@ -0,0 +1,32 @@
+<?php
+/**
+*
+* @package migration
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+namespace phpbb\db\migration\data\v310;
+
+class plupload extends \phpbb\db\migration\migration
+{
+ public function effectively_installed()
+ {
+ return isset($this->config['plupload_last_gc']) &&
+ isset($this->config['plupload_salt']);
+ }
+
+ static public function depends_on()
+ {
+ return array('\phpbb\db\migration\data\v310\dev');
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('config.add', array('plupload_last_gc', 0)),
+ array('config.add', array('plupload_salt', unique_id())),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v310/signature_module_auth.php b/phpBB/phpbb/db/migration/data/v310/signature_module_auth.php
index a85e0be01c..6da1cb8009 100644
--- a/phpBB/phpbb/db/migration/data/v310/signature_module_auth.php
+++ b/phpBB/phpbb/db/migration/data/v310/signature_module_auth.php
@@ -27,7 +27,7 @@ class signature_module_auth extends \phpbb\db\migration\migration
static public function depends_on()
{
- return array('\phpbb\db\migration\data\v31x\dev');
+ return array('\phpbb\db\migration\data\v310\dev');
}
public function update_data()
diff --git a/phpBB/phpbb/db/migration/data/v310/softdelete_p2.php b/phpBB/phpbb/db/migration/data/v310/softdelete_p2.php
index 0c32e474f4..38b190c766 100644
--- a/phpBB/phpbb/db/migration/data/v310/softdelete_p2.php
+++ b/phpBB/phpbb/db/migration/data/v310/softdelete_p2.php
@@ -34,7 +34,10 @@ class softdelete_p2 extends \phpbb\db\migration\migration
),
'drop_keys' => array(
$this->table_prefix . 'posts' => array('post_approved'),
- $this->table_prefix . 'topics' => array('forum_appr_last'),
+ $this->table_prefix . 'topics' => array(
+ 'forum_appr_last',
+ 'topic_approved',
+ ),
),
);
}
@@ -63,6 +66,7 @@ class softdelete_p2 extends \phpbb\db\migration\migration
),
$this->table_prefix . 'topics' => array(
'forum_appr_last' => array('forum_id', 'topic_approved', 'topic_last_post_id'),
+ 'topic_approved' => array('topic_approved'),
),
),
);
diff --git a/phpBB/phpbb/db/migration/data/v310/style_update_p2.php b/phpBB/phpbb/db/migration/data/v310/style_update_p2.php
index 202a8409fb..40d6a4dbbd 100644
--- a/phpBB/phpbb/db/migration/data/v310/style_update_p2.php
+++ b/phpBB/phpbb/db/migration/data/v310/style_update_p2.php
@@ -24,6 +24,14 @@ class style_update_p2 extends \phpbb\db\migration\migration
public function update_schema()
{
return array(
+ 'drop_keys' => array(
+ $this->table_prefix . 'styles' => array(
+ 'imageset_id',
+ 'template_id',
+ 'theme_id',
+ ),
+ ),
+
'drop_columns' => array(
$this->table_prefix . 'styles' => array(
'imageset_id',
@@ -53,10 +61,18 @@ class style_update_p2 extends \phpbb\db\migration\migration
),
),
+ 'add_index' => array(
+ $this->table_prefix . 'styles' => array(
+ 'imageset_id' => array('imageset_id'),
+ 'template_id' => array('template_id'),
+ 'theme_id' => array('theme_id'),
+ ),
+ ),
+
'add_tables' => array(
$this->table_prefix . 'styles_imageset' => array(
'COLUMNS' => array(
- 'imageset_id' => array('UINT', NULL, 'auto_increment'),
+ 'imageset_id' => array('UINT', null, 'auto_increment'),
'imageset_name' => array('VCHAR_UNI:255', ''),
'imageset_copyright' => array('VCHAR_UNI', ''),
'imageset_path' => array('VCHAR:100', ''),
@@ -68,7 +84,7 @@ class style_update_p2 extends \phpbb\db\migration\migration
),
$this->table_prefix . 'styles_imageset_data' => array(
'COLUMNS' => array(
- 'image_id' => array('UINT', NULL, 'auto_increment'),
+ 'image_id' => array('UINT', null, 'auto_increment'),
'image_name' => array('VCHAR:200', ''),
'image_filename' => array('VCHAR:200', ''),
'image_lang' => array('VCHAR:30', ''),
@@ -83,7 +99,7 @@ class style_update_p2 extends \phpbb\db\migration\migration
),
$this->table_prefix . 'styles_template' => array(
'COLUMNS' => array(
- 'template_id' => array('UINT', NULL, 'auto_increment'),
+ 'template_id' => array('UINT', null, 'auto_increment'),
'template_name' => array('VCHAR_UNI:255', ''),
'template_copyright' => array('VCHAR_UNI', ''),
'template_path' => array('VCHAR:100', ''),
@@ -112,7 +128,7 @@ class style_update_p2 extends \phpbb\db\migration\migration
),
$this->table_prefix . 'styles_theme' => array(
'COLUMNS' => array(
- 'theme_id' => array('UINT', NULL, 'auto_increment'),
+ 'theme_id' => array('UINT', null, 'auto_increment'),
'theme_name' => array('VCHAR_UNI:255', ''),
'theme_copyright' => array('VCHAR_UNI', ''),
'theme_path' => array('VCHAR:100', ''),
diff --git a/phpBB/phpbb/db/migration/data/v310/teampage.php b/phpBB/phpbb/db/migration/data/v310/teampage.php
index 80cc4be1c0..172435c672 100644
--- a/phpBB/phpbb/db/migration/data/v310/teampage.php
+++ b/phpBB/phpbb/db/migration/data/v310/teampage.php
@@ -27,7 +27,7 @@ class teampage extends \phpbb\db\migration\migration
'add_tables' => array(
$this->table_prefix . 'teampage' => array(
'COLUMNS' => array(
- 'teampage_id' => array('UINT', NULL, 'auto_increment'),
+ 'teampage_id' => array('UINT', null, 'auto_increment'),
'group_id' => array('UINT', 0),
'teampage_name' => array('VCHAR_UNI:255', ''),
'teampage_position' => array('UINT', 0),
diff --git a/phpBB/phpbb/db/migration/data/v310/ucp_popuppm_module.php b/phpBB/phpbb/db/migration/data/v310/ucp_popuppm_module.php
new file mode 100644
index 0000000000..f8ada6c6f5
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v310/ucp_popuppm_module.php
@@ -0,0 +1,42 @@
+<?php
+/**
+*
+* @package migration
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+namespace phpbb\db\migration\data\v310;
+
+class ucp_popuppm_module extends \phpbb\db\migration\migration
+{
+ public function effectively_installed()
+ {
+ $sql = 'SELECT module_id
+ FROM ' . MODULES_TABLE . "
+ WHERE module_class = 'ucp'
+ AND module_langname = 'UCP_PM_POPUP_TITLE'";
+ $result = $this->db->sql_query($sql);
+ $module_id = $this->db->sql_fetchfield('module_id');
+ $this->db->sql_freeresult($result);
+
+ return $module_id == false;
+ }
+
+ static public function depends_on()
+ {
+ return array('\phpbb\db\migration\data\v310\dev');
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('module.remove', array(
+ 'ucp',
+ 'UCP_PM',
+ 'UCP_PM_POPUP_TITLE',
+ )),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/exception.php b/phpBB/phpbb/db/migration/exception.php
index 58e29b5218..cfe546d1ab 100644
--- a/phpBB/phpbb/db/migration/exception.php
+++ b/phpBB/phpbb/db/migration/exception.php
@@ -10,14 +10,6 @@
namespace phpbb\db\migration;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* The migrator is responsible for applying new migrations in the correct order.
*
* @package db
diff --git a/phpBB/phpbb/db/migration/migration.php b/phpBB/phpbb/db/migration/migration.php
index aff3837279..b32de00871 100644
--- a/phpBB/phpbb/db/migration/migration.php
+++ b/phpBB/phpbb/db/migration/migration.php
@@ -10,14 +10,6 @@
namespace phpbb\db\migration;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Abstract base class for database migrations
*
* Each migration consists of a set of schema and data changes to be implemented
diff --git a/phpBB/phpbb/db/migration/tool/config.php b/phpBB/phpbb/db/migration/tool/config.php
index f2149dc59a..36a1931f4e 100644
--- a/phpBB/phpbb/db/migration/tool/config.php
+++ b/phpBB/phpbb/db/migration/tool/config.php
@@ -130,6 +130,10 @@ class config implements \phpbb\db\migration\tool\tool_interface
case 'remove':
$call = 'add';
+ if (sizeof($arguments) == 1)
+ {
+ $arguments[] = '';
+ }
break;
case 'update_if_equals':
diff --git a/phpBB/phpbb/db/migration/tool/module.php b/phpBB/phpbb/db/migration/tool/module.php
index 9869dd4230..3e39d87c04 100644
--- a/phpBB/phpbb/db/migration/tool/module.php
+++ b/phpBB/phpbb/db/migration/tool/module.php
@@ -182,9 +182,6 @@ class module implements \phpbb\db\migration\tool\tool_interface
{
// The "automatic" way
$basename = (isset($data['module_basename'])) ? $data['module_basename'] : '';
- $basename = str_replace(array('/', '\\'), '', $basename);
- $class = str_replace(array('/', '\\'), '', $class);
-
$module = $this->get_module_info($class, $basename);
$result = '';
@@ -353,9 +350,7 @@ class module implements \phpbb\db\migration\tool\tool_interface
}
// Automatic method
- $basename = str_replace(array('/', '\\'), '', $module['module_basename']);
- $class = str_replace(array('/', '\\'), '', $class);
-
+ $basename = $module['module_basename'];
$module_info = $this->get_module_info($class, $basename);
foreach ($module_info['modes'] as $mode => $info)
diff --git a/phpBB/phpbb/db/migrator.php b/phpBB/phpbb/db/migrator.php
index 7efb23a230..8186493800 100644
--- a/phpBB/phpbb/db/migrator.php
+++ b/phpBB/phpbb/db/migrator.php
@@ -10,14 +10,6 @@
namespace phpbb\db;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* The migrator is responsible for applying new migrations in the correct order.
*
* @package db
@@ -192,6 +184,11 @@ class migrator
foreach ($state['migration_depends_on'] as $depend)
{
+ if ($this->unfulfillable($depend) !== false)
+ {
+ throw new \phpbb\db\migration\exception('MIGRATION_NOT_FULFILLABLE', $name, $depend);
+ }
+
if (!isset($this->migration_state[$depend]) ||
!$this->migration_state[$depend]['migration_schema_done'] ||
!$this->migration_state[$depend]['migration_data_done'])
@@ -204,6 +201,7 @@ class migrator
'name' => $name,
'class' => $migration,
'state' => $state,
+ 'task' => '',
);
if (!isset($this->migration_state[$name]))
@@ -231,6 +229,7 @@ class migrator
if (!$state['migration_schema_done'])
{
+ $this->last_run_migration['task'] = 'apply_schema_changes';
$this->apply_schema_changes($migration->update_schema());
$state['migration_schema_done'] = true;
}
@@ -238,6 +237,7 @@ class migrator
{
try
{
+ $this->last_run_migration['task'] = 'process_data_step';
$result = $this->process_data_step($migration->update_data(), $state['migration_data_state']);
$state['migration_data_state'] = ($result === true) ? '' : $result;
@@ -308,6 +308,7 @@ class migrator
$this->last_run_migration = array(
'name' => $name,
'class' => $migration,
+ 'task' => '',
);
if ($state['migration_data_done'])
@@ -374,7 +375,7 @@ class migrator
foreach ($steps as $step_identifier => $step)
{
- $last_result = false;
+ $last_result = 0;
if ($state)
{
// Continue until we reach the step that matches the last step called
@@ -435,7 +436,7 @@ class migrator
* @param bool $reverse False to install, True to attempt uninstallation by reversing the call
* @return null
*/
- protected function run_step($step, $last_result = false, $reverse = false)
+ protected function run_step($step, $last_result = 0, $reverse = false)
{
$callable_and_parameters = $this->get_callable_from_step($step, $last_result, $reverse);
@@ -458,7 +459,7 @@ class migrator
* @param bool $reverse False to install, True to attempt uninstallation by reversing the call
* @return array Array with parameters for call_user_func_array(), 0 is the callable, 1 is parameters
*/
- protected function get_callable_from_step(array $step, $last_result = false, $reverse = false)
+ protected function get_callable_from_step(array $step, $last_result = 0, $reverse = false)
{
$type = $step[0];
$parameters = $step[1];
@@ -626,6 +627,7 @@ class migrator
{
continue;
}
+
return false;
}
diff --git a/phpBB/phpbb/db/sql_insert_buffer.php b/phpBB/phpbb/db/sql_insert_buffer.php
index 7bbd213bdc..41026ad425 100644
--- a/phpBB/phpbb/db/sql_insert_buffer.php
+++ b/phpBB/phpbb/db/sql_insert_buffer.php
@@ -10,14 +10,6 @@
namespace phpbb\db;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Collects rows for insert into a database until the buffer size is reached.
* Then flushes the buffer to the database and starts over again.
*
diff --git a/phpBB/phpbb/db/tools.php b/phpBB/phpbb/db/tools.php
index 1f156fbb04..4360c89ac3 100644
--- a/phpBB/phpbb/db/tools.php
+++ b/phpBB/phpbb/db/tools.php
@@ -10,14 +10,6 @@
namespace phpbb\db;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Database Tools for handling cross-db actions such as altering columns, etc.
* Currently not supported is returning SQL for creating tables.
*
@@ -33,7 +25,7 @@ class tools
/**
* @var object DB object
*/
- var $db = NULL;
+ var $db = null;
/**
* The Column types for every database we support
diff --git a/phpBB/phpbb/di/extension/config.php b/phpBB/phpbb/di/extension/config.php
index 85b374a3ca..2603e7b358 100644
--- a/phpBB/phpbb/di/extension/config.php
+++ b/phpBB/phpbb/di/extension/config.php
@@ -9,14 +9,6 @@
namespace phpbb\di\extension;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
@@ -78,7 +70,7 @@ class config extends Extension
{
if (preg_match('#^[a-z]+$#', $acm_type))
{
- return '\\phpbb\cache\driver\\'.$acm_type;
+ return 'phpbb\\cache\\driver\\' . $acm_type;
}
return $acm_type;
diff --git a/phpBB/phpbb/di/extension/core.php b/phpBB/phpbb/di/extension/core.php
index 1f6b700973..455dfa7ecd 100644
--- a/phpBB/phpbb/di/extension/core.php
+++ b/phpBB/phpbb/di/extension/core.php
@@ -9,14 +9,6 @@
namespace phpbb\di\extension;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
diff --git a/phpBB/phpbb/di/extension/ext.php b/phpBB/phpbb/di/extension/ext.php
index cf623a7c87..4f2f24cb1a 100644
--- a/phpBB/phpbb/di/extension/ext.php
+++ b/phpBB/phpbb/di/extension/ext.php
@@ -9,14 +9,6 @@
namespace phpbb\di\extension;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
diff --git a/phpBB/phpbb/di/pass/collection_pass.php b/phpBB/phpbb/di/pass/collection_pass.php
index ffc5a41f6d..507271de3e 100644
--- a/phpBB/phpbb/di/pass/collection_pass.php
+++ b/phpBB/phpbb/di/pass/collection_pass.php
@@ -9,14 +9,6 @@
namespace phpbb\di\pass;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
diff --git a/phpBB/phpbb/di/pass/kernel_pass.php b/phpBB/phpbb/di/pass/kernel_pass.php
index 6a9124ad78..9c2b193361 100644
--- a/phpBB/phpbb/di/pass/kernel_pass.php
+++ b/phpBB/phpbb/di/pass/kernel_pass.php
@@ -9,14 +9,6 @@
namespace phpbb\di\pass;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
diff --git a/phpBB/phpbb/di/service_collection.php b/phpBB/phpbb/di/service_collection.php
index fccdd77071..65df9ab1d1 100644
--- a/phpBB/phpbb/di/service_collection.php
+++ b/phpBB/phpbb/di/service_collection.php
@@ -9,14 +9,6 @@
namespace phpbb\di;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
diff --git a/phpBB/phpbb/error_collector.php b/phpBB/phpbb/error_collector.php
index 9b3216e32f..297972c6b8 100644
--- a/phpBB/phpbb/error_collector.php
+++ b/phpBB/phpbb/error_collector.php
@@ -9,14 +9,6 @@
namespace phpbb;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
class error_collector
{
var $errors;
diff --git a/phpBB/phpbb/event/data.php b/phpBB/phpbb/event/data.php
index 3481023b74..fbb16574ed 100644
--- a/phpBB/phpbb/event/data.php
+++ b/phpBB/phpbb/event/data.php
@@ -9,62 +9,54 @@
namespace phpbb\event;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
use Symfony\Component\EventDispatcher\Event;
class data extends Event implements \ArrayAccess
{
- private $data;
-
- public function __construct(array $data = array())
- {
- $this->set_data($data);
- }
-
- public function set_data(array $data = array())
- {
- $this->data = $data;
- }
-
- public function get_data()
- {
- return $this->data;
- }
-
- /**
- * Returns data filtered to only include specified keys.
- *
- * This effectively discards any keys added to data by hooks.
- */
- public function get_data_filtered($keys)
- {
- return array_intersect_key($this->data, array_flip($keys));
- }
-
- public function offsetExists($offset)
- {
- return isset($this->data[$offset]);
- }
-
- public function offsetGet($offset)
- {
- return isset($this->data[$offset]) ? $this->data[$offset] : null;
- }
-
- public function offsetSet($offset, $value)
- {
- $this->data[$offset] = $value;
- }
-
- public function offsetUnset($offset)
- {
- unset($this->data[$offset]);
- }
+ private $data;
+
+ public function __construct(array $data = array())
+ {
+ $this->set_data($data);
+ }
+
+ public function set_data(array $data = array())
+ {
+ $this->data = $data;
+ }
+
+ public function get_data()
+ {
+ return $this->data;
+ }
+
+ /**
+ * Returns data filtered to only include specified keys.
+ *
+ * This effectively discards any keys added to data by hooks.
+ */
+ public function get_data_filtered($keys)
+ {
+ return array_intersect_key($this->data, array_flip($keys));
+ }
+
+ public function offsetExists($offset)
+ {
+ return isset($this->data[$offset]);
+ }
+
+ public function offsetGet($offset)
+ {
+ return isset($this->data[$offset]) ? $this->data[$offset] : null;
+ }
+
+ public function offsetSet($offset, $value)
+ {
+ $this->data[$offset] = $value;
+ }
+
+ public function offsetUnset($offset)
+ {
+ unset($this->data[$offset]);
+ }
}
diff --git a/phpBB/phpbb/event/dispatcher.php b/phpBB/phpbb/event/dispatcher.php
index cc3733692e..74b35eb78d 100644
--- a/phpBB/phpbb/event/dispatcher.php
+++ b/phpBB/phpbb/event/dispatcher.php
@@ -9,14 +9,6 @@
namespace phpbb\event;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
use Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher;
/**
diff --git a/phpBB/phpbb/event/extension_subscriber_loader.php b/phpBB/phpbb/event/extension_subscriber_loader.php
index ab50a589fe..6408f93e2a 100644
--- a/phpBB/phpbb/event/extension_subscriber_loader.php
+++ b/phpBB/phpbb/event/extension_subscriber_loader.php
@@ -9,39 +9,27 @@
namespace phpbb\event;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
class extension_subscriber_loader
{
private $dispatcher;
- private $extension_manager;
+ private $listener_collection;
- public function __construct(EventDispatcherInterface $dispatcher, \phpbb\extension\manager $extension_manager)
+ public function __construct(EventDispatcherInterface $dispatcher, \phpbb\di\service_collection $listener_collection)
{
$this->dispatcher = $dispatcher;
- $this->extension_manager = $extension_manager;
+ $this->listener_collection = $listener_collection;
}
public function load()
{
- $finder = $this->extension_manager->get_finder();
- $subscriber_classes = $finder
- ->extension_directory('/event')
- ->core_path('event/')
- ->get_classes();
-
- foreach ($subscriber_classes as $class)
+ if (!empty($this->listener_collection))
{
- $subscriber = new $class();
- $this->dispatcher->addSubscriber($subscriber);
+ foreach ($this->listener_collection as $listener)
+ {
+ $this->dispatcher->addSubscriber($listener);
+ }
}
}
}
diff --git a/phpBB/phpbb/event/kernel_exception_subscriber.php b/phpBB/phpbb/event/kernel_exception_subscriber.php
index 09103680e8..8a4de1fbad 100644
--- a/phpBB/phpbb/event/kernel_exception_subscriber.php
+++ b/phpBB/phpbb/event/kernel_exception_subscriber.php
@@ -9,14 +9,6 @@
namespace phpbb\event;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
@@ -72,7 +64,6 @@ class kernel_exception_subscriber implements EventSubscriberInterface
page_footer(true, false, false);
-
$status_code = $exception instanceof HttpException ? $exception->getStatusCode() : 500;
$response = new Response($this->template->assign_display('body'), $status_code);
$event->setResponse($response);
diff --git a/phpBB/phpbb/event/kernel_request_subscriber.php b/phpBB/phpbb/event/kernel_request_subscriber.php
index a629dd8440..7d5418498b 100644
--- a/phpBB/phpbb/event/kernel_request_subscriber.php
+++ b/phpBB/phpbb/event/kernel_request_subscriber.php
@@ -9,14 +9,6 @@
namespace phpbb\event;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
diff --git a/phpBB/phpbb/event/kernel_terminate_subscriber.php b/phpBB/phpbb/event/kernel_terminate_subscriber.php
index de441da102..32dba322d1 100644
--- a/phpBB/phpbb/event/kernel_terminate_subscriber.php
+++ b/phpBB/phpbb/event/kernel_terminate_subscriber.php
@@ -9,14 +9,6 @@
namespace phpbb\event;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\PostResponseEvent;
diff --git a/phpBB/phpbb/extension/base.php b/phpBB/phpbb/extension/base.php
index a529cc7961..1f871750e0 100644
--- a/phpBB/phpbb/extension/base.php
+++ b/phpBB/phpbb/extension/base.php
@@ -9,14 +9,6 @@
namespace phpbb\extension;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
diff --git a/phpBB/phpbb/extension/exception.php b/phpBB/phpbb/extension/exception.php
index e2ba647878..b1f4997fdd 100644
--- a/phpBB/phpbb/extension/exception.php
+++ b/phpBB/phpbb/extension/exception.php
@@ -10,14 +10,6 @@
namespace phpbb\extension;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Exception class for metadata
*/
class exception extends \UnexpectedValueException
diff --git a/phpBB/phpbb/extension/extension_interface.php b/phpBB/phpbb/extension/extension_interface.php
index 1e5f546dc5..bddff51b5a 100644
--- a/phpBB/phpbb/extension/extension_interface.php
+++ b/phpBB/phpbb/extension/extension_interface.php
@@ -10,14 +10,6 @@
namespace phpbb\extension;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* The interface extension meta classes have to implement to run custom code
* on enable/disable/purge.
*
diff --git a/phpBB/phpbb/extension/finder.php b/phpBB/phpbb/extension/finder.php
index e787919588..c9c16ae6d5 100644
--- a/phpBB/phpbb/extension/finder.php
+++ b/phpBB/phpbb/extension/finder.php
@@ -10,14 +10,6 @@
namespace phpbb\extension;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* The extension finder provides a simple way to locate files in active extensions
*
* @package extension
diff --git a/phpBB/phpbb/extension/manager.php b/phpBB/phpbb/extension/manager.php
index ce6d7e05c8..23b281deaa 100644
--- a/phpBB/phpbb/extension/manager.php
+++ b/phpBB/phpbb/extension/manager.php
@@ -9,14 +9,6 @@
namespace phpbb\extension;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
@@ -234,7 +226,9 @@ class manager
*/
public function enable($name)
{
+ // @codingStandardsIgnoreStart
while ($this->enable_step($name));
+ // @codingStandardsIgnoreEnd
}
/**
@@ -311,7 +305,9 @@ class manager
*/
public function disable($name)
{
+ // @codingStandardsIgnoreStart
while ($this->disable_step($name));
+ // @codingStandardsIgnoreEnd
}
/**
@@ -388,7 +384,9 @@ class manager
*/
public function purge($name)
{
+ // @codingStandardsIgnoreStart
while ($this->purge_step($name));
+ // @codingStandardsIgnoreEnd
}
/**
@@ -413,9 +411,24 @@ class manager
if ($file_info->isFile() && $file_info->getFilename() == 'ext.' . $this->php_ext)
{
$ext_name = $iterator->getInnerIterator()->getSubPath();
+ $composer_file = $iterator->getPath() . '/composer.json';
+
+ // Ignore the extension if there is no composer.json.
+ if (!is_readable($composer_file) || !($ext_info = file_get_contents($composer_file)))
+ {
+ continue;
+ }
+ $ext_info = json_decode($ext_info, true);
$ext_name = str_replace(DIRECTORY_SEPARATOR, '/', $ext_name);
+ // Ignore the extension if directory depth is not correct or if the directory structure
+ // does not match the name value specified in composer.json.
+ if (substr_count($ext_name, '/') !== 1 || !isset($ext_info['name']) || $ext_name != $ext_info['name'])
+ {
+ continue;
+ }
+
$available[$ext_name] = $this->phpbb_root_path . 'ext/' . $ext_name . '/';
}
}
diff --git a/phpBB/phpbb/extension/metadata_manager.php b/phpBB/phpbb/extension/metadata_manager.php
index a77f3a2c6e..66cdb86513 100644
--- a/phpBB/phpbb/extension/metadata_manager.php
+++ b/phpBB/phpbb/extension/metadata_manager.php
@@ -10,14 +10,6 @@
namespace phpbb\extension;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* The extension metadata manager validates and gets meta-data for extensions
*
* @package extension
@@ -147,7 +139,7 @@ class metadata_manager
if (!file_exists($this->metadata_file))
{
- throw new \phpbb\extension\exception('The required file does not exist: ' . $this->metadata_file);
+ throw new \phpbb\extension\exception('The required file does not exist: ' . $this->metadata_file);
}
}
@@ -166,12 +158,12 @@ class metadata_manager
{
if (!($file_contents = file_get_contents($this->metadata_file)))
{
- throw new \phpbb\extension\exception('file_get_contents failed on ' . $this->metadata_file);
+ throw new \phpbb\extension\exception('file_get_contents failed on ' . $this->metadata_file);
}
- if (($metadata = json_decode($file_contents, true)) === NULL)
+ if (($metadata = json_decode($file_contents, true)) === null)
{
- throw new \phpbb\extension\exception('json_decode failed on ' . $this->metadata_file);
+ throw new \phpbb\extension\exception('json_decode failed on ' . $this->metadata_file);
}
$this->metadata = $metadata;
@@ -199,50 +191,50 @@ class metadata_manager
* @return Bool True if valid, throws an exception if invalid
*/
public function validate($name = 'display')
- {
- // Basic fields
- $fields = array(
- 'name' => '#^[a-zA-Z0-9_\x7f-\xff]{2,}/[a-zA-Z0-9_\x7f-\xff]{2,}$#',
- 'type' => '#^phpbb3-extension$#',
- 'licence' => '#.+#',
- 'version' => '#.+#',
- );
-
- switch ($name)
- {
- case 'all':
- $this->validate('display');
+ {
+ // Basic fields
+ $fields = array(
+ 'name' => '#^[a-zA-Z0-9_\x7f-\xff]{2,}/[a-zA-Z0-9_\x7f-\xff]{2,}$#',
+ 'type' => '#^phpbb-extension$#',
+ 'licence' => '#.+#',
+ 'version' => '#.+#',
+ );
+
+ switch ($name)
+ {
+ case 'all':
+ $this->validate('display');
$this->validate_enable();
- break;
+ break;
- case 'display':
- foreach ($fields as $field => $data)
+ case 'display':
+ foreach ($fields as $field => $data)
{
$this->validate($field);
}
$this->validate_authors();
- break;
-
- default:
- if (isset($fields[$name]))
- {
- if (!isset($this->metadata[$name]))
- {
- throw new \phpbb\extension\exception("Required meta field '$name' has not been set.");
+ break;
+
+ default:
+ if (isset($fields[$name]))
+ {
+ if (!isset($this->metadata[$name]))
+ {
+ throw new \phpbb\extension\exception("Required meta field '$name' has not been set.");
}
if (!preg_match($fields[$name], $this->metadata[$name]))
{
- throw new \phpbb\extension\exception("Meta field '$name' is invalid.");
+ throw new \phpbb\extension\exception("Meta field '$name' is invalid.");
}
}
break;
}
return true;
- }
+ }
/**
* Validates the contents of the authors field
@@ -253,14 +245,14 @@ class metadata_manager
{
if (empty($this->metadata['authors']))
{
- throw new \phpbb\extension\exception("Required meta field 'authors' has not been set.");
+ throw new \phpbb\extension\exception("Required meta field 'authors' has not been set.");
}
foreach ($this->metadata['authors'] as $author)
{
if (!isset($author['name']))
{
- throw new \phpbb\extension\exception("Required meta field 'author name' has not been set.");
+ throw new \phpbb\extension\exception("Required meta field 'author name' has not been set.");
}
}
@@ -274,8 +266,8 @@ class metadata_manager
*/
public function validate_enable()
{
- // Check for phpBB, PHP versions
- if (!$this->validate_require_phpbb() || !$this->validate_require_php())
+ // Check for valid directory & phpBB, PHP versions
+ if (!$this->validate_dir() || !$this->validate_require_phpbb() || !$this->validate_require_php())
{
return false;
}
@@ -283,6 +275,16 @@ class metadata_manager
return true;
}
+ /**
+ * Validates the most basic directory structure to ensure it follows <vendor>/<ext> convention.
+ *
+ * @return boolean True when passes validation
+ */
+ public function validate_dir()
+ {
+ return (substr_count($this->ext_name, '/') === 1 && $this->ext_name == $this->get_metadata('name'));
+ }
+
/**
* Validates the contents of the phpbb requirement field
@@ -291,12 +293,12 @@ class metadata_manager
*/
public function validate_require_phpbb()
{
- if (!isset($this->metadata['require']['phpbb']))
+ if (!isset($this->metadata['require']['phpbb/phpbb']))
{
- return true;
+ return false;
}
- return $this->_validate_version($this->metadata['require']['phpbb'], $this->config['version']);
+ return true;
}
/**
@@ -308,10 +310,10 @@ class metadata_manager
{
if (!isset($this->metadata['require']['php']))
{
- return true;
+ return false;
}
- return $this->_validate_version($this->metadata['require']['php'], phpversion());
+ return true;
}
/**
@@ -354,7 +356,7 @@ class metadata_manager
'META_REQUIRE_PHP' => (isset($this->metadata['require']['php'])) ? htmlspecialchars($this->metadata['require']['php']) : '',
'META_REQUIRE_PHP_FAIL' => !$this->validate_require_php(),
- 'META_REQUIRE_PHPBB' => (isset($this->metadata['require']['phpbb'])) ? htmlspecialchars($this->metadata['require']['phpbb']) : '',
+ 'META_REQUIRE_PHPBB' => (isset($this->metadata['require']['phpbb/phpbb'])) ? htmlspecialchars($this->metadata['require']['phpbb/phpbb']) : '',
'META_REQUIRE_PHPBB_FAIL' => !$this->validate_require_phpbb(),
'META_DISPLAY_NAME' => (isset($this->metadata['extra']['display-name'])) ? htmlspecialchars($this->metadata['extra']['display-name']) : '',
diff --git a/phpBB/phpbb/extension/provider.php b/phpBB/phpbb/extension/provider.php
index c2a264d311..bfdc2b66b9 100644
--- a/phpBB/phpbb/extension/provider.php
+++ b/phpBB/phpbb/extension/provider.php
@@ -10,14 +10,6 @@
namespace phpbb\extension;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Provides a set of items found in extensions.
*
* This abstract class is essentially a wrapper around item-specific
diff --git a/phpBB/phpbb/feed/base.php b/phpBB/phpbb/feed/base.php
index de7dd41df4..e6c1e606fa 100644
--- a/phpBB/phpbb/feed/base.php
+++ b/phpBB/phpbb/feed/base.php
@@ -10,14 +10,6 @@
namespace phpbb\feed;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Base class with some generic functions and settings.
*
* @package phpBB3
@@ -150,7 +142,7 @@ abstract class base
*/
function get($key)
{
- return (isset($this->keys[$key])) ? $this->keys[$key] : NULL;
+ return (isset($this->keys[$key])) ? $this->keys[$key] : null;
}
function get_readable_forums()
diff --git a/phpBB/phpbb/feed/factory.php b/phpBB/phpbb/feed/factory.php
index e011b0e3a9..d370160563 100644
--- a/phpBB/phpbb/feed/factory.php
+++ b/phpBB/phpbb/feed/factory.php
@@ -10,14 +10,6 @@
namespace phpbb\feed;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Factory class to return correct object
* @package phpBB3
*/
diff --git a/phpBB/phpbb/feed/forum.php b/phpBB/phpbb/feed/forum.php
index 5f64d85625..8026824ab7 100644
--- a/phpBB/phpbb/feed/forum.php
+++ b/phpBB/phpbb/feed/forum.php
@@ -10,14 +10,6 @@
namespace phpbb\feed;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Forum feed
*
* This will give you the last {$this->num_items} posts made
@@ -36,7 +28,7 @@ class forum extends \phpbb\feed\post_base
* @param int $forum_id Forum ID
* @return \phpbb\feed\forum
*/
- public function set_forum_id($topic_id)
+ public function set_forum_id($forum_id)
{
$this->forum_id = (int) $forum_id;
diff --git a/phpBB/phpbb/feed/forums.php b/phpBB/phpbb/feed/forums.php
index 6be1c68da8..ddbb0bf7b3 100644
--- a/phpBB/phpbb/feed/forums.php
+++ b/phpBB/phpbb/feed/forums.php
@@ -10,14 +10,6 @@
namespace phpbb\feed;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* 'All Forums' feed
*
* This will give you a list of all postable forums where feeds are enabled
diff --git a/phpBB/phpbb/feed/helper.php b/phpBB/phpbb/feed/helper.php
index cf8328bd5e..3f2759b85e 100644
--- a/phpBB/phpbb/feed/helper.php
+++ b/phpBB/phpbb/feed/helper.php
@@ -10,14 +10,6 @@
namespace phpbb\feed;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Class with some helpful functions used in feeds
* @package phpBB3
*/
diff --git a/phpBB/phpbb/feed/news.php b/phpBB/phpbb/feed/news.php
index 20017a3248..7888e73239 100644
--- a/phpBB/phpbb/feed/news.php
+++ b/phpBB/phpbb/feed/news.php
@@ -10,14 +10,6 @@
namespace phpbb\feed;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* News feed
*
* This will give you {$this->num_items} first posts
diff --git a/phpBB/phpbb/feed/overall.php b/phpBB/phpbb/feed/overall.php
index 8ee1f092ab..4545ba5c64 100644
--- a/phpBB/phpbb/feed/overall.php
+++ b/phpBB/phpbb/feed/overall.php
@@ -10,14 +10,6 @@
namespace phpbb\feed;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Board wide feed (aka overall feed)
*
* This will give you the newest {$this->num_items} posts
diff --git a/phpBB/phpbb/feed/post_base.php b/phpBB/phpbb/feed/post_base.php
index 5588ecadb0..42c5eea9e3 100644
--- a/phpBB/phpbb/feed/post_base.php
+++ b/phpBB/phpbb/feed/post_base.php
@@ -10,14 +10,6 @@
namespace phpbb\feed;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Abstract class for post based feeds
*
* @package phpBB3
diff --git a/phpBB/phpbb/feed/topic.php b/phpBB/phpbb/feed/topic.php
index 1eeb4fbe94..09f377dd10 100644
--- a/phpBB/phpbb/feed/topic.php
+++ b/phpBB/phpbb/feed/topic.php
@@ -10,14 +10,6 @@
namespace phpbb\feed;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Topic feed for a specific topic
*
* This will give you the last {$this->num_items} posts made within this topic.
diff --git a/phpBB/phpbb/feed/topic_base.php b/phpBB/phpbb/feed/topic_base.php
index f05be9223e..7e28e67b82 100644
--- a/phpBB/phpbb/feed/topic_base.php
+++ b/phpBB/phpbb/feed/topic_base.php
@@ -10,14 +10,6 @@
namespace phpbb\feed;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Abstract class for topic based feeds
*
* @package phpBB3
diff --git a/phpBB/phpbb/feed/topics.php b/phpBB/phpbb/feed/topics.php
index d70195c87b..bdc858e947 100644
--- a/phpBB/phpbb/feed/topics.php
+++ b/phpBB/phpbb/feed/topics.php
@@ -10,14 +10,6 @@
namespace phpbb\feed;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* New Topics feed
*
* This will give you the last {$this->num_items} created topics
diff --git a/phpBB/phpbb/feed/topics_active.php b/phpBB/phpbb/feed/topics_active.php
index c6f46d67e6..cc0adac2eb 100644
--- a/phpBB/phpbb/feed/topics_active.php
+++ b/phpBB/phpbb/feed/topics_active.php
@@ -10,14 +10,6 @@
namespace phpbb\feed;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Active Topics feed
*
* This will give you the last {$this->num_items} topics
diff --git a/phpBB/phpbb/filesystem.php b/phpBB/phpbb/filesystem.php
index dbfaebe0fa..7878be0a5e 100644
--- a/phpBB/phpbb/filesystem.php
+++ b/phpBB/phpbb/filesystem.php
@@ -10,14 +10,6 @@
namespace phpbb;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* A class with various functions that are related to paths, files and the filesystem
* @package phpBB3
*/
diff --git a/phpBB/phpbb/groupposition/exception.php b/phpBB/phpbb/groupposition/exception.php
index 3a8d92dbc7..f43502235d 100644
--- a/phpBB/phpbb/groupposition/exception.php
+++ b/phpBB/phpbb/groupposition/exception.php
@@ -10,14 +10,6 @@
namespace phpbb\groupposition;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* @package groupposition
*/
class exception extends \Exception
diff --git a/phpBB/phpbb/groupposition/groupposition_interface.php b/phpBB/phpbb/groupposition/groupposition_interface.php
index a568785185..9785172a00 100644
--- a/phpBB/phpbb/groupposition/groupposition_interface.php
+++ b/phpBB/phpbb/groupposition/groupposition_interface.php
@@ -10,14 +10,6 @@
namespace phpbb\groupposition;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Interface to manage group positions in various places of phpbb
*
* The interface provides simple methods to add, delete and move a group
diff --git a/phpBB/phpbb/groupposition/legend.php b/phpBB/phpbb/groupposition/legend.php
index 9a1ef3d1d0..47ba06c006 100644
--- a/phpBB/phpbb/groupposition/legend.php
+++ b/phpBB/phpbb/groupposition/legend.php
@@ -10,14 +10,6 @@
namespace phpbb\groupposition;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Legend group position class
*
* group_legend is an ascending list 1, 2, ..., n for groups which are displayed. 1 is the first group, n the last.
diff --git a/phpBB/phpbb/groupposition/teampage.php b/phpBB/phpbb/groupposition/teampage.php
index 4e8228eb58..d934571ebc 100644
--- a/phpBB/phpbb/groupposition/teampage.php
+++ b/phpBB/phpbb/groupposition/teampage.php
@@ -10,14 +10,6 @@
namespace phpbb\groupposition;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Teampage group position class
*
* Teampage position is an ascending list 1, 2, ..., n for items which are displayed. 1 is the first item, n the last.
diff --git a/phpBB/phpbb/hook/finder.php b/phpBB/phpbb/hook/finder.php
index d5eb1f8186..c8f71861d9 100644
--- a/phpBB/phpbb/hook/finder.php
+++ b/phpBB/phpbb/hook/finder.php
@@ -10,14 +10,6 @@
namespace phpbb\hook;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* The hook finder locates installed hooks.
*
* @package phpBB3
diff --git a/phpBB/phpbb/json_response.php b/phpBB/phpbb/json_response.php
index fe532fc9d4..45c2f6cac4 100644
--- a/phpBB/phpbb/json_response.php
+++ b/phpBB/phpbb/json_response.php
@@ -10,14 +10,6 @@
namespace phpbb;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* JSON class
* @package phpBB3
*/
diff --git a/phpBB/phpbb/lock/db.php b/phpBB/phpbb/lock/db.php
index 3e15727c12..461adda045 100644
--- a/phpBB/phpbb/lock/db.php
+++ b/phpBB/phpbb/lock/db.php
@@ -10,14 +10,6 @@
namespace phpbb\lock;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Database locking class
* @package phpBB3
*/
diff --git a/phpBB/phpbb/lock/flock.php b/phpBB/phpbb/lock/flock.php
index 2a36a853ee..94a5895440 100644
--- a/phpBB/phpbb/lock/flock.php
+++ b/phpBB/phpbb/lock/flock.php
@@ -10,14 +10,6 @@
namespace phpbb\lock;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* File locking class
* @package phpBB3
*/
diff --git a/phpBB/phpbb/log/log.php b/phpBB/phpbb/log/log.php
index 7f4e52ed39..a6ee06ebf2 100644
--- a/phpBB/phpbb/log/log.php
+++ b/phpBB/phpbb/log/log.php
@@ -10,14 +10,6 @@
namespace phpbb\log;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* This class is used to add entries into the log table.
*
* @package \phpbb\log\log
diff --git a/phpBB/phpbb/log/log_interface.php b/phpBB/phpbb/log/log_interface.php
index 427d30015d..420ba79691 100644
--- a/phpBB/phpbb/log/log_interface.php
+++ b/phpBB/phpbb/log/log_interface.php
@@ -10,14 +10,6 @@
namespace phpbb\log;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* The interface for the log-system.
*
* @package \phpbb\log\log
diff --git a/phpBB/phpbb/log/null.php b/phpBB/phpbb/log/null.php
index 2ef69926ee..77d0fbe2d7 100644
--- a/phpBB/phpbb/log/null.php
+++ b/phpBB/phpbb/log/null.php
@@ -10,14 +10,6 @@
namespace phpbb\log;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Null logger
*
* @package phpbb_log
diff --git a/phpBB/phpbb/mimetype/content_guesser.php b/phpBB/phpbb/mimetype/content_guesser.php
new file mode 100644
index 0000000000..2d74582a21
--- /dev/null
+++ b/phpBB/phpbb/mimetype/content_guesser.php
@@ -0,0 +1,33 @@
+<?php
+/**
+*
+* @package phpBB3
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+namespace phpbb\mimetype;
+
+/**
+* @package mimetype
+*/
+
+class content_guesser extends guesser_base
+{
+ /**
+ * @inheritdoc
+ */
+ public function is_supported()
+ {
+ return function_exists('mime_content_type');
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function guess($file, $file_name = '')
+ {
+ return mime_content_type($file);
+ }
+}
diff --git a/phpBB/phpbb/mimetype/extension_guesser.php b/phpBB/phpbb/mimetype/extension_guesser.php
new file mode 100644
index 0000000000..f6f4ae0138
--- /dev/null
+++ b/phpBB/phpbb/mimetype/extension_guesser.php
@@ -0,0 +1,509 @@
+<?php
+/**
+*
+* @package phpBB3
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+namespace phpbb\mimetype;
+
+/**
+* @package mimetype
+*/
+
+class extension_guesser extends guesser_base
+{
+ /**
+ * @var file extension map
+ */
+ protected $extension_map = array(
+ '3dm' => 'x-world/x-3dmf',
+ '3dmf' => 'x-world/x-3dmf',
+ 'a' => 'application/octet-stream',
+ 'aab' => 'application/x-authorware-bin',
+ 'aam' => 'application/x-authorware-map',
+ 'aas' => 'application/x-authorware-seg',
+ 'abc' => 'text/vnd.abc',
+ 'acgi' => 'text/html',
+ 'afl' => 'video/animaflex',
+ 'ai' => 'application/postscript',
+ 'aif' => 'audio/aiff',
+ 'aifc' => 'audio/aiff',
+ 'aiff' => 'audio/aiff',
+ 'aim' => 'application/x-aim',
+ 'aip' => 'text/x-audiosoft-intra',
+ 'ani' => 'application/x-navi-animation',
+ 'aos' => 'application/x-nokia-9000-communicator-add-on-software',
+ 'aps' => 'application/mime',
+ 'arc' => 'application/octet-stream',
+ 'arj' => 'application/arj',
+ 'art' => 'image/x-jg',
+ 'asf' => 'video/x-ms-asf',
+ 'asm' => 'text/x-asm',
+ 'asp' => 'text/asp',
+ 'asx' => 'video/x-ms-asf',
+ 'au' => 'audio/x-au',
+ 'avi' => 'video/avi',
+ 'avs' => 'video/avs-video',
+ 'bcpio' => 'application/x-bcpio',
+ 'bin' => 'application/x-binary',
+ 'bm' => 'image/bmp',
+ 'bmp' => 'image/bmp',
+ 'boo' => 'application/book',
+ 'book' => 'application/book',
+ 'boz' => 'application/x-bzip2',
+ 'bsh' => 'application/x-bsh',
+ 'bz' => 'application/x-bzip',
+ 'bz2' => 'application/x-bzip2',
+ 'c' => 'text/x-c',
+ 'c++' => 'text/x-c',
+ 'cat' => 'application/vnd.ms-pki.seccat',
+ 'cc' => 'text/plain',
+ 'ccad' => 'application/clariscad',
+ 'cco' => 'application/x-cocoa',
+ 'cdf' => 'application/cdf',
+ 'cer' => 'application/x-x509-ca-cert',
+ 'cha' => 'application/x-chat',
+ 'chat' => 'application/x-chat',
+ 'class' => 'application/java',
+ 'com' => 'application/octet-stream',
+ 'conf' => 'text/plain',
+ 'cpio' => 'application/x-cpio',
+ 'cpp' => 'text/x-c',
+ 'cpt' => 'application/x-cpt',
+ 'crl' => 'application/pkix-crl',
+ 'crt' => 'application/x-x509-ca-cert',
+ 'csh' => 'application/x-csh',
+ 'css' => 'text/css',
+ 'cxx' => 'text/plain',
+ 'dcr' => 'application/x-director',
+ 'deepv' => 'application/x-deepv',
+ 'def' => 'text/plain',
+ 'der' => 'application/x-x509-ca-cert',
+ 'dif' => 'video/x-dv',
+ 'dir' => 'application/x-director',
+ 'dl' => 'video/dl',
+ 'doc' => 'application/msword',
+ 'dot' => 'application/msword',
+ 'dp' => 'application/commonground',
+ 'drw' => 'application/drafting',
+ 'dump' => 'application/octet-stream',
+ 'dv' => 'video/x-dv',
+ 'dvi' => 'application/x-dvi',
+ 'dwf' => 'model/vnd.dwf',
+ 'dwg' => 'image/x-dwg',
+ 'dxf' => 'image/x-dwg',
+ 'dxr' => 'application/x-director',
+ 'el' => 'text/x-script.elisp',
+ 'elc' => 'application/x-elc',
+ 'env' => 'application/x-envoy',
+ 'eps' => 'application/postscript',
+ 'es' => 'application/x-esrehber',
+ 'etx' => 'text/x-setext',
+ 'evy' => 'application/x-envoy',
+ 'exe' => 'application/octet-stream',
+ 'f' => 'text/x-fortran',
+ 'f77' => 'text/x-fortran',
+ 'f90' => 'text/x-fortran',
+ 'fdf' => 'application/vnd.fdf',
+ 'fif' => 'image/fif',
+ 'fli' => 'video/x-fli',
+ 'flo' => 'image/florian',
+ 'flx' => 'text/vnd.fmi.flexstor',
+ 'fmf' => 'video/x-atomic3d-feature',
+ 'for' => 'text/x-fortran',
+ 'fpx' => 'image/vnd.fpx',
+ 'frl' => 'application/freeloader',
+ 'funk' => 'audio/make',
+ 'g' => 'text/plain',
+ 'g3' => 'image/g3fax',
+ 'gif' => 'image/gif',
+ 'gl' => 'video/x-gl',
+ 'gsd' => 'audio/x-gsm',
+ 'gsm' => 'audio/x-gsm',
+ 'gsp' => 'application/x-gsp',
+ 'gss' => 'application/x-gss',
+ 'gtar' => 'application/x-gtar',
+ 'gz' => 'application/x-gzip',
+ 'gzip' => 'application/x-gzip',
+ 'h' => 'text/x-h',
+ 'hdf' => 'application/x-hdf',
+ 'help' => 'application/x-helpfile',
+ 'hgl' => 'application/vnd.hp-hpgl',
+ 'hh' => 'text/x-h',
+ 'hlb' => 'text/x-script',
+ 'hlp' => 'application/hlp',
+ 'hpg' => 'application/vnd.hp-hpgl',
+ 'hpgl' => 'application/vnd.hp-hpgl',
+ 'hqx' => 'application/x-binhex40',
+ 'hta' => 'application/hta',
+ 'htc' => 'text/x-component',
+ 'htm' => 'text/html',
+ 'html' => 'text/html',
+ 'htmls' => 'text/html',
+ 'htt' => 'text/webviewhtml',
+ 'htx' => 'text/html',
+ 'ice' => 'x-conference/x-cooltalk',
+ 'ico' => 'image/x-icon',
+ 'idc' => 'text/plain',
+ 'ief' => 'image/ief',
+ 'iefs' => 'image/ief',
+ 'iges' => 'application/iges',
+ 'igs' => 'application/iges',
+ 'ima' => 'application/x-ima',
+ 'imap' => 'application/x-httpd-imap',
+ 'inf' => 'application/inf',
+ 'ins' => 'application/x-internett-signup',
+ 'ip' => 'application/x-ip2',
+ 'isu' => 'video/x-isvideo',
+ 'it' => 'audio/it',
+ 'iv' => 'application/x-inventor',
+ 'ivr' => 'i-world/i-vrml',
+ 'ivy' => 'application/x-livescreen',
+ 'jam' => 'audio/x-jam',
+ 'jav' => 'text/plain',
+ 'jav' => 'text/x-java-source',
+ 'java' => 'text/x-java-source',
+ 'jcm' => 'application/x-java-commerce',
+ 'jfif' => 'image/jpeg',
+ 'jfif-tbnl' => 'image/jpeg',
+ 'jpe' => 'image/jpeg',
+ 'jpeg' => 'image/jpeg',
+ 'jpg' => 'image/jpeg',
+ 'jps' => 'image/x-jps',
+ 'js' => 'application/x-javascript',
+ 'jut' => 'image/jutvision',
+ 'kar' => 'audio/midi',
+ 'ksh' => 'text/x-script.ksh',
+ 'la' => 'audio/x-nspaudio',
+ 'lam' => 'audio/x-liveaudio',
+ 'latex' => 'application/x-latex',
+ 'lha' => 'application/x-lha',
+ 'lhx' => 'application/octet-stream',
+ 'list' => 'text/plain',
+ 'lma' => 'audio/x-nspaudio',
+ 'log' => 'text/plain',
+ 'lsp' => 'text/x-script.lisp',
+ 'lst' => 'text/plain',
+ 'lsx' => 'text/x-la-asf',
+ 'ltx' => 'application/x-latex',
+ 'lzh' => 'application/x-lzh',
+ 'lzx' => 'application/x-lzx',
+ 'm' => 'text/x-m',
+ 'm1v' => 'video/mpeg',
+ 'm2a' => 'audio/mpeg',
+ 'm2v' => 'video/mpeg',
+ 'm3u' => 'audio/x-mpequrl',
+ 'man' => 'application/x-troff-man',
+ 'map' => 'application/x-navimap',
+ 'mar' => 'text/plain',
+ 'mbd' => 'application/mbedlet',
+ 'mc$' => 'application/x-magic-cap-package-1.0',
+ 'mcd' => 'application/x-mathcad',
+ 'mcf' => 'text/mcf',
+ 'mcp' => 'application/netmc',
+ 'me' => 'application/x-troff-me',
+ 'mht' => 'message/rfc822',
+ 'mhtml' => 'message/rfc822',
+ 'mid' => 'audio/x-midi',
+ 'midi' => 'audio/x-midi',
+ 'mif' => 'application/x-mif',
+ 'mime' => 'www/mime',
+ 'mjf' => 'audio/x-vnd.audioexplosion.mjuicemediafile',
+ 'mjpg' => 'video/x-motion-jpeg',
+ 'mm' => 'application/x-meme',
+ 'mme' => 'application/base64',
+ 'mod' => 'audio/x-mod',
+ 'moov' => 'video/quicktime',
+ 'mov' => 'video/quicktime',
+ 'movie' => 'video/x-sgi-movie',
+ 'mp2' => 'audio/x-mpeg',
+ 'mp3' => 'audio/x-mpeg-3',
+ 'mpa' => 'audio/mpeg',
+ 'mpc' => 'application/x-project',
+ 'mpe' => 'video/mpeg',
+ 'mpeg' => 'video/mpeg',
+ 'mpg' => 'video/mpeg',
+ 'mpga' => 'audio/mpeg',
+ 'mpp' => 'application/vnd.ms-project',
+ 'mpt' => 'application/x-project',
+ 'mpv' => 'application/x-project',
+ 'mpx' => 'application/x-project',
+ 'mrc' => 'application/marc',
+ 'ms' => 'application/x-troff-ms',
+ 'mv' => 'video/x-sgi-movie',
+ 'my' => 'audio/make',
+ 'mzz' => 'application/x-vnd.audioexplosion.mzz',
+ 'nap' => 'image/naplps',
+ 'naplps' => 'image/naplps',
+ 'nc' => 'application/x-netcdf',
+ 'ncm' => 'application/vnd.nokia.configuration-message',
+ 'nif' => 'image/x-niff',
+ 'niff' => 'image/x-niff',
+ 'nix' => 'application/x-mix-transfer',
+ 'nsc' => 'application/x-conference',
+ 'nvd' => 'application/x-navidoc',
+ 'o' => 'application/octet-stream',
+ 'oda' => 'application/oda',
+ 'omc' => 'application/x-omc',
+ 'omcd' => 'application/x-omcdatamaker',
+ 'omcr' => 'application/x-omcregerator',
+ 'p' => 'text/x-pascal',
+ 'p10' => 'application/x-pkcs10',
+ 'p12' => 'application/x-pkcs12',
+ 'p7a' => 'application/x-pkcs7-signature',
+ 'p7c' => 'application/x-pkcs7-mime',
+ 'p7m' => 'application/x-pkcs7-mime',
+ 'p7r' => 'application/x-pkcs7-certreqresp',
+ 'p7s' => 'application/pkcs7-signature',
+ 'part' => 'application/pro_eng',
+ 'pas' => 'text/pascal',
+ 'pbm' => 'image/x-portable-bitmap',
+ 'pcl' => 'application/x-pcl',
+ 'pct' => 'image/x-pict',
+ 'pcx' => 'image/x-pcx',
+ 'pdb' => 'chemical/x-pdb',
+ 'pdf' => 'application/pdf',
+ 'pfunk' => 'audio/make.my.funk',
+ 'pgm' => 'image/x-portable-greymap',
+ 'pic' => 'image/pict',
+ 'pict' => 'image/pict',
+ 'pkg' => 'application/x-newton-compatible-pkg',
+ 'pko' => 'application/vnd.ms-pki.pko',
+ 'pl' => 'text/x-script.perl',
+ 'plx' => 'application/x-pixclscript',
+ 'pm' => 'text/x-script.perl-module',
+ 'pm4' => 'application/x-pagemaker',
+ 'pm5' => 'application/x-pagemaker',
+ 'png' => 'image/png',
+ 'pnm' => 'image/x-portable-anymap',
+ 'pot' => 'application/mspowerpoint',
+ 'pov' => 'model/x-pov',
+ 'ppa' => 'application/vnd.ms-powerpoint',
+ 'ppm' => 'image/x-portable-pixmap',
+ 'pps' => 'application/mspowerpoint',
+ 'ppt' => 'application/mspowerpoint',
+ 'ppz' => 'application/mspowerpoint',
+ 'pre' => 'application/x-freelance',
+ 'prt' => 'application/pro_eng',
+ 'ps' => 'application/postscript',
+ 'psd' => 'application/octet-stream',
+ 'pvu' => 'paleovu/x-pv',
+ 'pwz' => 'application/vnd.ms-powerpoint',
+ 'py' => 'text/x-script.phyton',
+ 'pyc' => 'applicaiton/x-bytecode.python',
+ 'qcp' => 'audio/vnd.qcelp',
+ 'qd3' => 'x-world/x-3dmf',
+ 'qd3d' => 'x-world/x-3dmf',
+ 'qif' => 'image/x-quicktime',
+ 'qt' => 'video/quicktime',
+ 'qtc' => 'video/x-qtc',
+ 'qti' => 'image/x-quicktime',
+ 'qtif' => 'image/x-quicktime',
+ 'ra' => 'audio/x-realaudio',
+ 'ram' => 'audio/x-pn-realaudio',
+ 'ras' => 'image/x-cmu-raster',
+ 'rast' => 'image/cmu-raster',
+ 'rexx' => 'text/x-script.rexx',
+ 'rf' => 'image/vnd.rn-realflash',
+ 'rgb' => 'image/x-rgb',
+ 'rm' => 'audio/x-pn-realaudio',
+ 'rmi' => 'audio/mid',
+ 'rmm' => 'audio/x-pn-realaudio',
+ 'rmp' => 'audio/x-pn-realaudio',
+ 'rng' => 'application/vnd.nokia.ringing-tone',
+ 'rnx' => 'application/vnd.rn-realplayer',
+ 'roff' => 'application/x-troff',
+ 'rp' => 'image/vnd.rn-realpix',
+ 'rpm' => 'audio/x-pn-realaudio-plugin',
+ 'rt' => 'text/richtext',
+ 'rtf' => 'text/richtext',
+ 'rtx' => 'text/richtext',
+ 'rv' => 'video/vnd.rn-realvideo',
+ 's' => 'text/x-asm',
+ 's3m' => 'audio/s3m',
+ 'saveme' => 'application/octet-stream',
+ 'sbk' => 'application/x-tbook',
+ 'scm' => 'video/x-scm',
+ 'sdml' => 'text/plain',
+ 'sdp' => 'application/x-sdp',
+ 'sdr' => 'application/sounder',
+ 'sea' => 'application/x-sea',
+ 'set' => 'application/set',
+ 'sgm' => 'text/x-sgml',
+ 'sgml' => 'text/x-sgml',
+ 'sh' => 'text/x-script.sh',
+ 'shar' => 'application/x-shar',
+ 'shtml' => 'text/x-server-parsed-html',
+ 'sid' => 'audio/x-psid',
+ 'sit' => 'application/x-stuffit',
+ 'skd' => 'application/x-koan',
+ 'skm' => 'application/x-koan',
+ 'skp' => 'application/x-koan',
+ 'skt' => 'application/x-koan',
+ 'sl' => 'application/x-seelogo',
+ 'smi' => 'application/smil',
+ 'smil' => 'application/smil',
+ 'snd' => 'audio/x-adpcm',
+ 'sol' => 'application/solids',
+ 'spc' => 'text/x-speech',
+ 'spl' => 'application/futuresplash',
+ 'spr' => 'application/x-sprite',
+ 'sprite' => 'application/x-sprite',
+ 'src' => 'application/x-wais-source',
+ 'ssi' => 'text/x-server-parsed-html',
+ 'ssm' => 'application/streamingmedia',
+ 'sst' => 'application/vnd.ms-pki.certstore',
+ 'step' => 'application/step',
+ 'stl' => 'application/vnd.ms-pki.stl',
+ 'stp' => 'application/step',
+ 'sv4cpio' => 'application/x-sv4cpio',
+ 'sv4crc' => 'application/x-sv4crc',
+ 'svf' => 'image/x-dwg',
+ 'svr' => 'application/x-world',
+ 'swf' => 'application/x-shockwave-flash',
+ 't' => 'application/x-troff',
+ 'talk' => 'text/x-speech',
+ 'tar' => 'application/x-tar',
+ 'tbk' => 'application/x-tbook',
+ 'tcl' => 'text/x-script.tcl',
+ 'tcsh' => 'text/x-script.tcsh',
+ 'tex' => 'application/x-tex',
+ 'texi' => 'application/x-texinfo',
+ 'texinfo' => 'application/x-texinfo',
+ 'text' => 'text/plain',
+ 'tgz' => 'application/x-compressed',
+ 'tif' => 'image/tiff',
+ 'tiff' => 'image/tiff',
+ 'tr' => 'application/x-troff',
+ 'tsi' => 'audio/tsp-audio',
+ 'tsp' => 'audio/tsplayer',
+ 'tsv' => 'text/tab-separated-values',
+ 'turbot' => 'image/florian',
+ 'txt' => 'text/plain',
+ 'uil' => 'text/x-uil',
+ 'uni' => 'text/uri-list',
+ 'unis' => 'text/uri-list',
+ 'unv' => 'application/i-deas',
+ 'uri' => 'text/uri-list',
+ 'uris' => 'text/uri-list',
+ 'ustar' => 'multipart/x-ustar',
+ 'uu' => 'text/x-uuencode',
+ 'uue' => 'text/x-uuencode',
+ 'vcd' => 'application/x-cdlink',
+ 'vcs' => 'text/x-vcalendar',
+ 'vda' => 'application/vda',
+ 'vdo' => 'video/vdo',
+ 'vew' => 'application/groupwise',
+ 'viv' => 'video/vivo',
+ 'vivo' => 'video/vivo',
+ 'vmd' => 'application/vocaltec-media-desc',
+ 'vmf' => 'application/vocaltec-media-file',
+ 'voc' => 'audio/voc',
+ 'vos' => 'video/vosaic',
+ 'vox' => 'audio/voxware',
+ 'vqe' => 'audio/x-twinvq-plugin',
+ 'vqf' => 'audio/x-twinvq',
+ 'vql' => 'audio/x-twinvq-plugin',
+ 'vrml' => 'application/x-vrml',
+ 'vrt' => 'x-world/x-vrt',
+ 'vsd' => 'application/x-visio',
+ 'vst' => 'application/x-visio',
+ 'vsw' => 'application/x-visio',
+ 'w60' => 'application/wordperfect6.0',
+ 'w61' => 'application/wordperfect6.1',
+ 'w6w' => 'application/msword',
+ 'wav' => 'audio/wav',
+ 'wb1' => 'application/x-qpro',
+ 'wbmp' => 'image/vnd.wap.wbmp',
+ 'web' => 'application/vnd.xara',
+ 'wiz' => 'application/msword',
+ 'wk1' => 'application/x-123',
+ 'wmf' => 'windows/metafile',
+ 'wml' => 'text/vnd.wap.wml',
+ 'wmlc' => 'application/vnd.wap.wmlc',
+ 'wmls' => 'text/vnd.wap.wmlscript',
+ 'wmlsc' => 'application/vnd.wap.wmlscriptc',
+ 'word' => 'application/msword',
+ 'wp' => 'application/wordperfect',
+ 'wp5' => 'application/wordperfect',
+ 'wp6' => 'application/wordperfect',
+ 'wpd' => 'application/wordperfect',
+ 'wq1' => 'application/x-lotus',
+ 'wri' => 'application/mswrite',
+ 'wrl' => 'model/vrml',
+ 'wrz' => 'model/vrml',
+ 'wsc' => 'text/scriplet',
+ 'wsrc' => 'application/x-wais-source',
+ 'wtk' => 'application/x-wintalk',
+ 'xbm' => 'image/xbm',
+ 'xdr' => 'video/x-amt-demorun',
+ 'xgz' => 'xgl/drawing',
+ 'xif' => 'image/vnd.xiff',
+ 'xl' => 'application/excel',
+ 'xla' => 'application/excel',
+ 'xlb' => 'application/excel',
+ 'xlc' => 'application/excel',
+ 'xld' => 'application/excel',
+ 'xlk' => 'application/excel',
+ 'xll' => 'application/excel',
+ 'xlm' => 'application/excel',
+ 'xls' => 'application/excel',
+ 'xlt' => 'application/excel',
+ 'xlv' => 'application/excel',
+ 'xlw' => 'application/excel',
+ 'xm' => 'audio/xm',
+ 'xml' => 'text/xml',
+ 'xmz' => 'xgl/movie',
+ 'xpix' => 'application/x-vnd.ls-xpix',
+ 'xpm' => 'image/xpm',
+ 'x-png' => 'image/png',
+ 'xsr' => 'video/x-amt-showrun',
+ 'xwd' => 'image/x-xwindowdump',
+ 'xyz' => 'chemical/x-pdb',
+ 'z' => 'application/x-compressed',
+ 'zip' => 'application/x-zip-compressed',
+ 'zoo' => 'application/octet-stream',
+ 'zsh' => 'text/x-script.zsh',
+ );
+
+ /**
+ * @inheritdoc
+ */
+ public function is_supported()
+ {
+ return true;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function guess($file, $file_name = '')
+ {
+ $file_name = (empty($file_name)) ? $file : $file_name;
+ return $this->map_extension_to_type($file_name);
+ }
+
+ /**
+ * Map extension of supplied file_name to mime type
+ *
+ * @param string $file_name Path to file or filename
+ *
+ * @return string|null Mimetype if known or null if not
+ */
+ protected function map_extension_to_type($file_name)
+ {
+ $extension = pathinfo($file_name, PATHINFO_EXTENSION);
+
+ if (isset($this->extension_map[$extension]))
+ {
+ return $this->extension_map[$extension];
+ }
+ else
+ {
+ return null;
+ }
+ }
+}
diff --git a/phpBB/phpbb/mimetype/guesser.php b/phpBB/phpbb/mimetype/guesser.php
new file mode 100644
index 0000000000..3499b3b0f7
--- /dev/null
+++ b/phpBB/phpbb/mimetype/guesser.php
@@ -0,0 +1,130 @@
+<?php
+/**
+*
+* @package phpBB3
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+namespace phpbb\mimetype;
+
+/**
+* @package mimetype
+*/
+
+class guesser
+{
+ /**
+ * @const Default priority for mimetype guessers
+ */
+ const PRIORITY_DEFAULT = 0;
+
+ /**
+ * @var mimetype guessers
+ */
+ protected $guessers;
+
+ /**
+ * Construct a mimetype guesser object
+ *
+ * @param array $mimetype_guessers Mimetype guesser service collection
+ */
+ public function __construct($mimetype_guessers)
+ {
+ $this->register_guessers($mimetype_guessers);
+ }
+
+ /**
+ * Register MimeTypeGuessers and sort them by priority
+ *
+ * @param array $mimetype_guessers Mimetype guesser service collection
+ *
+ * @throws \LogicException If incorrect or not mimetype guessers have
+ * been supplied to class
+ */
+ protected function register_guessers($mimetype_guessers)
+ {
+ foreach ($mimetype_guessers as $guesser)
+ {
+ $is_supported = (method_exists($guesser, 'is_supported')) ? 'is_supported' : '';
+ $is_supported = (method_exists($guesser, 'isSupported')) ? 'isSupported' : $is_supported;
+
+ if (empty($is_supported))
+ {
+ throw new \LogicException('Incorrect mimetype guesser supplied.');
+ }
+
+ if ($guesser->$is_supported())
+ {
+ $this->guessers[] = $guesser;
+ }
+ }
+
+ if (empty($this->guessers))
+ {
+ throw new \LogicException('No mimetype guesser supplied.');
+ }
+
+ // Sort guessers by priority
+ usort($this->guessers, array($this, 'sort_priority'));
+ }
+
+ /**
+ * Sort the priority of supplied guessers
+ * This is a compare function for usort. A guesser with higher priority
+ * should be used first and vice versa. usort() orders the array values
+ * from low to high depending on what the comparison function returns
+ * to it. Return value should be smaller than 0 if value a is smaller
+ * than value b. This has been reversed in the comparision function in
+ * order to sort the guessers from high to low.
+ * Method has been set to public in order to allow proper testing.
+ *
+ * @param object $guesser_a Mimetype guesser a
+ * @param object $guesser_b Mimetype guesser b
+ *
+ * @return int If both guessers have the same priority 0, bigger
+ * than 0 if first guesser has lower priority, and lower
+ * than 0 if first guesser has higher priority
+ */
+ public function sort_priority($guesser_a, $guesser_b)
+ {
+ $priority_a = (int) (method_exists($guesser_a, 'get_priority')) ? $guesser_a->get_priority() : self::PRIORITY_DEFAULT;
+ $priority_b = (int) (method_exists($guesser_b, 'get_priority')) ? $guesser_b->get_priority() : self::PRIORITY_DEFAULT;
+
+ return $priority_b - $priority_a;
+ }
+
+ /**
+ * Guess mimetype of supplied file
+ *
+ * @param string $file Path to file
+ *
+ * @return string Guess for mimetype of file
+ */
+ public function guess($file, $file_name = '')
+ {
+ if (!is_file($file))
+ {
+ return false;
+ }
+
+ if (!is_readable($file))
+ {
+ return false;
+ }
+
+ foreach ($this->guessers as $guesser)
+ {
+ $mimetype = $guesser->guess($file, $file_name);
+
+ // Try to guess something that is not the fallback application/octet-stream
+ if ($mimetype !== null && $mimetype !== 'application/octet-stream')
+ {
+ return $mimetype;
+ }
+ }
+ // Return any mimetype if we got a result or the fallback value
+ return (!empty($mimetype)) ? $mimetype : 'application/octet-stream';
+ }
+}
diff --git a/phpBB/phpbb/mimetype/guesser_base.php b/phpBB/phpbb/mimetype/guesser_base.php
new file mode 100644
index 0000000000..082b098028
--- /dev/null
+++ b/phpBB/phpbb/mimetype/guesser_base.php
@@ -0,0 +1,38 @@
+<?php
+/**
+*
+* @package phpBB3
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+namespace phpbb\mimetype;
+
+/**
+* @package mimetype
+*/
+
+abstract class guesser_base implements guesser_interface
+{
+ /**
+ * @var int Guesser Priority
+ */
+ protected $priority;
+
+ /**
+ * @inheritdoc
+ */
+ public function get_priority()
+ {
+ return $this->priority;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function set_priority($priority)
+ {
+ $this->priority = $priority;
+ }
+}
diff --git a/phpBB/phpbb/mimetype/guesser_interface.php b/phpBB/phpbb/mimetype/guesser_interface.php
new file mode 100644
index 0000000000..103689765e
--- /dev/null
+++ b/phpBB/phpbb/mimetype/guesser_interface.php
@@ -0,0 +1,49 @@
+<?php
+/**
+*
+* @package phpBB3
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+namespace phpbb\mimetype;
+
+/**
+* @package mimetype
+*/
+
+interface guesser_interface
+{
+ /**
+ * Returns whether this guesser is supported on the current OS
+ *
+ * @return bool True if guesser is supported, false if not
+ */
+ public function is_supported();
+
+ /**
+ * Guess mimetype of supplied file
+ *
+ * @param string $file Path to file
+ *
+ * @return string Guess for mimetype of file
+ */
+ public function guess($file, $file_name = '');
+
+ /**
+ * Get the guesser priority
+ *
+ * @return int Guesser priority
+ */
+ public function get_priority();
+
+ /**
+ * Set the guesser priority
+ *
+ * @param int Guesser priority
+ *
+ * @return void
+ */
+ public function set_priority($priority);
+}
diff --git a/phpBB/phpbb/notification/exception.php b/phpBB/phpbb/notification/exception.php
index 275fb3b542..6bdded3fd8 100644
--- a/phpBB/phpbb/notification/exception.php
+++ b/phpBB/phpbb/notification/exception.php
@@ -10,14 +10,6 @@
namespace phpbb\notification;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Notifications exception
*
* @package notifications
diff --git a/phpBB/phpbb/notification/manager.php b/phpBB/phpbb/notification/manager.php
index c42c84fb1f..2e8652771b 100644
--- a/phpBB/phpbb/notification/manager.php
+++ b/phpBB/phpbb/notification/manager.php
@@ -10,14 +10,6 @@
namespace phpbb\notification;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Notifications service class
* @package notifications
*/
@@ -35,6 +27,9 @@ class manager
/** @var \phpbb\user_loader */
protected $user_loader;
+ /** @var \phpbb\config\config */
+ protected $config;
+
/** @var \phpbb\db\driver\driver */
protected $db;
@@ -66,6 +61,7 @@ class manager
* @param array $notification_methods
* @param ContainerBuilder $phpbb_container
* @param \phpbb\user_loader $user_loader
+ * @param \phpbb\config\config $config
* @param \phpbb\db\driver\driver $db
* @param \phpbb\user $user
* @param string $phpbb_root_path
@@ -75,13 +71,14 @@ class manager
* @param string $user_notifications_table
* @return \phpbb\notification\manager
*/
- public function __construct($notification_types, $notification_methods, $phpbb_container, \phpbb\user_loader $user_loader, \phpbb\db\driver\driver $db, \phpbb\cache\service $cache, $user, $phpbb_root_path, $php_ext, $notification_types_table, $notifications_table, $user_notifications_table)
+ public function __construct($notification_types, $notification_methods, $phpbb_container, \phpbb\user_loader $user_loader, \phpbb\config\config $config, \phpbb\db\driver\driver $db, \phpbb\cache\service $cache, $user, $phpbb_root_path, $php_ext, $notification_types_table, $notifications_table, $user_notifications_table)
{
$this->notification_types = $notification_types;
$this->notification_methods = $notification_methods;
$this->phpbb_container = $phpbb_container;
$this->user_loader = $user_loader;
+ $this->config = $config;
$this->db = $db;
$this->cache = $cache;
$this->user = $user;
@@ -154,7 +151,7 @@ class manager
AND nt.notification_type_id = n.notification_type_id
AND nt.notification_type_enabled = 1';
$result = $this->db->sql_query($sql);
- $unread_count = (int) $this->db->sql_fetchfield('unread_count', $result);
+ $unread_count = (int) $this->db->sql_fetchfield('unread_count');
$this->db->sql_freeresult($result);
}
@@ -167,7 +164,7 @@ class manager
AND nt.notification_type_id = n.notification_type_id
AND nt.notification_type_enabled = 1';
$result = $this->db->sql_query($sql);
- $total_count = (int) $this->db->sql_fetchfield('total_count', $result);
+ $total_count = (int) $this->db->sql_fetchfield('total_count');
$this->db->sql_freeresult($result);
}
@@ -262,8 +259,7 @@ class manager
SET notification_read = 1
WHERE notification_time <= " . (int) $time .
(($notification_type_name !== false) ? ' AND ' .
- (is_array($notification_type_name) ? $this->db->sql_in_set('notification_type_id', $this->get_notification_type_ids($notification_type_name)) : 'notification_type_id = ' . $this->get_notification_type_id($notification_type_name))
- : '') .
+ (is_array($notification_type_name) ? $this->db->sql_in_set('notification_type_id', $this->get_notification_type_ids($notification_type_name)) : 'notification_type_id = ' . $this->get_notification_type_id($notification_type_name)) : '') .
(($user_id !== false) ? ' AND ' . (is_array($user_id) ? $this->db->sql_in_set('user_id', $user_id) : 'user_id = ' . (int) $user_id) : '') .
(($item_id !== false) ? ' AND ' . (is_array($item_id) ? $this->db->sql_in_set('item_id', $item_id) : 'item_id = ' . (int) $item_id) : '');
$this->db->sql_query($sql);
@@ -285,8 +281,7 @@ class manager
SET notification_read = 1
WHERE notification_time <= " . (int) $time .
(($notification_type_name !== false) ? ' AND ' .
- (is_array($notification_type_name) ? $this->db->sql_in_set('notification_type_id', $this->get_notification_type_ids($notification_type_name)) : 'notification_type_id = ' . $this->get_notification_type_id($notification_type_name))
- : '') .
+ (is_array($notification_type_name) ? $this->db->sql_in_set('notification_type_id', $this->get_notification_type_ids($notification_type_name)) : 'notification_type_id = ' . $this->get_notification_type_id($notification_type_name)) : '') .
(($item_parent_id !== false) ? ' AND ' . (is_array($item_parent_id) ? $this->db->sql_in_set('item_parent_id', $item_parent_id) : 'item_parent_id = ' . (int) $item_parent_id) : '') .
(($user_id !== false) ? ' AND ' . (is_array($user_id) ? $this->db->sql_in_set('user_id', $user_id) : 'user_id = ' . (int) $user_id) : '');
$this->db->sql_query($sql);
@@ -807,6 +802,8 @@ class manager
WHERE notification_time < ' . (int) $timestamp .
(($only_read) ? ' AND notification_read = 1' : '');
$this->db->sql_query($sql);
+
+ $this->config->set('read_notification_last_gc', time(), false);
}
/**
diff --git a/phpBB/phpbb/notification/method/base.php b/phpBB/phpbb/notification/method/base.php
index 327f964424..4ce42de830 100644
--- a/phpBB/phpbb/notification/method/base.php
+++ b/phpBB/phpbb/notification/method/base.php
@@ -10,14 +10,6 @@
namespace phpbb\notification\method;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Base notifications method class
* @package notifications
*/
diff --git a/phpBB/phpbb/notification/method/email.php b/phpBB/phpbb/notification/method/email.php
index b761eb5a28..e039fae8de 100644
--- a/phpBB/phpbb/notification/method/email.php
+++ b/phpBB/phpbb/notification/method/email.php
@@ -10,14 +10,6 @@
namespace phpbb\notification\method;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Email notification method class
* This class handles sending emails for notifications
*
diff --git a/phpBB/phpbb/notification/method/jabber.php b/phpBB/phpbb/notification/method/jabber.php
index 6ec21bb735..bdfaf5a6fc 100644
--- a/phpBB/phpbb/notification/method/jabber.php
+++ b/phpBB/phpbb/notification/method/jabber.php
@@ -10,14 +10,6 @@
namespace phpbb\notification\method;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Jabber notification method class
* This class handles sending Jabber messages for notifications
*
diff --git a/phpBB/phpbb/notification/method/messenger_base.php b/phpBB/phpbb/notification/method/messenger_base.php
index b1b30f29b7..7cb38eb59d 100644
--- a/phpBB/phpbb/notification/method/messenger_base.php
+++ b/phpBB/phpbb/notification/method/messenger_base.php
@@ -10,14 +10,6 @@
namespace phpbb\notification\method;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Abstract notification method handling email and jabber notifications
* using the phpBB messenger.
*
diff --git a/phpBB/phpbb/notification/method/method_interface.php b/phpBB/phpbb/notification/method/method_interface.php
index 0131a8bde0..4830d06b86 100644
--- a/phpBB/phpbb/notification/method/method_interface.php
+++ b/phpBB/phpbb/notification/method/method_interface.php
@@ -10,14 +10,6 @@
namespace phpbb\notification\method;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Base notifications method interface
* @package notifications
*/
diff --git a/phpBB/phpbb/notification/type/admin_activate_user.php b/phpBB/phpbb/notification/type/admin_activate_user.php
new file mode 100644
index 0000000000..5f146e18ff
--- /dev/null
+++ b/phpBB/phpbb/notification/type/admin_activate_user.php
@@ -0,0 +1,166 @@
+<?php
+/**
+*
+* @package notifications
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+namespace phpbb\notification\type;
+
+/**
+* Admin activation notifications class
+* This class handles notifications for users requiring admin activation
+*
+* @package notifications
+*/
+class admin_activate_user extends \phpbb\notification\type\base
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function get_type()
+ {
+ return 'admin_activate_user';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected $language_key = 'NOTIFICATION_ADMIN_ACTIVATE_USER';
+
+ /**
+ * {@inheritdoc}
+ */
+ public static $notification_option = array(
+ 'lang' => 'NOTIFICATION_TYPE_ADMIN_ACTIVATE_USER',
+ 'group' => 'NOTIFICATION_GROUP_ADMINISTRATION',
+ );
+
+ /**
+ * {@inheritdoc}
+ */
+ public function is_available()
+ {
+ return ($this->auth->acl_get('a_user') && $this->config['require_activation'] == USER_ACTIVATION_ADMIN);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function get_item_id($user)
+ {
+ return (int) $user['user_id'];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function get_item_parent_id($post)
+ {
+ return 0;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function find_users_for_notification($user, $options = array())
+ {
+ $options = array_merge(array(
+ 'ignore_users' => array(),
+ ), $options);
+
+ // Grab admins that have permission to administer users.
+ $admin_ary = $this->auth->acl_get_list(false, 'a_user', false);
+ $users = (!empty($admin_ary[0]['a_user'])) ? $admin_ary[0]['a_user'] : array();
+
+ // Grab founders
+ $sql = 'SELECT user_id
+ FROM ' . USERS_TABLE . '
+ WHERE user_type = ' . USER_FOUNDER;
+ $result = $this->db->sql_query($sql);
+
+ while ($row = $this->db->sql_fetchrow($sql))
+ {
+ $users[] = (int) $row['user_id'];
+ }
+ $this->db->sql_freeresult($result);
+
+ if (empty($users))
+ {
+ return array();
+ }
+ $users = array_unique($users);
+
+ return $this->check_user_notification_options($users, $options);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get_avatar()
+ {
+ return $this->user_loader->get_avatar($this->item_id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get_title()
+ {
+ $username = $this->user_loader->get_username($this->item_id, 'no_profile');
+
+ return $this->user->lang($this->language_key, $username);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get_email_template()
+ {
+ return 'admin_activate';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get_email_template_variables()
+ {
+ $board_url = generate_board_url();
+ $username = $this->user_loader->get_username($this->item_id, 'no_profile');
+
+ return array(
+ 'USERNAME' => htmlspecialchars_decode($username),
+ 'U_USER_DETAILS' => "{$board_url}/memberlist.{$this->php_ext}?mode=viewprofile&u={$this->item_id}",
+ 'U_ACTIVATE' => "{$board_url}/ucp.{$this->php_ext}?mode=activate&u={$this->item_id}&k={$this->get_data('user_actkey')}",
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get_url()
+ {
+ return append_sid($this->phpbb_root_path . 'memberlist.' . $this->php_ext, "mode=viewprofile&u={$this->item_id}");
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function users_to_query()
+ {
+ return array($this->item_id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function create_insert_array($user, $pre_create_data)
+ {
+ $this->set_data('user_actkey', $user['user_actkey']);
+ $this->notification_time = $user['user_regdate'];
+
+ return parent::create_insert_array($user, $pre_create_data);
+ }
+}
diff --git a/phpBB/phpbb/notification/type/approve_post.php b/phpBB/phpbb/notification/type/approve_post.php
index cf4ec57989..51a9a704b0 100644
--- a/phpBB/phpbb/notification/type/approve_post.php
+++ b/phpBB/phpbb/notification/type/approve_post.php
@@ -10,14 +10,6 @@
namespace phpbb\notification\type;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Post approved notifications class
* This class handles notifications for posts when they are approved (to their authors)
*
diff --git a/phpBB/phpbb/notification/type/approve_topic.php b/phpBB/phpbb/notification/type/approve_topic.php
index ca5bb67754..6229800c68 100644
--- a/phpBB/phpbb/notification/type/approve_topic.php
+++ b/phpBB/phpbb/notification/type/approve_topic.php
@@ -10,14 +10,6 @@
namespace phpbb\notification\type;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Topic approved notifications class
* This class handles notifications for topics when they are approved (for authors)
*
@@ -34,7 +26,7 @@ class approve_topic extends \phpbb\notification\type\topic
{
return 'approve_topic';
}
-
+
/**
* Language key used to output the text
*
diff --git a/phpBB/phpbb/notification/type/base.php b/phpBB/phpbb/notification/type/base.php
index 3c44468bb8..951585853f 100644
--- a/phpBB/phpbb/notification/type/base.php
+++ b/phpBB/phpbb/notification/type/base.php
@@ -10,14 +10,6 @@
namespace phpbb\notification\type;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Base notifications class
* @package notifications
*/
diff --git a/phpBB/phpbb/notification/type/bookmark.php b/phpBB/phpbb/notification/type/bookmark.php
index 50ea7380af..5e6fdd2523 100644
--- a/phpBB/phpbb/notification/type/bookmark.php
+++ b/phpBB/phpbb/notification/type/bookmark.php
@@ -10,14 +10,6 @@
namespace phpbb\notification\type;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Bookmark updating notifications class
* This class handles notifications for replies to a bookmarked topic
*
diff --git a/phpBB/phpbb/notification/type/disapprove_post.php b/phpBB/phpbb/notification/type/disapprove_post.php
index 0c9162ec5c..411d4195c7 100644
--- a/phpBB/phpbb/notification/type/disapprove_post.php
+++ b/phpBB/phpbb/notification/type/disapprove_post.php
@@ -10,14 +10,6 @@
namespace phpbb\notification\type;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Post disapproved notifications class
* This class handles notifications for posts when they are disapproved (for authors)
*
diff --git a/phpBB/phpbb/notification/type/disapprove_topic.php b/phpBB/phpbb/notification/type/disapprove_topic.php
index dde6f83ec4..19e9d468ce 100644
--- a/phpBB/phpbb/notification/type/disapprove_topic.php
+++ b/phpBB/phpbb/notification/type/disapprove_topic.php
@@ -10,14 +10,6 @@
namespace phpbb\notification\type;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Topic disapproved notifications class
* This class handles notifications for topics when they are disapproved (for authors)
*
diff --git a/phpBB/phpbb/notification/type/group_request.php b/phpBB/phpbb/notification/type/group_request.php
index 1768a8fffa..e0527fe220 100644
--- a/phpBB/phpbb/notification/type/group_request.php
+++ b/phpBB/phpbb/notification/type/group_request.php
@@ -9,14 +9,6 @@
namespace phpbb\notification\type;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
class group_request extends \phpbb\notification\type\base
{
/**
diff --git a/phpBB/phpbb/notification/type/group_request_approved.php b/phpBB/phpbb/notification/type/group_request_approved.php
index be4a902acd..448f049412 100644
--- a/phpBB/phpbb/notification/type/group_request_approved.php
+++ b/phpBB/phpbb/notification/type/group_request_approved.php
@@ -9,14 +9,6 @@
namespace phpbb\notification\type;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
class group_request_approved extends \phpbb\notification\type\base
{
/**
diff --git a/phpBB/phpbb/notification/type/pm.php b/phpBB/phpbb/notification/type/pm.php
index bed0807b0f..584a30efa6 100644
--- a/phpBB/phpbb/notification/type/pm.php
+++ b/phpBB/phpbb/notification/type/pm.php
@@ -10,14 +10,6 @@
namespace phpbb\notification\type;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Private message notifications class
* This class handles notifications for private messages
*
diff --git a/phpBB/phpbb/notification/type/post.php b/phpBB/phpbb/notification/type/post.php
index fe50e7f172..c2854c17af 100644
--- a/phpBB/phpbb/notification/type/post.php
+++ b/phpBB/phpbb/notification/type/post.php
@@ -10,14 +10,6 @@
namespace phpbb\notification\type;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Post notifications class
* This class handles notifications for replies to a topic
*
@@ -191,6 +183,10 @@ class post extends \phpbb\notification\type\base
'username' => $this->get_data('post_username'),
)), $responders);
+ $responders_cnt = sizeof($responders);
+ $responders = $this->trim_user_ary($responders);
+ $trimmed_responders_cnt = $responders_cnt - sizeof($responders);
+
foreach ($responders as $responder)
{
if ($responder['username'])
@@ -202,11 +198,18 @@ class post extends \phpbb\notification\type\base
$usernames[] = $this->user_loader->get_username($responder['poster_id'], 'no_profile');
}
}
+ $lang_key = $this->language_key;
+
+ if ($trimmed_responders_cnt)
+ {
+ $lang_key .= '_TRIMMED';
+ }
return $this->user->lang(
- $this->language_key,
- implode(', ', $usernames),
- censor_text($this->get_data('topic_title'))
+ $lang_key,
+ implode($this->user->lang['COMMA_SEPARATOR'], $usernames),
+ censor_text($this->get_data('topic_title')),
+ $trimmed_responders_cnt
);
}
@@ -242,7 +245,7 @@ class post extends \phpbb\notification\type\base
'TOPIC_TITLE' => htmlspecialchars_decode(censor_text($this->get_data('topic_title'))),
'U_VIEW_POST' => generate_board_url() . "/viewtopic.{$this->php_ext}?p={$this->item_id}#p{$this->item_id}",
- 'U_NEWEST_POST' => generate_board_url() . "/viewtopic.{$this->php_ext}?f={$this->get_data('forum_id')}&t={$this->item_parent_id}&view=unread#unread",
+ 'U_NEWEST_POST' => generate_board_url() . "/viewtopic.{$this->php_ext}?f={$this->get_data('forum_id')}&t={$this->item_parent_id}&e=1&view=unread#unread",
'U_TOPIC' => generate_board_url() . "/viewtopic.{$this->php_ext}?f={$this->get_data('forum_id')}&t={$this->item_parent_id}",
'U_VIEW_TOPIC' => generate_board_url() . "/viewtopic.{$this->php_ext}?f={$this->get_data('forum_id')}&t={$this->item_parent_id}",
'U_FORUM' => generate_board_url() . "/viewforum.{$this->php_ext}?f={$this->get_data('forum_id')}",
@@ -280,6 +283,22 @@ class post extends \phpbb\notification\type\base
}
}
+ return $this->trim_user_ary($users);
+ }
+
+ /**
+ * Trim the user array passed down to 3 users if the array contains
+ * more than 4 users.
+ *
+ * @param array $users Array of users
+ * @return array Trimmed array of user_ids
+ */
+ public function trim_user_ary($users)
+ {
+ if (sizeof($users) > 4)
+ {
+ array_splice($users, 3);
+ }
return $users;
}
diff --git a/phpBB/phpbb/notification/type/post_in_queue.php b/phpBB/phpbb/notification/type/post_in_queue.php
index f05ed1ce9a..db16763583 100644
--- a/phpBB/phpbb/notification/type/post_in_queue.php
+++ b/phpBB/phpbb/notification/type/post_in_queue.php
@@ -10,14 +10,6 @@
namespace phpbb\notification\type;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Post in queue notifications class
* This class handles notifications for posts that are put in the moderation queue (for moderators)
*
diff --git a/phpBB/phpbb/notification/type/quote.php b/phpBB/phpbb/notification/type/quote.php
index 56cfbc9364..e8527261d8 100644
--- a/phpBB/phpbb/notification/type/quote.php
+++ b/phpBB/phpbb/notification/type/quote.php
@@ -10,16 +10,8 @@
namespace phpbb\notification\type;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Post quoting notifications class
-* This class handles notifications for quoting users in a post
+* This class handles notifying users when they have been quoted in a post
*
* @package notifications
*/
diff --git a/phpBB/phpbb/notification/type/report_pm.php b/phpBB/phpbb/notification/type/report_pm.php
index fd3f754f8a..55f6bf946d 100644
--- a/phpBB/phpbb/notification/type/report_pm.php
+++ b/phpBB/phpbb/notification/type/report_pm.php
@@ -10,15 +10,7 @@
namespace phpbb\notification\type;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
-* Private message reproted notifications class
+* Private message reported notifications class
* This class handles notifications for private messages when they are reported
*
* @package notifications
diff --git a/phpBB/phpbb/notification/type/report_pm_closed.php b/phpBB/phpbb/notification/type/report_pm_closed.php
index 2e4a1ceb30..9d2aac329e 100644
--- a/phpBB/phpbb/notification/type/report_pm_closed.php
+++ b/phpBB/phpbb/notification/type/report_pm_closed.php
@@ -10,14 +10,6 @@
namespace phpbb\notification\type;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* PM report closed notifications class
* This class handles notifications for when reports are closed on PMs (for the one who reported the PM)
*
diff --git a/phpBB/phpbb/notification/type/report_post.php b/phpBB/phpbb/notification/type/report_post.php
index c2dad6f1bb..89b497efa6 100644
--- a/phpBB/phpbb/notification/type/report_post.php
+++ b/phpBB/phpbb/notification/type/report_post.php
@@ -10,14 +10,6 @@
namespace phpbb\notification\type;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Reported post notifications class
* This class handles notifications for reported posts
*
diff --git a/phpBB/phpbb/notification/type/report_post_closed.php b/phpBB/phpbb/notification/type/report_post_closed.php
index 270ccf0a1a..5874d48e31 100644
--- a/phpBB/phpbb/notification/type/report_post_closed.php
+++ b/phpBB/phpbb/notification/type/report_post_closed.php
@@ -10,14 +10,6 @@
namespace phpbb\notification\type;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Post report closed notifications class
* This class handles notifications for when reports are closed on posts (for the one who reported the post)
*
diff --git a/phpBB/phpbb/notification/type/topic.php b/phpBB/phpbb/notification/type/topic.php
index 8db02f610b..6198881d8d 100644
--- a/phpBB/phpbb/notification/type/topic.php
+++ b/phpBB/phpbb/notification/type/topic.php
@@ -10,14 +10,6 @@
namespace phpbb\notification\type;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Topic notifications class
* This class handles notifications for new topics
*
diff --git a/phpBB/phpbb/notification/type/topic_in_queue.php b/phpBB/phpbb/notification/type/topic_in_queue.php
index 056651bc53..c8c1b5b7e2 100644
--- a/phpBB/phpbb/notification/type/topic_in_queue.php
+++ b/phpBB/phpbb/notification/type/topic_in_queue.php
@@ -10,14 +10,6 @@
namespace phpbb\notification\type;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Topic in queue notifications class
* This class handles notifications for topics when they are put in the moderation queue (for moderators)
*
diff --git a/phpBB/phpbb/notification/type/type_interface.php b/phpBB/phpbb/notification/type/type_interface.php
index cfc6cd461e..e3e6898172 100644
--- a/phpBB/phpbb/notification/type/type_interface.php
+++ b/phpBB/phpbb/notification/type/type_interface.php
@@ -10,14 +10,6 @@
namespace phpbb\notification\type;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Base notifications interface
* @package notifications
*/
diff --git a/phpBB/phpbb/pagination.php b/phpBB/phpbb/pagination.php
new file mode 100644
index 0000000000..467dc2157f
--- /dev/null
+++ b/phpBB/phpbb/pagination.php
@@ -0,0 +1,306 @@
+<?php
+/**
+*
+* @package phpbb
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+namespace phpbb;
+
+class pagination
+{
+ /** @var \phpbb\template\template */
+ protected $template;
+
+ /** @var \phpbb\user */
+ protected $user;
+
+ /**
+ * Constructor
+ *
+ * @param \phpbb\template\template $template
+ * @param \phpbb\user $user
+ */
+ public function __construct(\phpbb\template\template $template, \phpbb\user $user)
+ {
+ $this->template = $template;
+ $this->user = $user;
+ }
+
+ /**
+ * Generate a pagination link based on the url and the page information
+ *
+ * @param string $base_url is url prepended to all links generated within the function
+ * If you use page numbers inside your controller route, base_url should contains a placeholder (%d)
+ * for the page. Also be sure to specify the pagination path information into the start_name argument
+ * @param string $on_page is the page for which we want to generate the link
+ * @param string $start_name is the name of the parameter containing the first item of the given page (example: start=20)
+ * If you use page numbers inside your controller route, start name should be the string
+ * that should be removed for the first page (example: /page/%d)
+ * @param int $per_page the number of items, posts, etc. to display per page, used to determine the number of pages to produce
+ * @return URL for the requested page
+ */
+ protected function generate_page_link($base_url, $on_page, $start_name, $per_page)
+ {
+ if (strpos($start_name, '%d') !== false)
+ {
+ return ($on_page > 1) ? sprintf($base_url, (int) $on_page) : str_replace($start_name, '', $base_url);
+ }
+ else
+ {
+ $url_delim = (strpos($base_url, '?') === false) ? '?' : ((strpos($base_url, '?') === strlen($base_url) - 1) ? '' : '&amp;');
+ return ($on_page > 1) ? $base_url . $url_delim . $start_name . '=' . (($on_page - 1) * $per_page) : $base_url;
+ }
+ }
+
+ /**
+ * Generate template rendered pagination
+ * Allows full control of rendering of pagination with the template
+ *
+ * @param string $base_url is url prepended to all links generated within the function
+ * If you use page numbers inside your controller route, base_url should contains a placeholder (%d)
+ * for the page. Also be sure to specify the pagination path information into the start_name argument
+ * @param string $block_var_name is the name assigned to the pagination data block within the template (example: <!-- BEGIN pagination -->)
+ * @param string $start_name is the name of the parameter containing the first item of the given page (example: start=20)
+ * If you use page numbers inside your controller route, start name should be the string
+ * that should be removed for the first page (example: /page/%d)
+ * @param int $num_items the total number of items, posts, etc., used to determine the number of pages to produce
+ * @param int $per_page the number of items, posts, etc. to display per page, used to determine the number of pages to produce
+ * @param int $start the item which should be considered currently active, used to determine the page we're on
+ * @param bool $reverse_count determines whether we weight display of the list towards the start (false) or end (true) of the list
+ * @param bool $ignore_on_page decides whether we enable an active (unlinked) item, used primarily for embedded lists
+ * @return null
+ */
+ public function generate_template_pagination($base_url, $block_var_name, $start_name, $num_items, $per_page, $start = 1, $reverse_count = false, $ignore_on_page = false)
+ {
+ $total_pages = ceil($num_items / $per_page);
+
+ if ($total_pages == 1 || !$num_items)
+ {
+ return;
+ }
+
+ $on_page = $this->get_on_page($per_page, $start);
+
+ if ($reverse_count)
+ {
+ $start_page = ($total_pages > 5) ? $total_pages - 4 : 1;
+ $end_page = $total_pages;
+ }
+ else
+ {
+ // What we're doing here is calculating what the "start" and "end" pages should be. We
+ // do this by assuming pagination is "centered" around the currently active page with
+ // the three previous and three next page links displayed. Anything more than that and
+ // we display the ellipsis, likewise anything less.
+ //
+ // $start_page is the page at which we start creating the list. When we have five or less
+ // pages we start at page 1 since there will be no ellipsis displayed. Anymore than that
+ // and we calculate the start based on the active page. This is the min/max calculation.
+ // First (max) would we end up starting on a page less than 1? Next (min) would we end
+ // up starting so close to the end that we'd not display our minimum number of pages.
+ //
+ // $end_page is the last page in the list to display. Like $start_page we use a min/max to
+ // determine this number. Again at most five pages? Then just display them all. More than
+ // five and we first (min) determine whether we'd end up listing more pages than exist.
+ // We then (max) ensure we're displaying the minimum number of pages.
+ $start_page = ($total_pages > 5) ? min(max(1, $on_page - 3), $total_pages - 4) : 1;
+ $end_page = ($total_pages > 5) ? max(min($total_pages, $on_page + 3), 5) : $total_pages;
+ }
+
+ $u_previous_page = $u_next_page = '';
+ if ($on_page != 1)
+ {
+ $u_previous_page = $this->generate_page_link($base_url, $on_page - 1, $start_name, $per_page);
+
+ $this->template->assign_block_vars($block_var_name, array(
+ 'PAGE_NUMBER' => '',
+ 'PAGE_URL' => $u_previous_page,
+ 'S_IS_CURRENT' => false,
+ 'S_IS_PREV' => true,
+ 'S_IS_NEXT' => false,
+ 'S_IS_ELLIPSIS' => false,
+ ));
+ }
+
+ // This do...while exists purely to negate the need for start and end assign_block_vars, i.e.
+ // to display the first and last page in the list plus any ellipsis. We use this loop to jump
+ // around a little within the list depending on where we're starting (and ending).
+ $at_page = 1;
+ do
+ {
+ // We decide whether to display the ellipsis during the loop. The ellipsis is always
+ // displayed as either the second or penultimate item in the list. So are we at either
+ // of those points and of course do we even need to display it, i.e. is the list starting
+ // on at least page 3 and ending three pages before the final item.
+ $this->template->assign_block_vars($block_var_name, array(
+ 'PAGE_NUMBER' => $at_page,
+ 'PAGE_URL' => $this->generate_page_link($base_url, $at_page, $start_name, $per_page),
+ 'S_IS_CURRENT' => (!$ignore_on_page && $at_page == $on_page),
+ 'S_IS_NEXT' => false,
+ 'S_IS_PREV' => false,
+ 'S_IS_ELLIPSIS' => ($at_page == 2 && $start_page > 2) || ($at_page == $total_pages - 1 && $end_page < $total_pages - 1),
+ ));
+
+ // We may need to jump around in the list depending on whether we have or need to display
+ // the ellipsis. Are we on page 2 and are we more than one page away from the start
+ // of the list? Yes? Then we jump to the start of the list. Likewise are we at the end of
+ // the list and are there more than two pages left in total? Yes? Then jump to the penultimate
+ // page (so we can display the ellipsis next pass). Else, increment the counter and keep
+ // going
+ if ($at_page == 2 && $at_page < $start_page - 1)
+ {
+ $at_page = $start_page;
+ }
+ else if ($at_page == $end_page && $end_page < $total_pages - 1)
+ {
+ $at_page = $total_pages - 1;
+ }
+ else
+ {
+ $at_page++;
+ }
+ }
+ while ($at_page <= $total_pages);
+
+ if ($on_page != $total_pages)
+ {
+ $u_next_page = $this->generate_page_link($base_url, $on_page + 1, $start_name, $per_page);
+
+ $this->template->assign_block_vars($block_var_name, array(
+ 'PAGE_NUMBER' => '',
+ 'PAGE_URL' => $u_next_page,
+ 'S_IS_CURRENT' => false,
+ 'S_IS_PREV' => false,
+ 'S_IS_NEXT' => true,
+ 'S_IS_ELLIPSIS' => false,
+ ));
+ }
+
+ // If the block_var_name is a nested block, we will use the last (most
+ // inner) block as a prefix for the template variables. If the last block
+ // name is pagination, the prefix is empty. If the rest of the
+ // block_var_name is not empty, we will modify the last row of that block
+ // and add our pagination items.
+ $tpl_block_name = $tpl_prefix = '';
+ if (strrpos($block_var_name, '.') !== false)
+ {
+ $tpl_block_name = substr($block_var_name, 0, strrpos($block_var_name, '.'));
+ $tpl_prefix = strtoupper(substr($block_var_name, strrpos($block_var_name, '.') + 1));
+ }
+ else
+ {
+ $tpl_prefix = strtoupper($block_var_name);
+ }
+ $tpl_prefix = ($tpl_prefix == 'PAGINATION') ? '' : $tpl_prefix . '_';
+
+ $template_array = array(
+ $tpl_prefix . 'BASE_URL' => $base_url,
+ $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 : '',
+ $tpl_prefix . 'TOTAL_PAGES' => $total_pages,
+ $tpl_prefix . 'CURRENT_PAGE' => $on_page,
+ );
+
+ if ($tpl_block_name)
+ {
+ $this->template->alter_block_array($tpl_block_name, $template_array, true, 'change');
+ }
+ else
+ {
+ $this->template->assign_vars($template_array);
+ }
+ }
+
+ /**
+ * Get current page number
+ *
+ * @param int $per_page the number of items, posts, etc. per page
+ * @param int $start the item which should be considered currently active, used to determine the page we're on
+ * @return int Current page number
+ */
+ public function get_on_page($per_page, $start)
+ {
+ return floor($start / $per_page) + 1;
+ }
+
+ /**
+ * Return current page
+ * This function also sets certain specific template variables
+ *
+ * @param string $base_url the base url used to call this page, used by Javascript for popup jump to page
+ * @param int $num_items the total number of items, posts, topics, etc.
+ * @param int $per_page the number of items, posts, etc. per page
+ * @param int $start the item which should be considered currently active, used to determine the page we're on
+ * @return string Descriptive pagination string (e.g. "page 1 of 10")
+ */
+ public function on_page($base_url, $num_items, $per_page, $start)
+ {
+ $on_page = $this->get_on_page($per_page, $start);
+
+ $this->template->assign_vars(array(
+ 'PER_PAGE' => $per_page,
+ 'ON_PAGE' => $on_page,
+ 'BASE_URL' => $base_url,
+ ));
+
+ return $this->user->lang('PAGE_OF', $on_page, max(ceil($num_items / $per_page), 1));
+ }
+
+ /**
+ * Get current page number
+ *
+ * @param int $start the item which should be considered currently active, used to determine the page we're on
+ * @param int $per_page the number of items, posts, etc. per page
+ * @param int $num_items the total number of items, posts, topics, etc.
+ * @return int Current page number
+ */
+ public function validate_start($start, $per_page, $num_items)
+ {
+ if ($start < 0 || $start >= $num_items)
+ {
+ return ($start < 0) ? 0 : floor(($num_items - 1) / $per_page) * $per_page;
+ }
+
+ return $start;
+ }
+
+ /**
+ * Get new start when searching from the end
+ *
+ * If the user is trying to reach late pages, start searching from the end.
+ *
+ * @param int $start the item which should be considered currently active, used to determine the page we're on
+ * @param int $limit the number of items, posts, etc. to display
+ * @param int $num_items the total number of items, posts, topics, etc.
+ * @return int Current page number
+ */
+ public function reverse_start($start, $limit, $num_items)
+ {
+ return max(0, $num_items - $limit - $start);
+ }
+
+ /**
+ * Get new item limit when searching from the end
+ *
+ * If the user is trying to reach late pages, start searching from the end.
+ * In this case the items to display might be lower then the actual per_page setting.
+ *
+ * @param int $start the item which should be considered currently active, used to determine the page we're on
+ * @param int $per_page the number of items, posts, etc. per page
+ * @param int $num_items the total number of items, posts, topics, etc.
+ * @return int Current page number
+ */
+ public function reverse_limit($start, $per_page, $num_items)
+ {
+ if ($start + $per_page > $num_items)
+ {
+ return min($per_page, max(1, $num_items - $start));
+ }
+
+ return $per_page;
+ }
+}
diff --git a/phpBB/phpbb/path_helper.php b/phpBB/phpbb/path_helper.php
index b2ed11a927..8cd8808261 100644
--- a/phpBB/phpbb/path_helper.php
+++ b/phpBB/phpbb/path_helper.php
@@ -10,14 +10,6 @@
namespace phpbb;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* A class with various functions that are related to paths, files and the filesystem
* @package phpBB3
*/
@@ -89,26 +81,24 @@ class path_helper
}
/**
- * Update a path to the correct relative root path
+ * Update a web path to the correct relative root path
*
* This replaces $phpbb_root_path . some_url with
- * get_web_root_path() . some_url OR if $phpbb_root_path
- * is not at the beginning of $path, just prepends the
- * web root path
+ * get_web_root_path() . some_url
*
* @param string $path The path to be updated
* @return string
*/
public function update_web_root_path($path)
{
- $web_root_path = $this->get_web_root_path($this->symfony_request);
-
if (strpos($path, $this->phpbb_root_path) === 0)
{
$path = substr($path, strlen($this->phpbb_root_path));
+
+ return $this->get_web_root_path() . $path;
}
- return $web_root_path . $path;
+ return $path;
}
/**
diff --git a/phpBB/phpbb/permissions.php b/phpBB/phpbb/permissions.php
index d0405471bc..8319e6d123 100644
--- a/phpBB/phpbb/permissions.php
+++ b/phpBB/phpbb/permissions.php
@@ -9,14 +9,6 @@
namespace phpbb;
-/**
-* DO NOT CHANGE
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
class permissions
{
/**
diff --git a/phpBB/phpbb/php/ini.php b/phpBB/phpbb/php/ini.php
index 8767091aba..f0f53807fe 100644
--- a/phpBB/phpbb/php/ini.php
+++ b/phpBB/phpbb/php/ini.php
@@ -10,14 +10,6 @@
namespace phpbb\php;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Wrapper class for ini_get function.
*
* Provides easier handling of the different interpretations of ini values.
diff --git a/phpBB/phpbb/plupload/plupload.php b/phpBB/phpbb/plupload/plupload.php
new file mode 100644
index 0000000000..6bff2b8a7e
--- /dev/null
+++ b/phpBB/phpbb/plupload/plupload.php
@@ -0,0 +1,371 @@
+<?php
+/**
+*
+* @package phpBB3
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+namespace phpbb\plupload;
+
+/**
+* This class handles all server-side plupload functions
+*
+* @package \phpbb\plupload\plupload
+*/
+class plupload
+{
+ /**
+ * @var string
+ */
+ protected $phpbb_root_path;
+
+ /**
+ * @var \phpbb\config\config
+ */
+ protected $config;
+
+ /**
+ * @var \phpbb\request\request_interface
+ */
+ protected $request;
+
+ /**
+ * @var \phpbb\user
+ */
+ protected $user;
+
+ /**
+ * @var \phpbb\php\ini
+ */
+ protected $php_ini;
+
+ /**
+ * @var \phpbb\mimetype\guesser
+ */
+ protected $mimetype_guesser;
+
+ /**
+ * Final destination for uploaded files, i.e. the "files" directory.
+ * @var string
+ */
+ protected $upload_directory;
+
+ /**
+ * Temporary upload directory for plupload uploads.
+ * @var string
+ */
+ protected $temporary_directory;
+
+ /**
+ * Constructor.
+ *
+ * @param string $phpbb_root_path
+ * @param \phpbb\config\config $config
+ * @param \phpbb\request\request_interface $request
+ * @param \phpbb\user $user
+ * @param \phpbb\php\ini $php_ini
+ * @param \phpbb\mimetype\guesser $mimetype_guesser
+ *
+ * @return null
+ */
+ public function __construct($phpbb_root_path, \phpbb\config\config $config, \phpbb\request\request_interface $request, \phpbb\user $user, \phpbb\php\ini $php_ini, \phpbb\mimetype\guesser $mimetype_guesser)
+ {
+ $this->phpbb_root_path = $phpbb_root_path;
+ $this->config = $config;
+ $this->request = $request;
+ $this->user = $user;
+ $this->php_ini = $php_ini;
+ $this->mimetype_guesser = $mimetype_guesser;
+
+ $this->upload_directory = $this->phpbb_root_path . $this->config['upload_path'];
+ $this->temporary_directory = $this->upload_directory . '/plupload';
+ }
+
+ /**
+ * Plupload allows for chunking so we must check for that and assemble
+ * the whole file first before performing any checks on it.
+ *
+ * @param string $form_name The name of the file element in the upload form
+ *
+ * @return array|null null if there are no chunks to piece together
+ * otherwise array containing the path to the
+ * pieced-together file and its size
+ */
+ public function handle_upload($form_name)
+ {
+ $chunks_expected = $this->request->variable('chunks', 0);
+
+ // If chunking is disabled or we are not using plupload, just return
+ // and handle the file as usual
+ if ($chunks_expected < 2)
+ {
+ return;
+ }
+
+ $file_name = $this->request->variable('name', '');
+ $chunk = $this->request->variable('chunk', 0);
+
+ $this->user->add_lang('plupload');
+ $this->prepare_temporary_directory();
+
+ $file_path = $this->temporary_filepath($file_name);
+ $this->integrate_uploaded_file($form_name, $chunk, $file_path);
+
+ // If we are done with all the chunks, strip the .part suffix and then
+ // handle the resulting file as normal, otherwise die and await the
+ // next chunk.
+ if ($chunk == $chunks_expected - 1)
+ {
+ rename("{$file_path}.part", $file_path);
+
+ // Need to modify some of the $_FILES values to reflect the new file
+ return array(
+ 'tmp_name' => $file_path,
+ 'name' => $this->request->variable('real_filename', ''),
+ 'size' => filesize($file_path),
+ 'type' => $this->mimetype_guesser->guess($file_path, $file_name),
+ );
+ }
+ else
+ {
+ $json_response = new \phpbb\json_response();
+ $json_response->send(array(
+ 'jsonrpc' => '2.0',
+ 'id' => 'id',
+ 'result' => null,
+ ));
+ }
+ }
+
+ /**
+ * Fill in the plupload configuration options in the template
+ *
+ * @param \phpbb\cache\service $cache
+ * @param \phpbb\template\template $template
+ * @param string $s_action The URL to submit the POST data to
+ * @param int $forum_id The ID of the forum
+ *
+ * @return null
+ */
+ public function configure(\phpbb\cache\service $cache, \phpbb\template\template $template, $s_action, $forum_id)
+ {
+ $filters = $this->generate_filter_string($cache, $forum_id);
+ $chunk_size = $this->get_chunk_size();
+ $resize = $this->generate_resize_string();
+
+ $template->assign_vars(array(
+ 'S_RESIZE' => $resize,
+ 'S_PLUPLOAD' => true,
+ 'FILTERS' => $filters,
+ 'CHUNK_SIZE' => $chunk_size,
+ 'S_PLUPLOAD_URL' => htmlspecialchars_decode($s_action),
+ ));
+
+ $this->user->add_lang('plupload');
+ }
+
+ /**
+ * Checks whether the page request was sent by plupload or not
+ *
+ * @return bool
+ */
+ public function is_active()
+ {
+ return $this->request->header('X-PHPBB-USING-PLUPLOAD', false);
+ }
+
+ /**
+ * Returns whether the current HTTP request is a multipart request.
+ *
+ * @return bool
+ */
+ public function is_multipart()
+ {
+ $content_type = $this->request->server('CONTENT_TYPE');
+
+ return strpos($content_type, 'multipart') === 0;
+ }
+
+ /**
+ * Sends an error message back to the client via JSON response
+ *
+ * @param int $code The error code
+ * @param string $msg The translation string of the message to be sent
+ *
+ * @return null
+ */
+ public function emit_error($code, $msg)
+ {
+ $json_response = new \phpbb\json_response();
+ $json_response->send(array(
+ 'jsonrpc' => '2.0',
+ 'id' => 'id',
+ 'error' => array(
+ 'code' => $code,
+ 'message' => $this->user->lang($msg),
+ ),
+ ));
+ }
+
+ /**
+ * Looks at the list of allowed extensions and generates a string
+ * appropriate for use in configuring plupload with
+ *
+ * @param \phpbb\cache\service $cache
+ * @param string $forum_id The ID of the forum
+ *
+ * @return string
+ */
+ public function generate_filter_string(\phpbb\cache\service $cache, $forum_id)
+ {
+ $attach_extensions = $cache->obtain_attach_extensions($forum_id);
+ unset($attach_extensions['_allowed_']);
+ $groups = array();
+
+ // Re-arrange the extension array to $groups[$group_name][]
+ foreach ($attach_extensions as $extension => $extension_info)
+ {
+ if (!isset($groups[$extension_info['group_name']]))
+ {
+ $groups[$extension_info['group_name']] = array();
+ }
+
+ $groups[$extension_info['group_name']][] = $extension;
+ }
+
+ $filters = array();
+ foreach ($groups as $group => $extensions)
+ {
+ $filters[] = sprintf(
+ "{title: '%s', extensions: '%s'}",
+ addslashes(ucfirst(strtolower($group))),
+ addslashes(implode(',', $extensions))
+ );
+ }
+
+ return implode(',', $filters);
+ }
+
+ /**
+ * Generates a string that is used to tell plupload to automatically resize
+ * files before uploading them.
+ *
+ * @return string
+ */
+ public function generate_resize_string()
+ {
+ $resize = '';
+ if ($this->config['img_max_height'] > 0 && $this->config['img_max_width'] > 0)
+ {
+ $resize = sprintf(
+ 'resize: {width: %d, height: %d, quality: 100},',
+ (int) $this->config['img_max_height'],
+ (int) $this->config['img_max_width']
+ );
+ }
+
+ return $resize;
+ }
+
+ /**
+ * Checks various php.ini values and the maximum file size to determine
+ * the maximum size chunks a file can be split up into for upload
+ *
+ * @return int
+ */
+ public function get_chunk_size()
+ {
+ $max = min(
+ $this->php_ini->get_bytes('upload_max_filesize'),
+ $this->php_ini->get_bytes('post_max_size'),
+ max(1, $this->php_ini->get_bytes('memory_limit')),
+ $this->config['max_filesize']
+ );
+
+ // Use half of the maximum possible to leave plenty of room for other
+ // POST data.
+ return floor($max / 2);
+ }
+
+ protected function temporary_filepath($file_name)
+ {
+ // Must preserve the extension for plupload to work.
+ return sprintf(
+ '%s/%s_%s%s',
+ $this->temporary_directory,
+ $this->config['plupload_salt'],
+ md5($file_name),
+ \filespec::get_extension($file_name)
+ );
+ }
+
+ /**
+ * Checks whether the chunk we are about to deal with was actually uploaded
+ * by PHP and actually exists, if not, it generates an error
+ *
+ * @param string $form_name The name of the file in the form data
+ *
+ * @return null
+ */
+ protected function integrate_uploaded_file($form_name, $chunk, $file_path)
+ {
+ $is_multipart = $this->is_multipart();
+ $upload = $this->request->file($form_name);
+ if ($is_multipart && (!isset($upload['tmp_name']) || !is_uploaded_file($upload['tmp_name'])))
+ {
+ $this->emit_error(103, 'PLUPLOAD_ERR_MOVE_UPLOADED');
+ }
+
+ $tmp_file = $this->temporary_filepath($upload['tmp_name']);
+
+ if (!move_uploaded_file($upload['tmp_name'], $tmp_file))
+ {
+ $this->emit_error(103, 'PLUPLOAD_ERR_MOVE_UPLOADED');
+ }
+
+ $out = fopen("{$file_path}.part", $chunk == 0 ? 'wb' : 'ab');
+ if (!$out)
+ {
+ $this->emit_error(102, 'PLUPLOAD_ERR_OUTPUT');
+ }
+
+ $in = fopen(($is_multipart) ? $tmp_file : 'php://input', 'rb');
+ if (!$in)
+ {
+ $this->emit_error(101, 'PLUPLOAD_ERR_INPUT');
+ }
+
+ while ($buf = fread($in, 4096))
+ {
+ fwrite($out, $buf);
+ }
+
+ fclose($in);
+ fclose($out);
+
+ if ($is_multipart)
+ {
+ unlink($tmp_file);
+ }
+ }
+
+ /**
+ * Creates the temporary directory if it does not already exist.
+ *
+ * @return null
+ */
+ protected function prepare_temporary_directory()
+ {
+ if (!file_exists($this->temporary_directory))
+ {
+ mkdir($this->temporary_directory);
+
+ copy(
+ $this->upload_directory . '/index.htm',
+ $this->temporary_directory . '/index.htm'
+ );
+ }
+ }
+}
diff --git a/phpBB/phpbb/request/deactivated_super_global.php b/phpBB/phpbb/request/deactivated_super_global.php
index 8f39960477..b03624593e 100644
--- a/phpBB/phpbb/request/deactivated_super_global.php
+++ b/phpBB/phpbb/request/deactivated_super_global.php
@@ -10,14 +10,6 @@
namespace phpbb\request;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Replacement for a superglobal (like $_GET or $_POST) which calls
* trigger_error on all operations but isset, overloads the [] operator with SPL.
*
diff --git a/phpBB/phpbb/request/request.php b/phpBB/phpbb/request/request.php
index 1c388b3c73..3171a6edb7 100644
--- a/phpBB/phpbb/request/request.php
+++ b/phpBB/phpbb/request/request.php
@@ -10,14 +10,6 @@
namespace phpbb\request;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* All application input is accessed through this class.
*
* It provides a method to disable access to input data through super globals.
@@ -225,7 +217,7 @@ class request implements \phpbb\request\request_interface
* @return mixed The value of $_REQUEST[$var_name] run through {@link set_var set_var} to ensure that the type is the
* the same as that of $default. If the variable is not set $default is returned.
*/
- public function untrimmed_variable($var_name, $default, $multibyte, $super_global = \phpbb\request\request_interface::REQUEST)
+ public function untrimmed_variable($var_name, $default, $multibyte = false, $super_global = \phpbb\request\request_interface::REQUEST)
{
return $this->_variable($var_name, $default, $multibyte, $super_global, false);
}
diff --git a/phpBB/phpbb/request/request_interface.php b/phpBB/phpbb/request/request_interface.php
index cd949147f7..1f9978b276 100644
--- a/phpBB/phpbb/request/request_interface.php
+++ b/phpBB/phpbb/request/request_interface.php
@@ -10,14 +10,6 @@
namespace phpbb\request;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* An interface through which all application input can be accessed.
*
* @package \phpbb\request\request
diff --git a/phpBB/phpbb/request/type_cast_helper.php b/phpBB/phpbb/request/type_cast_helper.php
index 262aff73c1..e9b55663af 100644
--- a/phpBB/phpbb/request/type_cast_helper.php
+++ b/phpBB/phpbb/request/type_cast_helper.php
@@ -10,14 +10,6 @@
namespace phpbb\request;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* A helper class that provides convenience methods for type casting.
*
* @package \phpbb\request\request
diff --git a/phpBB/phpbb/request/type_cast_helper_interface.php b/phpBB/phpbb/request/type_cast_helper_interface.php
index e8195c352e..f12795eef9 100644
--- a/phpBB/phpbb/request/type_cast_helper_interface.php
+++ b/phpBB/phpbb/request/type_cast_helper_interface.php
@@ -10,14 +10,6 @@
namespace phpbb\request;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* An interface for type cast operations.
*
* @package \phpbb\request\request
diff --git a/phpBB/phpbb/search/base.php b/phpBB/phpbb/search/base.php
index f2f982c31b..9ecf3751d0 100644
--- a/phpBB/phpbb/search/base.php
+++ b/phpBB/phpbb/search/base.php
@@ -12,14 +12,6 @@ namespace phpbb\search;
/**
* @ignore
*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
-* @ignore
-*/
define('SEARCH_RESULT_NOT_IN_CACHE', 0);
define('SEARCH_RESULT_IN_CACHE', 1);
define('SEARCH_RESULT_INCOMPLETE', 2);
diff --git a/phpBB/phpbb/search/fulltext_mysql.php b/phpBB/phpbb/search/fulltext_mysql.php
index 50d2d2577f..cdd2da222f 100644
--- a/phpBB/phpbb/search/fulltext_mysql.php
+++ b/phpBB/phpbb/search/fulltext_mysql.php
@@ -10,14 +10,6 @@
namespace phpbb\search;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* fulltext_mysql
* Fulltext search for MySQL
* @package search
@@ -781,7 +773,7 @@ class fulltext_mysql extends \phpbb\search\base
$alter[] = 'ADD FULLTEXT (post_subject)';
}
- if (!isset($this->stats['post_text']))
+ if (!isset($this->stats['post_content']))
{
if ($this->db->sql_layer == 'mysqli' || version_compare($this->db->sql_server_info(true), '4.1.3', '>='))
{
@@ -791,12 +783,8 @@ class fulltext_mysql extends \phpbb\search\base
{
$alter[] = 'MODIFY post_text mediumtext NOT NULL';
}
- $alter[] = 'ADD FULLTEXT (post_text)';
- }
- if (!isset($this->stats['post_content']))
- {
- $alter[] = 'ADD FULLTEXT post_content (post_subject, post_text)';
+ $alter[] = 'ADD FULLTEXT post_content (post_text, post_subject)';
}
if (sizeof($alter))
@@ -834,11 +822,6 @@ class fulltext_mysql extends \phpbb\search\base
$alter[] = 'DROP INDEX post_subject';
}
- if (isset($this->stats['post_text']))
- {
- $alter[] = 'DROP INDEX post_text';
- }
-
if (isset($this->stats['post_content']))
{
$alter[] = 'DROP INDEX post_content';
@@ -864,7 +847,7 @@ class fulltext_mysql extends \phpbb\search\base
$this->get_stats();
}
- return (isset($this->stats['post_text']) && isset($this->stats['post_subject']) && isset($this->stats['post_content'])) ? true : false;
+ return isset($this->stats['post_subject']) && isset($this->stats['post_content']);
}
/**
@@ -904,11 +887,7 @@ class fulltext_mysql extends \phpbb\search\base
if ($index_type == 'FULLTEXT')
{
- if ($row['Key_name'] == 'post_text')
- {
- $this->stats['post_text'] = $row;
- }
- else if ($row['Key_name'] == 'post_subject')
+ if ($row['Key_name'] == 'post_subject')
{
$this->stats['post_subject'] = $row;
}
diff --git a/phpBB/phpbb/search/fulltext_native.php b/phpBB/phpbb/search/fulltext_native.php
index 33326f2882..1b314a24d3 100644
--- a/phpBB/phpbb/search/fulltext_native.php
+++ b/phpBB/phpbb/search/fulltext_native.php
@@ -10,14 +10,6 @@
namespace phpbb\search;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* fulltext_native
* phpBB's own db driven fulltext search, version 2
* @package search
@@ -850,7 +842,6 @@ class fulltext_native extends \phpbb\search\base
}
$this->db->sql_freeresult($result);
-
// if we use mysql and the total result count is not cached yet, retrieve it from the db
if (!$total_results && $is_mysql)
{
@@ -1189,8 +1180,8 @@ class fulltext_native extends \phpbb\search\base
* we know that it will also be lower than CJK ranges
*/
if ((strncmp($word, UTF8_HANGUL_FIRST, 3) < 0 || strncmp($word, UTF8_HANGUL_LAST, 3) > 0)
- && (strncmp($word, UTF8_CJK_FIRST, 3) < 0 || strncmp($word, UTF8_CJK_LAST, 3) > 0)
- && (strncmp($word, UTF8_CJK_B_FIRST, 4) < 0 || strncmp($word, UTF8_CJK_B_LAST, 4) > 0))
+ && (strncmp($word, UTF8_CJK_FIRST, 3) < 0 || strncmp($word, UTF8_CJK_LAST, 3) > 0)
+ && (strncmp($word, UTF8_CJK_B_FIRST, 4) < 0 || strncmp($word, UTF8_CJK_B_LAST, 4) > 0))
{
$word = strtok(' ');
continue;
@@ -1684,8 +1675,8 @@ class fulltext_native extends \phpbb\search\base
$pos += $utf_len;
if (($utf_char >= UTF8_HANGUL_FIRST && $utf_char <= UTF8_HANGUL_LAST)
- || ($utf_char >= UTF8_CJK_FIRST && $utf_char <= UTF8_CJK_LAST)
- || ($utf_char >= UTF8_CJK_B_FIRST && $utf_char <= UTF8_CJK_B_LAST))
+ || ($utf_char >= UTF8_CJK_FIRST && $utf_char <= UTF8_CJK_LAST)
+ || ($utf_char >= UTF8_CJK_B_FIRST && $utf_char <= UTF8_CJK_B_LAST))
{
/**
* All characters within these ranges are valid
diff --git a/phpBB/phpbb/search/fulltext_postgres.php b/phpBB/phpbb/search/fulltext_postgres.php
index 756034103e..063bf52a19 100644
--- a/phpBB/phpbb/search/fulltext_postgres.php
+++ b/phpBB/phpbb/search/fulltext_postgres.php
@@ -10,14 +10,6 @@
namespace phpbb\search;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* fulltext_postgres
* Fulltext search for PostgreSQL
* @package search
diff --git a/phpBB/phpbb/search/fulltext_sphinx.php b/phpBB/phpbb/search/fulltext_sphinx.php
index cb76d58f49..acbfad9474 100644
--- a/phpBB/phpbb/search/fulltext_sphinx.php
+++ b/phpBB/phpbb/search/fulltext_sphinx.php
@@ -9,16 +9,6 @@
namespace phpbb\search;
-/**
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
-* @ignore
-*/
define('SPHINX_MAX_MATCHES', 20000);
define('SPHINX_CONNECT_RETRIES', 3);
define('SPHINX_CONNECT_WAIT_TIME', 300);
diff --git a/phpBB/phpbb/search/sphinx/config.php b/phpBB/phpbb/search/sphinx/config.php
index 262d6008cc..cb8e4524df 100644
--- a/phpBB/phpbb/search/sphinx/config.php
+++ b/phpBB/phpbb/search/sphinx/config.php
@@ -10,14 +10,6 @@
namespace phpbb\search\sphinx;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* \phpbb\search\sphinx\config
* An object representing the sphinx configuration
* Can read it from file and write it back out after modification
diff --git a/phpBB/phpbb/search/sphinx/config_comment.php b/phpBB/phpbb/search/sphinx/config_comment.php
index 77a943377d..20b1c19af1 100644
--- a/phpBB/phpbb/search/sphinx/config_comment.php
+++ b/phpBB/phpbb/search/sphinx/config_comment.php
@@ -10,14 +10,6 @@
namespace phpbb\search\sphinx;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* \phpbb\search\sphinx\config_comment
* Represents a comment inside the sphinx configuration
*/
diff --git a/phpBB/phpbb/search/sphinx/config_section.php b/phpBB/phpbb/search/sphinx/config_section.php
index 730abf011e..8f9253ec56 100644
--- a/phpBB/phpbb/search/sphinx/config_section.php
+++ b/phpBB/phpbb/search/sphinx/config_section.php
@@ -10,14 +10,6 @@
namespace phpbb\search\sphinx;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* \phpbb\search\sphinx\config_section
* Represents a single section inside the sphinx configuration
*/
diff --git a/phpBB/phpbb/search/sphinx/config_variable.php b/phpBB/phpbb/search/sphinx/config_variable.php
index c8f40bfb5f..c0f6d28dcc 100644
--- a/phpBB/phpbb/search/sphinx/config_variable.php
+++ b/phpBB/phpbb/search/sphinx/config_variable.php
@@ -10,14 +10,6 @@
namespace phpbb\search\sphinx;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* \phpbb\search\sphinx\config_variable
* Represents a single variable inside the sphinx configuration
*/
diff --git a/phpBB/phpbb/session.php b/phpBB/phpbb/session.php
index 2baf61043d..f530d30f1f 100644
--- a/phpBB/phpbb/session.php
+++ b/phpBB/phpbb/session.php
@@ -10,14 +10,6 @@
namespace phpbb;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Session class
* @package phpBB3
*/
@@ -42,13 +34,13 @@ class session
*/
static function extract_current_page($root_path)
{
- global $request;
+ global $request, $symfony_request, $phpbb_filesystem;
$page_array = array();
// First of all, get the request uri...
- $script_name = htmlspecialchars_decode($request->server('PHP_SELF'));
- $args = explode('&', htmlspecialchars_decode($request->server('QUERY_STRING')));
+ $script_name = $symfony_request->getScriptName();
+ $args = explode('&', $symfony_request->getQueryString());
// If we are unable to get the script name we use REQUEST_URI as a failover and note it within the page array for easier support...
if (!$script_name)
@@ -89,6 +81,12 @@ class session
$page_name = (substr($script_name, -1, 1) == '/') ? '' : basename($script_name);
$page_name = urlencode(htmlspecialchars($page_name));
+ $symfony_request_path = $phpbb_filesystem->clean_path($symfony_request->getPathInfo());
+ if ($symfony_request_path !== '/')
+ {
+ $page_name .= $symfony_request_path;
+ }
+
// current directory within the phpBB root (for example: adm)
$root_dirs = explode('/', str_replace('\\', '/', phpbb_realpath($root_path)));
$page_dirs = explode('/', str_replace('\\', '/', phpbb_realpath('./')));
@@ -105,10 +103,14 @@ class session
}
// Current page from phpBB root (for example: adm/index.php?i=10&b=2)
- $page = (($page_dir) ? $page_dir . '/' : '') . $page_name . (($query_string) ? "?$query_string" : '');
+ $page = (($page_dir) ? $page_dir . '/' : '') . $page_name;
+ if ($query_string)
+ {
+ $page .= '?' . $query_string;
+ }
// The script path from the webroot to the current directory (for example: /phpBB3/adm/) : always prefixed with / and ends in /
- $script_path = trim(str_replace('\\', '/', dirname($script_name)));
+ $script_path = $symfony_request->getBasePath();
// The script path from the webroot to the phpBB root (for example: /phpBB3/)
$script_dirs = explode('/', $script_path);
@@ -1225,7 +1227,6 @@ class session
$this->session_create(ANONYMOUS);
}
-
// Determine which message to output
$till_date = ($ban_row['ban_end']) ? $this->format_date($ban_row['ban_end']) : '';
$message = ($ban_row['ban_end']) ? 'BOARD_BAN_TIME' : 'BOARD_BAN_PERM';
diff --git a/phpBB/phpbb/symfony_request.php b/phpBB/phpbb/symfony_request.php
index 92784c213b..ebe862a565 100644
--- a/phpBB/phpbb/symfony_request.php
+++ b/phpBB/phpbb/symfony_request.php
@@ -11,14 +11,6 @@ namespace phpbb;
use Symfony\Component\HttpFoundation\Request;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
class symfony_request extends Request
{
/**
diff --git a/phpBB/phpbb/template/asset.php b/phpBB/phpbb/template/asset.php
index 27564bf347..24e0d6698d 100644
--- a/phpBB/phpbb/template/asset.php
+++ b/phpBB/phpbb/template/asset.php
@@ -9,14 +9,6 @@
namespace phpbb\template;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
class asset
{
protected $components = array();
diff --git a/phpBB/phpbb/template/base.php b/phpBB/phpbb/template/base.php
index 86868707f0..6044effa1f 100644
--- a/phpBB/phpbb/template/base.php
+++ b/phpBB/phpbb/template/base.php
@@ -9,14 +9,6 @@
namespace phpbb\template;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
abstract class base implements template
{
/**
diff --git a/phpBB/phpbb/template/context.php b/phpBB/phpbb/template/context.php
index 24234c1e4a..65c7d094a0 100644
--- a/phpBB/phpbb/template/context.php
+++ b/phpBB/phpbb/template/context.php
@@ -10,14 +10,6 @@
namespace phpbb\template;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Stores variables assigned to template.
*
* @package phpBB3
@@ -285,7 +277,7 @@ class context
// Search array to get correct position
list($search_key, $search_value) = @each($key);
- $key = NULL;
+ $key = null;
foreach ($block as $i => $val_ary)
{
if ($val_ary[$search_key] === $search_value)
@@ -296,7 +288,7 @@ class context
}
// key/value pair not found
- if ($key === NULL)
+ if ($key === null)
{
return false;
}
diff --git a/phpBB/phpbb/template/template.php b/phpBB/phpbb/template/template.php
index cf38bba522..d95b0a822c 100644
--- a/phpBB/phpbb/template/template.php
+++ b/phpBB/phpbb/template/template.php
@@ -9,14 +9,6 @@
namespace phpbb\template;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
interface template
{
diff --git a/phpBB/phpbb/template/twig/definition.php b/phpBB/phpbb/template/twig/definition.php
index 2490a43f81..945c46675e 100644
--- a/phpBB/phpbb/template/twig/definition.php
+++ b/phpBB/phpbb/template/twig/definition.php
@@ -10,14 +10,6 @@
namespace phpbb\template\twig;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* This class holds all DEFINE variables from the current page load
*/
class definition
diff --git a/phpBB/phpbb/template/twig/environment.php b/phpBB/phpbb/template/twig/environment.php
index a6c0e476f0..24bd55b3c5 100644
--- a/phpBB/phpbb/template/twig/environment.php
+++ b/phpBB/phpbb/template/twig/environment.php
@@ -9,14 +9,6 @@
namespace phpbb\template\twig;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
class environment extends \Twig_Environment
{
/** @var array */
diff --git a/phpBB/phpbb/template/twig/extension.php b/phpBB/phpbb/template/twig/extension.php
index 1ddb97369e..6847dbd9f8 100644
--- a/phpBB/phpbb/template/twig/extension.php
+++ b/phpBB/phpbb/template/twig/extension.php
@@ -9,14 +9,6 @@
namespace phpbb\template\twig;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
class extension extends \Twig_Extension
{
/** @var \phpbb\template\context */
@@ -48,11 +40,11 @@ class extension extends \Twig_Extension
return 'phpbb';
}
- /**
- * Returns the token parser instance to add to the existing list.
- *
- * @return array An array of Twig_TokenParser instances
- */
+ /**
+ * Returns the token parser instance to add to the existing list.
+ *
+ * @return array An array of Twig_TokenParser instances
+ */
public function getTokenParsers()
{
return array(
@@ -66,36 +58,36 @@ class extension extends \Twig_Extension
);
}
- /**
- * Returns a list of filters to add to the existing list.
- *
- * @return array An array of filters
- */
- public function getFilters()
- {
+ /**
+ * Returns a list of filters to add to the existing list.
+ *
+ * @return array An array of filters
+ */
+ public function getFilters()
+ {
return array(
new \Twig_SimpleFilter('subset', array($this, 'loop_subset'), array('needs_environment' => true)),
new \Twig_SimpleFilter('addslashes', 'addslashes'),
);
- }
-
- /**
- * Returns a list of global functions to add to the existing list.
- *
- * @return array An array of global functions
- */
- public function getFunctions()
- {
+ }
+
+ /**
+ * Returns a list of global functions to add to the existing list.
+ *
+ * @return array An array of global functions
+ */
+ public function getFunctions()
+ {
return array(
new \Twig_SimpleFunction('lang', array($this, 'lang')),
);
}
- /**
- * Returns a list of operators to add to the existing list.
- *
- * @return array An array of operators
- */
+ /**
+ * Returns a list of operators to add to the existing list.
+ *
+ * @return array An array of operators
+ */
public function getOperators()
{
return array(
@@ -126,19 +118,19 @@ class extension extends \Twig_Extension
'mod' => array('precedence' => 60, 'class' => 'Twig_Node_Expression_Binary_Mod', 'associativity' => \Twig_ExpressionParser::OPERATOR_LEFT),
),
);
- }
+ }
/**
- * Grabs a subset of a loop
- *
- * @param Twig_Environment $env A Twig_Environment instance
- * @param mixed $item A variable
- * @param integer $start Start of the subset
- * @param integer $end End of the subset
- * @param Boolean $preserveKeys Whether to preserve key or not (when the input is an array)
- *
- * @return mixed The sliced variable
- */
+ * Grabs a subset of a loop
+ *
+ * @param Twig_Environment $env A Twig_Environment instance
+ * @param mixed $item A variable
+ * @param integer $start Start of the subset
+ * @param integer $end End of the subset
+ * @param Boolean $preserveKeys Whether to preserve key or not (when the input is an array)
+ *
+ * @return mixed The sliced variable
+ */
function loop_subset(\Twig_Environment $env, $item, $start, $end = null, $preserveKeys = false)
{
// We do almost the same thing as Twig's slice (array_slice), except when $end is positive
diff --git a/phpBB/phpbb/template/twig/lexer.php b/phpBB/phpbb/template/twig/lexer.php
index d832fbf84e..f4efc58540 100644
--- a/phpBB/phpbb/template/twig/lexer.php
+++ b/phpBB/phpbb/template/twig/lexer.php
@@ -9,14 +9,6 @@
namespace phpbb\template\twig;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
class lexer extends \Twig_Lexer
{
public function tokenize($code, $filename = null)
@@ -76,6 +68,12 @@ class lexer extends \Twig_Lexer
);
// Fix tokens that may have inline variables (e.g. <!-- DEFINE $TEST = '{FOO}')
+ $code = $this->strip_surrounding_quotes(array(
+ 'INCLUDE',
+ 'INCLUDEPHP',
+ 'INCLUDEJS',
+ 'INCLUDECSS',
+ ), $code);
$code = $this->fix_inline_variable_tokens(array(
'DEFINE \$[a-zA-Z0-9_]+ =',
'INCLUDE',
@@ -83,6 +81,12 @@ class lexer extends \Twig_Lexer
'INCLUDEJS',
'INCLUDECSS',
), $code);
+ $code = $this->add_surrounding_quotes(array(
+ 'INCLUDE',
+ 'INCLUDEPHP',
+ 'INCLUDEJS',
+ 'INCLUDECSS',
+ ), $code);
// Fix our BEGIN statements
$code = $this->fix_begin_tokens($code);
@@ -116,9 +120,29 @@ class lexer extends \Twig_Lexer
}
/**
+ * Strip surrounding quotes
+ *
+ * First step to fix tokens that may have inline variables
+ * E.g. <!-- INCLUDE '{TEST}.html' to <!-- INCLUDE {TEST}.html
+ *
+ * @param array $tokens array of tokens to search for (imploded to a regular expression)
+ * @param string $code
+ * @return string
+ */
+ protected function strip_surrounding_quotes($tokens, $code)
+ {
+ // Remove matching quotes at the beginning/end if a statement;
+ // E.g. 'asdf'"' -> asdf'"
+ // E.g. "asdf'"" -> asdf'"
+ // E.g. 'asdf'" -> 'asdf'"
+ return preg_replace('#<!-- (' . implode('|', $tokens) . ') (([\'"])?(.*?)\1) -->#', '<!-- $1 $2 -->', $code);
+ }
+
+ /**
* Fix tokens that may have inline variables
*
- * E.g. <!-- INCLUDE {TEST}.html
+ * Second step to fix tokens that may have inline variables
+ * E.g. <!-- INCLUDE '{TEST}.html' to <!-- INCLUDE ' ~ {TEST} ~ '.html
*
* @param array $tokens array of tokens to search for (imploded to a regular expression)
* @param string $code
@@ -128,23 +152,31 @@ class lexer extends \Twig_Lexer
{
$callback = function($matches)
{
- // Remove matching quotes at the beginning/end if a statement;
- // E.g. 'asdf'"' -> asdf'"
- // E.g. "asdf'"" -> asdf'"
- // E.g. 'asdf'" -> 'asdf'"
- $matches[2] = preg_replace('#^([\'"])?(.*?)\1$#', '$2', $matches[2]);
-
// Replace template variables with start/end to parse variables (' ~ TEST ~ '.html)
$matches[2] = preg_replace('#{([a-zA-Z0-9_\.$]+)}#', "'~ \$1 ~'", $matches[2]);
- // Surround the matches in single quotes ('' ~ TEST ~ '.html')
- return "<!-- {$matches[1]} '{$matches[2]}' -->";
+ return "<!-- {$matches[1]} {$matches[2]} -->";
};
return preg_replace_callback('#<!-- (' . implode('|', $tokens) . ') (.+?) -->#', $callback, $code);
}
/**
+ * Add surrounding quotes
+ *
+ * Last step to fix tokens that may have inline variables
+ * E.g. <!-- INCLUDE '{TEST}.html' to <!-- INCLUDE '' ~ {TEST} ~ '.html'
+ *
+ * @param array $tokens array of tokens to search for (imploded to a regular expression)
+ * @param string $code
+ * @return string
+ */
+ protected function add_surrounding_quotes($tokens, $code)
+ {
+ return preg_replace('#<!-- (' . implode('|', $tokens) . ') (.+?) -->#', '<!-- $1 \'$2\' -->', $code);
+ }
+
+ /**
* Fix begin tokens (convert our BEGIN to Twig for)
*
* Not meant to be used outside of this context, public because the anonymous function calls this
diff --git a/phpBB/phpbb/template/twig/loader.php b/phpBB/phpbb/template/twig/loader.php
index 910061dc0f..e01e9de467 100644
--- a/phpBB/phpbb/template/twig/loader.php
+++ b/phpBB/phpbb/template/twig/loader.php
@@ -10,14 +10,6 @@
namespace phpbb\template\twig;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Twig Template loader
* @package phpBB3
*/
diff --git a/phpBB/phpbb/template/twig/node/definenode.php b/phpBB/phpbb/template/twig/node/definenode.php
index ec084d0f7d..6a9969f8c6 100644
--- a/phpBB/phpbb/template/twig/node/definenode.php
+++ b/phpBB/phpbb/template/twig/node/definenode.php
@@ -9,14 +9,6 @@
namespace phpbb\template\twig\node;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
class definenode extends \Twig_Node
{
diff --git a/phpBB/phpbb/template/twig/node/event.php b/phpBB/phpbb/template/twig/node/event.php
index 202db775ee..7a1181a866 100644
--- a/phpBB/phpbb/template/twig/node/event.php
+++ b/phpBB/phpbb/template/twig/node/event.php
@@ -9,14 +9,6 @@
namespace phpbb\template\twig\node;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
class event extends \Twig_Node
{
@@ -57,10 +49,10 @@ class event extends \Twig_Node
// templates on page load rather than at compile. This is
// slower, but makes developing extensions easier (no need to
// purge the cache when a new event template file is added)
- $compiler
- ->write("if (\$this->env->getLoader()->exists('@{$ext_namespace}/{$location}.html')) {\n")
- ->indent()
- ;
+ $compiler
+ ->write("if (\$this->env->getLoader()->exists('@{$ext_namespace}/{$location}.html')) {\n")
+ ->indent()
+ ;
}
if (defined('DEBUG') || $this->environment->getLoader()->exists('@' . $ext_namespace . '/' . $location . '.html'))
@@ -79,7 +71,7 @@ class event extends \Twig_Node
{
$compiler
->outdent()
- ->write("}\n\n")
+ ->write("}\n\n")
;
}
}
diff --git a/phpBB/phpbb/template/twig/node/expression/binary/equalequal.php b/phpBB/phpbb/template/twig/node/expression/binary/equalequal.php
index 48d8b814b8..f3bbfa6691 100644
--- a/phpBB/phpbb/template/twig/node/expression/binary/equalequal.php
+++ b/phpBB/phpbb/template/twig/node/expression/binary/equalequal.php
@@ -9,14 +9,6 @@
namespace phpbb\template\twig\node\expression\binary;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
class equalequal extends \Twig_Node_Expression_Binary
{
diff --git a/phpBB/phpbb/template/twig/node/expression/binary/notequalequal.php b/phpBB/phpbb/template/twig/node/expression/binary/notequalequal.php
index 87585dfb4c..c9c2687e08 100644
--- a/phpBB/phpbb/template/twig/node/expression/binary/notequalequal.php
+++ b/phpBB/phpbb/template/twig/node/expression/binary/notequalequal.php
@@ -9,14 +9,6 @@
namespace phpbb\template\twig\node\expression\binary;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
class notequalequal extends \Twig_Node_Expression_Binary
{
diff --git a/phpBB/phpbb/template/twig/node/includenode.php b/phpBB/phpbb/template/twig/node/includenode.php
index 77fe7f3acb..d9b45d6407 100644
--- a/phpBB/phpbb/template/twig/node/includenode.php
+++ b/phpBB/phpbb/template/twig/node/includenode.php
@@ -9,14 +9,6 @@
namespace phpbb\template\twig\node;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
class includenode extends \Twig_Node_Include
{
diff --git a/phpBB/phpbb/template/twig/node/includephp.php b/phpBB/phpbb/template/twig/node/includephp.php
index 4024cf0cc8..3f4621c0a9 100644
--- a/phpBB/phpbb/template/twig/node/includephp.php
+++ b/phpBB/phpbb/template/twig/node/includephp.php
@@ -9,21 +9,13 @@
namespace phpbb\template\twig\node;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
class includephp extends \Twig_Node
{
/** @var Twig_Environment */
protected $environment;
- public function __construct(\Twig_Node_Expression $expr, \phpbb\template\twig\environment $environment, $ignoreMissing = false, $lineno, $tag = null)
+ public function __construct(\Twig_Node_Expression $expr, \phpbb\template\twig\environment $environment, $lineno, $ignoreMissing = false, $tag = null)
{
$this->environment = $environment;
diff --git a/phpBB/phpbb/template/twig/node/php.php b/phpBB/phpbb/template/twig/node/php.php
index b37759303d..2b18551266 100644
--- a/phpBB/phpbb/template/twig/node/php.php
+++ b/phpBB/phpbb/template/twig/node/php.php
@@ -9,14 +9,6 @@
namespace phpbb\template\twig\node;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
class php extends \Twig_Node
{
diff --git a/phpBB/phpbb/template/twig/tokenparser/defineparser.php b/phpBB/phpbb/template/twig/tokenparser/defineparser.php
index 688afec191..8484f2e81a 100644
--- a/phpBB/phpbb/template/twig/tokenparser/defineparser.php
+++ b/phpBB/phpbb/template/twig/tokenparser/defineparser.php
@@ -9,14 +9,6 @@
namespace phpbb\template\twig\tokenparser;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
class defineparser extends \Twig_TokenParser
{
@@ -38,6 +30,13 @@ class defineparser extends \Twig_TokenParser
$stream->next();
$value = $this->parser->getExpressionParser()->parseExpression();
+ if ($value instanceof \Twig_Node_Expression_Name)
+ {
+ // This would happen if someone improperly formed their DEFINE syntax
+ // e.g. <!-- DEFINE $VAR = foo -->
+ throw new \Twig_Error_Syntax('Invalid DEFINE', $token->getLine(), $this->parser->getFilename());
+ }
+
$stream->expect(\Twig_Token::BLOCK_END_TYPE);
} else {
$capture = true;
diff --git a/phpBB/phpbb/template/twig/tokenparser/event.php b/phpBB/phpbb/template/twig/tokenparser/event.php
index 7cf4000909..8864e879f8 100644
--- a/phpBB/phpbb/template/twig/tokenparser/event.php
+++ b/phpBB/phpbb/template/twig/tokenparser/event.php
@@ -9,14 +9,6 @@
namespace phpbb\template\twig\tokenparser;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
class event extends \Twig_TokenParser
{
diff --git a/phpBB/phpbb/template/twig/tokenparser/includejs.php b/phpBB/phpbb/template/twig/tokenparser/includejs.php
index 30a99f3279..0e46915b86 100644
--- a/phpBB/phpbb/template/twig/tokenparser/includejs.php
+++ b/phpBB/phpbb/template/twig/tokenparser/includejs.php
@@ -9,14 +9,6 @@
namespace phpbb\template\twig\tokenparser;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
class includejs extends \Twig_TokenParser
{
diff --git a/phpBB/phpbb/template/twig/tokenparser/includeparser.php b/phpBB/phpbb/template/twig/tokenparser/includeparser.php
index 715c0ec84d..d351f1b4cd 100644
--- a/phpBB/phpbb/template/twig/tokenparser/includeparser.php
+++ b/phpBB/phpbb/template/twig/tokenparser/includeparser.php
@@ -9,14 +9,6 @@
namespace phpbb\template\twig\tokenparser;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
class includeparser extends \Twig_TokenParser_Include
{
diff --git a/phpBB/phpbb/template/twig/tokenparser/includephp.php b/phpBB/phpbb/template/twig/tokenparser/includephp.php
index d906837590..1b3d1742e3 100644
--- a/phpBB/phpbb/template/twig/tokenparser/includephp.php
+++ b/phpBB/phpbb/template/twig/tokenparser/includephp.php
@@ -9,14 +9,6 @@
namespace phpbb\template\twig\tokenparser;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
class includephp extends \Twig_TokenParser
{
@@ -43,7 +35,7 @@ class includephp extends \Twig_TokenParser
$stream->expect(\Twig_Token::BLOCK_END_TYPE);
- return new \phpbb\template\twig\node\includephp($expr, $this->parser->getEnvironment(), $ignoreMissing, $token->getLine(), $this->getTag());
+ return new \phpbb\template\twig\node\includephp($expr, $this->parser->getEnvironment(), $token->getLine(), $ignoreMissing, $this->getTag());
}
/**
diff --git a/phpBB/phpbb/template/twig/tokenparser/php.php b/phpBB/phpbb/template/twig/tokenparser/php.php
index e4f70fb9b1..b427969e2d 100644
--- a/phpBB/phpbb/template/twig/tokenparser/php.php
+++ b/phpBB/phpbb/template/twig/tokenparser/php.php
@@ -9,14 +9,6 @@
namespace phpbb\template\twig\tokenparser;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
class php extends \Twig_TokenParser
{
@@ -53,5 +45,5 @@ class php extends \Twig_TokenParser
public function getTag()
{
return 'PHP';
- }
+ }
}
diff --git a/phpBB/phpbb/template/twig/twig.php b/phpBB/phpbb/template/twig/twig.php
index 9df9310427..ddadcfd89a 100644
--- a/phpBB/phpbb/template/twig/twig.php
+++ b/phpBB/phpbb/template/twig/twig.php
@@ -10,14 +10,6 @@
namespace phpbb\template\twig;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Twig Template class.
* @package phpBB3
*/
diff --git a/phpBB/phpbb/tree/nestedset.php b/phpBB/phpbb/tree/nestedset.php
index 171dae4d14..13184cf41c 100644
--- a/phpBB/phpbb/tree/nestedset.php
+++ b/phpBB/phpbb/tree/nestedset.php
@@ -9,14 +9,6 @@
namespace phpbb\tree;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
abstract class nestedset implements \phpbb\tree\tree_interface
{
/** @var \phpbb\db\driver\driver */
diff --git a/phpBB/phpbb/tree/nestedset_forum.php b/phpBB/phpbb/tree/nestedset_forum.php
index 2fee5b097e..ef6023546b 100644
--- a/phpBB/phpbb/tree/nestedset_forum.php
+++ b/phpBB/phpbb/tree/nestedset_forum.php
@@ -9,14 +9,6 @@
namespace phpbb\tree;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
class nestedset_forum extends \phpbb\tree\nestedset
{
/**
diff --git a/phpBB/phpbb/tree/tree_interface.php b/phpBB/phpbb/tree/tree_interface.php
index 162c1e5e29..90ec27e024 100644
--- a/phpBB/phpbb/tree/tree_interface.php
+++ b/phpBB/phpbb/tree/tree_interface.php
@@ -9,14 +9,6 @@
namespace phpbb\tree;
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
interface tree_interface
{
/**
diff --git a/phpBB/phpbb/user.php b/phpBB/phpbb/user.php
index f97cc94d40..b2ab187a70 100644
--- a/phpBB/phpbb/user.php
+++ b/phpBB/phpbb/user.php
@@ -10,14 +10,6 @@
namespace phpbb;
/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* Base user class
*
* This is the overarching class which contains (through session extend)
@@ -44,7 +36,7 @@ class user extends \phpbb\session
var $img_array = array();
// Able to add new options (up to id 31)
- var $keyoptions = array('viewimg' => 0, 'viewflash' => 1, 'viewsmilies' => 2, 'viewsigs' => 3, 'viewavatars' => 4, 'viewcensors' => 5, 'attachsig' => 6, 'bbcode' => 8, 'smilies' => 9, 'popuppm' => 10, 'sig_bbcode' => 15, 'sig_smilies' => 16, 'sig_links' => 17);
+ var $keyoptions = array('viewimg' => 0, 'viewflash' => 1, 'viewsmilies' => 2, 'viewsigs' => 3, 'viewavatars' => 4, 'viewcensors' => 5, 'attachsig' => 6, 'bbcode' => 8, 'smilies' => 9, 'sig_bbcode' => 15, 'sig_smilies' => 16, 'sig_links' => 17);
/**
* Constructor to set the lang path
@@ -343,7 +335,6 @@ class user extends \phpbb\session
}
}
-
// Does the user need to change their password? If so, redirect to the
// ucp profile reg_details page ... of course do not redirect if we're already in the ucp
if (!defined('IN_ADMIN') && !defined('ADMIN_START') && $config['chg_passforce'] && !empty($this->data['is_registered']) && $auth->acl_get('u_chgpasswd') && $this->data['user_passchg'] < time() - ($config['chg_passforce'] * 86400))
diff --git a/phpBB/phpbb/user_loader.php b/phpBB/phpbb/user_loader.php
index 78620ab1b9..c1d69802f8 100644
--- a/phpBB/phpbb/user_loader.php
+++ b/phpBB/phpbb/user_loader.php
@@ -10,13 +10,6 @@
namespace phpbb;
/**
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
* User loader class
*
* This handles loading users from the database and