Upgraded drupal core with security updates
[yaffs-website] / web / core / lib / Drupal / Core / Session / AccountProxy.php
1 <?php
2
3 namespace Drupal\Core\Session;
4
5 /**
6  * A proxied implementation of AccountInterface.
7  *
8  * The reason why we need an account proxy is that we don't want to have global
9  * state directly stored in the container.
10  *
11  * This proxy object avoids multiple invocations of the authentication manager
12  * which can happen if the current user is accessed in constructors. It also
13  * allows legacy code to change the current user where the user cannot be
14  * directly injected into dependent code.
15  */
16 class AccountProxy implements AccountProxyInterface {
17
18   /**
19    * The instantiated account.
20    *
21    * @var \Drupal\Core\Session\AccountInterface
22    */
23   protected $account;
24
25   /**
26    * Account id.
27    *
28    * @var int
29    */
30   protected $id = 0;
31
32   /**
33    * Initial account id.
34    *
35    * @var int
36    *
37    * @deprecated Scheduled for removal in Drupal 8.4.x. Use $this->id instead.
38    */
39   protected $initialAccountId;
40
41   /**
42    * {@inheritdoc}
43    */
44   public function setAccount(AccountInterface $account) {
45     // If the passed account is already proxied, use the actual account instead
46     // to prevent loops.
47     if ($account instanceof static) {
48       $account = $account->getAccount();
49     }
50     $this->account = $account;
51     $this->id = $account->id();
52     date_default_timezone_set(drupal_get_user_timezone());
53   }
54
55   /**
56    * {@inheritdoc}
57    */
58   public function getAccount() {
59     if (!isset($this->account)) {
60       if ($this->id) {
61         // After the container is rebuilt, DrupalKernel sets the initial
62         // account to the id of the logged in user. This is necessary in order
63         // to refresh the user account reference here.
64         $this->setAccount($this->loadUserEntity($this->id));
65       }
66       else {
67         $this->account = new AnonymousUserSession();
68       }
69     }
70
71     return $this->account;
72   }
73
74   /**
75    * {@inheritdoc}
76    */
77   public function id() {
78     return $this->id;
79   }
80
81   /**
82    * {@inheritdoc}
83    */
84   public function getRoles($exclude_locked_roles = FALSE) {
85     return $this->getAccount()->getRoles($exclude_locked_roles);
86   }
87
88   /**
89    * {@inheritdoc}
90    */
91   public function hasPermission($permission) {
92     return $this->getAccount()->hasPermission($permission);
93   }
94
95   /**
96    * {@inheritdoc}
97    */
98   public function isAuthenticated() {
99     return $this->getAccount()->isAuthenticated();
100   }
101
102   /**
103    * {@inheritdoc}
104    */
105   public function isAnonymous() {
106     return $this->getAccount()->isAnonymous();
107   }
108
109   /**
110    * {@inheritdoc}
111    */
112   public function getPreferredLangcode($fallback_to_default = TRUE) {
113     return $this->getAccount()->getPreferredLangcode($fallback_to_default);
114   }
115
116   /**
117    * {@inheritdoc}
118    */
119   public function getPreferredAdminLangcode($fallback_to_default = TRUE) {
120     return $this->getAccount()->getPreferredAdminLangcode($fallback_to_default);
121   }
122
123   /**
124    * {@inheritdoc}
125    */
126   public function getUsername() {
127     return $this->getAccountName();
128   }
129
130   /**
131    * {@inheritdoc}
132    */
133   public function getAccountName() {
134     return $this->getAccount()->getAccountName();
135   }
136
137   /**
138    * {@inheritdoc}
139    */
140   public function getDisplayName() {
141     return $this->getAccount()->getDisplayName();
142   }
143
144   /**
145    * {@inheritdoc}
146    */
147   public function getEmail() {
148     return $this->getAccount()->getEmail();
149   }
150
151   /**
152    * {@inheritdoc}
153    */
154   public function getTimeZone() {
155     return $this->getAccount()->getTimeZone();
156   }
157
158   /**
159    * {@inheritdoc}
160    */
161   public function getLastAccessedTime() {
162     return $this->getAccount()->getLastAccessedTime();
163   }
164
165   /**
166    * {@inheritdoc}
167    */
168   public function setInitialAccountId($account_id) {
169     if (isset($this->account)) {
170       throw new \LogicException('AccountProxyInterface::setInitialAccountId() cannot be called after an account was set on the AccountProxy');
171     }
172
173     $this->id = $this->initialAccountId = $account_id;
174   }
175
176   /**
177    * Load a user entity.
178    *
179    * The entity manager requires additional initialization code and cache
180    * clearing after the list of modules is changed. Therefore it is necessary to
181    * retrieve it as late as possible.
182    *
183    * Because of serialization issues it is currently not possible to inject the
184    * container into the AccountProxy. Thus it is necessary to retrieve the
185    * entity manager statically.
186    *
187    * @see https://www.drupal.org/node/2430447
188    *
189    * @param int $account_id
190    *   The id of an account to load.
191    *
192    * @return \Drupal\Core\Session\AccountInterface|null
193    *   An account or NULL if none is found.
194    */
195   protected function loadUserEntity($account_id) {
196     return \Drupal::entityManager()->getStorage('user')->load($account_id);
197   }
198
199 }