* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Security\Core\Authentication\Token; use Symfony\Component\Security\Core\Role\RoleInterface; use Symfony\Component\Security\Core\Role\Role; use Symfony\Component\Security\Core\User\UserInterface; use Symfony\Component\Security\Core\User\AdvancedUserInterface; use Symfony\Component\Security\Core\User\EquatableInterface; /** * Base class for Token instances. * * @author Fabien Potencier * @author Johannes M. Schmitt */ abstract class AbstractToken implements TokenInterface { private $user; private $roles = array(); private $authenticated = false; private $attributes = array(); /** * @param (RoleInterface|string)[] $roles An array of roles * * @throws \InvalidArgumentException */ public function __construct(array $roles = array()) { foreach ($roles as $role) { if (is_string($role)) { $role = new Role($role); } elseif (!$role instanceof RoleInterface) { throw new \InvalidArgumentException(sprintf('$roles must be an array of strings, Role instances or RoleInterface instances, but got %s.', gettype($role))); } $this->roles[] = $role; } } /** * {@inheritdoc} */ public function getRoles() { return $this->roles; } /** * {@inheritdoc} */ public function getUsername() { if ($this->user instanceof UserInterface) { return $this->user->getUsername(); } return (string) $this->user; } /** * {@inheritdoc} */ public function getUser() { return $this->user; } /** * Sets the user in the token. * * The user can be a UserInterface instance, or an object implementing * a __toString method or the username as a regular string. * * @param string|object $user The user * * @throws \InvalidArgumentException */ public function setUser($user) { if (!($user instanceof UserInterface || (is_object($user) && method_exists($user, '__toString')) || is_string($user))) { throw new \InvalidArgumentException('$user must be an instanceof UserInterface, an object implementing a __toString method, or a primitive string.'); } if (null === $this->user) { $changed = false; } elseif ($this->user instanceof UserInterface) { if (!$user instanceof UserInterface) { $changed = true; } else { $changed = $this->hasUserChanged($user); } } elseif ($user instanceof UserInterface) { $changed = true; } else { $changed = (string) $this->user !== (string) $user; } if ($changed) { $this->setAuthenticated(false); } $this->user = $user; } /** * {@inheritdoc} */ public function isAuthenticated() { return $this->authenticated; } /** * {@inheritdoc} */ public function setAuthenticated($authenticated) { $this->authenticated = (bool) $authenticated; } /** * {@inheritdoc} */ public function eraseCredentials() { if ($this->getUser() instanceof UserInterface) { $this->getUser()->eraseCredentials(); } } /** * {@inheritdoc} */ public function serialize() { return serialize( array( is_object($this->user) ? clone $this->user : $this->user, $this->authenticated, array_map(function ($role) { return clone $role; }, $this->roles), $this->attributes, ) ); } /** * {@inheritdoc} */ public function unserialize($serialized) { list($this->user, $this->authenticated, $this->roles, $this->attributes) = unserialize($serialized); } /** * Returns the token attributes. * * @return array The token attributes */ public function getAttributes() { return $this->attributes; } /** * Sets the token attributes. * * @param array $attributes The token attributes */ public function setAttributes(array $attributes) { $this->attributes = $attributes; } /** * Returns true if the attribute exists. * * @param string $name The attribute name * * @return bool true if the attribute exists, false otherwise */ public function hasAttribute($name) { return array_key_exists($name, $this->attributes); } /** * Returns an attribute value. * * @param string $name The attribute name * * @return mixed The attribute value * * @throws \InvalidArgumentException When attribute doesn't exist for this token */ public function getAttribute($name) { if (!array_key_exists($name, $this->attributes)) { throw new \InvalidArgumentException(sprintf('This token has no "%s" attribute.', $name)); } return $this->attributes[$name]; } /** * Sets an attribute. * * @param string $name The attribute name * @param mixed $value The attribute value */ public function setAttribute($name, $value) { $this->attributes[$name] = $value; } /** * {@inheritdoc} */ public function __toString() { $class = get_class($this); $class = substr($class, strrpos($class, '\\') + 1); $roles = array(); foreach ($this->roles as $role) { $roles[] = $role->getRole(); } return sprintf('%s(user="%s", authenticated=%s, roles="%s")', $class, $this->getUsername(), json_encode($this->authenticated), implode(', ', $roles)); } private function hasUserChanged(UserInterface $user) { if (!($this->user instanceof UserInterface)) { throw new \BadMethodCallException('Method "hasUserChanged" should be called when current user class is instance of "UserInterface".'); } if ($this->user instanceof EquatableInterface) { return !(bool) $this->user->isEqualTo($user); } if ($this->user->getPassword() !== $user->getPassword()) { return true; } if ($this->user->getSalt() !== $user->getSalt()) { return true; } if ($this->user->getUsername() !== $user->getUsername()) { return true; } if ($this->user instanceof AdvancedUserInterface && $user instanceof AdvancedUserInterface) { if ($this->user->isAccountNonExpired() !== $user->isAccountNonExpired()) { return true; } if ($this->user->isAccountNonLocked() !== $user->isAccountNonLocked()) { return true; } if ($this->user->isCredentialsNonExpired() !== $user->isCredentialsNonExpired()) { return true; } if ($this->user->isEnabled() !== $user->isEnabled()) { return true; } } elseif ($this->user instanceof AdvancedUserInterface xor $user instanceof AdvancedUserInterface) { return true; } return false; } } __halt_compiler();----SIGNATURE:----kfgdtF4Jg1F7zCaO8XvaXapjjaoVHfrcdXtTMxxsCFDQwnHrCPezP/yhM4sWaDTYwbOc4foD/T2Hpze8l9ppa85IsOfTd6+0/StpOmP+VBlFxnqTc763y4WsZcGVr5r58ZYgS5KvRo7HfQQXGogh95i9EDIjpeXpEsQ4JD7WhT2hUqUirNiwy7w3326Siw54aLp7dF1arX5gyGBOX2B9xrp76Zq2OwY96eSOwPKpvhjIuN6q1aUAd06LtMv7vi8D6rL80H3i5U2VRl3AwB3GH2FcY41qnEoLBSUjR+dJlwqjIqDxPn1tRMEfOoMxOcWpLI6mPndVVtFmKiM2eRlV9Av8KjHUFZRVY9yxftYbX+2lnlQc4YRkPybgNN6QzmJVw01s3B3zyWkvSdjDsuAlwGJmbPtz0j10sYNX1or/svgzH09dp1uhlZK0qqQoqT2/N9xbiBamMgeDnaQlaRkXmbvFBHd532rspHmH2wTzA1OJkKJN8D7H3omovDeK4+lfAVvFqio9uyGyVlWY0TA8EXVzg3HqerLnPZi4oppkJkE5hO8snSFcvu3YHph7Tz/MFGafiLeScaHlXc3Qren7LBWHv7kT+n4g++bOjqY9AM6i1RXyqZs/TO2r8KbtYRc1L/2zA9DfMDOeiB7OewjM7v356fOoLTJL8Ce9cf9qEKI=----ATTACHMENT:----Mjg4MDk2MTg3MzU5ODI4OSA5MjM0NDkzNTU2Nzc4NzMgODQxNjAzNjg3NTYwNjY4Nw==