diff --git a/apps/dav/lib/CalDAV/CalendarImpl.php b/apps/dav/lib/CalDAV/CalendarImpl.php index 79a5626f322c1..3fb28a631a724 100644 --- a/apps/dav/lib/CalDAV/CalendarImpl.php +++ b/apps/dav/lib/CalDAV/CalendarImpl.php @@ -42,7 +42,6 @@ use function Sabre\Uri\split as uriSplit; class CalendarImpl implements ICreateFromString, IHandleImipMessage { - private CalDavBackend $backend; private Calendar $calendar; /** @var array */ @@ -147,7 +146,7 @@ public function createFromString(string $name, string $calendarData): void { $server = new InvitationResponseServer(false); /** @var CustomPrincipalPlugin $plugin */ - $plugin = $server->server->getPlugin('auth'); + $plugin = $server->getServer()->getPlugin('auth'); // we're working around the previous implementation // that only allowed the public system principal to be used // so set the custom principal here @@ -163,14 +162,14 @@ public function createFromString(string $name, string $calendarData): void { // Force calendar change URI /** @var Schedule\Plugin $schedulingPlugin */ - $schedulingPlugin = $server->server->getPlugin('caldav-schedule'); + $schedulingPlugin = $server->getServer()->getPlugin('caldav-schedule'); $schedulingPlugin->setPathOfCalendarObjectChange($fullCalendarFilename); $stream = fopen('php://memory', 'rb+'); fwrite($stream, $calendarData); rewind($stream); try { - $server->server->createFile($fullCalendarFilename, $stream); + $server->getServer()->createFile($fullCalendarFilename, $stream); } catch (Conflict $e) { throw new CalendarException('Could not create new calendar event: ' . $e->getMessage(), 0, $e); } finally { @@ -182,10 +181,10 @@ public function createFromString(string $name, string $calendarData): void { * @throws CalendarException */ public function handleIMipMessage(string $name, string $calendarData): void { - $server = new InvitationResponseServer(false); + $server = $this->getInvitationResponseServer(); /** @var CustomPrincipalPlugin $plugin */ - $plugin = $server->server->getPlugin('auth'); + $plugin = $server->getServer()->getPlugin('auth'); // we're working around the previous implementation // that only allowed the public system principal to be used // so set the custom principal here @@ -196,7 +195,7 @@ public function handleIMipMessage(string $name, string $calendarData): void { } // Force calendar change URI /** @var Schedule\Plugin $schedulingPlugin */ - $schedulingPlugin = $server->server->getPlugin('caldav-schedule'); + $schedulingPlugin = $server->getServer()->getPlugin('caldav-schedule'); // Let sabre handle the rest $iTipMessage = new Message(); /** @var VCalendar $vObject */ @@ -204,25 +203,25 @@ public function handleIMipMessage(string $name, string $calendarData): void { /** @var VEvent $vEvent */ $vEvent = $vObject->{'VEVENT'}; - if($vObject->{'METHOD'} === null) { + if ($vObject->{'METHOD'} === null) { throw new CalendarException('No Method provided for scheduling data. Could not process message'); } - if(!isset($vEvent->{'ORGANIZER'}) || !isset($vEvent->{'ATTENDEE'})) { + if (!isset($vEvent->{'ORGANIZER'}) || !isset($vEvent->{'ATTENDEE'})) { throw new CalendarException('Could not process scheduling data, neccessary data missing from ICAL'); } $organizer = $vEvent->{'ORGANIZER'}->getValue(); $attendee = $vEvent->{'ATTENDEE'}->getValue(); $iTipMessage->method = $vObject->{'METHOD'}->getValue(); - if($iTipMessage->method === 'REPLY') { + if ($iTipMessage->method === 'REPLY') { if ($server->isExternalAttendee($vEvent->{'ATTENDEE'}->getValue())) { $iTipMessage->recipient = $organizer; } else { $iTipMessage->recipient = $attendee; } $iTipMessage->sender = $attendee; - } else if($iTipMessage->method === 'CANCEL') { + } elseif ($iTipMessage->method === 'CANCEL') { $iTipMessage->recipient = $attendee; $iTipMessage->sender = $organizer; } @@ -232,4 +231,8 @@ public function handleIMipMessage(string $name, string $calendarData): void { $iTipMessage->message = $vObject; $schedulingPlugin->scheduleLocalDelivery($iTipMessage); } + + public function getInvitationResponseServer(): InvitationResponseServer { + return new InvitationResponseServer(false); + } } diff --git a/apps/dav/lib/CalDAV/InvitationResponse/InvitationResponseServer.php b/apps/dav/lib/CalDAV/InvitationResponse/InvitationResponseServer.php index a85892443cc45..e64c815753b94 100644 --- a/apps/dav/lib/CalDAV/InvitationResponse/InvitationResponseServer.php +++ b/apps/dav/lib/CalDAV/InvitationResponse/InvitationResponseServer.php @@ -39,7 +39,6 @@ use Sabre\VObject\ITip\Message; class InvitationResponseServer { - /** @var \OCA\DAV\Connector\Sabre\Server */ public $server; @@ -127,7 +126,11 @@ public function handleITipMessage(Message $iTipMessage) { public function isExternalAttendee(string $principalUri): bool { /** @var \Sabre\DAVACL\Plugin $aclPlugin */ - $aclPlugin = $this->server->getPlugin('acl'); + $aclPlugin = $this->getServer()->getPlugin('acl'); return $aclPlugin->getPrincipalByUri($principalUri) === null; } + + public function getServer(): \OCA\DAV\Connector\Sabre\Server { + return $this->server; + } } diff --git a/apps/dav/tests/unit/CalDAV/CalendarImplTest.php b/apps/dav/tests/unit/CalDAV/CalendarImplTest.php index 6842bdadb53f0..cc0b963634c14 100644 --- a/apps/dav/tests/unit/CalDAV/CalendarImplTest.php +++ b/apps/dav/tests/unit/CalDAV/CalendarImplTest.php @@ -31,10 +31,18 @@ use OCA\DAV\CalDAV\CalendarImpl; use OCA\DAV\CalDAV\InvitationResponse\InvitationResponseServer; use OCA\DAV\CalDAV\Schedule\Plugin; +use OCA\DAV\Connector\Sabre\Server; +use OCP\Calendar\Exceptions\CalendarException; use PHPUnit\Framework\MockObject\MockObject; +use Sabre\VObject\Component\VCalendar; +use Sabre\VObject\Component\VEvent; +use Sabre\VObject\ITip\Message; +use Sabre\VObject\Reader; +/** + * @group DB + */ class CalendarImplTest extends \Test\TestCase { - /** @var CalendarImpl */ private $calendarImpl; @@ -69,7 +77,7 @@ public function testGetKey() { } public function testGetDisplayname() { - $this->assertEquals($this->calendarImpl->getDisplayName(),'user readable name 123'); + $this->assertEquals($this->calendarImpl->getDisplayName(), 'user readable name 123'); } public function testGetDisplayColor() { @@ -132,52 +140,104 @@ public function testGetPermissionAll() { } public function testHandleImipMessage(): void { - $invitationResponseServer = $this->createConfiguredMock(InvitationResponseServer::class, [ - 'server' => $this->createConfiguredMock(CalDavBackend::class, [ - 'getPlugin' => [ - 'auth' => $this->createMock(CustomPrincipalPlugin::class), - 'schedule' => $this->createMock(Plugin::class) - ] - ]) - ]); - $message = <<server->getPlugin('auth'); + $authPlugin = $this->createMock(CustomPrincipalPlugin::class); $authPlugin->expects(self::once()) - ->method('setPrincipalUri') + ->method('setCurrentPrincipal') ->with($this->calendar->getPrincipalURI()); + /** @var \Sabre\DAVACL\Plugin|MockObject $aclPlugin*/ + $aclPlugin = $this->createMock(\Sabre\DAVACL\Plugin::class); + /** @var Plugin|MockObject $schedulingPlugin */ - $schedulingPlugin = $invitationResponseServer->server->getPlugin('caldav-schedule'); + $schedulingPlugin = $this->createMock(Plugin::class); + $iTipMessage = $this->getITipMessage($message); + $iTipMessage->recipient = "mailto:lewis@stardew-tent-living.com"; $schedulingPlugin->expects(self::once()) - ->method('setPathOfCalendarObjectChange') - ->with('fullcalendarname'); + ->method('scheduleLocalDelivery') + ->with($iTipMessage); + + $server = $this->createMock(Server::class); + $server->expects($this->any()) + ->method('getPlugin') + ->willReturnMap([ + ['auth', $authPlugin], + ['acl', $aclPlugin], + ['caldav-schedule', $schedulingPlugin] + ]); + + $invitationResponseServer = $this->createPartialMock(InvitationResponseServer::class, ['getServer', 'isExternalAttendee']); + $invitationResponseServer->server = $server; + $invitationResponseServer->expects($this->any()) + ->method('getServer') + ->willReturn($server); + $invitationResponseServer->expects(self::once()) + ->method('isExternalAttendee') + ->willReturn(false); + + $calendarImpl = $this->getMockBuilder(CalendarImpl::class) + ->setConstructorArgs([$this->calendar, $this->calendarInfo, $this->backend]) + ->onlyMethods(['getInvitationResponseServer']) + ->getMock(); + $calendarImpl->expects($this->once()) + ->method('getInvitationResponseServer') + ->willReturn($invitationResponseServer); + + $calendarImpl->handleIMipMessage('filename.ics', $message); } public function testHandleImipMessageNoCalendarUri(): void { - $invitationResponseServer = $this->createConfiguredMock(InvitationResponseServer::class, [ - 'server' => $this->createConfiguredMock(CalDavBackend::class, [ - 'getPlugin' => [ - 'auth' => $this->createMock(CustomPrincipalPlugin::class), - 'schedule' => $this->createMock(Plugin::class) - ] - ]) - ]); + /** @var CustomPrincipalPlugin|MockObject $authPlugin */ + $authPlugin = $this->createMock(CustomPrincipalPlugin::class); + $authPlugin->expects(self::once()) + ->method('setCurrentPrincipal') + ->with($this->calendar->getPrincipalURI()); + unset($this->calendarInfo['uri']); + + /** @var Plugin|MockObject $schedulingPlugin */ + $schedulingPlugin = $this->createMock(Plugin::class); + + /** @var \Sabre\DAVACL\Plugin|MockObject $schedulingPlugin */ + $aclPlugin = $this->createMock(\Sabre\DAVACL\Plugin::class); + + $server = + $this->createMock(Server::class); + $server->expects($this->any()) + ->method('getPlugin') + ->willReturnMap([ + ['auth', $authPlugin], + ['acl', $aclPlugin], + ['caldav-schedule', $schedulingPlugin] + ]); + + $invitationResponseServer = $this->createPartialMock(InvitationResponseServer::class, ['getServer']); + $invitationResponseServer->server = $server; + $invitationResponseServer->expects($this->any()) + ->method('getServer') + ->willReturn($server); + + $calendarImpl = $this->getMockBuilder(CalendarImpl::class) + ->setConstructorArgs([$this->calendar, $this->calendarInfo, $this->backend]) + ->onlyMethods(['getInvitationResponseServer']) + ->getMock(); + $calendarImpl->expects($this->once()) + ->method('getInvitationResponseServer') + ->willReturn($invitationResponseServer); $message = <<server->getPlugin('auth'); - $authPlugin->expects(self::once()) - ->method('setPrincipalUri') - ->with($this->calendar->getPrincipalURI()); + $this->expectException(CalendarException::class); + $calendarImpl->handleIMipMessage('filename.ics', $message); + } - unset($this->calendarInfo['uri']); - $this->expectException('CalendarException'); - $this->calendarImpl->handleIMipMessage('filename.ics', $message); + private function getITipMessage($calendarData): Message { + $iTipMessage = new Message(); + /** @var VCalendar $vObject */ + $vObject = Reader::read($calendarData); + /** @var VEvent $vEvent */ + $vEvent = $vObject->{'VEVENT'}; + $orgaizer = $vEvent->{'ORGANIZER'}->getValue(); + $attendee = $vEvent->{'ATTENDEE'}->getValue(); + + $iTipMessage->method = $vObject->{'METHOD'}->getValue(); + $iTipMessage->recipient = $orgaizer; + $iTipMessage->sender = $attendee; + $iTipMessage->uid = isset($vEvent->{'UID'}) ? $vEvent->{'UID'}->getValue() : ''; + $iTipMessage->component = 'VEVENT'; + $iTipMessage->sequence = isset($vEvent->{'SEQUENCE'}) ? (int)$vEvent->{'SEQUENCE'}->getValue() : 0; + $iTipMessage->message = $vObject; + return $iTipMessage; } } diff --git a/apps/dav/tests/unit/Controller/InvitationResponseControllerTest.php b/apps/dav/tests/unit/Controller/InvitationResponseControllerTest.php index efbad5e300817..fdbb69e6c0d33 100644 --- a/apps/dav/tests/unit/Controller/InvitationResponseControllerTest.php +++ b/apps/dav/tests/unit/Controller/InvitationResponseControllerTest.php @@ -480,7 +480,7 @@ private function buildQueryExpects($token, $return, $time) { $expr->expects($this->once()) ->method('eq') ->with('token', 'namedParameterToken') - ->willReturn($function); + ->willReturn((string)$function); $this->dbConnection->expects($this->once()) ->method('getQueryBuilder') diff --git a/tests/lib/Encryption/UtilTest.php b/tests/lib/Encryption/UtilTest.php index 248377fc698e9..c2bc4ac55bd46 100644 --- a/tests/lib/Encryption/UtilTest.php +++ b/tests/lib/Encryption/UtilTest.php @@ -13,7 +13,6 @@ use Test\TestCase; class UtilTest extends TestCase { - /** * block size will always be 8192 for a PHP stream * @see https://bugs.php.net/bug.php?id=21641