Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 3 |
CRAP | |
0.00% |
0 / 24 |
| AccountSwitcher | |
0.00% |
0 / 1 |
|
0.00% |
0 / 3 |
56 | |
0.00% |
0 / 24 |
| __construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
|||
| switchTo | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 8 |
|||
| switchBack | |
0.00% |
0 / 1 |
20 | |
0.00% |
0 / 13 |
|||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\Core\Session\AccountSwitcher. | |
| */ | |
| namespace Drupal\Core\Session; | |
| /** | |
| * An implementation of AccountSwitcherInterface. | |
| * | |
| * This allows for safe switching of user accounts by ensuring that session | |
| * data for one user is not leaked in to others. It also provides a stack that | |
| * allows reverting to a previous user after switching. | |
| */ | |
| class AccountSwitcher implements AccountSwitcherInterface { | |
| /** | |
| * A stack of previous overridden accounts. | |
| * | |
| * @var \Drupal\Core\Session\AccountInterface[] | |
| */ | |
| protected $accountStack = array(); | |
| /** | |
| * The current user service. | |
| * | |
| * @var \Drupal\Core\Session\AccountProxyInterface | |
| */ | |
| protected $currentUser = array(); | |
| /** | |
| * The write-safe session handler. | |
| * | |
| * @var \Drupal\Core\Session\WriteSafeSessionHandlerInterface | |
| */ | |
| protected $writeSafeHandler; | |
| /** | |
| * The original state of session saving prior to account switching. | |
| * | |
| * @var bool | |
| */ | |
| protected $originalSessionSaving; | |
| /** | |
| * Constructs a new AccountSwitcher. | |
| * | |
| * @param \Drupal\Core\Session\AccountProxyInterface $current_user | |
| * The current user service. | |
| * @param \Drupal\Core\Session\WriteSafeSessionHandlerInterface $write_safe_handler | |
| * The write-safe session handler. | |
| */ | |
| public function __construct(AccountProxyInterface $current_user, WriteSafeSessionHandlerInterface $write_safe_handler) { | |
| $this->currentUser = $current_user; | |
| $this->writeSafeHandler = $write_safe_handler; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function switchTo(AccountInterface $account) { | |
| // Prevent session information from being saved and push previous account. | |
| if (!isset($this->originalSessionSaving)) { | |
| // Ensure that only the first session saving status is saved. | |
| $this->originalSessionSaving = $this->writeSafeHandler->isSessionWritable(); | |
| } | |
| $this->writeSafeHandler->setSessionWritable(FALSE); | |
| array_push($this->accountStack, $this->currentUser->getAccount()); | |
| $this->currentUser->setAccount($account); | |
| return $this; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function switchBack() { | |
| // Restore the previous account from the stack. | |
| if (!empty($this->accountStack)) { | |
| $this->currentUser->setAccount(array_pop($this->accountStack)); | |
| } | |
| else { | |
| throw new \RuntimeException('No more accounts to revert to.'); | |
| } | |
| // Restore original session saving status if all account switches are | |
| // reverted. | |
| if (empty($this->accountStack)) { | |
| if ($this->originalSessionSaving) { | |
| $this->writeSafeHandler->setSessionWritable(TRUE); | |
| } | |
| } | |
| return $this; | |
| } | |
| } |