1<?php 2 3declare(strict_types=1); 4/** 5 * @copyright Copyright (c) 2019 Joas Schilling <coding@schilljs.com> 6 * 7 * @license GNU AGPL version 3 or any later version 8 * 9 * This program is free software: you can redistribute it and/or modify 10 * it under the terms of the GNU Affero General Public License as 11 * published by the Free Software Foundation, either version 3 of the 12 * License, or (at your option) any later version. 13 * 14 * This program is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 * GNU Affero General Public License for more details. 18 * 19 * You should have received a copy of the GNU Affero General Public License 20 * along with this program. If not, see <http://www.gnu.org/licenses/>. 21 * 22 */ 23 24namespace OCA\Talk\Collaboration\Resources; 25 26use OCA\Talk\Events\AddParticipantsEvent; 27use OCA\Talk\Events\RemoveParticipantEvent; 28use OCA\Talk\Events\RemoveUserEvent; 29use OCA\Talk\Events\RoomEvent; 30use OCA\Talk\GuestManager; 31use OCA\Talk\Model\Attendee; 32use OCA\Talk\Room; 33use OCP\Collaboration\Resources\IManager; 34use OCP\Collaboration\Resources\ResourceException; 35use OCP\EventDispatcher\IEventDispatcher; 36use OCP\IUserManager; 37 38class Listener { 39 public static function register(IEventDispatcher $dispatcher): void { 40 $listener = static function (RoomEvent $event): void { 41 $room = $event->getRoom(); 42 /** @var IManager $manager */ 43 $resourceManager = \OC::$server->query(IManager::class); 44 45 try { 46 $resource = $resourceManager->getResourceForUser('room', $room->getToken(), null); 47 } catch (ResourceException $e) { 48 return; 49 } 50 $resourceManager->invalidateAccessCacheForResource($resource); 51 }; 52 $dispatcher->addListener(Room::EVENT_AFTER_ROOM_DELETE, $listener); 53 54 $listener = static function (AddParticipantsEvent $event): void { 55 $room = $event->getRoom(); 56 /** @var IManager $manager */ 57 $resourceManager = \OC::$server->query(IManager::class); 58 /** @var IUserManager $userManager */ 59 $userManager = \OC::$server->getUserManager(); 60 try { 61 $resource = $resourceManager->getResourceForUser('room', $room->getToken(), null); 62 } catch (ResourceException $e) { 63 return; 64 } 65 66 $participants = $event->getParticipants(); 67 foreach ($participants as $participant) { 68 $user = null; 69 if ($participant['actorType'] === Attendee::ACTOR_USERS) { 70 $user = $userManager->get($participant['actorId']); 71 } 72 73 $resourceManager->invalidateAccessCacheForResourceByUser($resource, $user); 74 } 75 }; 76 $dispatcher->addListener(Room::EVENT_AFTER_USERS_ADD, $listener); 77 78 $listener = static function (RemoveUserEvent $event): void { 79 $room = $event->getRoom(); 80 /** @var IManager $manager */ 81 $resourceManager = \OC::$server->query(IManager::class); 82 try { 83 $resource = $resourceManager->getResourceForUser('room', $room->getToken(), null); 84 } catch (ResourceException $e) { 85 return; 86 } 87 88 $resourceManager->invalidateAccessCacheForResourceByUser($resource, $event->getUser()); 89 }; 90 $dispatcher->addListener(Room::EVENT_AFTER_USER_REMOVE, $listener); 91 92 $listener = static function (RemoveParticipantEvent $event): void { 93 $room = $event->getRoom(); 94 /** @var IManager $manager */ 95 $resourceManager = \OC::$server->query(IManager::class); 96 /** @var IUserManager $userManager */ 97 $userManager = \OC::$server->getUserManager(); 98 try { 99 $resource = $resourceManager->getResourceForUser('room', $room->getToken(), null); 100 } catch (ResourceException $e) { 101 return; 102 } 103 104 $participant = $event->getParticipant(); 105 $user = null; 106 if ($participant->getAttendee()->getActorType() === Attendee::ACTOR_USERS) { 107 $user = $userManager->get($participant->getAttendee()->getActorId()); 108 } 109 $resourceManager->invalidateAccessCacheForResourceByUser($resource, $user); 110 }; 111 $dispatcher->addListener(Room::EVENT_AFTER_PARTICIPANT_REMOVE, $listener); 112 113 $listener = static function (RoomEvent $event): void { 114 $room = $event->getRoom(); 115 /** @var IManager $manager */ 116 $resourceManager = \OC::$server->query(IManager::class); 117 118 try { 119 $resource = $resourceManager->getResourceForUser('room', $room->getToken(), null); 120 } catch (ResourceException $e) { 121 return; 122 } 123 $resourceManager->invalidateAccessCacheForResourceByUser($resource, null); 124 }; 125 $dispatcher->addListener(Room::EVENT_AFTER_TYPE_SET, $listener); 126 $dispatcher->addListener(GuestManager::EVENT_AFTER_EMAIL_INVITE, $listener); 127 } 128} 129