From 5be1f5d5c9db05d2329d10701e2b72bb7e5d2986 Mon Sep 17 00:00:00 2001 From: rxu Date: Tue, 6 Jun 2023 12:54:15 +0700 Subject: [PATCH] [ticket/17135] Refactor messenger code to services [ci skip] PHPBB3-17135 --- .../default/container/services_console.yml | 2 + .../default/container/services_cron.yml | 5 +- .../default/container/services_messenger.yml | 14 ++-- .../container/services_notification.yml | 2 + .../config/default/container/services_ucp.yml | 1 + .../container/services_install_finish.yml | 2 - phpBB/memberlist.php | 28 +++---- phpBB/phpbb/console/command/user/activate.php | 31 +++---- phpBB/phpbb/console/command/user/add.php | 32 ++++---- phpBB/phpbb/cron/task/core/queue.php | 36 ++++----- .../install_finish/task/notify_user.php | 78 +++++++----------- phpBB/phpbb/message/form.php | 4 +- phpBB/phpbb/message/message.php | 80 ++++++++++--------- phpBB/phpbb/messenger/method/base.php | 42 ++++++++-- phpBB/phpbb/messenger/method/email.php | 23 +++--- phpBB/phpbb/messenger/method/jabber.php | 10 +++ phpBB/phpbb/notification/method/email.php | 30 +++++-- phpBB/phpbb/notification/method/jabber.php | 18 +++-- .../notification/method/messenger_base.php | 52 ++++++------ phpBB/phpbb/ucp/controller/reset_password.php | 42 +++++----- 20 files changed, 296 insertions(+), 236 deletions(-) diff --git a/phpBB/config/default/container/services_console.yml b/phpBB/config/default/container/services_console.yml index 6c85e22f9a..704c122d59 100644 --- a/phpBB/config/default/container/services_console.yml +++ b/phpBB/config/default/container/services_console.yml @@ -331,6 +331,7 @@ services: - '@user_loader' - '%core.root_path%' - '%core.php_ext%' + - '@messenger.method_collection' tags: - { name: console.command } @@ -344,6 +345,7 @@ services: - '@passwords.manager' - '%core.root_path%' - '%core.php_ext%' + - '@messenger.method_collection' tags: - { name: console.command } diff --git a/phpBB/config/default/container/services_cron.yml b/phpBB/config/default/container/services_cron.yml index a19ed9900d..85d5c1631f 100644 --- a/phpBB/config/default/container/services_cron.yml +++ b/phpBB/config/default/container/services_cron.yml @@ -86,10 +86,9 @@ services: cron.task.core.queue: class: phpbb\cron\task\core\queue arguments: - - '%core.root_path%' - - '%core.php_ext%' - '@config' - - '%core.cache_dir%' + - '@messenger.queue' + - '%core.messenger_queue_file%' calls: - [set_name, [cron.task.core.queue]] tags: diff --git a/phpBB/config/default/container/services_messenger.yml b/phpBB/config/default/container/services_messenger.yml index 659a4fa558..83037d6427 100644 --- a/phpBB/config/default/container/services_messenger.yml +++ b/phpBB/config/default/container/services_messenger.yml @@ -9,7 +9,7 @@ services: tags: - { name: service_collection, tag: messenger.method, class_name_aware: true } - messenger.method_base: + messenger.method.base: class: phpbb\messenger\method\base shared: false arguments: @@ -21,20 +21,24 @@ services: - '@user' - '@messenger.queue' - messenger.method_email: + messenger.method.email: class: phpbb\messenger\method\email shared: false - parent: messenger.method_base + parent: messenger.method.base calls: - [init, []] - [set_transport, []] + tags: + - { name: messenger.method } - messenger.method_jabber: + messenger.method.jabber: class: phpbb\messenger\method\jabber shared: false - parent: messenger.method_base + parent: messenger.method.base calls: - [init, []] + tags: + - { name: messenger.method } messenger.queue: class: phpbb\messenger\queue diff --git a/phpBB/config/default/container/services_notification.yml b/phpBB/config/default/container/services_notification.yml index 92592850f9..0ac9dc6a88 100644 --- a/phpBB/config/default/container/services_notification.yml +++ b/phpBB/config/default/container/services_notification.yml @@ -229,6 +229,7 @@ services: - '%core.root_path%' - '%core.php_ext%' - '%tables.notification_emails%' + - '@messenger.method_collection' tags: - { name: notification.method } @@ -241,6 +242,7 @@ services: - '@config' - '%core.root_path%' - '%core.php_ext%' + - '@messenger.method_collection' tags: - { name: notification.method } diff --git a/phpBB/config/default/container/services_ucp.yml b/phpBB/config/default/container/services_ucp.yml index acd78f8440..6321e431db 100644 --- a/phpBB/config/default/container/services_ucp.yml +++ b/phpBB/config/default/container/services_ucp.yml @@ -26,6 +26,7 @@ services: - '%tables.users%' - '%core.root_path%' - '%core.php_ext%' + - '@messenger.method_collection' phpbb.ucp.controller.webpush: class: phpbb\ucp\controller\webpush diff --git a/phpBB/config/installer/container/services_install_finish.yml b/phpBB/config/installer/container/services_install_finish.yml index b200118e11..c9acdad025 100644 --- a/phpBB/config/installer/container/services_install_finish.yml +++ b/phpBB/config/installer/container/services_install_finish.yml @@ -23,8 +23,6 @@ services: - '@installer.helper.container_factory' - '@installer.helper.config' - '@installer.helper.iohandler' - - '%core.root_path%' - - '%core.php_ext%' tags: - { name: install_finish, order: 3 } diff --git a/phpBB/memberlist.php b/phpBB/memberlist.php index 28b1adbdee..f61fd21502 100644 --- a/phpBB/memberlist.php +++ b/phpBB/memberlist.php @@ -428,8 +428,6 @@ switch ($mode) if (check_form_key('memberlist_messaging')) { - include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx); - $subject = sprintf($user->lang['IM_JABBER_SUBJECT'], $user->data['username'], $config['server_name']); $message = $request->variable('message', '', true); @@ -438,22 +436,22 @@ switch ($mode) trigger_error('EMPTY_MESSAGE_IM'); } - $messenger = new messenger(false); + $messenger = $phpbb_container->get('messenger.method_collection'); + $jabber = $messenger->offsetGet('messenger.method.jabber'); + $jabber->set_use_queue(false); - $messenger->template('profile_send_im', $row['user_lang']); - $messenger->subject(html_entity_decode($subject, ENT_COMPAT)); + $jabber->template('profile_send_im', $row['user_lang']); + $jabber->subject(html_entity_decode($subject, ENT_COMPAT)); + $jabber->set_addresses($row); - $messenger->replyto($user->data['user_email']); - $messenger->set_addresses($row); - - $messenger->assign_vars(array( + $jabber->assign_vars([ 'BOARD_CONTACT' => phpbb_get_board_contact($config, $phpEx), 'FROM_USERNAME' => html_entity_decode($user->data['username'], ENT_COMPAT), 'TO_USERNAME' => html_entity_decode($row['username'], ENT_COMPAT), - 'MESSAGE' => html_entity_decode($message, ENT_COMPAT)) - ); + 'MESSAGE' => html_entity_decode($message, ENT_COMPAT), + ]); - $messenger->send(NOTIFY_IM); + $jabber->send(); $s_select = 'S_SENT_JABBER'; } @@ -903,10 +901,7 @@ switch ($mode) case 'contactadmin': case 'email': - if (!class_exists('messenger')) - { - include($phpbb_root_path . 'includes/functions_messenger.' . $phpEx); - } + $messenger = $phpbb_container->get('messenger.method_collection'); $user_id = $request->variable('u', 0); $topic_id = $request->variable('t', 0); @@ -940,7 +935,6 @@ switch ($mode) if ($request->is_set_post('submit')) { - $messenger = new messenger(false); $form->submit($messenger); } diff --git a/phpBB/phpbb/console/command/user/activate.php b/phpBB/phpbb/console/command/user/activate.php index 1d635b46dc..9157206e0a 100644 --- a/phpBB/phpbb/console/command/user/activate.php +++ b/phpBB/phpbb/console/command/user/activate.php @@ -20,6 +20,7 @@ use phpbb\log\log_interface; use phpbb\notification\manager; use phpbb\user; use phpbb\user_loader; +use phpbb\di\service_collection; use Symfony\Component\Console\Command\Command as symfony_command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; @@ -58,6 +59,9 @@ class activate extends command */ protected $php_ext; + /** @var service_collection */ + protected $messenger; + /** * Construct method * @@ -69,8 +73,9 @@ class activate extends command * @param user_loader $user_loader * @param string $phpbb_root_path * @param string $php_ext + * @param service_collection $messenger */ - public function __construct(user $user, config $config, language $language, log_interface $log, manager $notifications, user_loader $user_loader, $phpbb_root_path, $php_ext) + public function __construct(user $user, config $config, language $language, log_interface $log, manager $notifications, user_loader $user_loader, $phpbb_root_path, $php_ext, service_collection $messenger) { $this->config = $config; $this->language = $language; @@ -79,6 +84,7 @@ class activate extends command $this->user_loader = $user_loader; $this->phpbb_root_path = $phpbb_root_path; $this->php_ext = $php_ext; + $this->messenger = $messenger; $this->language->add_lang('acp/users'); parent::__construct($user); @@ -194,20 +200,15 @@ class activate extends command if ($input->getOption('send-email')) { - if (!class_exists('messenger')) - { - require($this->phpbb_root_path . 'includes/functions_messenger.' . $this->php_ext); - } - - $messenger = new \messenger(false); - $messenger->template('admin_welcome_activated', $user_row['user_lang']); - $messenger->set_addresses($user_row); - $messenger->anti_abuse_headers($this->config, $this->user); - $messenger->assign_vars(array( - 'USERNAME' => html_entity_decode($user_row['username'], ENT_COMPAT)) - ); - - $messenger->send(NOTIFY_EMAIL); + $email = $this->messenger->offsetGet('messenger.method.email'); + $email->set_use_queue(false); + $email->template('admin_welcome_activated', $user_row['user_lang']); + $email->set_addresses($user_row); + $email->anti_abuse_headers($this->config, $this->user); + $email->assign_vars([ + 'USERNAME' => html_entity_decode($user_row['username'], ENT_COMPAT), + ]); + $email->send(); } } } diff --git a/phpBB/phpbb/console/command/user/add.php b/phpBB/phpbb/console/command/user/add.php index c01aac7cb6..3a54cc409f 100644 --- a/phpBB/phpbb/console/command/user/add.php +++ b/phpBB/phpbb/console/command/user/add.php @@ -20,6 +20,7 @@ use phpbb\exception\runtime_exception; use phpbb\language\language; use phpbb\passwords\manager; use phpbb\user; +use phpbb\di\service_collection; use Symfony\Component\Console\Command\Command as symfony_command; use Symfony\Component\Console\Helper\QuestionHelper; use Symfony\Component\Console\Input\InputInterface; @@ -59,6 +60,9 @@ class add extends command */ protected $php_ext; + /** @var service_collection */ + protected $messenger; + /** * Construct method * @@ -69,8 +73,9 @@ class add extends command * @param manager $password_manager * @param string $phpbb_root_path * @param string $php_ext + * @param service_collection $messenger */ - public function __construct(user $user, driver_interface $db, config $config, language $language, manager $password_manager, $phpbb_root_path, $php_ext) + public function __construct(user $user, driver_interface $db, config $config, language $language, manager $password_manager, $phpbb_root_path, $php_ext, service_collection $messenger) { $this->db = $db; $this->config = $config; @@ -78,6 +83,7 @@ class add extends command $this->password_manager = $password_manager; $this->phpbb_root_path = $phpbb_root_path; $this->php_ext = $php_ext; + $this->messenger = $messenger; $this->language->add_lang('ucp'); parent::__construct($user); @@ -307,24 +313,18 @@ class add extends command $user_actkey = $this->get_activation_key($user_id); - if (!class_exists('messenger')) - { - require($this->phpbb_root_path . 'includes/functions_messenger.' . $this->php_ext); - } - - $messenger = new \messenger(false); - $messenger->template($email_template, $this->user->lang_name); - $messenger->to($this->data['email'], $this->data['username']); - $messenger->anti_abuse_headers($this->config, $this->user); - $messenger->assign_vars(array( + $email = $this->messenger->offsetGet('messenger.method.email'); + $email->set_use_queue(false); + $email->template($email_template, $this->user->lang_name); + $email->to($this->data['email'], $this->data['username']); + $email->anti_abuse_headers($this->config, $this->user); + $email->assign_vars([ 'WELCOME_MSG' => html_entity_decode($this->language->lang('WELCOME_SUBJECT', $this->config['sitename']), ENT_COMPAT), 'USERNAME' => html_entity_decode($this->data['username'], ENT_COMPAT), 'PASSWORD' => html_entity_decode($this->data['new_password'], ENT_COMPAT), - 'U_ACTIVATE' => generate_board_url() . "/ucp.{$this->php_ext}?mode=activate&u=$user_id&k=$user_actkey") - ); - - $messenger->send(NOTIFY_EMAIL); - } + 'U_ACTIVATE' => generate_board_url() . "/ucp.{$this->php_ext}?mode=activate&u=$user_id&k=$user_actkey", + ]); + $email->send(); /** * Get user activation key diff --git a/phpBB/phpbb/cron/task/core/queue.php b/phpBB/phpbb/cron/task/core/queue.php index 2f0d91d046..5e1f0d1be9 100644 --- a/phpBB/phpbb/cron/task/core/queue.php +++ b/phpBB/phpbb/cron/task/core/queue.php @@ -13,30 +13,35 @@ namespace phpbb\cron\task\core; +use \phpbb\config\config; +use \phpbb\messenger\queue; + /** * Queue cron task. Sends email and jabber messages queued by other scripts. */ class queue extends \phpbb\cron\task\base { - protected $phpbb_root_path; - protected $php_ext; - protected $cache_dir; + /** var config */ protected $config; + /** var queue */ + protected $queue; + + /** var string */ + protected $queue_cache_file; + /** * Constructor. * - * @param string $phpbb_root_path The root path - * @param string $php_ext PHP file extension - * @param \phpbb\config\config $config The config - * @param string $cache_dir phpBB cache directory + * @param config $config The config + * @param string $queue_cache_file The messenger file queue cache filename + * @param queue $queue The messenger file queue object */ - public function __construct($phpbb_root_path, $php_ext, \phpbb\config\config $config, $cache_dir) + public function __construct(config $config, queue $queue, $queue_cache_file) { - $this->phpbb_root_path = $phpbb_root_path; - $this->php_ext = $php_ext; $this->config = $config; - $this->cache_dir = $cache_dir; + $this->queue = $queue; + $this->queue_cache_file = $queue_cache_file; } /** @@ -46,12 +51,7 @@ class queue extends \phpbb\cron\task\base */ public function run() { - if (!class_exists('queue')) - { - include($this->phpbb_root_path . 'includes/functions_messenger.' . $this->php_ext); - } - $queue = new \queue(); - $queue->process(); + $this->queue->process(); } /** @@ -63,7 +63,7 @@ class queue extends \phpbb\cron\task\base */ public function is_runnable() { - return file_exists($this->cache_dir . 'queue.' . $this->php_ext); + return file_exists($this->queue_cache_file); } /** diff --git a/phpBB/phpbb/install/module/install_finish/task/notify_user.php b/phpBB/phpbb/install/module/install_finish/task/notify_user.php index 6fb7bc2743..4d3402a6f5 100644 --- a/phpBB/phpbb/install/module/install_finish/task/notify_user.php +++ b/phpBB/phpbb/install/module/install_finish/task/notify_user.php @@ -14,62 +14,48 @@ namespace phpbb\install\module\install_finish\task; use phpbb\config\db; +use phpbb\install\helper\config; +use phpbb\install\helper\iohandler\iohandler_interface; +use phpbb\auth\auth; +use phpbb\log\log_interface; +use phpbb\user; +use phpbb\install\helper\container_factory; +use phpbb\di\service_collection; /** * Logs installation and sends an email to the admin */ class notify_user extends \phpbb\install\task_base { - /** - * @var \phpbb\install\helper\config - */ + /** @var config */ protected $install_config; - /** - * @var \phpbb\install\helper\iohandler\iohandler_interface - */ + /** @var iohandler_interface */ protected $iohandler; - /** - * @var \phpbb\auth\auth - */ + /** @var auth */ protected $auth; - /** - * @var db - */ + /** @var db */ protected $config; - /** - * @var \phpbb\log\log_interface - */ + /** @var log_interface */ protected $log; - /** - * @var \phpbb\user - */ + /** @var user */ protected $user; - /** - * @var string - */ - protected $phpbb_root_path; - - /** - * @var string - */ - protected $php_ext; + /** @var service_collection */ + protected $messenger; /** * Constructor * - * @param \phpbb\install\helper\container_factory $container - * @param \phpbb\install\helper\config $install_config - * @param \phpbb\install\helper\iohandler\iohandler_interface $iohandler - * @param string $phpbb_root_path - * @param string $php_ext + * @param container_factory $container + * @param config $install_config + * @param iohandler_interface $iohandler */ - public function __construct(\phpbb\install\helper\container_factory $container, \phpbb\install\helper\config $install_config, \phpbb\install\helper\iohandler\iohandler_interface $iohandler, $phpbb_root_path, $php_ext) + public function __construct(container_factory $container, config $install_config, iohandler_interface $iohandler) { $this->install_config = $install_config; $this->iohandler = $iohandler; @@ -77,8 +63,7 @@ class notify_user extends \phpbb\install\task_base $this->auth = $container->get('auth'); $this->log = $container->get('log'); $this->user = $container->get('user'); - $this->phpbb_root_path = $phpbb_root_path; - $this->php_ext = $php_ext; + $this->messenger = $container->get('messenger.method_collection'); // We need to reload config for cases when it doesn't have all values /** @var \phpbb\cache\driver\driver_interface $cache */ @@ -107,17 +92,16 @@ class notify_user extends \phpbb\install\task_base if ($this->config['email_enable']) { - include ($this->phpbb_root_path . 'includes/functions_messenger.' . $this->php_ext); - - $messenger = new \messenger(false); - $messenger->template('installed', $this->install_config->get('user_language', 'en')); - $messenger->to($this->config['board_email'], $this->install_config->get('admin_name')); - $messenger->anti_abuse_headers($this->config, $this->user); - $messenger->assign_vars(array( - 'USERNAME' => html_entity_decode($this->install_config->get('admin_name'), ENT_COMPAT), - 'PASSWORD' => html_entity_decode($this->install_config->get('admin_passwd'), ENT_COMPAT)) - ); - $messenger->send(NOTIFY_EMAIL); + $email = $this->messenger->offsetGet('messenger.method.email'); + $email->set_use_queue(false); + $email->template('installed', $this->install_config->get('user_language', 'en')); + $email->to($this->config['board_email'], $this->install_config->get('admin_name')); + $email->anti_abuse_headers($this->config, $this->user); + $email->assign_vars([ + 'USERNAME' => html_entity_decode($this->install_config->get('admin_name'), ENT_COMPAT), + 'PASSWORD' => html_entity_decode($this->install_config->get('admin_passwd'), ENT_COMPAT), + ]); + $email->send(); } // Login admin @@ -141,7 +125,7 @@ class notify_user extends \phpbb\install\task_base $this->user->ip, 'LOG_INSTALL_INSTALLED', false, - array($this->config['version']) + [$this->config['version']] ); // Remove install_lock diff --git a/phpBB/phpbb/message/form.php b/phpBB/phpbb/message/form.php index c23b168906..479d687212 100644 --- a/phpBB/phpbb/message/form.php +++ b/phpBB/phpbb/message/form.php @@ -129,10 +129,10 @@ abstract class form /** * Submit form, generate the email and send it * - * @param \messenger $messenger + * @param \phpbb\di\service_collection $messenger * @return void */ - public function submit(\messenger $messenger) + public function submit(\phpbb\di\service_collection $messenger) { if (!check_form_key('memberlist_email')) { diff --git a/phpBB/phpbb/message/message.php b/phpBB/phpbb/message/message.php index 554fe48a12..23960d4778 100644 --- a/phpBB/phpbb/message/message.php +++ b/phpBB/phpbb/message/message.php @@ -138,10 +138,10 @@ class message { $this->recipients[] = array( 'name' => $recipient_name, - 'address' => $recipient_address, + 'user_email' => $recipient_address, 'lang' => $recipient_lang, 'username' => $recipient_username, - 'jabber' => $recipient_jabber, + 'user_jabber' => $recipient_jabber, 'notify_type' => $recipient_notify_type, 'to_name' => $recipient_name, ); @@ -220,10 +220,10 @@ class message $this->recipients[] = array( 'lang' => $this->sender_lang, - 'address' => $this->sender_address, + 'user_email' => $this->sender_address, 'name' => $this->sender_name, 'username' => $this->sender_username, - 'jabber' => $this->sender_jabber, + 'user_jabber' => $this->sender_jabber, 'notify_type' => $this->sender_notify_type, 'to_name' => $this->recipients[0]['to_name'], ); @@ -232,11 +232,11 @@ class message /** * Send the email * - * @param \messenger $messenger + * @param \phpbb\di\service_collection $messenger * @param string $contact * @return void */ - public function send(\messenger $messenger, $contact) + public function send(\phpbb\di\service_collection $messenger, $contact) { if (!count($this->recipients)) { @@ -245,38 +245,46 @@ class message foreach ($this->recipients as $recipient) { - $messenger->template($this->template, $recipient['lang']); - $messenger->replyto($this->sender_address); - $messenger->to($recipient['address'], $recipient['name']); - $messenger->im($recipient['jabber'], $recipient['username']); - - $messenger->headers('X-AntiAbuse', 'Board servername - ' . $this->server_name); - $messenger->headers('X-AntiAbuse', 'User IP - ' . $this->sender_ip); - - if ($this->sender_id) + $messenger_collection_iterator = $this->messenger->getIterator(); + while ($messenger_collection_iterator->valid()) { - $messenger->headers('X-AntiAbuse', 'User_id - ' . $this->sender_id); + $messenger_method = $messenger_collection_iterator->current(); + $messenger_method->set_use_queue(false); + if ($messenger_method->get_id() == $recipient['notify_type'] || $recipient['notify_type'] == NOTIFY_BOTH) + { + $messenger_method->template($this->template, $recipient['lang']); + $messenger_method->set_addresses($recipient); + $messenger_method->replyto($this->sender_address); + + $messenger_method->headers('X-AntiAbuse', 'Board servername - ' . $this->server_name); + $messenger_method->headers('X-AntiAbuse', 'User IP - ' . $this->sender_ip); + if ($this->sender_id) + { + $messenger_method->headers('X-AntiAbuse', 'User_id - ' . $this->sender_id); + } + if ($this->sender_username) + { + $messenger_method->headers('X-AntiAbuse', 'Username - ' . $this->sender_username); + } + + $messenger_method->subject(html_entity_decode($this->subject, ENT_COMPAT)); + + $messenger_method->assign_vars([ + 'BOARD_CONTACT' => $contact, + 'TO_USERNAME' => html_entity_decode($recipient['to_name'], ENT_COMPAT), + 'FROM_USERNAME' => html_entity_decode($this->sender_name, ENT_COMPAT), + 'MESSAGE' => html_entity_decode($this->body, ENT_COMPAT), + ]); + + if (count($this->template_vars)) + { + $messenger_method->assign_vars($this->template_vars); + } + + $messenger_method->send(); + } + $messenger_collection_iterator->next(); } - if ($this->sender_username) - { - $messenger->headers('X-AntiAbuse', 'Username - ' . $this->sender_username); - } - - $messenger->subject(html_entity_decode($this->subject, ENT_COMPAT)); - - $messenger->assign_vars(array( - 'BOARD_CONTACT' => $contact, - 'TO_USERNAME' => html_entity_decode($recipient['to_name'], ENT_COMPAT), - 'FROM_USERNAME' => html_entity_decode($this->sender_name, ENT_COMPAT), - 'MESSAGE' => html_entity_decode($this->body, ENT_COMPAT)) - ); - - if (count($this->template_vars)) - { - $messenger->assign_vars($this->template_vars); - } - - $messenger->send($recipient['notify_type']); } } } diff --git a/phpBB/phpbb/messenger/method/base.php b/phpBB/phpbb/messenger/method/base.php index 507b5beea8..d743d00b48 100644 --- a/phpBB/phpbb/messenger/method/base.php +++ b/phpBB/phpbb/messenger/method/base.php @@ -132,6 +132,38 @@ class base $this->subject = $subject; } + /** + * Adds antiabuse headers + * + * @param \phpbb\config\config $config Config object + * @param \phpbb\user $user User object + * @return void + */ + public function anti_abuse_headers($config, $user) + { + } + + /** + * Set up extra headers + * + * @param string $header_name Email header name + * @param string $header_value Email header body + * @return void + */ + public function header($header_name, $header_value) + { + } + + /** + * Set the reply to address + * + * @param string $address Email "Reply to" address + * @return void + */ + public function replyto($address) + { + } + /** * Set email template to use * @@ -232,7 +264,6 @@ class base public function assign_vars($vars) { $this->setup_template(); - $this->template->assign_vars($vars); } @@ -352,13 +383,15 @@ class base */ public function save_queue() { - $this->queue->save(); - return; + if ($this->use_queue && !empty($this->queue)) + { + $this->queue->save(); + return; + } } /** * Setup template engine - * * @return void */ protected function setup_template() @@ -402,7 +435,6 @@ class base protected function set_template_paths($path_name, $paths) { $this->setup_template(); - $this->template->set_custom_style($path_name, $paths); } } diff --git a/phpBB/phpbb/messenger/method/email.php b/phpBB/phpbb/messenger/method/email.php index 039591feb7..f6683e82d0 100644 --- a/phpBB/phpbb/messenger/method/email.php +++ b/phpBB/phpbb/messenger/method/email.php @@ -82,6 +82,16 @@ class email extends base /** @var Symfony\Component\Mailer\Transport */ protected $transport; + /** + * Get messenger method id + * + * @return int + */ + public function get_id() + { + return NOTIFY_EMAIL; + } + /** * Check if the messenger method is enabled * @return void @@ -286,19 +296,6 @@ class email extends base parent::error($type, $msg); } - /** - * Save message data to the messenger file queue - * @return void - */ - public function save_queue() - { - if ($this->config['email_package_size'] && $this->use_queue && !empty($this->queue)) - { - $this->queue->save(); - return; - } - } - /** * Detect proper Header class method to add header * diff --git a/phpBB/phpbb/messenger/method/jabber.php b/phpBB/phpbb/messenger/method/jabber.php index 2e7f2040da..33a8d19eb3 100644 --- a/phpBB/phpbb/messenger/method/jabber.php +++ b/phpBB/phpbb/messenger/method/jabber.php @@ -110,6 +110,16 @@ class jabber extends base ]; } + /** + * Get messenger method id + * + * @return int + */ + public function get_id() + { + return NOTIFY_IM; + } + /** * Check if the messenger method is enabled * @return void diff --git a/phpBB/phpbb/notification/method/email.php b/phpBB/phpbb/notification/method/email.php index cffd259c0e..dd181ac5a3 100644 --- a/phpBB/phpbb/notification/method/email.php +++ b/phpBB/phpbb/notification/method/email.php @@ -14,6 +14,11 @@ namespace phpbb\notification\method; use phpbb\notification\type\type_interface; +use phpbb\user; +use phpbb\user_loader; +use phpbb\config\config; +use phpbb\db\driver\driver_interface; +use phpbb\di\service_collection; /** * Email notification method class @@ -34,20 +39,33 @@ class email extends \phpbb\notification\method\messenger_base /** @var string Notification emails table */ protected $notification_emails_table; + /** @var service_collection */ + protected $messenger; + /** * Notification Method email Constructor * - * @param \phpbb\user_loader $user_loader - * @param \phpbb\user $user - * @param \phpbb\config\config $config - * @param \phpbb\db\driver\driver_interface $db + * @param user_loader $user_loader + * @param user $user + * @param config $config + * @param driver_interface $db * @param string $phpbb_root_path * @param string $php_ext * @param string $notification_emails_table + * @param service_collection $messenger */ - public function __construct(\phpbb\user_loader $user_loader, \phpbb\user $user, \phpbb\config\config $config, \phpbb\db\driver\driver_interface $db, $phpbb_root_path, $php_ext, $notification_emails_table) + public function __construct( + user_loader $user_loader, + user $user, + config $config, + driver_interface $db, + $phpbb_root_path, + $php_ext, + $notification_emails_table, + service_collection $messenger + ) { - parent::__construct($user_loader, $phpbb_root_path, $php_ext); + parent::__construct($messenger, $user_loader, $phpbb_root_path, $php_ext); $this->user = $user; $this->config = $config; diff --git a/phpBB/phpbb/notification/method/jabber.php b/phpBB/phpbb/notification/method/jabber.php index 9a1aadb9a0..5765152139 100644 --- a/phpBB/phpbb/notification/method/jabber.php +++ b/phpBB/phpbb/notification/method/jabber.php @@ -14,6 +14,10 @@ namespace phpbb\notification\method; use phpbb\notification\type\type_interface; +use phpbb\user; +use phpbb\user_loader; +use phpbb\config\config; +use phpbb\di\service_collection; /** * Jabber notification method class @@ -28,18 +32,22 @@ class jabber extends \phpbb\notification\method\messenger_base /** @var \phpbb\config\config */ protected $config; + /** @var service_collection */ + protected $messenger; + /** * Notification Method jabber Constructor * - * @param \phpbb\user_loader $user_loader - * @param \phpbb\user $user - * @param \phpbb\config\config $config + * @param user_loader $user_loader + * @param user $user + * @param config $config * @param string $phpbb_root_path * @param string $php_ext + * @param service_collection $messenger */ - public function __construct(\phpbb\user_loader $user_loader, \phpbb\user $user, \phpbb\config\config $config, $phpbb_root_path, $php_ext) + public function __construct(user_loader $user_loader, user $user, config $config, $phpbb_root_path, $php_ext, service_collection $messenger) { - parent::__construct($user_loader, $phpbb_root_path, $php_ext); + parent::__construct($messenger, $user_loader, $phpbb_root_path, $php_ext); $this->user = $user; $this->config = $config; diff --git a/phpBB/phpbb/notification/method/messenger_base.php b/phpBB/phpbb/notification/method/messenger_base.php index 85461b282d..0d9b3c163b 100644 --- a/phpBB/phpbb/notification/method/messenger_base.php +++ b/phpBB/phpbb/notification/method/messenger_base.php @@ -14,6 +14,8 @@ namespace phpbb\notification\method; use phpbb\notification\type\type_interface; +use phpbb\di\service_collection; +use phpbb\user_loader; /** * Abstract notification method handling email and jabber notifications @@ -21,7 +23,10 @@ use phpbb\notification\type\type_interface; */ abstract class messenger_base extends \phpbb\notification\method\base { - /** @var \phpbb\user_loader */ + /** @var service_collection */ + protected $messenger; + + /** @var user_loader */ protected $user_loader; /** @var string */ @@ -33,12 +38,14 @@ abstract class messenger_base extends \phpbb\notification\method\base /** * Notification Method Board Constructor * - * @param \phpbb\user_loader $user_loader + * @param service_collection $messenger + * @param user_loader $user_loader * @param string $phpbb_root_path * @param string $php_ext */ - public function __construct(\phpbb\user_loader $user_loader, $phpbb_root_path, $php_ext) + public function __construct(service_collection $messenger, user_loader $user_loader, $phpbb_root_path, $php_ext) { + $this->messenger = $messenger; $this->user_loader = $user_loader; $this->phpbb_root_path = $phpbb_root_path; $this->php_ext = $php_ext; @@ -73,7 +80,7 @@ abstract class messenger_base extends \phpbb\notification\method\base } // Load all users we want to notify (we need their email address) - $user_ids = array(); + $user_ids = []; foreach ($this->queue as $notification) { $user_ids[] = $notification->user_id; @@ -89,13 +96,6 @@ abstract class messenger_base extends \phpbb\notification\method\base // Load all the users we need $this->user_loader->load_users(array_diff($user_ids, $banned_users), array(USER_IGNORE)); - // Load the messenger - if (!class_exists('messenger')) - { - include($this->phpbb_root_path . 'includes/functions_messenger.' . $this->php_ext); - } - $messenger = new \messenger(); - // Time to go through the queue and send emails /** @var type_interface $notification */ foreach ($this->queue as $notification) @@ -112,22 +112,28 @@ abstract class messenger_base extends \phpbb\notification\method\base continue; } - $messenger->template($notification->get_email_template(), $user['user_lang'], '', $template_dir_prefix); + $messenger_collection_iterator = $this->messenger->getIterator(); + while ($messenger_collection_iterator->valid()) + { + $messenger_method = $messenger_collection_iterator->current(); + if ($messenger_method->get_id() == $notify_method || $notify_method == NOTIFY_BOTH) + { + $messenger_method->template($notification->get_email_template(), $user['user_lang'], '', $template_dir_prefix); + $messenger_method->set_addresses($user); + $messenger_method->assign_vars(array_merge([ + 'USERNAME' => $user['username'], + 'U_NOTIFICATION_SETTINGS' => generate_board_url() . '/ucp.' . $this->php_ext . '?i=ucp_notifications&mode=notification_options', + ], $notification->get_email_template_variables())); - $messenger->set_addresses($user); + $messenger_method->send(); - $messenger->assign_vars(array_merge(array( - 'USERNAME' => $user['username'], - - 'U_NOTIFICATION_SETTINGS' => generate_board_url() . '/ucp.' . $this->php_ext . '?i=ucp_notifications&mode=notification_options', - ), $notification->get_email_template_variables())); - - $messenger->send($notify_method); + // Save the queue in the messenger method class (has to be called or these messages could be lost) + $messenger_method->save_queue(); + } + $messenger_collection_iterator->next(); + } } - // Save the queue in the messenger class (has to be called or these emails could be lost?) - $messenger->save_queue(); - // We're done, empty the queue $this->empty_queue(); } diff --git a/phpBB/phpbb/ucp/controller/reset_password.php b/phpBB/phpbb/ucp/controller/reset_password.php index 64c43a5d00..ae01972d7f 100644 --- a/phpBB/phpbb/ucp/controller/reset_password.php +++ b/phpBB/phpbb/ucp/controller/reset_password.php @@ -25,6 +25,7 @@ use phpbb\passwords\manager; use phpbb\request\request; use phpbb\template\template; use phpbb\user; +use phpbb\di\service_collection; use Symfony\Component\HttpFoundation\Response; /** @@ -71,6 +72,9 @@ class reset_password /** @var string PHP extension */ protected $php_ext; + /** @var service_collection */ + protected $messenger; + /** * Reset password controller constructor. * @@ -87,11 +91,12 @@ class reset_password * @param string $users_table * @param string $root_path * @param string $php_ext + * @param service_collection $messenger */ public function __construct(config $config, driver_interface $db, dispatcher $dispatcher, helper $helper, language $language, log_interface $log, manager $passwords_manager, request $request, template $template, user $user, string $users_table, - string $root_path, string $php_ext) + string $root_path, string $php_ext, service_collection $messenger) { $this->config = $config; $this->db = $db; @@ -106,6 +111,7 @@ class reset_password $this->users_table = $users_table; $this->root_path = $root_path; $this->php_ext = $php_ext; + $this->messenger = $messenger; } /** @@ -250,29 +256,19 @@ class reset_password WHERE user_id = ' . $user_row['user_id']; $this->db->sql_query($sql); - if (!class_exists('messenger')) - { - include($this->root_path . 'includes/functions_messenger.' . $this->php_ext); - } - - /** @var \messenger $messenger */ - $messenger = new \messenger(false); - - $messenger->template('user_forgot_password', $user_row['user_lang']); - - $messenger->set_addresses($user_row); - - $messenger->anti_abuse_headers($this->config, $this->user); - - $messenger->assign_vars([ - 'USERNAME' => html_entity_decode($user_row['username'], ENT_COMPAT), - 'U_RESET_PASSWORD' => generate_board_url(true) . $this->helper->route('phpbb_ucp_reset_password_controller', [ - 'u' => $user_row['user_id'], - 'token' => $reset_token, - ], false) + $email = $this->messenger->offsetGet('messenger.method.email'); + $email->set_use_queue(false); + $email->template('user_forgot_password', $user_row['user_lang']); + $email->set_addresses($user_row); + $email->anti_abuse_headers($this->config, $this->user); + $email->assign_vars([ + 'USERNAME' => html_entity_decode($user_row['username'], ENT_COMPAT), + 'U_RESET_PASSWORD' => generate_board_url(true) . $this->helper->route('phpbb_ucp_reset_password_controller', [ + 'u' => $user_row['user_id'], + 'token' => $reset_token, + ], false) ]); - - $messenger->send($user_row['user_notify_type']); + $email->send(); return $this->helper->message($message); }