Issues (17)

Controller/ConfirmEmailUpdateController.php (1 issue)

Severity
1
<?php
2
3
namespace Azine\EmailUpdateConfirmationBundle\Controller;
4
5
use Azine\EmailUpdateConfirmationBundle\AzineEmailUpdateConfirmationEvents;
6
use Azine\EmailUpdateConfirmationBundle\Services\EmailUpdateConfirmation;
7
use FOS\UserBundle\Event\UserEvent;
8
use FOS\UserBundle\Model\User;
9
use FOS\UserBundle\Model\UserInterface;
10
use FOS\UserBundle\Model\UserManagerInterface;
11
use FOS\UserBundle\Util\CanonicalFieldsUpdater;
12
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
13
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
14
use Symfony\Component\HttpFoundation\Request;
15
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
16
use Symfony\Component\Translation\TranslatorInterface;
17
18
/**
19
 * Controller managing the confirmation of changed user email.
20
 *
21
 * @author Dominik Businger <[email protected]>
22
 */
23
class ConfirmEmailUpdateController extends Controller
24
{
25
    /**
26
     * @var EventDispatcherInterface
27
     */
28
    private $eventDispatcher;
29
30
    /**
31
     * @var UserManagerInterface
32
     */
33
    private $userManager;
34
35
    /**
36
     * @var EmailUpdateConfirmation
37
     */
38
    private $emailUpdateConfirmation;
39
40
    /**
41
     * @var TranslatorInterface
42
     */
43
    private $translator;
44
45
    /**
46
     * @var CanonicalFieldsUpdater
47
     */
48
    private $canonicalFieldsUpdater;
49
50
    public function __construct(EventDispatcherInterface $eventDispatcher, UserManagerInterface $userManager, EmailUpdateConfirmation $emailUpdateConfirmation, TranslatorInterface $translator, CanonicalFieldsUpdater $canonicalFieldsUpdater)
51
    {
52
        $this->eventDispatcher = $eventDispatcher;
53
        $this->userManager = $userManager;
54
        $this->emailUpdateConfirmation = $emailUpdateConfirmation;
55
        $this->translator = $translator;
56
        $this->canonicalFieldsUpdater = $canonicalFieldsUpdater;
57
    }
58
59
    /**
60
     * Confirm user`s email update.
61
     *
62
     * @param Request $request
63
     * @param string  $token
64
     * @param string  $redirectRoute
65
     *
66
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
67
     */
68
    public function confirmEmailUpdateAction(Request $request, $token, $redirectRoute)
69
    {
70
        /** @var User $user */
71
        $user = $this->userManager->findUserByConfirmationToken($token);
72
73
        // If user was not found throw 404 exception
74
        if (!$user) {
0 ignored issues
show
$user is of type FOS\UserBundle\Model\User, thus it always evaluated to true.
Loading history...
75
            throw $this->createNotFoundException($this->translator->trans('email_update.error.message'));
76
        }
77
78
        // Show invalid token message if the user id found via token does not match the current users id (e.g. anon. or other user)
79
        if (!($this->getUser() instanceof UserInterface) || ($user->getId() !== $this->getUser()->getId())) {
80
            throw new AccessDeniedException($this->translator->trans('email_update.error.message'));
81
        }
82
83
        $newEmail = $this->emailUpdateConfirmation->fetchEncryptedEmailFromConfirmationLink($user, $request->get('target'));
84
85
        // Update user email
86
        if ($newEmail) {
87
            $user->setConfirmationToken($this->emailUpdateConfirmation->getEmailConfirmedToken());
88
            $user->setEmail($newEmail);
89
            $user->setEmail($this->canonicalFieldsUpdater->canonicalizeEmail($newEmail));
90
        }
91
92
        $this->userManager->updateUser($user);
93
94
        $event = new UserEvent($user, $request);
95
        $this->eventDispatcher->dispatch(AzineEmailUpdateConfirmationEvents::EMAIL_UPDATE_SUCCESS, $event);
96
97
        return $this->redirect($this->generateUrl($redirectRoute));
98
    }
99
}
100