From c75a12c1540b63909e2546733a83a36646c82bd3 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Thu, 14 Oct 2021 11:12:55 +0200 Subject: [PATCH] Build instances of the calendar providers before using them What we get from the registration context are only the class names. We still have to load the classes before we can use them. Signed-off-by: Christoph Wurst --- lib/private/Calendar/Manager.php | 35 ++++++++++++++++++++++++++---- tests/lib/Calendar/ManagerTest.php | 14 +++++++++++- 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/lib/private/Calendar/Manager.php b/lib/private/Calendar/Manager.php index 30ee60e49430f..3fa4b55d1eaac 100644 --- a/lib/private/Calendar/Manager.php +++ b/lib/private/Calendar/Manager.php @@ -31,6 +31,11 @@ use OCP\Calendar\ICalendarProvider; use OCP\Calendar\ICalendarQuery; use OCP\Calendar\IManager; +use Psr\Container\ContainerInterface; +use Psr\Log\LoggerInterface; +use Throwable; +use function array_map; +use function array_merge; class Manager implements IManager { @@ -47,8 +52,18 @@ class Manager implements IManager { /** @var Coordinator */ private $coordinator; - public function __construct(Coordinator $coordinator) { + /** @var ContainerInterface */ + private $container; + + /** @var LoggerInterface */ + private $logger; + + public function __construct(Coordinator $coordinator, + ContainerInterface $container, + LoggerInterface $logger) { $this->coordinator = $coordinator; + $this->container = $container; + $this->logger = $logger; } /** @@ -159,9 +174,21 @@ public function searchForPrincipal(ICalendarQuery $query): array { } /** @var CalendarQuery $query */ - $calendars = array_merge(...array_map(static function (ICalendarProvider $p) use ($query) { - return $p->getCalendars($query->getPrincipalUri(), $query->getCalendarUris()); - }, $context->getCalendarProviders())); + $calendars = array_merge( + ...array_map(function ($registration) use ($query) { + try { + /** @var ICalendarProvider $provider */ + $provider = $this->container->get($registration->getService()); + } catch (Throwable $e) { + $this->logger->error('Could not load calendar provider ' . $registration->getService() . ': ' . $e->getMessage(), [ + 'exception' => $e, + ]); + return []; + } + + return $provider->getCalendars($query->getPrincipalUri(), $query->getCalendarUris()); + }, $context->getCalendarProviders()) + ); $results = []; /** @var ICalendar $calendar */ diff --git a/tests/lib/Calendar/ManagerTest.php b/tests/lib/Calendar/ManagerTest.php index 70f7dbe2437a7..a4d9d45fdb263 100644 --- a/tests/lib/Calendar/ManagerTest.php +++ b/tests/lib/Calendar/ManagerTest.php @@ -27,6 +27,8 @@ use OC\Calendar\Manager; use OCP\Calendar\ICalendar; use PHPUnit\Framework\MockObject\MockObject; +use Psr\Container\ContainerInterface; +use Psr\Log\LoggerInterface; use Test\TestCase; class ManagerTest extends TestCase { @@ -34,6 +36,12 @@ class ManagerTest extends TestCase { /** @var Coordinator|MockObject */ private $coordinator; + /** @var MockObject|ContainerInterface */ + private $container; + + /** @var MockObject|LoggerInterface */ + private $logger; + /** @var Manager */ private $manager; @@ -41,9 +49,13 @@ protected function setUp(): void { parent::setUp(); $this->coordinator = $this->createMock(Coordinator::class); + $this->container = $this->createMock(ContainerInterface::class); + $this->logger = $this->createMock(LoggerInterface::class); $this->manager = new Manager( - $this->coordinator + $this->coordinator, + $this->container, + $this->logger ); }