Skip to content

Commit 21d312c

Browse files
committed
Fix email verification logic
1 parent fc00d29 commit 21d312c

2 files changed

Lines changed: 41 additions & 33 deletions

File tree

src/Controllers/LoginController.php

Lines changed: 40 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use App\Repositories\AuthorizationCodeRepository;
77
use App\Repositories\StreamRepository;
88
use App\Repositories\UserRepository;
9+
use App\Models\User;
910
use App\Services\ApiWrapper;
1011
use Exception;
1112
use MailchimpTransactional\ApiClient;
@@ -50,6 +51,7 @@ public function login(Request $request, Response $response): Response
5051

5152
if ($user && password_verify($password, $user->password)) {
5253
if (isset($user->email_verified) && !$user->email_verified) {
54+
$this->sendVerificationEmail($request, $user);
5355
$this->messages->addMessage('email_not_verified', true);
5456
return $this->redirectToRoute($request, $response, 'app_index');
5557
}
@@ -94,40 +96,9 @@ public function register(Request $request, Response $response): Response
9496

9597
// Créer l'utilisateur (email non vérifié)
9698
$user = $this->userRepository->insertWithPassword($email, $password);
97-
$user = $this->userRepository->insertResetToken($user);
9899

99100
// Envoyer l'email de vérification
100-
$routeParser = RouteContext::fromRequest($request)->getRouteParser();
101-
$verifyUrl = $_SERVER['WEBSITE_DOMAIN'] . $routeParser->urlFor('app_verify_email', ["token" => $user->reset_token]);
102-
103-
try {
104-
$result = $this->mailchimp->messages->send([
105-
"message" => [
106-
"from_email" => "contact@helloasso.io",
107-
"from_name" => "HelloAsso",
108-
"subject" => "Confirmez votre adresse email",
109-
"html" => $this->buildVerificationEmail($verifyUrl),
110-
"to" => [["email" => $user->email, "type" => "to"]],
111-
],
112-
]);
113-
114-
// Le client Mandrill retourne l'exception au lieu de la lancer
115-
if ($result instanceof Exception) {
116-
throw $result;
117-
}
118-
119-
// Vérifier le statut de l'envoi Mandrill
120-
if (is_array($result) && isset($result[0]->status) && in_array($result[0]->status, ['rejected', 'invalid'])) {
121-
throw new Exception('Email rejeté par Mandrill : ' . ($result[0]->reject_reason ?? 'raison inconnue'));
122-
}
123-
} catch (Exception $e) {
124-
$this->logger->error('Échec de l\'envoi de l\'email de vérification', [
125-
'email' => $user->email,
126-
'error' => $e->getMessage(),
127-
]);
128-
$this->messages->addMessage('register_error', 'Votre compte a été créé mais l\'email de vérification n\'a pas pu être envoyé. Veuillez réessayer plus tard.');
129-
return $this->redirectToRoute($request, $response, 'app_register');
130-
}
101+
$this->sendVerificationEmail($request, $user);
131102

132103
$this->messages->addMessage('register_success', true);
133104
return $this->redirectToRoute($request, $response, 'app_index');
@@ -180,6 +151,43 @@ private function validatePassword(string $password, string $passwordRepeat): arr
180151
return $errors;
181152
}
182153

154+
/**
155+
* Envoie (ou renvoie) l'email de vérification à un utilisateur.
156+
* Génère un nouveau token de réinitialisation avant l'envoi.
157+
*/
158+
private function sendVerificationEmail(Request $request, User $user): void
159+
{
160+
$user = $this->userRepository->insertResetToken($user);
161+
162+
$routeParser = RouteContext::fromRequest($request)->getRouteParser();
163+
$verifyUrl = $_SERVER['WEBSITE_DOMAIN'] . $routeParser->urlFor('app_verify_email', ["token" => $user->reset_token]);
164+
165+
try {
166+
$result = $this->mailchimp->messages->send([
167+
"message" => [
168+
"from_email" => "contact@helloasso.io",
169+
"from_name" => "HelloAsso",
170+
"subject" => "Confirmez votre adresse email",
171+
"html" => $this->buildVerificationEmail($verifyUrl),
172+
"to" => [["email" => $user->email, "type" => "to"]],
173+
],
174+
]);
175+
176+
if ($result instanceof Exception) {
177+
throw $result;
178+
}
179+
180+
if (is_array($result) && isset($result[0]->status) && in_array($result[0]->status, ['rejected', 'invalid'])) {
181+
throw new Exception('Email rejeté par Mandrill : ' . ($result[0]->reject_reason ?? 'raison inconnue'));
182+
}
183+
} catch (Exception $e) {
184+
$this->logger->error('Échec de l\'envoi de l\'email de vérification', [
185+
'email' => $user->email,
186+
'error' => $e->getMessage(),
187+
]);
188+
}
189+
}
190+
183191
/**
184192
* Génère le contenu HTML de l'email de vérification.
185193
*/

src/views/index.html.twig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@
114114
<button type="button" class="btn-close" data-bs-dismiss="toast" aria-label="Close"></button>
115115
</div>
116116
<div class="toast-body">
117-
Veuillez confirmer votre adresse email avant de vous connecter. Consultez votre boîte mail 📧
117+
Votre adresse email n'est pas encore vérifiée. Un nouvel email de vérification vient de vous être envoyé 📧
118118
</div>
119119
</div>
120120
</div>

0 commit comments

Comments
 (0)