Backup of database 9 Nov 17
[yaffs-website] / web / modules / contrib / permissions_by_term / src / KernelEventListener.php
1 <?php
2
3 namespace Drupal\permissions_by_term;
4
5 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
6 use Symfony\Component\HttpKernel\KernelEvents;
7 use Symfony\Component\HttpFoundation\JsonResponse;
8 use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
9 use Symfony\Component\HttpKernel\Event\GetResponseEvent;
10 use Symfony\Component\HttpFoundation\RedirectResponse;
11 use Symfony\Component\HttpFoundation\Request;
12
13 /**
14  * Class KernelEventListener.
15  *
16  * @package Drupal\permissions_by_term
17  */
18 class KernelEventListener implements EventSubscriberInterface
19 {
20
21   /**
22    * Instantiating of objects on class construction.
23    */
24   public function __construct()
25   {
26     $this->accessCheckService = \Drupal::service('permissions_by_term.access_check');
27     $this->accessStorageService = \Drupal::service('permissions_by_term.access_storage');
28   }
29
30   /**
31    * Access restriction on kernel request.
32    */
33   public function onKernelRequest(GetResponseEvent $event)
34   {
35     // Restricts access to nodes (views/edit).
36     if ($this->canRequestGetNode($event->getRequest())) {
37       $nid = $event->getRequest()->attributes->get('node')->get('nid')->getValue()['0']['value'];
38       if (!$this->accessCheckService->canUserAccessByNodeId($nid)) {
39         $this->sendUserToAccessDeniedPage();
40       }
41     }
42
43     // Restrict access to taxonomy terms by autocomplete list.
44     if ($event->getRequest()->attributes->get('target_type') == 'taxonomy_term' &&
45       $event->getRequest()->attributes->get('_route') == 'system.entity_autocomplete') {
46       $query_string = $event->getRequest()->get('q');
47       $query_string = trim($query_string);
48
49       $tid = $this->accessStorageService->getTermIdByName($query_string);
50       if (!$this->accessCheckService->isAccessAllowedByDatabase($tid)) {
51         $this->sendUserToAccessDeniedPage();
52       }
53     }
54   }
55
56   /**
57    * Restricts access on kernel response.
58    */
59   public function onKernelResponse(FilterResponseEvent $event) {
60     $this->restrictTermAccessAtAutoCompletion($event);
61   }
62
63   /**
64    * Restricts access to terms on AJAX auto completion.
65    */
66   private function restrictTermAccessAtAutoCompletion(FilterResponseEvent $event) {
67     if ($event->getRequest()->attributes->get('target_type') == 'taxonomy_term' &&
68       $event->getRequest()->attributes->get('_route') == 'system.entity_autocomplete'
69     ) {
70       $json_suggested_terms = $event->getResponse()->getContent();
71       $suggested_terms = json_decode($json_suggested_terms);
72       $allowed_terms = [];
73       foreach ($suggested_terms as $term) {
74         $tid = $this->accessStorageService->getTermIdByName($term->label);
75         if ($this->accessCheckService->isAccessAllowedByDatabase($tid)) {
76           $allowed_terms[] = [
77             'value' => $term->value,
78             'label' => $term->label,
79           ];
80         }
81       }
82
83       $json_response = new JsonResponse($allowed_terms);
84       $event->setResponse($json_response);
85     }
86   }
87
88   /**
89    * The subscribed events.
90    */
91   public static function getSubscribedEvents()
92   {
93     return [
94       KernelEvents::REQUEST => 'onKernelRequest',
95       KernelEvents::RESPONSE => 'onKernelResponse',
96     ];
97   }
98
99   private function canRequestGetNode(Request $request) {
100     if (method_exists($request->attributes, 'get') && !empty($request->attributes->get('node'))) {
101       if (method_exists($request->attributes->get('node'), 'get')) {
102         return TRUE;
103       }
104     }
105
106     return FALSE;
107   }
108
109   private function sendUserToAccessDeniedPage() {
110     $redirect_url = new \Drupal\Core\Url('system.403');
111     $response = new RedirectResponse($redirect_url->toString());
112     $response->send();
113     return $response;
114   }
115
116 }