diff --git a/phpBB/bin/phpbbcli.php b/phpBB/bin/phpbbcli.php
new file mode 100644
index 0000000000..05e2597960
--- /dev/null
+++ b/phpBB/bin/phpbbcli.php
@@ -0,0 +1,35 @@
+register();
+$phpbb_class_loader_ext = new \phpbb\class_loader('\\', "{$phpbb_root_path}ext/", $phpEx);
+$phpbb_class_loader_ext->register();
+
+$phpbb_container = phpbb_create_update_container($phpbb_root_path, $phpEx, "$phpbb_root_path/config");
+
+$application = new \phpbb\console\application('phpBB Console', PHPBB_VERSION);
+$application->register_container_commands($phpbb_container);
+$application->run();
diff --git a/phpBB/composer.json b/phpBB/composer.json
index ddb264de17..3cf83a8fe9 100644
--- a/phpBB/composer.json
+++ b/phpBB/composer.json
@@ -3,6 +3,7 @@
"require": {
"lusitanian/oauth": "0.2.*",
"symfony/config": "2.3.*",
+ "symfony/console": "2.3.*",
"symfony/dependency-injection": "2.3.*",
"symfony/event-dispatcher": "2.3.*",
"symfony/http-kernel": "2.3.*",
diff --git a/phpBB/composer.lock b/phpBB/composer.lock
index 5d1ba4efe1..c0eb7afcbb 100644
--- a/phpBB/composer.lock
+++ b/phpBB/composer.lock
@@ -3,7 +3,7 @@
"This file locks the dependencies of your project to a known state",
"Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file"
],
- "hash": "7bcfe8f8ce4fa46cb53c276cf93dcd3e",
+ "hash": "cc83663b780856890f787b9b4d6ea474",
"packages": [
{
"name": "lusitanian/oauth",
@@ -154,6 +154,59 @@
"homepage": "http://symfony.com",
"time": "2013-08-06 05:49:23"
},
+ {
+ "name": "symfony/console",
+ "version": "v2.3.6",
+ "target-dir": "Symfony/Component/Console",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/Console.git",
+ "reference": "f880062d56edefb25b36f2defa65aafe65959dc7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/Console/zipball/f880062d56edefb25b36f2defa65aafe65959dc7",
+ "reference": "f880062d56edefb25b36f2defa65aafe65959dc7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "symfony/event-dispatcher": "~2.1"
+ },
+ "suggest": {
+ "symfony/event-dispatcher": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Symfony\\Component\\Console\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "http://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Console Component",
+ "homepage": "http://symfony.com",
+ "time": "2013-09-25 06:04:15"
+ },
{
"name": "symfony/debug",
"version": "v2.3.4",
diff --git a/phpBB/config/console.yml b/phpBB/config/console.yml
new file mode 100644
index 0000000000..c85a9d19ed
--- /dev/null
+++ b/phpBB/config/console.yml
@@ -0,0 +1,35 @@
+services:
+ console.command.extension.disable:
+ class: phpbb\console\command\extension\disable
+ arguments:
+ - @ext.manager
+ tags:
+ - { name: console.command }
+
+ console.command.extension.enable:
+ class: phpbb\console\command\extension\enable
+ arguments:
+ - @ext.manager
+ tags:
+ - { name: console.command }
+
+ console.command.extension.purge:
+ class: phpbb\console\command\extension\purge
+ arguments:
+ - @ext.manager
+ tags:
+ - { name: console.command }
+
+ console.command.extension.show:
+ class: phpbb\console\command\extension\show
+ arguments:
+ - @ext.manager
+ tags:
+ - { name: console.command }
+
+ console.command.fixup.recalculate_email_hash:
+ class: phpbb\console\command\fixup\recalculate_email_hash
+ arguments:
+ - @dbal.conn
+ tags:
+ - { name: console.command }
diff --git a/phpBB/config/services.yml b/phpBB/config/services.yml
index 7e3202d86b..f61ed5f87f 100644
--- a/phpBB/config/services.yml
+++ b/phpBB/config/services.yml
@@ -6,6 +6,7 @@ imports:
- { resource: avatars.yml }
- { resource: feed.yml }
- { resource: auth_providers.yml }
+ - { resource: console.yml }
services:
acl.permissions:
diff --git a/phpBB/develop/extensions.php b/phpBB/develop/extensions.php
deleted file mode 100644
index 43621f3080..0000000000
--- a/phpBB/develop/extensions.php
+++ /dev/null
@@ -1,129 +0,0 @@
-load_extensions();
- $all = array_keys($phpbb_extension_manager->all_available());
-
- if (empty($all))
- {
- echo "There were no extensions found.\n";
- exit(3);
- }
-
- echo "Enabled:\n";
- $enabled = array_keys($phpbb_extension_manager->all_enabled());
- print_extensions($enabled);
- echo "\n";
-
- echo "Disabled:\n";
- $disabled = array_keys($phpbb_extension_manager->all_disabled());
- print_extensions($disabled);
- echo "\n";
-
- echo "Available:\n";
- $purged = array_diff($all, $enabled, $disabled);
- print_extensions($purged);
-}
-
-function print_extensions($exts)
-{
- foreach ($exts as $ext)
- {
- echo "- $ext\n";
- }
-}
-
-function enable_extension($name)
-{
- global $phpbb_extension_manager;
-
- $phpbb_extension_manager->enable($name);
-}
-
-function disable_extension($name)
-{
- global $phpbb_extension_manager;
-
- $phpbb_extension_manager->disable($name);
-}
-
-function purge_extension($name)
-{
- global $phpbb_extension_manager;
-
- $phpbb_extension_manager->purge($name);
-}
-
-function validate_argument_count($count)
-{
- global $argv;
-
- if (count($argv) <= $count)
- {
- usage();
- }
-}
-
-validate_argument_count(1);
-
-$action = $argv[1];
-
-switch ($action)
-{
- case 'list':
- list_extensions();
- break;
-
- case 'enable':
- validate_argument_count(2);
- enable_extension($argv[2]);
- break;
-
- case 'disable':
- validate_argument_count(2);
- disable_extension($argv[2]);
- break;
-
- case 'purge':
- validate_argument_count(2);
- purge_extension($argv[2]);
- break;
-
- default:
- usage();
-}
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 @@
+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 @@
+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 @@
+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("Could not disable extension $name");
+ return 1;
+ }
+ else
+ {
+ $output->writeln("Successfully disabled extension $name");
+ 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 @@
+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("Successfully enabled extension $name");
+ return 0;
+ }
+ else
+ {
+ $output->writeln("Could not enable extension $name");
+ 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 @@
+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("Could not purge extension $name");
+ return 1;
+ }
+ else
+ {
+ $output->writeln("Successfully purge extension $name");
+ 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 @@
+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('No extensions were found.');
+ 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("$type:");
+
+ 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 @@
+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('Successfully recalculated all email hashes.');
+ }
+}