vendor/sylius/sylius/src/Sylius/Component/User/Model/User.php line 21

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Sylius package.
  4.  *
  5.  * (c) Paweł Jędrzejewski
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. declare(strict_types=1);
  11. namespace Sylius\Component\User\Model;
  12. use Doctrine\Common\Collections\ArrayCollection;
  13. use Doctrine\Common\Collections\Collection;
  14. use Sylius\Component\Resource\Model\TimestampableTrait;
  15. use Sylius\Component\Resource\Model\ToggleableTrait;
  16. class User implements UserInterface
  17. {
  18.     use TimestampableTraitToggleableTrait;
  19.     /** @var mixed */
  20.     protected $id;
  21.     /** @var string|null */
  22.     protected $username;
  23.     /**
  24.      * Normalized representation of a username.
  25.      *
  26.      * @var string|null
  27.      */
  28.     protected $usernameCanonical;
  29.     /**
  30.      * Random data that is used as an additional input to a function that hashes a password.
  31.      *
  32.      * @var string
  33.      */
  34.     protected $salt;
  35.     /**
  36.      * Encrypted password. Must be persisted.
  37.      *
  38.      * @var string|null
  39.      */
  40.     protected $password;
  41.     /**
  42.      * Password before encryption. Used for model validation. Must not be persisted.
  43.      *
  44.      * @var string|null
  45.      */
  46.     protected $plainPassword;
  47.     /** @var \DateTimeInterface|null */
  48.     protected $lastLogin;
  49.     /**
  50.      * Random string sent to the user email address in order to verify it
  51.      *
  52.      * @var string|null
  53.      */
  54.     protected $emailVerificationToken;
  55.     /**
  56.      * Random string sent to the user email address in order to verify the password resetting request
  57.      *
  58.      * @var string|null
  59.      */
  60.     protected $passwordResetToken;
  61.     /** @var \DateTimeInterface|null */
  62.     protected $passwordRequestedAt;
  63.     /** @var \DateTimeInterface|null */
  64.     protected $verifiedAt;
  65.     /** @var bool */
  66.     protected $locked false;
  67.     /** @var \DateTimeInterface|null */
  68.     protected $expiresAt;
  69.     /** @var \DateTimeInterface|null */
  70.     protected $credentialsExpireAt;
  71.     /**
  72.      * We need at least one role to be able to authenticate
  73.      *
  74.      * @var array
  75.      */
  76.     protected $roles = [UserInterface::DEFAULT_ROLE];
  77.     /**
  78.      * @var UserOAuthInterface[]
  79.      *
  80.      * @psalm-var Collection<array-key, UserOAuthInterface>
  81.      */
  82.     protected $oauthAccounts;
  83.     /** @var string|null */
  84.     protected $email;
  85.     /** @var string|null */
  86.     protected $emailCanonical;
  87.     /** @var string|null */
  88.     protected $encoderName;
  89.     public function __construct()
  90.     {
  91.         $this->salt base_convert(bin2hex(random_bytes(20)), 1636);
  92.         /** @var ArrayCollection<array-key, UserOAuthInterface> $this->oauthAccounts */
  93.         $this->oauthAccounts = new ArrayCollection();
  94.         $this->createdAt = new \DateTime();
  95.         // Set here to overwrite default value from trait
  96.         $this->enabled false;
  97.     }
  98.     public function __toString(): string
  99.     {
  100.         return (string) $this->getUsername();
  101.     }
  102.     public function getId()
  103.     {
  104.         return $this->id;
  105.     }
  106.     public function getEmail(): ?string
  107.     {
  108.         return $this->email;
  109.     }
  110.     public function setEmail(?string $email): void
  111.     {
  112.         $this->email $email;
  113.     }
  114.     public function getEmailCanonical(): ?string
  115.     {
  116.         return $this->emailCanonical;
  117.     }
  118.     public function setEmailCanonical(?string $emailCanonical): void
  119.     {
  120.         $this->emailCanonical $emailCanonical;
  121.     }
  122.     public function getUsername(): ?string
  123.     {
  124.         return $this->username;
  125.     }
  126.     public function setUsername(?string $username): void
  127.     {
  128.         $this->username $username;
  129.     }
  130.     public function getUsernameCanonical(): ?string
  131.     {
  132.         return $this->usernameCanonical;
  133.     }
  134.     public function setUsernameCanonical(?string $usernameCanonical): void
  135.     {
  136.         $this->usernameCanonical $usernameCanonical;
  137.     }
  138.     public function getSalt(): string
  139.     {
  140.         return $this->salt;
  141.     }
  142.     public function getPlainPassword(): ?string
  143.     {
  144.         return $this->plainPassword;
  145.     }
  146.     public function setPlainPassword(?string $password): void
  147.     {
  148.         $this->plainPassword $password;
  149.     }
  150.     public function getPassword(): ?string
  151.     {
  152.         return $this->password;
  153.     }
  154.     public function setPassword(?string $password): void
  155.     {
  156.         $this->password $password;
  157.     }
  158.     public function getExpiresAt(): ?\DateTimeInterface
  159.     {
  160.         return $this->expiresAt;
  161.     }
  162.     public function setExpiresAt(?\DateTimeInterface $date): void
  163.     {
  164.         $this->expiresAt $date;
  165.     }
  166.     public function getCredentialsExpireAt(): ?\DateTimeInterface
  167.     {
  168.         return $this->credentialsExpireAt;
  169.     }
  170.     public function setCredentialsExpireAt(?\DateTimeInterface $date): void
  171.     {
  172.         $this->credentialsExpireAt $date;
  173.     }
  174.     public function getLastLogin(): ?\DateTimeInterface
  175.     {
  176.         return $this->lastLogin;
  177.     }
  178.     public function setLastLogin(?\DateTimeInterface $time): void
  179.     {
  180.         $this->lastLogin $time;
  181.     }
  182.     public function getEmailVerificationToken(): ?string
  183.     {
  184.         return $this->emailVerificationToken;
  185.     }
  186.     public function setEmailVerificationToken(?string $verificationToken): void
  187.     {
  188.         $this->emailVerificationToken $verificationToken;
  189.     }
  190.     public function getPasswordResetToken(): ?string
  191.     {
  192.         return $this->passwordResetToken;
  193.     }
  194.     public function setPasswordResetToken(?string $passwordResetToken): void
  195.     {
  196.         $this->passwordResetToken $passwordResetToken;
  197.     }
  198.     public function isCredentialsNonExpired(): bool
  199.     {
  200.         return !$this->hasExpired($this->credentialsExpireAt);
  201.     }
  202.     public function isAccountNonExpired(): bool
  203.     {
  204.         return !$this->hasExpired($this->expiresAt);
  205.     }
  206.     public function setLocked(bool $locked): void
  207.     {
  208.         $this->locked $locked;
  209.     }
  210.     public function isAccountNonLocked(): bool
  211.     {
  212.         return !$this->locked;
  213.     }
  214.     public function hasRole(string $role): bool
  215.     {
  216.         return in_array(strtoupper($role), $this->getRoles(), true);
  217.     }
  218.     public function addRole(string $role): void
  219.     {
  220.         $role strtoupper($role);
  221.         if (!in_array($role$this->rolestrue)) {
  222.             $this->roles[] = $role;
  223.         }
  224.     }
  225.     public function removeRole(string $role): void
  226.     {
  227.         if (false !== $key array_search(strtoupper($role), $this->rolestrue)) {
  228.             unset($this->roles[$key]);
  229.             $this->roles array_values($this->roles);
  230.         }
  231.     }
  232.     public function getRoles(): array
  233.     {
  234.         return $this->roles;
  235.     }
  236.     public function isPasswordRequestNonExpired(\DateInterval $ttl): bool
  237.     {
  238.         if (null === $this->passwordRequestedAt) {
  239.             return false;
  240.         }
  241.         $threshold = new \DateTime();
  242.         $threshold->sub($ttl);
  243.         return $threshold <= $this->passwordRequestedAt;
  244.     }
  245.     public function getPasswordRequestedAt(): ?\DateTimeInterface
  246.     {
  247.         return $this->passwordRequestedAt;
  248.     }
  249.     public function setPasswordRequestedAt(?\DateTimeInterface $date): void
  250.     {
  251.         $this->passwordRequestedAt $date;
  252.     }
  253.     public function isVerified(): bool
  254.     {
  255.         return null !== $this->verifiedAt;
  256.     }
  257.     public function getVerifiedAt(): ?\DateTimeInterface
  258.     {
  259.         return $this->verifiedAt;
  260.     }
  261.     public function setVerifiedAt(?\DateTimeInterface $verifiedAt): void
  262.     {
  263.         $this->verifiedAt $verifiedAt;
  264.     }
  265.     public function eraseCredentials(): void
  266.     {
  267.         $this->plainPassword null;
  268.     }
  269.     public function getOAuthAccounts(): Collection
  270.     {
  271.         return $this->oauthAccounts;
  272.     }
  273.     public function getOAuthAccount(string $provider): ?UserOAuthInterface
  274.     {
  275.         if ($this->oauthAccounts->isEmpty()) {
  276.             return null;
  277.         }
  278.         $filtered $this->oauthAccounts->filter(function (UserOAuthInterface $oauth) use ($provider): bool {
  279.             return $provider === $oauth->getProvider();
  280.         });
  281.         if ($filtered->isEmpty()) {
  282.             return null;
  283.         }
  284.         return $filtered->current();
  285.     }
  286.     public function addOAuthAccount(UserOAuthInterface $oauth): void
  287.     {
  288.         if (!$this->oauthAccounts->contains($oauth)) {
  289.             $this->oauthAccounts->add($oauth);
  290.             $oauth->setUser($this);
  291.         }
  292.     }
  293.     public function getEncoderName(): ?string
  294.     {
  295.         return $this->encoderName;
  296.     }
  297.     public function setEncoderName(?string $encoderName): void
  298.     {
  299.         $this->encoderName $encoderName;
  300.     }
  301.     /**
  302.      * The serialized data have to contain the fields used by the equals method and the username.
  303.      */
  304.     public function serialize(): string
  305.     {
  306.         return serialize([
  307.             $this->password,
  308.             $this->salt,
  309.             $this->usernameCanonical,
  310.             $this->username,
  311.             $this->locked,
  312.             $this->enabled,
  313.             $this->id,
  314.             $this->encoderName,
  315.         ]);
  316.     }
  317.     /**
  318.      * @param string $serialized
  319.      */
  320.     public function unserialize($serialized): void
  321.     {
  322.         $data unserialize($serialized);
  323.         // add a few extra elements in the array to ensure that we have enough keys when unserializing
  324.         // older data which does not include all properties.
  325.         $data array_merge($dataarray_fill(02null));
  326.         [
  327.             $this->password,
  328.             $this->salt,
  329.             $this->usernameCanonical,
  330.             $this->username,
  331.             $this->locked,
  332.             $this->enabled,
  333.             $this->id,
  334.             $this->encoderName,
  335.         ] = $data;
  336.     }
  337.     protected function hasExpired(?\DateTimeInterface $date): bool
  338.     {
  339.         return null !== $date && new \DateTime() >= $date;
  340.     }
  341. }