Completed
Push — master ( d67956...a656c9 )
by Piotr
11s
created

PreventDeletingCurrentUser::getSubscribedEvents()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 2
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 4
rs 10
1
<?php
2
3
/**
4
 * (c) FSi sp. z o.o. <[email protected]>
5
 *
6
 * For the full copyright and license information, please view the LICENSE
7
 * file that was distributed with this source code.
8
 */
9
10
namespace FSi\Bundle\AdminSecurityBundle\EventListener;
11
12
use FSi\Bundle\AdminBundle\Admin\Element;
13
use FSi\Bundle\AdminBundle\Event\BatchEvents;
14
use FSi\Bundle\AdminBundle\Event\FormEvent;
15
use FSi\Bundle\AdminBundle\Message\FlashMessages;
16
use FSi\Bundle\AdminSecurityBundle\Doctrine\Admin\UserElement;
17
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
18
use Symfony\Component\HttpFoundation\RedirectResponse;
19
use Symfony\Component\HttpFoundation\Request;
20
use Symfony\Component\Routing\RouterInterface;
21
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
22
23
class PreventDeletingCurrentUser implements EventSubscriberInterface
24
{
25
    /**
26
     * @var TokenStorageInterface
27
     */
28
    private $tokenStorage;
29
30
    /**
31
     * @var RouterInterface
32
     */
33
    private $router;
34
35
    /**
36
     * @var FlashMessages
37
     */
38
    private $flashMessages;
39
40
    public function __construct(
41
        TokenStorageInterface $tokenStorage,
42
        RouterInterface $router,
43
        FlashMessages $flashMessages
44
    ) {
45
        $this->tokenStorage = $tokenStorage;
46
        $this->router = $router;
47
        $this->flashMessages = $flashMessages;
48
    }
49
50
    /**
51
     * {@inheritdoc}
52
     */
53
    public static function getSubscribedEvents()
54
    {
55
        return [
56
            BatchEvents::BATCH_OBJECTS_PRE_APPLY => 'preventDeletingCurrentUser',
57
        ];
58
    }
59
60
    public function preventDeletingCurrentUser(FormEvent $event)
61
    {
62
        $element = $event->getElement();
63
64
        if (!($element instanceof UserElement)) {
65
            return;
66
        }
67
68
        $user = $this->tokenStorage->getToken()->getUser();
69
        $request = $event->getRequest();
70
        $indexes = $request->get('indexes', []);
71
72
        foreach ($indexes as $index) {
73
            /** @var \FSi\Bundle\AdminSecurityBundle\Security\User\UserInterface $entity */
74
            $entity = $element->getDataIndexer()->getData($index);
75
76
            if ($user === $entity) {
77
                $this->setRedirectResponse($event);
78
                $this->flashMessages->error(
79
                    'admin.user_list.message.delete_current_user',
80
                    [],
81
                    'FSiAdminSecurity'
82
                );
83
84
                return;
85
            }
86
        }
87
    }
88
89
    private function setRedirectResponse(FormEvent $event)
90
    {
91
        $event->stopPropagation();
92
        $redirectUrl = $this->getRedirectUrl($event->getElement(), $event->getRequest());
93
        $event->setResponse(new RedirectResponse($redirectUrl));
94
    }
95
96
    private function getRedirectUrl(Element $element, Request $request)
97
    {
98
        $redirectUrl = $request->get('redirect_uri');
99
100
        if ($redirectUrl === null) {
101
            return $this->router->generate($element->getRoute(), $element->getRouteParameters());
102
        }
103
104
        return $redirectUrl;
105
    }
106
}
107