Skip to content

Commit b300c5c

Browse files
committed
Rate limiting same as password reset for the resending of email confirmation emails
1 parent 9fa5dc9 commit b300c5c

2 files changed

Lines changed: 24 additions & 2 deletions

File tree

src/Entity/User/AbstractUser.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,9 @@ public function getNewEmailConfirmationToken(): ?string
268268
public function setNewEmailConfirmationToken(?string $newEmailConfirmationToken): self
269269
{
270270
$this->newEmailConfirmationToken = $newEmailConfirmationToken;
271+
if ($newEmailConfirmationToken) {
272+
$this->newEmailAddressChangeRequestedAt = new \DateTime();
273+
}
271274

272275
return $this;
273276
}
@@ -297,6 +300,9 @@ public function getEmailAddressVerifyToken(): ?string
297300
public function setEmailAddressVerifyToken(?string $emailAddressVerifyToken): void
298301
{
299302
$this->emailAddressVerifyToken = $emailAddressVerifyToken;
303+
if ($emailAddressVerifyToken) {
304+
$this->emailLastUpdatedAt = new \DateTime();
305+
}
300306
}
301307

302308
public function isPasswordRequestLimitReached($ttl): bool
@@ -307,6 +313,22 @@ public function isPasswordRequestLimitReached($ttl): bool
307313
&& $lastRequest->getTimestamp() + $ttl > time();
308314
}
309315

316+
public function isNewEmailVerifyRequestLimitReached($ttl): bool
317+
{
318+
$lastRequest = $this->getNewEmailAddressChangeRequestedAt();
319+
320+
return $lastRequest instanceof \DateTime
321+
&& $lastRequest->getTimestamp() + $ttl > time();
322+
}
323+
324+
public function isEmailVerifyRequestLimitReached($ttl): bool
325+
{
326+
$lastRequest = $this->emailLastUpdatedAt;
327+
328+
return $lastRequest instanceof \DateTime
329+
&& $lastRequest->getTimestamp() + $ttl > time();
330+
}
331+
310332
/** @see \Serializable::serialize() */
311333
public function serialize(): string
312334
{

src/Helper/User/UserDataProcessor.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ private function findUserByUsername(string $usernameQuery): ?AbstractUser
116116
public function updateNewEmailToken(string $usernameQuery): ?AbstractUser
117117
{
118118
$user = $this->findUserByUsername($usernameQuery);
119-
if (!$user) {
119+
if (!$user || $user->isNewEmailVerifyRequestLimitReached($this->tokenTtl)) {
120120
return null;
121121
}
122122
$this->setNewEmailConfirmationToken($user);
@@ -127,7 +127,7 @@ public function updateNewEmailToken(string $usernameQuery): ?AbstractUser
127127
public function updateVerifyEmailToken(string $usernameQuery): ?AbstractUser
128128
{
129129
$user = $this->findUserByUsername($usernameQuery);
130-
if (!$user) {
130+
if (!$user || $user->isEmailVerifyRequestLimitReached($this->tokenTtl)) {
131131
return null;
132132
}
133133
$this->setEmailAddressVerifyToken($user);

0 commit comments

Comments
 (0)