diff --git a/inmail.services.yml b/inmail.services.yml index 58583ca..4ef5986 100644 --- a/inmail.services.yml +++ b/inmail.services.yml @@ -1,7 +1,7 @@ services: inmail.processor: class: Drupal\inmail\MessageProcessor - arguments: ['@entity.manager', '@plugin.manager.inmail.analyzer', '@plugin.manager.inmail.handler', '@logger.channel.inmail', '@inmail.mime_parser'] + arguments: ['@entity.manager', '@plugin.manager.inmail.analyzer', '@plugin.manager.inmail.handler', '@logger.channel.inmail', '@inmail.mime_parser', '@account_switcher'] plugin.manager.inmail.deliverer: class: Drupal\Core\Plugin\DefaultPluginManager arguments: diff --git a/src/MessageProcessor.php b/src/MessageProcessor.php index 1e09f1d..7a7bbde 100644 --- a/src/MessageProcessor.php +++ b/src/MessageProcessor.php @@ -9,9 +9,11 @@ namespace Drupal\inmail; use Drupal\Component\Utility\SafeMarkup; use Drupal\Core\Entity\EntityManagerInterface; use Drupal\Core\Logger\LoggerChannelInterface; +use Drupal\Core\Session\AccountSwitcherInterface; use Drupal\inmail\Entity\DelivererConfig; use Drupal\inmail\MIME\ParseException; use Drupal\inmail\MIME\ParserInterface; +use Drupal\user\Entity\User; /** * Mail message processor using services to analyze and handle messages. @@ -65,15 +67,23 @@ class MessageProcessor implements MessageProcessorInterface { protected $parser; /** + * The account switcher service. + * + * @var \Drupal\Core\Session\AccountSwitcherInterface + */ + protected $accountSwitcher; + + /** * Constructs a new message processor. */ - public function __construct(EntityManagerInterface $entity_manager, AnalyzerManagerInterface $analyzer_manager, HandlerManagerInterface $handler_manager, LoggerChannelInterface $logger_channel, ParserInterface $parser) { + public function __construct(EntityManagerInterface $entity_manager, AnalyzerManagerInterface $analyzer_manager, HandlerManagerInterface $handler_manager, LoggerChannelInterface $logger_channel, ParserInterface $parser, AccountSwitcherInterface $account_switcher) { $this->analyzerStorage = $entity_manager->getStorage('inmail_analyzer'); $this->analyzerManager = $analyzer_manager; $this->handlerStorage = $entity_manager->getStorage('inmail_handler'); $this->handlerManager = $handler_manager; $this->loggerChannel = $logger_channel; $this->parser = $parser; + $this->accountSwitcher = $account_switcher; } /** @@ -114,6 +124,11 @@ class MessageProcessor implements MessageProcessorInterface { $event and $event->addArgument(get_class($analyzer_result), $analyzer_result->summarize()); } + // Switch the user context. + // @todo: Replace anonymous user with the default user after + // https://www.drupal.org/node/2754253 gets in. + $this->accountSwitcher->switchTo(User::getAnonymousUser()); + // Handle message. foreach ($this->handlerStorage->loadMultiple() as $handler_config) { /** @var \Drupal\inmail\Entity\HandlerConfig $handler_config */ @@ -124,6 +139,9 @@ class MessageProcessor implements MessageProcessorInterface { } } + // Switch back to a previous account. + $this->accountSwitcher->switchBack(); + if ($event) { // Dump all log items into a past argument per source. foreach ($result->readLog() as $source => $log) {