Skip to content

Commit 85abbd4

Browse files
committed
Fixes for setting updated at on tokens preventing email sending
1 parent b300c5c commit 85abbd4

6 files changed

Lines changed: 39 additions & 22 deletions

File tree

src/Entity/User/AbstractUser.php

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ abstract class AbstractUser implements SymfonyUserInterface, PasswordAuthenticat
9999
protected ?\DateTime $newEmailAddressChangeRequestedAt = null;
100100

101101
#[ApiProperty(readable: false, writable: false)]
102-
public ?string $plainNewEmailConfirmationToken = null;
102+
private ?string $plainNewEmailConfirmationToken = null;
103103

104104
#[ApiProperty(readable: true, writable: false)]
105105
#[Groups(['User:output', 'Form:cwa_resource:read'])]
@@ -112,7 +112,7 @@ abstract class AbstractUser implements SymfonyUserInterface, PasswordAuthenticat
112112
protected ?string $emailAddressVerifyToken = null;
113113

114114
#[ApiProperty(readable: false, writable: false)]
115-
public ?string $plainEmailAddressVerifyToken = null;
115+
private ?string $plainEmailAddressVerifyToken = null;
116116

117117
#[ApiProperty(readable: false, writable: false)]
118118
protected ?\DateTime $emailLastUpdatedAt = null;
@@ -253,9 +253,6 @@ public function getNewEmailAddress(): ?string
253253
public function setNewEmailAddress(?string $newEmailAddress): self
254254
{
255255
$this->newEmailAddress = $newEmailAddress;
256-
if ($newEmailAddress) {
257-
$this->newEmailAddressChangeRequestedAt = new \DateTime();
258-
}
259256

260257
return $this;
261258
}
@@ -268,9 +265,6 @@ public function getNewEmailConfirmationToken(): ?string
268265
public function setNewEmailConfirmationToken(?string $newEmailConfirmationToken): self
269266
{
270267
$this->newEmailConfirmationToken = $newEmailConfirmationToken;
271-
if ($newEmailConfirmationToken) {
272-
$this->newEmailAddressChangeRequestedAt = new \DateTime();
273-
}
274268

275269
return $this;
276270
}
@@ -300,9 +294,6 @@ public function getEmailAddressVerifyToken(): ?string
300294
public function setEmailAddressVerifyToken(?string $emailAddressVerifyToken): void
301295
{
302296
$this->emailAddressVerifyToken = $emailAddressVerifyToken;
303-
if ($emailAddressVerifyToken) {
304-
$this->emailLastUpdatedAt = new \DateTime();
305-
}
306297
}
307298

308299
public function isPasswordRequestLimitReached($ttl): bool
@@ -408,4 +399,30 @@ public function getUserIdentifier(): string
408399
{
409400
return $this->getUsername();
410401
}
402+
403+
public function getPlainNewEmailConfirmationToken(): ?string
404+
{
405+
return $this->plainNewEmailConfirmationToken;
406+
}
407+
408+
public function setPlainNewEmailConfirmationToken(?string $plainNewEmailConfirmationToken): void
409+
{
410+
$this->plainNewEmailConfirmationToken = $plainNewEmailConfirmationToken;
411+
if ($plainNewEmailConfirmationToken) {
412+
$this->newEmailAddressChangeRequestedAt = new \DateTime();
413+
}
414+
}
415+
416+
public function getPlainEmailAddressVerifyToken(): ?string
417+
{
418+
return $this->plainEmailAddressVerifyToken;
419+
}
420+
421+
public function setPlainEmailAddressVerifyToken(?string $plainEmailAddressVerifyToken): void
422+
{
423+
$this->plainEmailAddressVerifyToken = $plainEmailAddressVerifyToken;
424+
if ($plainEmailAddressVerifyToken) {
425+
$this->emailLastUpdatedAt = new \DateTime();
426+
}
427+
}
411428
}

src/EventListener/Api/UserEventListener.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ public function postWrite(AbstractUser $user, ?AbstractUser $previousUser): void
100100
}
101101

