Completed
Push — master ( 98650c...4863ba )
by philippe
03:22
created

SecurityController::forgotPassword()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 39
Code Lines 26

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
eloc 26
nc 3
nop 3
dl 0
loc 39
rs 9.504
c 0
b 0
f 0
1
<?php
2
3
namespace App\Controller;
4
5
use App\Entity\User;
6
use App\Form\UserRegistrationType;
7
use Doctrine\Common\Persistence\ObjectManager;
8
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
9
use Symfony\Component\Form\Extension\Core\Type\EmailType;
10
use Symfony\Component\HttpFoundation\Request;
11
use Symfony\Component\HttpFoundation\Response;
12
use Symfony\Component\Routing\Annotation\Route;
13
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
14
use Symfony\Component\Security\Core\Exception\InvalidCsrfTokenException;
15
use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
16
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
17
18
class SecurityController extends AbstractController
19
{
20
    /**
21
     * @Route("/login", name="security_login")
22
     */
23
    public function login(AuthenticationUtils $auth): Response
24
    {
25
        $error = $auth->getLastAuthenticationError();
26
        $lastUsername = $auth->getLastUsername();
27
        return $this->render('security/login.html.twig', [
28
           'last_username' => $lastUsername,
29
           'error' => $error
30
        ]);
31
    }
32
33
    /**
34
     * @Route("/logout", name="security_logout")
35
     */
36
    public function logout()
37
    {
38
    }
39
40
    /**
41
     * @Route("/register", name="security_register")
42
     */
43
    public function register(Request $request,
44
                             ObjectManager $om,
45
                             UserPasswordEncoderInterface $encoder,
46
                             \Swift_Mailer $mailer,
47
                             TokenGeneratorInterface $generator)
48
    {
49
50
        $user = new User();
51
        $form = $this->createForm(UserRegistrationType::class, $user);
52
        $form->handleRequest($request);
53
54
        if ($form->isSubmitted() && $form->isValid()) {
55
            $hash = $encoder->encodePassword($user, $user->getPlainPassword());
56
            $user->setPassword($hash);
57
58
            $token = $generator->generateToken();
59
            $user->setToken($token);
60
61
            $user->setValidation(false);
62
63
            $mode = $form->getData()->getMode();
64
            //dump($request);dump($mode); dump($form->getData()->getMode()); die();
65
66
            if ($mode == 1) {
67
                $user->setRoles(['ROLE_RECRUITER']);
68
            } else {
69
                $user->setRoles(['ROLE_CANDIDATE']);
70
            }
71
            $om->persist($user);
72
            $om->flush();
73
74
            $message = (new \Swift_Message('Votre inscription sur SnowTricks'))
75
                ->setFrom('[email protected]')
76
                ->setTo($user->getEmail())
77
                ->setBody('Validez votre compte en cliquant sur ce <a href="http://localhost:8000/confirm?user=' . $user->getId() . '&token=' . $token . '">LIEN</a>', 'text/html');
78
79
            $mailer->send($message);
80
81
            $this->addFlash('success', 'Un mail de confirmation vous a été envoyé, cliquez sur le lien pour activer votre compte.');
82
            return $this->redirectToRoute('security_login');
83
        }
84
85
        return $this->render('security/register.html.twig', [
86
            'formRegister' => $form->createView(),
87
        ]);
88
    }
89
90
    /**
91
     * @param Request $request
92
     * @param User $user
93
     * @return Response
94
     * @Route("/confirm", name="security_confirm")
95
     */
96
    public function registerConfirm(Request $request, User $user)
97
    {
98
        $token = $request->get('token');
99
        if (!$token) {
100
            return new Response(new InvalidCsrfTokenException());
101
        }
102
103
        if (!$user) {
0 ignored issues
show
introduced by
$user is of type App\Entity\User, thus it always evaluated to true.
Loading history...
104
            throw $this->createNotFoundException();
105
        }
106
107
        if ($user->getToken() === $token) {
108
            $user->setValidation(true);
109
            $this->getDoctrine()->getManager()->flush();
110
            $this->addFlash('success', 'Votre compte a bien été activé');
111
        }
112
        return $this->redirecttoRoute('security_login');
113
    }
114
115
    /**
116
     * @Route("/forgotpassword", name="security_forgot")
117
     */
118
    public function forgotPassword(Request $request, \Swift_Mailer $mailer, TokenGeneratorInterface $generator)
119
    {
120
        $user = new User();
121
        $form = $this->createFormBuilder($user)
122
            ->add('email', EmailType::class)
123
            ->getForm();
124
125
        $form->handleRequest($request);
126
127
        if ($form->isSubmitted() && $form->isValid()) {
128
            $user = $form->getData();
129
            $email = $user->getEmail();
130
131
            $repository = $this->getDoctrine()->getRepository(User::class);
132
            $userMail = $repository->findOneBy(['email' => $email]);
133
134
            $token = $generator->generateToken();
135
            $userMail->setToken($token);
136
137
            $this->getDoctrine()->getManager()->flush();
138
139
            if ($userMail){
140
141
                $message = (new \Swift_Message('Réinitialisation de votre mot de passe'))
142
                    ->setFrom('[email protected]')
143
                    ->setTo($user->getEmail())
144
                    ->setBody('<a href="http://localhost:8000/resetpassword?user=' . $userMail->getId() . '&token=' . $token . '">Réinitialiser votre mot de passe</a>', 'text/html');
145
                $mailer->send($message);
146
                $this->addFlash(
147
                    'info',
148
                    'Un mail vous a été envoyé, cliquez sur le lien pour réinitialiser votre mot de passe.'
149
                );
150
            }
151
            return $this->redirectToRoute('security_login');
152
        }
153
154
        return $this->render(
155
            'security/forgotpassword.html.twig', [
156
                'formForgotPassword' => $form->createView(),
157
            ]
158
        );
159
160
    }
161
}
162