Security update for Core, with self-updated composer
[yaffs-website] / web / core / modules / user / src / EventSubscriber / UserRequestSubscriber.php
1 <?php
2
3 namespace Drupal\user\EventSubscriber;
4
5 use Drupal\Core\Entity\EntityManagerInterface;
6 use Drupal\Core\Session\AccountInterface;
7 use Drupal\Core\Site\Settings;
8 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
9 use Symfony\Component\HttpKernel\Event\PostResponseEvent;
10 use Symfony\Component\HttpKernel\KernelEvents;
11
12 /**
13  * Updates the current user's last access time.
14  */
15 class UserRequestSubscriber implements EventSubscriberInterface {
16
17   /**
18    * The current account.
19    *
20    * @var \Drupal\Core\Session\AccountInterface
21    */
22   protected $account;
23
24   /**
25    * The entity manager.
26    *
27    * @var \Drupal\Core\Entity\EntityManagerInterface
28    */
29   protected $entityManager;
30
31   /**
32    * Constructs a new UserRequestSubscriber.
33    *
34    * @param \Drupal\Core\Session\AccountInterface $account
35    *   The current user.
36    * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
37    *   The entity manager.
38    */
39   public function __construct(AccountInterface $account, EntityManagerInterface $entity_manager) {
40     $this->account = $account;
41     $this->entityManager = $entity_manager;
42   }
43
44   /**
45    * Updates the current user's last access time.
46    *
47    * @param \Symfony\Component\HttpKernel\Event\PostResponseEvent $event
48    *   The event to process.
49    */
50   public function onKernelTerminate(PostResponseEvent $event) {
51     if ($this->account->isAuthenticated() && REQUEST_TIME - $this->account->getLastAccessedTime() > Settings::get('session_write_interval', 180)) {
52       // Do that no more than once per 180 seconds.
53       /** @var \Drupal\user\UserStorageInterface $storage */
54       $storage = $this->entityManager->getStorage('user');
55       $storage->updateLastAccessTimestamp($this->account, REQUEST_TIME);
56     }
57   }
58
59   /**
60    * {@inheritdoc}
61    */
62   public static function getSubscribedEvents() {
63     // Should go before other subscribers start to write their caches. Notably
64     // before \Drupal\Core\EventSubscriber\KernelDestructionSubscriber to
65     // prevent instantiation of destructed services.
66     $events[KernelEvents::TERMINATE][] = ['onKernelTerminate', 300];
67     return $events;
68   }
69
70 }