Commit d2f1171d authored by Kurucz István's avatar Kurucz István
Browse files

Issue #3301672: Redirect message not show, if page is cached before

parent dfda7e9b
Loading
Loading
Loading
Loading
+0 −25
Original line number Diff line number Diff line
@@ -22,31 +22,6 @@ function redirect_after_logout_help($route_name, RouteMatchInterface $route_matc
  }
}

/**
 * Implements hook_page_attachments().
 */
function redirect_after_logout_page_attachments(array &$attachments) {
  $parameter_bag = \Drupal::request()->query;
  // Set logout message.
  if ((bool) $parameter_bag->get('logout-message') && \Drupal::currentUser()->isAnonymous()) {
    $config = \Drupal::config('redirect_after_logout.settings');
    $logout_message = $config->get('message');
    $token_service = \Drupal::token();
    \Drupal::messenger()->addMessage(Xss::filter($token_service->replace($logout_message)));
  }
  elseif ((bool) $parameter_bag->get('logout-message') && !\Drupal::currentUser()->isAnonymous()) {
    $destination = \Drupal::service('redirect.destination')->getAsArray();
    $current_url = Url::fromRoute('<current>');
    $path = $current_url->getInternalPath();
    $path_args = explode('/', $path);
    if ($path_args !== FALSE) {
      $destination = implode('/', $path_args);
    }
    $response = new RedirectResponse($destination);
    $response->send();
  }
}

/**
 * Implements hook_user_logout().
 */
+7 −1
Original line number Diff line number Diff line
services:
  redirect_after_logout_subscriber:
    class: 'Drupal\redirect_after_logout\EventSubscriber\RedirectAfterLogoutSubscriber'
    arguments: ['@config.factory']
    arguments:
      - '@config.factory'
      - '@current_user'
      - '@messenger'
      - '@redirect.destination'
      - '@request_stack'
      - '@token'
    tags:
      - { name: 'event_subscriber' }
+95 −2
Original line number Diff line number Diff line
@@ -3,10 +3,17 @@
namespace Drupal\redirect_after_logout\EventSubscriber;

use Drupal\Component\Utility\UrlHelper;
use Drupal\Component\Utility\Xss;
use Drupal\Core\Config\ConfigFactory;
use Drupal\Core\Messenger\MessengerInterface;
use Drupal\Core\Routing\RedirectDestinationInterface;
use Drupal\Core\Session\AccountProxyInterface;
use Drupal\Core\Url;
use Drupal\Core\Utility\Token;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;

@@ -25,10 +32,68 @@ class RedirectAfterLogoutSubscriber implements EventSubscriberInterface {
  protected $configFactory;

  /**
   * {@inheritdoc}
   * The current user.
   *
   * @var \Drupal\Core\Session\AccountProxyInterface
   */
  protected $currentUser;

  /**
   * The messenger.
   *
   * @var \Drupal\Core\Messenger\MessengerInterface
   */
  protected $messenger;

  /**
   * The redirect destination.
   *
   * @var \Drupal\Core\Routing\RedirectDestinationInterface
   */
  protected $redirectDestination;

  /**
   * The request stack.
   *
   * @var \Symfony\Component\HttpFoundation\RequestStack
   */
  protected $requestStack;

  /**
   * The token service.
   *
   * @var \Drupal\Core\Utility\Token
   */
  protected $token;

  /**
   * Constructor.
   *
   * @param \Drupal\Core\Config\ConfigFactory
   *   The config factory.
   * @param \Drupal\Core\Session\AccountProxyInterface
   *   The current user.
   * @param \Drupal\Core\Messenger\MessengerInterface $messenger
   *   The messenger.
   * @param RedirectDestinationInterface $redirectDestination
   *   The redirect destination.
   * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
   *   The request stack.
   * @param \Drupal\Core\Utility\Token $token
   *   The token service.
   */
  public function __construct(ConfigFactory $configFactory) {
  public function __construct(ConfigFactory $configFactory,
                              AccountProxyInterface $currentUser,
                              MessengerInterface $messenger,
                              RedirectDestinationInterface $redirectDestination,
                              RequestStack $request_stack,
                              Token $token) {
    $this->configFactory = $configFactory;
    $this->currentUser = $currentUser;
    $this->messenger = $messenger;
    $this->redirectDestination = $redirectDestination;
    $this->requestStack = $request_stack;
    $this->token = $token;
  }

  /**
@@ -69,12 +134,40 @@ class RedirectAfterLogoutSubscriber implements EventSubscriberInterface {
    $response->send();
  }

  /**
   * Check redirection.
   *
   * @param \Symfony\Component\HttpKernel\Event\ResponseEvent $event
   *   Event.
   */
  public function showMessage(RequestEvent $event) {
    $parameter_bag = $this->requestStack->getCurrentRequest()->query;
    // Set logout message.
    if ((bool) $parameter_bag->get('logout-message') && $this->currentUser->isAnonymous()) {
      $config = $this->configFactory->get('redirect_after_logout.settings');
      $logout_message = $config->get('message');
      $this->messenger->addMessage(Xss::filter($this->token->replace($logout_message)));
    }
    elseif ((bool) $parameter_bag->get('logout-message') && !$this->currentUser->isAnonymous()) {
      $destination = $this->redirectDestination->getAsArray();
      $current_url = Url::fromRoute('<current>');
      $path = $current_url->getInternalPath();
      $path_args = explode('/', $path);
      if ($path_args !== FALSE) {
        $destination = implode('/', $path_args);
      }
      $response = new RedirectResponse($destination);
      $response->send();
    }
  }

  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents() {
    $events = [];
    $events[KernelEvents::RESPONSE][] = ['checkRedirection'];
    $events[KernelEvents::REQUEST][] = ['showMessage', 50];
    return $events;
  }

+0 −3
Original line number Diff line number Diff line
@@ -41,9 +41,6 @@ class RedirectTest extends TestBase {
    // Valid node path.
    $this->setRedirectConfig('/foobar-example', $message);
    $this->logoutRedirectHelper($this->regularUser, '/foobar-example', $message);
    // Path only token.
    $this->setRedirectConfig('[current-user:url]', $message);
    $this->logoutRedirectHelper($this->regularUser, $this->regularUser->toUrl()->toString(), $message);
    // Path with token.
    $this->setRedirectConfig('/foobar-[site:name]', $message);
    $this->logoutRedirectHelper($this->regularUser, '/foobar-example', $message);