Skip to content

Commit 157749f

Browse files
committed
Send by username without permissions required
1 parent 80d6329 commit 157749f

4 files changed

Lines changed: 64 additions & 24 deletions

File tree

features/user/new_email_address.feature

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,16 @@ Feature: Register process via a form
161161
And the JSON node "newEmailConfirmationToken" should not exist
162162
And I should not receive any emails
163163

164+
@loginUser
165+
Scenario: I can resend a new email address confirmation email with a new token
166+
Given there is a "new_email" form
167+
And there is a user with the username "another_user" password "password" and role "ROLE_USER"
168+
And I add "referer" header equal to "http://www.website.com"
169+
When I send a "GET" request to "/confirm-email/my_username/new@email.com/abc123"
170+
Then the response status code should be 201
171+
And the JSON node "newEmailConfirmationToken" should not exist
172+
And I should not receive any emails
173+
164174
Scenario: I can verify my new email address
165175
Given there is a user with the username "my_username" password "password" and role "ROLE_USER" and the email address "old@email.com"
166176
And the user has a new email address "new@email.com" and confirmation token abc123

src/Action/User/ResendVerifyEmailAddressAction.php

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,8 @@
1313

1414
namespace Silverback\ApiComponentsBundle\Action\User;
1515

16-
use Silverback\ApiComponentsBundle\Entity\User\AbstractUser;
1716
use Silverback\ApiComponentsBundle\Helper\User\UserDataProcessor;
1817
use Silverback\ApiComponentsBundle\Helper\User\UserMailer;
19-
use Symfony\Bundle\SecurityBundle\Security;
2018
use Symfony\Component\HttpFoundation\Response;
2119

2220
/**
@@ -27,17 +25,22 @@
2725
public function __construct(
2826
private UserMailer $userMailer,
2927
private UserDataProcessor $userDataProcessor,
30-
private Security $security,
3128
) {
3229
}
3330

34-
public function __invoke(string $username, string $token): Response
31+
public function __invoke(string $username): Response
3532
{
36-
$user = $this->security->getUser();
37-
if (!$user instanceof AbstractUser) {
38-
return new Response(null, Response::HTTP_UNAUTHORIZED);
33+
$user = $this->userDataProcessor->updateVerifyEmailToken($username);
34+
if (!$user) {
35+
$response = new Response(null, Response::HTTP_OK);
36+
$response->setCache([
37+
'private' => true,
38+
's_maxage' => 0,
39+
'max_age' => 0,
40+
]);
41+
return $response;
3942
}
40-
$this->userDataProcessor->setEmailAddressVerifyToken($user);
43+
4144
$emailSuccess = $this->userMailer->sendEmailVerifyEmail($user);
4245

4346
$response = new Response(null, $emailSuccess ? Response::HTTP_OK : Response::HTTP_SERVICE_UNAVAILABLE);

src/Action/User/ResendVerifyNewEmailAddressAction.php

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,8 @@
1313

1414
namespace Silverback\ApiComponentsBundle\Action\User;
1515

16-
use Silverback\ApiComponentsBundle\Entity\User\AbstractUser;
1716
use Silverback\ApiComponentsBundle\Helper\User\UserDataProcessor;
1817
use Silverback\ApiComponentsBundle\Helper\User\UserMailer;
19-
use Symfony\Bundle\SecurityBundle\Security;
2018
use Symfony\Component\HttpFoundation\Response;
2119

2220
/**
@@ -27,17 +25,21 @@
2725
public function __construct(
2826
private UserMailer $userMailer,
2927
private UserDataProcessor $userDataProcessor,
30-
private Security $security,
3128
) {
3229
}
3330

34-
public function __invoke(string $username, string $token): Response
31+
public function __invoke(string $username): Response
3532
{
36-
$user = $this->security->getUser();
37-
if (!$user instanceof AbstractUser) {
38-
return new Response(null, Response::HTTP_UNAUTHORIZED);
33+
$user = $this->userDataProcessor->updateNewEmailToken($username);
34+
if (!$user) {
35+
$response = new Response(null, Response::HTTP_OK);
36+
$response->setCache([
37+
'private' => true,
38+
's_maxage' => 0,
39+
'max_age' => 0,
40+
]);
41+
return $response;
3942
}
40-
$this->userDataProcessor->setNewEmailConfirmationToken($user);
4143
$emailSuccess = $this->userMailer->sendChangeEmailConfirmationEmail($user);
4244

4345
$response = new Response(null, $emailSuccess ? Response::HTTP_OK : Response::HTTP_SERVICE_UNAVAILABLE);

src/Helper/User/UserDataProcessor.php

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,8 @@ public function __construct(
3939

4040
public function updatePasswordConfirmationToken(string $usernameQuery): ?AbstractUser
4141
{
42-
$user = $this->userRepository->loadUserByIdentifier($usernameQuery);
43-
if (!$user) {
44-
throw new InvalidArgumentException('Username not found');
45-
}
46-
47-
if ($user->isPasswordRequestLimitReached($this->tokenTtl)) {
42+
$user = $this->findUserByUsername($usernameQuery);
43+
if (!$user || $user->isPasswordRequestLimitReached($this->tokenTtl)) {
4844
return null;
4945
}
5046

@@ -107,13 +103,42 @@ public function processChanges(AbstractUser $user, ?AbstractUser $previousUser):
107103
}
108104
}
109105

110-
public function setNewEmailConfirmationToken(AbstractUser $user): void
106+
private function findUserByUsername(string $usernameQuery): ?AbstractUser
107+
{
108+
$user = $this->userRepository->loadUserByIdentifier($usernameQuery);
109+
if (!$user) {
110+
throw new InvalidArgumentException('Username not found');
111+
}
112+
return $user;
113+
}
114+
115+
public function updateNewEmailToken(string $usernameQuery): ?AbstractUser
116+
{
117+
$user = $this->findUserByUsername($usernameQuery);
118+
if (!$user) {
119+
return null;
120+
}
121+
$this->setNewEmailConfirmationToken($user);
122+
return $user;
123+
}
124+
125+
public function updateVerifyEmailToken(string $usernameQuery): ?AbstractUser
126+
{
127+
$user = $this->findUserByUsername($usernameQuery);
128+
if (!$user) {
129+
return null;
130+
}
131+
$this->setEmailAddressVerifyToken($user);
132+
return $user;
133+
}
134+
135+
private function setNewEmailConfirmationToken(AbstractUser $user): void
111136
{
112137
$user->setNewEmailConfirmationToken($this->passwordHasher->hashPassword($user, $token = TokenGenerator::generateToken()));
113138
$user->plainNewEmailConfirmationToken = $token;
114139
}
115140

116-
public function setEmailAddressVerifyToken(AbstractUser $user): void
141+
private function setEmailAddressVerifyToken(AbstractUser $user): void
117142
{
118143
$user->setEmailAddressVerifyToken($this->passwordHasher->hashPassword($user, $token = TokenGenerator::generateToken()));
119144
$user->plainEmailAddressVerifyToken = $token;

0 commit comments

Comments
 (0)