Aucune description

LinkTokens.php 1.3KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. <?php declare(strict_types=1);
  2. namespace MailPoet\Subscribers;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\Entities\SubscriberEntity;
  5. class LinkTokens {
  6. private const OBSOLETE_LINK_TOKEN_LENGTH = 6;
  7. /** @var SubscribersRepository */
  8. private $subscribersRepository;
  9. public function __construct(
  10. SubscribersRepository $subscribersRepository
  11. ) {
  12. $this->subscribersRepository = $subscribersRepository;
  13. }
  14. public function getToken(SubscriberEntity $subscriber): string {
  15. if ($subscriber->getLinkToken() === null) {
  16. $subscriber->setLinkToken($this->generateToken($subscriber->getEmail()));
  17. $this->subscribersRepository->flush();
  18. }
  19. return (string)$subscriber->getLinkToken();
  20. }
  21. public function verifyToken(SubscriberEntity $subscriber, string $token) {
  22. $databaseToken = $this->getToken($subscriber);
  23. $requestToken = substr($token, 0, strlen($databaseToken));
  24. return hash_equals($databaseToken, $requestToken);
  25. }
  26. /**
  27. * Only for backward compatibility for old tokens
  28. */
  29. private function generateToken(?string $email, int $length = self::OBSOLETE_LINK_TOKEN_LENGTH): ?string {
  30. if ($email !== null) {
  31. $authKey = '';
  32. if (defined('AUTH_KEY')) {
  33. $authKey = AUTH_KEY;
  34. }
  35. return substr(md5($authKey . $email), 0, $length);
  36. }
  37. return null;
  38. }
  39. }