Completed
Push — master ( 577a52...db05bc )
by Valery
09:02
created

ResettingController::passwordResetConfirm()   A

Complexity

Conditions 5
Paths 4

Size

Total Lines 30

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 30
rs 9.1288
c 0
b 0
f 0
cc 5
nc 4
nop 3
1
<?php
2
3
declare(strict_types=1);
4
5
namespace App\Controller;
6
7
use App\Entity\User;
8
use App\Form\Type\PasswordType;
9
use App\Repository\ResettingRepository;
10
use App\Service\ResettingService;
11
use Symfony\Component\HttpFoundation\RedirectResponse;
12
use Symfony\Component\HttpFoundation\Request;
13
use Symfony\Component\HttpFoundation\Response;
14
use Symfony\Component\Routing\Annotation\Route;
15
16
final class ResettingController extends BaseController
17
{
18
    const TOKEN_TTL = 43200;
19
20
    /**
21
     * @Route("/password/reset", methods={"GET|POST"}, name="password_reset")
22
     */
23
    public function passwordReset(ResettingService $service, Request $request): Response
24
    {
25
        if ($request->get('email')
26
            && $this->isCsrfTokenValid('password_reset', $request->request->get('_csrf_token'))) {
27
            $status = $service->sendResetPasswordLink($request);
28
        }
29
30
        return $this->render('resetting/password_reset.html.twig', [
31
            'site' => $this->site(),
32
            'status' => $status ?? '',
33
        ]);
34
    }
35
36
    /**
37
     * @Route("/password/reset/{token}", methods={"GET|POST"}, name="password_reset_confirm")
38
     */
39
    public function passwordResetConfirm(ResettingRepository $repository, Request $request, $token): Response
40
    {
41
        /** @var User $user */
42
        $user = $repository->findOneBy(['confirmation_token' => $token]);
43
44
        if (!$user) {
45
            // Token not found.
46
            return new RedirectResponse($this->generateUrl('security_login'));
47
        } elseif (!$user->isPasswordRequestNonExpired(self::TOKEN_TTL)) {
48
            // Token has expired.
49
            $this->addFlash('danger', 'message.token_expired');
50
51
            return new RedirectResponse($this->generateUrl('password_reset'));
52
        }
53
54
        $form = $this->createForm(PasswordType::class, []);
55
        $form->handleRequest($request);
56
57
        if ($form->isSubmitted() && $form->isValid()) {
58
            $repository->setPassword($user, $form->getNormData()['password']);
59
            $this->addFlash('success', 'message.password_has_been_reset');
60
61
            return $this->redirectToRoute('security_login');
62
        }
63
64
        return $this->render('resetting/password_change.html.twig', [
65
            'site' => $this->site(),
66
            'form' => $form->createView(),
67
        ]);
68
    }
69
}
70