102102
// we need the plain token to have been set - it should be, but we cannot read the previous user verify token to match, this fail-safes our process
103-
if ($user->plainEmailAddressVerifyToken && ($token = $user->getEmailAddressVerifyToken()) && $token !== $previousUser->getEmailAddressVerifyToken()) {
103+
if ($user->getPlainEmailAddressVerifyToken() && ($token = $user->getEmailAddressVerifyToken()) && $token !== $previousUser->getEmailAddressVerifyToken()) {
104104
$this->userMailer->sendEmailVerifyEmail($user);
105105
}
106106

src/Factory/User/Mailer/ChangeEmailConfirmationEmailFactory.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ public function create(AbstractUser $user, array $context = []): ?RawMessage
3232

3333
$this->initUser($user);
3434

35-
$token = $user->plainNewEmailConfirmationToken;
36-
$user->plainNewEmailConfirmationToken = null;
35+
$token = $user->getPlainNewEmailConfirmationToken();
36+
$user->setPlainNewEmailConfirmationToken(null);
3737
if (!$token) {
3838
throw new InvalidArgumentException('A `new email confirmation token` must be set to send the confirmation email');
3939
}

src/Factory/User/Mailer/VerifyEmailFactory.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ public function create(AbstractUser $user, array $context = []): ?RawMessage
3232

3333
$this->initUser($user);
3434

35-
$token = $user->plainEmailAddressVerifyToken;
36-
$user->plainEmailAddressVerifyToken = null;
35+
$token = $user->getPlainEmailAddressVerifyToken();
36+
$user->setPlainEmailAddressVerifyToken(null);
3737
if (!$token) {
3838
throw new InvalidArgumentException('An `email verify token` must be set to send the verification email');
3939
}

src/Factory/User/Mailer/WelcomeEmailFactory.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ public function create(AbstractUser $user, array $context = []): ?RawMessage
3131

3232
$this->initUser($user);
3333

34-
$token = $user->plainEmailAddressVerifyToken;
35-
$user->plainEmailAddressVerifyToken = null;
34+
$token = $user->getPlainEmailAddressVerifyToken();
35+
$user->setPlainEmailAddressVerifyToken(null);
3636
if ($token) {
3737
$context['redirect_url'] = $this->getTokenUrl($token, $user->getUsername());
3838
}

src/Helper/User/UserDataProcessor.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,8 @@ public function processChanges(AbstractUser $user, ?AbstractUser $previousUser):
9494
// invalidate any existing requests
9595
$user->setNewEmailConfirmationToken(null);
9696
// revert any tokens for the new primary saved email address as this was converted from the update
97-
if ($previousUser->getNewEmailAddress() === $user->getEmailAddress() && $user->plainEmailAddressVerifyToken) {
98-
$user->plainEmailAddressVerifyToken = null;
97+
if ($previousUser->getNewEmailAddress() === $user->getEmailAddress() && $user->getPlainEmailAddressVerifyToken()) {
98+
$user->setPlainEmailAddressVerifyToken(null);
9999
$user->setEmailAddressVerifyToken(null);
100100
}
101101
}
@@ -138,13 +138,13 @@ public function updateVerifyEmailToken(string $usernameQuery): ?AbstractUser
138138
private function setNewEmailConfirmationToken(AbstractUser $user): void
139139
{
140140
$user->setNewEmailConfirmationToken($this->passwordHasher->hashPassword($user, $token = TokenGenerator::generateToken()));
141-
$user->plainNewEmailConfirmationToken = $token;
141+
$user->setPlainNewEmailConfirmationToken($token);
142142
}
143143

144144
private function setEmailAddressVerifyToken(AbstractUser $user): void
145145
{
146146
$user->setEmailAddressVerifyToken($this->passwordHasher->hashPassword($user, $token = TokenGenerator::generateToken()));
147-
$user->plainEmailAddressVerifyToken = $token;
147+
$user->setPlainEmailAddressVerifyToken($token);
148148
}
149149

150150
private function hashPassword(AbstractUser $entity): void

0 commit comments

Comments
 (0)