From c778b1bade02ea772f23c75cb8de804d645feac4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Thu, 13 Oct 2016 12:15:10 +0200 Subject: [PATCH 1/8] Update sabre dav to 3.2 (#26115) * Update sabre/dav to 3.2.0 * Adjust code to work with sabre/dav 3.2.0 and it's dependencies * Adding own CalDAV plugin to fix calendar home property * Test if there is a user logged in when listing files home * Update sabre version used by integration tests * Disable unauthenticated DAV access This is needed to make Sabre 3.2 behave like we did before. Eventually we should integrate better with the ACL plugin which itself should implement an auth failure when appropriate. ===== * Fixed so cherry-pick was succesfull Signed-off-by: Roeland Jago Douma --- apps/dav/lib/CalDAV/CalendarObject.php | 2 +- apps/dav/lib/CalDAV/Plugin.php | 41 ++++++++++++++ apps/dav/lib/CardDAV/AddressBookImpl.php | 7 ++- apps/dav/lib/CardDAV/CardDavBackend.php | 2 +- apps/dav/lib/CardDAV/Converter.php | 9 ++-- apps/dav/lib/Connector/Sabre/DavAclPlugin.php | 1 + apps/dav/lib/Files/RootCollection.php | 2 +- apps/dav/lib/Server.php | 2 +- .../tests/unit/CalDAV/CalDavBackendTest.php | 4 +- apps/dav/tests/unit/CalDAV/CalendarTest.php | 12 ++--- .../unit/CardDAV/AddressBookImplTest.php | 25 ++++----- .../unit/CardDAV/BirthdayServiceTest.php | 34 ++++++------ .../tests/unit/CardDAV/CardDavBackendTest.php | 22 ++++---- apps/dav/tests/unit/CardDAV/ConverterTest.php | 23 ++++---- .../unit/CardDAV/ImageExportPluginTest.php | 12 ++--- .../tests/unit/CardDAV/SyncServiceTest.php | 10 ++-- .../tests/unit/Connector/Sabre/AuthTest.php | 54 ++++++++++--------- .../unit/Connector/Sabre/FilesPluginTest.php | 6 ++- build/integration/composer.json | 2 +- 19 files changed, 158 insertions(+), 112 deletions(-) create mode 100644 apps/dav/lib/CalDAV/Plugin.php diff --git a/apps/dav/lib/CalDAV/CalendarObject.php b/apps/dav/lib/CalDAV/CalendarObject.php index db3c7e1929c85..6d429fa6bf5b6 100644 --- a/apps/dav/lib/CalDAV/CalendarObject.php +++ b/apps/dav/lib/CalDAV/CalendarObject.php @@ -65,7 +65,7 @@ private static function createConfidentialObject($calData) { $vElement = $vObject->VTODO; } if(!is_null($vElement)) { - foreach ($vElement->children as &$property) { + foreach ($vElement->children() as &$property) { /** @var Property $property */ switch($property->name) { case 'CREATED': diff --git a/apps/dav/lib/CalDAV/Plugin.php b/apps/dav/lib/CalDAV/Plugin.php new file mode 100644 index 0000000000000..5172cea6e279c --- /dev/null +++ b/apps/dav/lib/CalDAV/Plugin.php @@ -0,0 +1,41 @@ + + * + * @copyright Copyright (c) 2016, ownCloud GmbH. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see + * + */ + +namespace OCA\DAV\CalDAV; + +use Sabre\HTTP\URLUtil; + +class Plugin extends \Sabre\CalDAV\Plugin { + + /** + * @inheritdoc + */ + function getCalendarHomeForPrincipal($principalUrl) { + + if (strrpos($principalUrl, 'principals/users', -strlen($principalUrl)) !== false) { + list(, $principalId) = URLUtil::splitPath($principalUrl); + return self::CALENDAR_ROOT .'/' . $principalId; + } + + return; + } + +} diff --git a/apps/dav/lib/CardDAV/AddressBookImpl.php b/apps/dav/lib/CardDAV/AddressBookImpl.php index 9de54eec33da9..5f77c0f44f68b 100644 --- a/apps/dav/lib/CardDAV/AddressBookImpl.php +++ b/apps/dav/lib/CardDAV/AddressBookImpl.php @@ -29,7 +29,6 @@ use OCP\IURLGenerator; use Sabre\VObject\Component\VCard; use Sabre\VObject\Property; -use Sabre\VObject\Property\Text; use Sabre\VObject\Reader; use Sabre\VObject\UUIDUtil; @@ -209,7 +208,7 @@ protected function getUid() { */ protected function createEmptyVCard($uid) { $vCard = new VCard(); - $vCard->add(new Text($vCard, 'UID', $uid)); + $vCard->UID = $uid; return $vCard; } @@ -225,8 +224,8 @@ protected function vCard2Array($uri, VCard $vCard) { 'URI' => $uri, ]; - foreach ($vCard->children as $property) { - /** @var \Sabre\VObject\Property\Unknown $property */ + foreach ($vCard->children() as $property) { + $result[$property->name] = $property->getValue(); if ($property->name === 'PHOTO' && $property->getValueType() === 'BINARY') { $url = $this->urlGenerator->getAbsoluteURL( $this->urlGenerator->linkTo('', 'remote.php') . '/dav/'); diff --git a/apps/dav/lib/CardDAV/CardDavBackend.php b/apps/dav/lib/CardDAV/CardDavBackend.php index de717a176427d..a320984c1fe53 100644 --- a/apps/dav/lib/CardDAV/CardDavBackend.php +++ b/apps/dav/lib/CardDAV/CardDavBackend.php @@ -957,7 +957,7 @@ protected function updateProperties($addressBookId, $cardUri, $vCardSerialized) ] ); - foreach ($vCard->children as $property) { + foreach ($vCard->children() as $property) { if(!in_array($property->name, self::$indexProperties)) { continue; } diff --git a/apps/dav/lib/CardDAV/Converter.php b/apps/dav/lib/CardDAV/Converter.php index 0f4a6fb3f0832..d1fb754017e17 100644 --- a/apps/dav/lib/CardDAV/Converter.php +++ b/apps/dav/lib/CardDAV/Converter.php @@ -43,16 +43,17 @@ public function createCardFromUser(IUser $user) { $image = $this->getAvatarImage($user); $vCard = new VCard(); - $vCard->add(new Text($vCard, 'UID', $uid)); + $vCard->VERSION = '3.0'; + $vCard->UID = $uid; if (!empty($displayName)) { - $vCard->add(new Text($vCard, 'FN', $displayName)); - $vCard->add(new Text($vCard, 'N', $this->splitFullName($displayName))); + $vCard->FN = $displayName; + $vCard->N = $this->splitFullName($displayName); } if (!empty($emailAddress)) { $vCard->add(new Text($vCard, 'EMAIL', $emailAddress, ['TYPE' => 'OTHER'])); } if (!empty($cloudId)) { - $vCard->add(new Text($vCard, 'CLOUD', $cloudId)); + $vCard->CLOUD = $cloudId; } if ($image) { $vCard->add('PHOTO', $image->data(), ['ENCODING' => 'b', 'TYPE' => $image->mimeType()]); diff --git a/apps/dav/lib/Connector/Sabre/DavAclPlugin.php b/apps/dav/lib/Connector/Sabre/DavAclPlugin.php index 6b6d78932628a..244394ec6fcb8 100644 --- a/apps/dav/lib/Connector/Sabre/DavAclPlugin.php +++ b/apps/dav/lib/Connector/Sabre/DavAclPlugin.php @@ -44,6 +44,7 @@ class DavAclPlugin extends \Sabre\DAVACL\Plugin { public function __construct() { $this->hideNodesFromListings = true; + $this->allowUnauthenticatedAccess = false; } function checkPrivileges($uri, $privileges, $recursion = self::R_PARENT, $throwExceptions = true) { diff --git a/apps/dav/lib/Files/RootCollection.php b/apps/dav/lib/Files/RootCollection.php index 57802d1957393..345015530e249 100644 --- a/apps/dav/lib/Files/RootCollection.php +++ b/apps/dav/lib/Files/RootCollection.php @@ -40,7 +40,7 @@ class RootCollection extends AbstractPrincipalCollection { function getChildForPrincipal(array $principalInfo) { list(,$name) = URLUtil::splitPath($principalInfo['uri']); $user = \OC::$server->getUserSession()->getUser(); - if ($name !== $user->getUID()) { + if (is_null($user) || $name !== $user->getUID()) { // a user is only allowed to see their own home contents, so in case another collection // is accessed, we return a simple empty collection for now // in the future this could be considered to be used for accessing shared files diff --git a/apps/dav/lib/Server.php b/apps/dav/lib/Server.php index 68a3731c300d6..9d74bac71fa10 100644 --- a/apps/dav/lib/Server.php +++ b/apps/dav/lib/Server.php @@ -116,7 +116,7 @@ public function __construct(IRequest $request, $baseUri) { $this->server->addPlugin($acl); // calendar plugins - $this->server->addPlugin(new \Sabre\CalDAV\Plugin()); + $this->server->addPlugin(new \OCA\DAV\CalDAV\Plugin()); $this->server->addPlugin(new \Sabre\CalDAV\ICSExportPlugin()); $this->server->addPlugin(new \Sabre\CalDAV\Schedule\Plugin()); $this->server->addPlugin(new IMipPlugin($mailer, $logger)); diff --git a/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php b/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php index b5e700e8bc4f8..bd6c9f27886d4 100644 --- a/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php +++ b/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php @@ -463,8 +463,8 @@ public function testGetDenormalizedData($expected, $key, $calData) { public function providesCalDataForGetDenormalizedData() { return [ - 'first occurrence before unix epoch starts' => [0, 'firstOccurence', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nUID:413F269B-B51B-46B1-AFB6-40055C53A4DC\r\nDTSTAMP:20160309T095056Z\r\nDTSTART;VALUE=DATE:16040222\r\nDTEND;VALUE=DATE:16040223\r\nRRULE:FREQ=YEARLY\r\nSUMMARY:SUMMARY\r\nTRANSP:TRANSPARENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"], - 'no first occurrence because yearly' => [null, 'firstOccurence', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nUID:413F269B-B51B-46B1-AFB6-40055C53A4DC\r\nDTSTAMP:20160309T095056Z\r\nRRULE:FREQ=YEARLY\r\nSUMMARY:SUMMARY\r\nTRANSP:TRANSPARENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"], + 'first occurrence before unix epoch starts' => [0, 'firstOccurence', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nUID:413F269B-B51B-46B1-AFB6-40055C53A4DC\r\nDTSTAMP:20160309T095056Z\r\nDTSTART;VALUE=DATE:16040222\r\nDTEND;VALUE=DATE:16040223\r\nRRULE:FREQ=YEARLY\r\nSUMMARY:SUMMARY\r\nTRANSP:TRANSPARENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"], + 'no first occurrence because yearly' => [null, 'firstOccurence', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nUID:413F269B-B51B-46B1-AFB6-40055C53A4DC\r\nDTSTAMP:20160309T095056Z\r\nRRULE:FREQ=YEARLY\r\nSUMMARY:SUMMARY\r\nTRANSP:TRANSPARENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"], 'CLASS:PRIVATE' => [CalDavBackend::CLASSIFICATION_PRIVATE, 'classification', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//dmfs.org//mimedir.icalendar//EN\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/Berlin\r\nX-LIC-LOCATION:Europe/Berlin\r\nBEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nDTSTART;TZID=Europe/Berlin:20160419T130000\r\nSUMMARY:Test\r\nCLASS:PRIVATE\r\nTRANSP:OPAQUE\r\nSTATUS:CONFIRMED\r\nDTEND;TZID=Europe/Berlin:20160419T140000\r\nLAST-MODIFIED:20160419T074202Z\r\nDTSTAMP:20160419T074202Z\r\nCREATED:20160419T074202Z\r\nUID:2e468c48-7860-492e-bc52-92fa0daeeccf.1461051722310\r\nEND:VEVENT\r\nEND:VCALENDAR"], 'CLASS:PUBLIC' => [CalDavBackend::CLASSIFICATION_PUBLIC, 'classification', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//dmfs.org//mimedir.icalendar//EN\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/Berlin\r\nX-LIC-LOCATION:Europe/Berlin\r\nBEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nDTSTART;TZID=Europe/Berlin:20160419T130000\r\nSUMMARY:Test\r\nCLASS:PUBLIC\r\nTRANSP:OPAQUE\r\nSTATUS:CONFIRMED\r\nDTEND;TZID=Europe/Berlin:20160419T140000\r\nLAST-MODIFIED:20160419T074202Z\r\nDTSTAMP:20160419T074202Z\r\nCREATED:20160419T074202Z\r\nUID:2e468c48-7860-492e-bc52-92fa0daeeccf.1461051722310\r\nEND:VEVENT\r\nEND:VCALENDAR"], 'CLASS:CONFIDENTIAL' => [CalDavBackend::CLASSIFICATION_CONFIDENTIAL, 'classification', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//dmfs.org//mimedir.icalendar//EN\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/Berlin\r\nX-LIC-LOCATION:Europe/Berlin\r\nBEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nDTSTART;TZID=Europe/Berlin:20160419T130000\r\nSUMMARY:Test\r\nCLASS:CONFIDENTIAL\r\nTRANSP:OPAQUE\r\nSTATUS:CONFIRMED\r\nDTEND;TZID=Europe/Berlin:20160419T140000\r\nLAST-MODIFIED:20160419T074202Z\r\nDTSTAMP:20160419T074202Z\r\nCREATED:20160419T074202Z\r\nUID:2e468c48-7860-492e-bc52-92fa0daeeccf.1461051722310\r\nEND:VEVENT\r\nEND:VCALENDAR"], diff --git a/apps/dav/tests/unit/CalDAV/CalendarTest.php b/apps/dav/tests/unit/CalDAV/CalendarTest.php index a11d8dd96ea66..bd4c1f6aabb99 100644 --- a/apps/dav/tests/unit/CalDAV/CalendarTest.php +++ b/apps/dav/tests/unit/CalDAV/CalendarTest.php @@ -50,7 +50,7 @@ public function setUp() { public function testDelete() { /** @var \PHPUnit_Framework_MockObject_MockObject | CalDavBackend $backend */ - $backend = $this->getMockBuilder('OCA\DAV\CalDAV\CalDavBackend')->disableOriginalConstructor()->getMock(); + $backend = $this->getMockBuilder(CalDavBackend::class)->disableOriginalConstructor()->getMock(); $backend->expects($this->once())->method('updateShares'); $backend->expects($this->any())->method('getShares')->willReturn([ ['href' => 'principal:user2'] @@ -70,7 +70,7 @@ public function testDelete() { */ public function testDeleteFromGroup() { /** @var \PHPUnit_Framework_MockObject_MockObject | CalDavBackend $backend */ - $backend = $this->getMockBuilder('OCA\DAV\CalDAV\CalDavBackend')->disableOriginalConstructor()->getMock(); + $backend = $this->getMockBuilder(CalDavBackend::class)->disableOriginalConstructor()->getMock(); $backend->expects($this->never())->method('updateShares'); $backend->expects($this->any())->method('getShares')->willReturn([ ['href' => 'principal:group2'] @@ -106,7 +106,7 @@ public function dataPropPatch() { */ public function testPropPatch($mutations, $throws) { /** @var \PHPUnit_Framework_MockObject_MockObject | CalDavBackend $backend */ - $backend = $this->getMockBuilder('OCA\DAV\CalDAV\CalDavBackend')->disableOriginalConstructor()->getMock(); + $backend = $this->getMockBuilder(CalDavBackend::class)->disableOriginalConstructor()->getMock(); $calendarInfo = [ '{http://owncloud.org/ns}owner-principal' => 'user1', 'principaluri' => 'user2', @@ -129,7 +129,7 @@ public function testPropPatch($mutations, $throws) { */ public function testAcl($expectsWrite, $readOnlyValue, $hasOwnerSet, $uri = 'default') { /** @var \PHPUnit_Framework_MockObject_MockObject | CalDavBackend $backend */ - $backend = $this->getMockBuilder('OCA\DAV\CalDAV\CalDavBackend')->disableOriginalConstructor()->getMock(); + $backend = $this->getMockBuilder(CalDavBackend::class)->disableOriginalConstructor()->getMock(); $backend->expects($this->any())->method('applyShareAcl')->willReturnArgument(1); $calendarInfo = [ 'principaluri' => 'user2', @@ -204,7 +204,7 @@ public function testPrivateClassification($expectedChildren, $isShared) { $calObject2 = ['uri' => 'event-2', 'classification' => CalDavBackend::CLASSIFICATION_PRIVATE]; /** @var \PHPUnit_Framework_MockObject_MockObject | CalDavBackend $backend */ - $backend = $this->getMockBuilder('OCA\DAV\CalDAV\CalDavBackend')->disableOriginalConstructor()->getMock(); + $backend = $this->getMockBuilder(CalDavBackend::class)->disableOriginalConstructor()->getMock(); $backend->expects($this->any())->method('getCalendarObjects')->willReturn([ $calObject0, $calObject1, $calObject2 ]); @@ -291,7 +291,7 @@ public function testConfidentialClassification($expectedChildren, $isShared) { $calObject2 = ['uri' => 'event-2', 'classification' => CalDavBackend::CLASSIFICATION_PRIVATE]; /** @var \PHPUnit_Framework_MockObject_MockObject | CalDavBackend $backend */ - $backend = $this->getMockBuilder('OCA\DAV\CalDAV\CalDavBackend')->disableOriginalConstructor()->getMock(); + $backend = $this->getMockBuilder(CalDavBackend::class)->disableOriginalConstructor()->getMock(); $backend->expects($this->any())->method('getCalendarObjects')->willReturn([ $calObject0, $calObject1, $calObject2 ]); diff --git a/apps/dav/tests/unit/CardDAV/AddressBookImplTest.php b/apps/dav/tests/unit/CardDAV/AddressBookImplTest.php index fa3cae27dece9..bd63f4cdffb1b 100644 --- a/apps/dav/tests/unit/CardDAV/AddressBookImplTest.php +++ b/apps/dav/tests/unit/CardDAV/AddressBookImplTest.php @@ -31,6 +31,7 @@ use OCA\DAV\CardDAV\AddressBook; use OCA\DAV\CardDAV\AddressBookImpl; use OCA\DAV\CardDAV\CardDavBackend; +use OCP\IURLGenerator; use Sabre\VObject\Component\VCard; use Sabre\VObject\Property\Text; use Test\TestCase; @@ -46,7 +47,7 @@ class AddressBookImplTest extends TestCase { /** @var AddressBook | \PHPUnit_Framework_MockObject_MockObject */ private $addressBook; - /** @var \OCP\IURLGenerator | \PHPUnit_Framework_MockObject_MockObject */ + /** @var IURLGenerator | \PHPUnit_Framework_MockObject_MockObject */ private $urlGenerator; /** @var CardDavBackend | \PHPUnit_Framework_MockObject_MockObject */ @@ -64,16 +65,12 @@ public function setUp() { 'principaluri' => 'principals/system/system', '{DAV:}displayname' => 'display name', ]; - $this->addressBook = $this->getMockBuilder('OCA\DAV\CardDAV\AddressBook') + $this->addressBook = $this->getMockBuilder(AddressBook::class) ->disableOriginalConstructor()->getMock(); - $this->backend = $this->getMockBuilder('\OCA\DAV\CardDAV\CardDavBackend') + $this->backend = $this->getMockBuilder(CardDavBackend::class) ->disableOriginalConstructor()->getMock(); - $this->vCard = $this->getMockBuilder('Sabre\VObject\Component\VCard') - ->disableOriginalConstructor() - ->getMock(); - $this->urlGenerator = $this->getMockBuilder('OCP\IURLGenerator') - ->disableOriginalConstructor() - ->getMock(); + $this->vCard = $this->createMock(VCard::class); + $this->urlGenerator = $this->createMock(IURLGenerator::class); $this->addressBookImpl = new AddressBookImpl( $this->addressBook, @@ -96,7 +93,7 @@ public function testGetDisplayName() { public function testSearch() { /** @var \PHPUnit_Framework_MockObject_MockObject | AddressBookImpl $addressBookImpl */ - $addressBookImpl = $this->getMockBuilder('OCA\DAV\CardDAV\AddressBookImpl') + $addressBookImpl = $this->getMockBuilder(AddressBookImpl::class) ->setConstructorArgs( [ $this->addressBook, @@ -143,7 +140,7 @@ public function testCreate($properties) { $uid = 'uid'; /** @var \PHPUnit_Framework_MockObject_MockObject | AddressBookImpl $addressBookImpl */ - $addressBookImpl = $this->getMockBuilder('OCA\DAV\CardDAV\AddressBookImpl') + $addressBookImpl = $this->getMockBuilder(AddressBookImpl::class) ->setConstructorArgs( [ $this->addressBook, @@ -184,7 +181,7 @@ public function testUpdate() { $properties = ['URI' => $uri, 'UID' => $uid, 'FN' => 'John Doe']; /** @var \PHPUnit_Framework_MockObject_MockObject | AddressBookImpl $addressBookImpl */ - $addressBookImpl = $this->getMockBuilder('OCA\DAV\CardDAV\AddressBookImpl') + $addressBookImpl = $this->getMockBuilder(AddressBookImpl::class) ->setConstructorArgs( [ $this->addressBook, @@ -267,7 +264,7 @@ public function testReadCard() { public function testCreateUid() { /** @var \PHPUnit_Framework_MockObject_MockObject | AddressBookImpl $addressBookImpl */ - $addressBookImpl = $this->getMockBuilder('OCA\DAV\CardDAV\AddressBookImpl') + $addressBookImpl = $this->getMockBuilder(AddressBookImpl::class) ->setConstructorArgs( [ $this->addressBook, @@ -299,7 +296,7 @@ function($id, $uid) { public function testCreateEmptyVCard() { $uid = 'uid'; $expectedVCard = new VCard(); - $expectedVCard->add(new Text($expectedVCard, 'UID', $uid)); + $expectedVCard->UID = $uid; $expectedVCardSerialized = $expectedVCard->serialize(); $result = $this->invokePrivate($this->addressBookImpl, 'createEmptyVCard', [$uid]); diff --git a/apps/dav/tests/unit/CardDAV/BirthdayServiceTest.php b/apps/dav/tests/unit/CardDAV/BirthdayServiceTest.php index 40a6330ddb83e..8f8d02f98909a 100644 --- a/apps/dav/tests/unit/CardDAV/BirthdayServiceTest.php +++ b/apps/dav/tests/unit/CardDAV/BirthdayServiceTest.php @@ -126,9 +126,9 @@ public function testOnCardChanged($expectedOp) { if ($expectedOp === 'create') { $service->expects($this->exactly(3))->method('buildDateFromContact')->willReturn(new VCalendar()); $this->calDav->expects($this->exactly(3))->method('createCalendarObject')->withConsecutive( - [1234, 'default-gump.vcf.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"], - [1234, 'default-gump.vcf-death.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"], - [1234, 'default-gump.vcf-anniversary.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"] + [1234, 'default-gump.vcf.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"], + [1234, 'default-gump.vcf-death.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"], + [1234, 'default-gump.vcf-anniversary.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"] ); } if ($expectedOp === 'update') { @@ -136,9 +136,9 @@ public function testOnCardChanged($expectedOp) { $service->expects($this->exactly(3))->method('birthdayEvenChanged')->willReturn(true); $this->calDav->expects($this->exactly(3))->method('getCalendarObject')->willReturn(['calendardata' => '']); $this->calDav->expects($this->exactly(3))->method('updateCalendarObject')->withConsecutive( - [1234, 'default-gump.vcf.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"], - [1234, 'default-gump.vcf-death.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"], - [1234, 'default-gump.vcf-anniversary.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"] + [1234, 'default-gump.vcf.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"], + [1234, 'default-gump.vcf-death.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"], + [1234, 'default-gump.vcf-anniversary.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"] ); } @@ -210,16 +210,16 @@ public function providesBirthday() { return [ [true, '', - "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nUID:12345\r\nDTSTAMP:20160218T133704Z\r\nDTSTART;VALUE=DATE:19000101\r\nDTEND;VALUE=DATE:19000102\r\nRRULE:FREQ=YEARLY\r\nSUMMARY:12345's Birthday (1900)\r\nTRANSP:TRANSPARENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"], + "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nUID:12345\r\nDTSTAMP:20160218T133704Z\r\nDTSTART;VALUE=DATE:19000101\r\nDTEND;VALUE=DATE:19000102\r\nRRULE:FREQ=YEARLY\r\nSUMMARY:12345's Birthday (1900)\r\nTRANSP:TRANSPARENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"], [false, - "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nUID:12345\r\nDTSTAMP:20160218T133704Z\r\nDTSTART;VALUE=DATE:19000101\r\nDTEND;VALUE=DATE:19000102\r\nRRULE:FREQ=YEARLY\r\nSUMMARY:12345's Birthday (1900)\r\nTRANSP:TRANSPARENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", - "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nUID:12345\r\nDTSTAMP:20160218T133704Z\r\nDTSTART;VALUE=DATE:19000101\r\nDTEND;VALUE=DATE:19000102\r\nRRULE:FREQ=YEARLY\r\nSUMMARY:12345's Birthday (1900)\r\nTRANSP:TRANSPARENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"], + "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nUID:12345\r\nDTSTAMP:20160218T133704Z\r\nDTSTART;VALUE=DATE:19000101\r\nDTEND;VALUE=DATE:19000102\r\nRRULE:FREQ=YEARLY\r\nSUMMARY:12345's Birthday (1900)\r\nTRANSP:TRANSPARENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", + "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nUID:12345\r\nDTSTAMP:20160218T133704Z\r\nDTSTART;VALUE=DATE:19000101\r\nDTEND;VALUE=DATE:19000102\r\nRRULE:FREQ=YEARLY\r\nSUMMARY:12345's Birthday (1900)\r\nTRANSP:TRANSPARENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"], [true, - "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nUID:12345\r\nDTSTAMP:20160218T133704Z\r\nDTSTART;VALUE=DATE:19000101\r\nDTEND;VALUE=DATE:19000102\r\nRRULE:FREQ=YEARLY\r\nSUMMARY:4567's Birthday (1900)\r\nTRANSP:TRANSPARENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", - "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nUID:12345\r\nDTSTAMP:20160218T133704Z\r\nDTSTART;VALUE=DATE:19000101\r\nDTEND;VALUE=DATE:19000102\r\nRRULE:FREQ=YEARLY\r\nSUMMARY:12345's Birthday (1900)\r\nTRANSP:TRANSPARENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"], + "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nUID:12345\r\nDTSTAMP:20160218T133704Z\r\nDTSTART;VALUE=DATE:19000101\r\nDTEND;VALUE=DATE:19000102\r\nRRULE:FREQ=YEARLY\r\nSUMMARY:4567's Birthday (1900)\r\nTRANSP:TRANSPARENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", + "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nUID:12345\r\nDTSTAMP:20160218T133704Z\r\nDTSTART;VALUE=DATE:19000101\r\nDTEND;VALUE=DATE:19000102\r\nRRULE:FREQ=YEARLY\r\nSUMMARY:12345's Birthday (1900)\r\nTRANSP:TRANSPARENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"], [true, - "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nUID:12345\r\nDTSTAMP:20160218T133704Z\r\nDTSTART;VALUE=DATE:19000101\r\nDTEND;VALUE=DATE:19000102\r\nRRULE:FREQ=YEARLY\r\nSUMMARY:12345's Birthday (1900)\r\nTRANSP:TRANSPARENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", - "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nUID:12345\r\nDTSTAMP:20160218T133704Z\r\nDTSTART;VALUE=DATE:19000102\r\nDTEND;VALUE=DATE:19000102\r\nRRULE:FREQ=YEARLY\r\nSUMMARY:12345's Birthday (1900)\r\nTRANSP:TRANSPARENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"] + "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nUID:12345\r\nDTSTAMP:20160218T133704Z\r\nDTSTART;VALUE=DATE:19000101\r\nDTEND;VALUE=DATE:19000102\r\nRRULE:FREQ=YEARLY\r\nSUMMARY:12345's Birthday (1900)\r\nTRANSP:TRANSPARENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", + "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nCALSCALE:GREGORIAN\r\nBEGIN:VEVENT\r\nUID:12345\r\nDTSTAMP:20160218T133704Z\r\nDTSTART;VALUE=DATE:19000102\r\nDTEND;VALUE=DATE:19000102\r\nRRULE:FREQ=YEARLY\r\nSUMMARY:12345's Birthday (1900)\r\nTRANSP:TRANSPARENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"] ]; } @@ -236,10 +236,10 @@ public function providesVCards() { [true, null], [true, ''], [true, 'yasfewf'], - [true, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nEND:VCARD\r\n", "Dr. Foo Bar"], - [true, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:\r\nEND:VCARD\r\n", "Dr. Foo Bar"], - [true, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:someday\r\nEND:VCARD\r\n", "Dr. Foo Bar"], - [false, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:1900-01-01\r\nEND:VCARD\r\n", "Dr. Foo Bar"], + [true, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nEND:VCARD\r\n", "Dr. Foo Bar"], + [true, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:\r\nEND:VCARD\r\n", "Dr. Foo Bar"], + [true, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:someday\r\nEND:VCARD\r\n", "Dr. Foo Bar"], + [false, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:1900-01-01\r\nEND:VCARD\r\n", "Dr. Foo Bar"], ]; } } diff --git a/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php b/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php index 890b70d6afa7f..f4c321fa6d0e7 100644 --- a/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php +++ b/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php @@ -169,7 +169,7 @@ public function testAddressBookSharing() { public function testCardOperations() { /** @var CardDavBackend | \PHPUnit_Framework_MockObject_MockObject $backend */ - $backend = $this->getMockBuilder('OCA\DAV\CardDAV\CardDavBackend') + $backend = $this->getMockBuilder(CardDavBackend::class) ->setConstructorArgs([$this->db, $this->principal, $this->userManager, null]) ->setMethods(['updateProperties', 'purgeProperties'])->getMock(); @@ -215,7 +215,7 @@ public function testCardOperations() { public function testMultiCard() { - $this->backend = $this->getMockBuilder('OCA\DAV\CardDAV\CardDavBackend') + $this->backend = $this->getMockBuilder(CardDavBackend::class) ->setConstructorArgs([$this->db, $this->principal, $this->userManager, null]) ->setMethods(['updateProperties'])->getMock(); @@ -261,8 +261,7 @@ public function testMultiCard() { } public function testDeleteWithoutCard() { - - $this->backend = $this->getMockBuilder('OCA\DAV\CardDAV\CardDavBackend') + $this->backend = $this->getMockBuilder(CardDavBackend::class) ->setConstructorArgs([$this->db, $this->principal, $this->userManager, null]) ->setMethods([ 'getCardId', @@ -302,8 +301,7 @@ public function testDeleteWithoutCard() { } public function testSyncSupport() { - - $this->backend = $this->getMockBuilder('OCA\DAV\CardDAV\CardDavBackend') + $this->backend = $this->getMockBuilder(CardDavBackend::class) ->setConstructorArgs([$this->db, $this->principal, $this->userManager, null]) ->setMethods(['updateProperties'])->getMock(); @@ -362,7 +360,7 @@ public function testUpdateProperties() { $cardUri = 'card-uri'; $cardId = 2; - $backend = $this->getMockBuilder('OCA\DAV\CardDAV\CardDavBackend') + $backend = $this->getMockBuilder(CardDavBackend::class) ->setConstructorArgs([$this->db, $this->principal, $this->userManager, null]) ->setMethods(['getCardId'])->getMock(); @@ -370,8 +368,8 @@ public function testUpdateProperties() { // add properties for new vCard $vCard = new VCard(); - $vCard->add(new Text($vCard, 'UID', $cardUri)); - $vCard->add(new Text($vCard, 'FN', 'John Doe')); + $vCard->UID = $cardUri; + $vCard->FN = 'John Doe'; $this->invokePrivate($backend, 'updateProperties', [$bookId, $cardUri, $vCard->serialize()]); $query = $this->db->getQueryBuilder(); @@ -391,7 +389,7 @@ public function testUpdateProperties() { // update properties for existing vCard $vCard = new VCard(); - $vCard->add(new Text($vCard, 'FN', 'John Doe')); + $vCard->UID = $cardUri; $this->invokePrivate($backend, 'updateProperties', [$bookId, $cardUri, $vCard->serialize()]); $query = $this->db->getQueryBuilder(); @@ -399,8 +397,8 @@ public function testUpdateProperties() { $this->assertSame(1, count($result)); - $this->assertSame('FN', $result[0]['name']); - $this->assertSame('John Doe', $result[0]['value']); + $this->assertSame('UID', $result[0]['name']); + $this->assertSame($cardUri, $result[0]['value']); $this->assertSame($bookId, (int)$result[0]['addressbookid']); $this->assertSame($cardId, (int)$result[0]['cardid']); } diff --git a/apps/dav/tests/unit/CardDAV/ConverterTest.php b/apps/dav/tests/unit/CardDAV/ConverterTest.php index 0e4502b9c0a66..7737b999507e4 100644 --- a/apps/dav/tests/unit/CardDAV/ConverterTest.php +++ b/apps/dav/tests/unit/CardDAV/ConverterTest.php @@ -25,6 +25,9 @@ namespace OCA\DAV\Tests\unit\CardDAV; use OCA\DAV\CardDAV\Converter; +use OCP\IImage; +use OCP\IUser; +use PHPUnit_Framework_MockObject_MockObject; use Test\TestCase; class ConverterTest extends TestCase { @@ -44,10 +47,10 @@ public function testCreation($expectedVCard, $displayName = null, $eMailAddress public function providesNewUsers() { return [ - ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;ENCODING=b;TYPE=JPEG:MTIzNDU2Nzg5\r\nEND:VCARD\r\n"], - ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:Dr. Foo Bar\r\nN:Bar;Dr.;Foo;;\r\nPHOTO;ENCODING=b;TYPE=JPEG:MTIzNDU2Nzg5\r\nEND:VCARD\r\n", "Dr. Foo Bar"], - ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:Dr. Foo Bar\r\nN:Bar;Dr.;Foo;;\r\nEMAIL;TYPE=OTHER:foo@bar.net\r\nPHOTO;ENCODING=b;TYPE=JPEG:MTIzNDU2Nzg5\r\nEND:VCARD\r\n", "Dr. Foo Bar", "foo@bar.net"], - ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:Dr. Foo Bar\r\nN:Bar;Dr.;Foo;;\r\nCLOUD:foo@bar.net\r\nPHOTO;ENCODING=b;TYPE=JPEG:MTIzNDU2Nzg5\r\nEND:VCARD\r\n", "Dr. Foo Bar", null, "foo@bar.net"], + ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;ENCODING=b;TYPE=JPEG:MTIzNDU2Nzg5\r\nEND:VCARD\r\n"], + ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:Dr. Foo Bar\r\nN:Bar;Dr.;Foo;;\r\nPHOTO;ENCODING=b;TYPE=JPEG:MTIzNDU2Nzg5\r\nEND:VCARD\r\n", "Dr. Foo Bar"], + ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:Dr. Foo Bar\r\nN:Bar;Dr.;Foo;;\r\nEMAIL;TYPE=OTHER:foo@bar.net\r\nPHOTO;ENCODING=b;TYPE=JPEG:MTIzNDU2Nzg5\r\nEND:VCARD\r\n", "Dr. Foo Bar", "foo@bar.net"], + ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:Dr. Foo Bar\r\nN:Bar;Dr.;Foo;;\r\nCLOUD:foo@bar.net\r\nPHOTO;ENCODING=b;TYPE=JPEG:MTIzNDU2Nzg5\r\nEND:VCARD\r\n", "Dr. Foo Bar", null, "foo@bar.net"], ]; } @@ -91,9 +94,9 @@ public function testUpdateOfRemovedElement($expectedVCard, $displayName = null, public function providesUsersForUpdateOfRemovedElement() { return [ - ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nEND:VCARD\r\n", "Dr. Foo Bar"], - ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nEND:VCARD\r\n", "Dr. Foo Bar", "foo@bar.net"], - ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nEND:VCARD\r\n", "Dr. Foo Bar", null, "foo@bar.net"], + ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nEND:VCARD\r\n", "Dr. Foo Bar"], + ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nEND:VCARD\r\n", "Dr. Foo Bar", "foo@bar.net"], + ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nEND:VCARD\r\n", "Dr. Foo Bar", null, "foo@bar.net"], ]; } @@ -122,13 +125,13 @@ public function providesNames() { * @param $displayName * @param $eMailAddress * @param $cloudId - * @return \PHPUnit_Framework_MockObject_MockObject + * @return IUser | PHPUnit_Framework_MockObject_MockObject */ protected function getUserMock($displayName, $eMailAddress, $cloudId) { - $image0 = $this->getMockBuilder('OCP\IImage')->disableOriginalConstructor()->getMock(); + $image0 = $this->getMockBuilder(IImage::class)->disableOriginalConstructor()->getMock(); $image0->method('mimeType')->willReturn('JPEG'); $image0->method('data')->willReturn('123456789'); - $user = $this->getMockBuilder('OCP\IUser')->disableOriginalConstructor()->getMock(); + $user = $this->getMockBuilder(IUser::class)->disableOriginalConstructor()->getMock(); $user->method('getUID')->willReturn('12345'); $user->method('getDisplayName')->willReturn($displayName); $user->method('getEMailAddress')->willReturn($eMailAddress); diff --git a/apps/dav/tests/unit/CardDAV/ImageExportPluginTest.php b/apps/dav/tests/unit/CardDAV/ImageExportPluginTest.php index e878cbd4f59c2..fc4be1433fe0c 100644 --- a/apps/dav/tests/unit/CardDAV/ImageExportPluginTest.php +++ b/apps/dav/tests/unit/CardDAV/ImageExportPluginTest.php @@ -159,36 +159,36 @@ public function providesPhotoData() { ], 'vcard without PHOTO' => [ false, - "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nEND:VCARD\r\n" + "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nEND:VCARD\r\n" ], 'vcard 3 with PHOTO' => [ [ 'Content-Type' => 'image/jpeg', 'body' => '12345' ], - "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;ENCODING=b;TYPE=JPEG:MTIzNDU=\r\nEND:VCARD\r\n" + "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;ENCODING=b;TYPE=JPEG:MTIzNDU=\r\nEND:VCARD\r\n" ], 'vcard 3 with PHOTO URL' => [ false, - "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;TYPE=JPEG;VALUE=URI:http://example.com/photo.jpg\r\nEND:VCARD\r\n" + "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;TYPE=JPEG;VALUE=URI:http://example.com/photo.jpg\r\nEND:VCARD\r\n" ], 'vcard 4 with PHOTO' => [ [ 'Content-Type' => 'image/jpeg', 'body' => '12345' ], - "BEGIN:VCARD\r\nVERSION:4.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO:data:image/jpeg;base64,MTIzNDU=\r\nEND:VCARD\r\n" + "BEGIN:VCARD\r\nVERSION:4.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO:data:image/jpeg;base64,MTIzNDU=\r\nEND:VCARD\r\n" ], 'vcard 4 with PHOTO URL' => [ false, - "BEGIN:VCARD\r\nVERSION:4.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;MEDIATYPE=image/jpeg:http://example.org/photo.jpg\r\nEND:VCARD\r\n" + "BEGIN:VCARD\r\nVERSION:4.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;MEDIATYPE=image/jpeg:http://example.org/photo.jpg\r\nEND:VCARD\r\n" ], 'vcard 4 with PHOTO AND INVALID MIMEtYPE' => [ [ 'Content-Type' => 'application/octet-stream', 'body' => '12345' ], - "BEGIN:VCARD\r\nVERSION:4.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO:data:image/svg;base64,MTIzNDU=\r\nEND:VCARD\r\n" + "BEGIN:VCARD\r\nVERSION:4.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO:data:image/svg;base64,MTIzNDU=\r\nEND:VCARD\r\n" ], ]; } diff --git a/apps/dav/tests/unit/CardDAV/SyncServiceTest.php b/apps/dav/tests/unit/CardDAV/SyncServiceTest.php index 62225dc293805..e6a5ac1f16ab9 100644 --- a/apps/dav/tests/unit/CardDAV/SyncServiceTest.php +++ b/apps/dav/tests/unit/CardDAV/SyncServiceTest.php @@ -68,7 +68,7 @@ public function testSyncWithDeletedElement() { public function testEnsureSystemAddressBookExists() { /** @var CardDavBackend | \PHPUnit_Framework_MockObject_MockObject $backend */ - $backend = $this->getMockBuilder('OCA\DAV\CardDAV\CardDAVBackend')->disableOriginalConstructor()->getMock(); + $backend = $this->getMockBuilder(CardDavBackend::class)->disableOriginalConstructor()->getMock(); $backend->expects($this->exactly(1))->method('createAddressBook'); $backend->expects($this->at(0))->method('getAddressBooksByUri')->willReturn(null); $backend->expects($this->at(1))->method('getAddressBooksByUri')->willReturn([]); @@ -82,7 +82,7 @@ public function testEnsureSystemAddressBookExists() { public function testUpdateAndDeleteUser() { /** @var CardDavBackend | \PHPUnit_Framework_MockObject_MockObject $backend */ - $backend = $this->getMockBuilder('OCA\DAV\CardDAV\CardDAVBackend')->disableOriginalConstructor()->getMock(); + $backend = $this->getMockBuilder(CardDavBackend::class)->disableOriginalConstructor()->getMock(); $logger = $this->getMockBuilder('OCP\ILogger')->disableOriginalConstructor()->getMock(); $backend->expects($this->once())->method('createCard'); @@ -118,7 +118,9 @@ public function testUpdateAndDeleteUser() { * @return \PHPUnit_Framework_MockObject_MockObject */ private function getBackendMock($createCount, $updateCount, $deleteCount) { - $backend = $this->getMockBuilder('OCA\DAV\CardDAV\CardDAVBackend')->disableOriginalConstructor()->getMock(); + $backend = $this->getMockBuilder(CardDavBackend::class) + ->disableOriginalConstructor() + ->getMock(); $backend->expects($this->exactly($createCount))->method('createCard'); $backend->expects($this->exactly($updateCount))->method('updateCard'); $backend->expects($this->exactly($deleteCount))->method('deleteCard'); @@ -134,7 +136,7 @@ private function getSyncServiceMock($backend, $response) { $userManager = $this->getMockBuilder('OCP\IUserManager')->disableOriginalConstructor()->getMock(); $logger = $this->getMockBuilder('OCP\ILogger')->disableOriginalConstructor()->getMock(); /** @var SyncService | \PHPUnit_Framework_MockObject_MockObject $ss */ - $ss = $this->getMockBuilder('OCA\DAV\CardDAV\SyncService') + $ss = $this->getMockBuilder(SyncService::class) ->setMethods(['ensureSystemAddressBookExists', 'requestSyncReport', 'download']) ->setConstructorArgs([$backend, $userManager, $logger]) ->getMock(); diff --git a/apps/dav/tests/unit/Connector/Sabre/AuthTest.php b/apps/dav/tests/unit/Connector/Sabre/AuthTest.php index 8d77fc03a8de0..74b85b8a1c9c9 100644 --- a/apps/dav/tests/unit/Connector/Sabre/AuthTest.php +++ b/apps/dav/tests/unit/Connector/Sabre/AuthTest.php @@ -34,6 +34,8 @@ use OCP\IRequest; use OCP\ISession; use OCP\IUser; +use Sabre\HTTP\RequestInterface; +use Sabre\HTTP\ResponseInterface; use Test\TestCase; /** @@ -237,10 +239,10 @@ public function testValidateUserPassWithPasswordLoginForbidden() { } public function testAuthenticateAlreadyLoggedInWithoutCsrfTokenForNonGet() { - $request = $this->getMockBuilder('Sabre\HTTP\RequestInterface') + $request = $this->getMockBuilder(RequestInterface::class) ->disableOriginalConstructor() ->getMock(); - $response = $this->getMockBuilder('Sabre\HTTP\ResponseInterface') + $response = $this->getMockBuilder(ResponseInterface::class) ->disableOriginalConstructor() ->getMock(); $this->userSession @@ -273,17 +275,17 @@ public function testAuthenticateAlreadyLoggedInWithoutCsrfTokenForNonGet() { $expectedResponse = [ false, - "No 'Authorization: Basic' header found. Either the client didn't send one, or the server is mis-configured", + "No 'Authorization: Basic' header found. Either the client didn't send one, or the server is misconfigured", ]; $response = $this->auth->check($request, $response); $this->assertSame($expectedResponse, $response); } public function testAuthenticateAlreadyLoggedInWithoutCsrfTokenAndCorrectlyDavAuthenticated() { - $request = $this->getMockBuilder('Sabre\HTTP\RequestInterface') + $request = $this->getMockBuilder(RequestInterface::class) ->disableOriginalConstructor() ->getMock(); - $response = $this->getMockBuilder('Sabre\HTTP\ResponseInterface') + $response = $this->getMockBuilder(ResponseInterface::class) ->disableOriginalConstructor() ->getMock(); $this->userSession @@ -330,10 +332,10 @@ public function testAuthenticateAlreadyLoggedInWithoutCsrfTokenAndCorrectlyDavAu * @expectedExceptionMessage 2FA challenge not passed. */ public function testAuthenticateAlreadyLoggedInWithoutTwoFactorChallengePassed() { - $request = $this->getMockBuilder('Sabre\HTTP\RequestInterface') + $request = $this->getMockBuilder(RequestInterface::class) ->disableOriginalConstructor() ->getMock(); - $response = $this->getMockBuilder('Sabre\HTTP\ResponseInterface') + $response = $this->getMockBuilder(ResponseInterface::class) ->disableOriginalConstructor() ->getMock(); $this->userSession @@ -384,10 +386,10 @@ public function testAuthenticateAlreadyLoggedInWithoutTwoFactorChallengePassed() * @expectedExceptionMessage CSRF check not passed. */ public function testAuthenticateAlreadyLoggedInWithoutCsrfTokenAndIncorrectlyDavAuthenticated() { - $request = $this->getMockBuilder('Sabre\HTTP\RequestInterface') + $request = $this->getMockBuilder(RequestInterface::class) ->disableOriginalConstructor() ->getMock(); - $response = $this->getMockBuilder('Sabre\HTTP\ResponseInterface') + $response = $this->getMockBuilder(ResponseInterface::class) ->disableOriginalConstructor() ->getMock(); $this->userSession @@ -430,10 +432,10 @@ public function testAuthenticateAlreadyLoggedInWithoutCsrfTokenAndIncorrectlyDav } public function testAuthenticateAlreadyLoggedInWithoutCsrfTokenForNonGetAndDesktopClient() { - $request = $this->getMockBuilder('Sabre\HTTP\RequestInterface') + $request = $this->getMockBuilder(RequestInterface::class) ->disableOriginalConstructor() ->getMock(); - $response = $this->getMockBuilder('Sabre\HTTP\ResponseInterface') + $response = $this->getMockBuilder(ResponseInterface::class) ->disableOriginalConstructor() ->getMock(); $this->userSession @@ -477,10 +479,10 @@ public function testAuthenticateAlreadyLoggedInWithoutCsrfTokenForNonGetAndDeskt } public function testAuthenticateAlreadyLoggedInWithoutCsrfTokenForGet() { - $request = $this->getMockBuilder('Sabre\HTTP\RequestInterface') + $request = $this->getMockBuilder(RequestInterface::class) ->disableOriginalConstructor() ->getMock(); - $response = $this->getMockBuilder('Sabre\HTTP\ResponseInterface') + $response = $this->getMockBuilder(ResponseInterface::class) ->disableOriginalConstructor() ->getMock(); $this->userSession @@ -512,10 +514,10 @@ public function testAuthenticateAlreadyLoggedInWithoutCsrfTokenForGet() { } public function testAuthenticateAlreadyLoggedInWithCsrfTokenForGet() { - $request = $this->getMockBuilder('Sabre\HTTP\RequestInterface') + $request = $this->getMockBuilder(RequestInterface::class) ->disableOriginalConstructor() ->getMock(); - $response = $this->getMockBuilder('Sabre\HTTP\ResponseInterface') + $response = $this->getMockBuilder(ResponseInterface::class) ->disableOriginalConstructor() ->getMock(); $this->userSession @@ -550,14 +552,14 @@ public function testAuthenticateNoBasicAuthenticateHeadersProvided() { $server = $this->getMockBuilder('\Sabre\DAV\Server') ->disableOriginalConstructor() ->getMock(); - $server->httpRequest = $this->getMockBuilder('\Sabre\HTTP\RequestInterface') + $server->httpRequest = $this->getMockBuilder(RequestInterface::class) ->disableOriginalConstructor() ->getMock(); - $server->httpResponse = $this->getMockBuilder('\Sabre\HTTP\ResponseInterface') + $server->httpResponse = $this->getMockBuilder(ResponseInterface::class) ->disableOriginalConstructor() ->getMock(); $response = $this->auth->check($server->httpRequest, $server->httpResponse); - $this->assertEquals([false, 'No \'Authorization: Basic\' header found. Either the client didn\'t send one, or the server is mis-configured'], $response); + $this->assertEquals([false, 'No \'Authorization: Basic\' header found. Either the client didn\'t send one, or the server is misconfigured'], $response); } /** @@ -566,11 +568,11 @@ public function testAuthenticateNoBasicAuthenticateHeadersProvided() { */ public function testAuthenticateNoBasicAuthenticateHeadersProvidedWithAjax() { /** @var \Sabre\HTTP\RequestInterface $httpRequest */ - $httpRequest = $this->getMockBuilder('\Sabre\HTTP\RequestInterface') + $httpRequest = $this->getMockBuilder(RequestInterface::class) ->disableOriginalConstructor() ->getMock(); /** @var \Sabre\HTTP\ResponseInterface $httpResponse */ - $httpResponse = $this->getMockBuilder('\Sabre\HTTP\ResponseInterface') + $httpResponse = $this->getMockBuilder(ResponseInterface::class) ->disableOriginalConstructor() ->getMock(); $this->userSession @@ -587,11 +589,11 @@ public function testAuthenticateNoBasicAuthenticateHeadersProvidedWithAjax() { public function testAuthenticateNoBasicAuthenticateHeadersProvidedWithAjaxButUserIsStillLoggedIn() { /** @var \Sabre\HTTP\RequestInterface $httpRequest */ - $httpRequest = $this->getMockBuilder('\Sabre\HTTP\RequestInterface') + $httpRequest = $this->getMockBuilder(RequestInterface::class) ->disableOriginalConstructor() ->getMock(); /** @var \Sabre\HTTP\ResponseInterface $httpResponse */ - $httpResponse = $this->getMockBuilder('\Sabre\HTTP\ResponseInterface') + $httpResponse = $this->getMockBuilder(ResponseInterface::class) ->disableOriginalConstructor() ->getMock(); /** @var IUser */ @@ -631,7 +633,7 @@ public function testAuthenticateValidCredentials() { $server = $this->getMockBuilder('\Sabre\DAV\Server') ->disableOriginalConstructor() ->getMock(); - $server->httpRequest = $this->getMockBuilder('\Sabre\HTTP\RequestInterface') + $server->httpRequest = $this->getMockBuilder(RequestInterface::class) ->disableOriginalConstructor() ->getMock(); $server->httpRequest @@ -644,7 +646,7 @@ public function testAuthenticateValidCredentials() { ->method('getHeader') ->with('Authorization') ->will($this->returnValue('basic dXNlcm5hbWU6cGFzc3dvcmQ=')); - $server->httpResponse = $this->getMockBuilder('\Sabre\HTTP\ResponseInterface') + $server->httpResponse = $this->getMockBuilder(ResponseInterface::class) ->disableOriginalConstructor() ->getMock(); $this->userSession @@ -670,7 +672,7 @@ public function testAuthenticateInvalidCredentials() { $server = $this->getMockBuilder('\Sabre\DAV\Server') ->disableOriginalConstructor() ->getMock(); - $server->httpRequest = $this->getMockBuilder('\Sabre\HTTP\RequestInterface') + $server->httpRequest = $this->getMockBuilder(RequestInterface::class) ->disableOriginalConstructor() ->getMock(); $server->httpRequest @@ -683,7 +685,7 @@ public function testAuthenticateInvalidCredentials() { ->method('getHeader') ->with('Authorization') ->will($this->returnValue('basic dXNlcm5hbWU6cGFzc3dvcmQ=')); - $server->httpResponse = $this->getMockBuilder('\Sabre\HTTP\ResponseInterface') + $server->httpResponse = $this->getMockBuilder(ResponseInterface::class) ->disableOriginalConstructor() ->getMock(); $this->userSession diff --git a/apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php b/apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php index d39f709493e0d..d4e9ce9dd3e4b 100644 --- a/apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php +++ b/apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php @@ -29,6 +29,8 @@ use OCP\Files\StorageNotAvailableException; use Sabre\DAV\PropFind; use Sabre\DAV\PropPatch; +use Sabre\HTTP\RequestInterface; +use Sabre\HTTP\ResponseInterface; use Test\TestCase; /** @@ -485,10 +487,10 @@ public function downloadHeadersProvider() { * @dataProvider downloadHeadersProvider */ public function testDownloadHeaders($isClumsyAgent, $contentDispositionHeader) { - $request = $this->getMockBuilder('Sabre\HTTP\RequestInterface') + $request = $this->getMockBuilder(RequestInterface::class) ->disableOriginalConstructor() ->getMock(); - $response = $this->getMockBuilder('Sabre\HTTP\ResponseInterface') + $response = $this->getMockBuilder(ResponseInterface::class) ->disableOriginalConstructor() ->getMock(); diff --git a/build/integration/composer.json b/build/integration/composer.json index 29f73f2064ac9..d7ccd593277a2 100644 --- a/build/integration/composer.json +++ b/build/integration/composer.json @@ -4,6 +4,6 @@ "behat/behat": "^3.0", "guzzlehttp/guzzle": "~5.0", "jarnaiz/behat-junit-formatter": "^1.3", - "sabre/dav": "3.0.9" + "sabre/dav": "3.2" } } From ca379bdb7d75611753a0d7d086e97d5c5017ce26 Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Fri, 4 Nov 2016 13:35:52 +0100 Subject: [PATCH 2/8] [3rdparty] Bump sabre/dav to 3.2 Signed-off-by: Roeland Jago Douma --- 3rdparty | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty b/3rdparty index bbe556f5a3030..a5036f09aca6d 160000 --- a/3rdparty +++ b/3rdparty @@ -1 +1 @@ -Subproject commit bbe556f5a3030e8ccf969ba7f54646226cccd5c2 +Subproject commit a5036f09aca6d817f55e36c101684ac95120bdea From 9fa3a22ddd7703302c4d8c452b8d2a6b5a401287 Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Tue, 18 Oct 2016 23:01:44 +0200 Subject: [PATCH 3/8] Fix tests Signed-off-by: Roeland Jago Douma --- apps/dav/lib/CardDAV/AddressBookImpl.php | 1 - apps/dav/tests/unit/CardDAV/AddressBookImplTest.php | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/dav/lib/CardDAV/AddressBookImpl.php b/apps/dav/lib/CardDAV/AddressBookImpl.php index 5f77c0f44f68b..c650f6c30be06 100644 --- a/apps/dav/lib/CardDAV/AddressBookImpl.php +++ b/apps/dav/lib/CardDAV/AddressBookImpl.php @@ -225,7 +225,6 @@ protected function vCard2Array($uri, VCard $vCard) { ]; foreach ($vCard->children() as $property) { - $result[$property->name] = $property->getValue(); if ($property->name === 'PHOTO' && $property->getValueType() === 'BINARY') { $url = $this->urlGenerator->getAbsoluteURL( $this->urlGenerator->linkTo('', 'remote.php') . '/dav/'); diff --git a/apps/dav/tests/unit/CardDAV/AddressBookImplTest.php b/apps/dav/tests/unit/CardDAV/AddressBookImplTest.php index bd63f4cdffb1b..172b341bd79f3 100644 --- a/apps/dav/tests/unit/CardDAV/AddressBookImplTest.php +++ b/apps/dav/tests/unit/CardDAV/AddressBookImplTest.php @@ -332,10 +332,11 @@ public function testVCard2Array() { $array = $this->invokePrivate($this->addressBookImpl, 'vCard2Array', ['uri', $vCard]); unset($array['PRODID']); + unset($array['UID']); $this->assertEquals([ 'URI' => 'uri', - 'VERSION' => '3.0', + 'VERSION' => '4.0', 'FN' => 'Full Name', 'CLOUD' => [ 'cloud-user1@localhost', From 6d1c0be47d2f3052f7e6c35377feee2ceb2cee29 Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Wed, 19 Oct 2016 10:49:43 +0200 Subject: [PATCH 4/8] Minor fixes Signed-off-by: Roeland Jago Douma --- apps/dav/lib/CalDAV/CalDavBackend.php | 6 +++--- apps/dav/lib/CalDAV/Calendar.php | 2 +- apps/dav/lib/Server.php | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/dav/lib/CalDAV/CalDavBackend.php b/apps/dav/lib/CalDAV/CalDavBackend.php index fb608c2009de4..d77c761a2cf60 100644 --- a/apps/dav/lib/CalDAV/CalDavBackend.php +++ b/apps/dav/lib/CalDAV/CalDavBackend.php @@ -37,7 +37,6 @@ use Sabre\CalDAV\Backend\SchedulingSupport; use Sabre\CalDAV\Backend\SubscriptionSupport; use Sabre\CalDAV\Backend\SyncSupport; -use Sabre\CalDAV\Plugin; use Sabre\CalDAV\Xml\Property\ScheduleCalendarTransp; use Sabre\CalDAV\Xml\Property\SupportedCalendarComponentSet; use Sabre\DAV; @@ -236,6 +235,7 @@ function getCalendarsForUser($principalUri) { '{http://sabredav.org/ns}sync-token' => $row['synctoken']?$row['synctoken']:'0', '{' . Plugin::NS_CALDAV . '}supported-calendar-component-set' => new SupportedCalendarComponentSet($components), '{' . Plugin::NS_CALDAV . '}schedule-calendar-transp' => new ScheduleCalendarTransp($row['transparent']?'transparent':'opaque'), + '{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}owner-principal' => $principalUri, ]; foreach($this->propertyMap as $xmlName=>$dbName) { @@ -1658,7 +1658,7 @@ public function getDenormalizedData($calendarData) { $it = new EventIterator($vObject, (string)$component->UID); $maxDate = new \DateTime(self::MAX_DATE); if ($it->isInfinite()) { - $lastOccurrence = $maxDate->getTimeStamp(); + $lastOccurrence = $maxDate->getTimestamp(); } else { $end = $it->getDtEnd(); while($it->valid() && $end < $maxDate) { @@ -1666,7 +1666,7 @@ public function getDenormalizedData($calendarData) { $it->next(); } - $lastOccurrence = $end->getTimeStamp(); + $lastOccurrence = $end->getTimestamp(); } } diff --git a/apps/dav/lib/CalDAV/Calendar.php b/apps/dav/lib/CalDAV/Calendar.php index fc08c9ac87a61..2df8944b83fc9 100644 --- a/apps/dav/lib/CalDAV/Calendar.php +++ b/apps/dav/lib/CalDAV/Calendar.php @@ -283,7 +283,7 @@ private function isPublic() { } private function isShared() { - return isset($this->calendarInfo['{http://owncloud.org/ns}owner-principal']); + return $this->calendarInfo['{http://owncloud.org/ns}owner-principal'] !== $this->calendarInfo['principaluri']; } public function isSubscription() { diff --git a/apps/dav/lib/Server.php b/apps/dav/lib/Server.php index 9d74bac71fa10..385a2fa93d9e6 100644 --- a/apps/dav/lib/Server.php +++ b/apps/dav/lib/Server.php @@ -125,7 +125,7 @@ public function __construct(IRequest $request, $baseUri) { $this->server->addPlugin(new DAV\Sharing\Plugin($authBackend, \OC::$server->getRequest())); $this->server->addPlugin(new \OCA\DAV\CalDAV\Publishing\PublishPlugin( \OC::$server->getConfig(), - \OC::$server->getUrlGenerator() + \OC::$server->getURLGenerator() )); // addressbook plugins From c016d947e2243329243b62a41caab82a4ff46a10 Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Fri, 4 Nov 2016 15:05:15 +0100 Subject: [PATCH 5/8] Fix plugin Signed-off-by: Roeland Jago Douma --- apps/dav/lib/CalDAV/Schedule/Plugin.php | 42 +++++++++++++++++++++++++ apps/dav/lib/Server.php | 2 +- 2 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 apps/dav/lib/CalDAV/Schedule/Plugin.php diff --git a/apps/dav/lib/CalDAV/Schedule/Plugin.php b/apps/dav/lib/CalDAV/Schedule/Plugin.php new file mode 100644 index 0000000000000..ad55a2756b0ea --- /dev/null +++ b/apps/dav/lib/CalDAV/Schedule/Plugin.php @@ -0,0 +1,42 @@ + + * + * @author Roeland Jago Douma + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ +namespace OCA\DAV\CalDAV\Schedule; + +class Plugin extends \Sabre\CalDAV\Schedule\Plugin { + + /** + * Returns a list of addresses that are associated with a principal. + * + * @param string $principal + * @return array + */ + protected function getAddressesForPrincipal($principal) { + $result = parent::getAddressesForPrincipal($principal); + + if ($result === null) { + $result = []; + } + + return $result; + } +} diff --git a/apps/dav/lib/Server.php b/apps/dav/lib/Server.php index 385a2fa93d9e6..fca4d0ce209fb 100644 --- a/apps/dav/lib/Server.php +++ b/apps/dav/lib/Server.php @@ -118,7 +118,7 @@ public function __construct(IRequest $request, $baseUri) { // calendar plugins $this->server->addPlugin(new \OCA\DAV\CalDAV\Plugin()); $this->server->addPlugin(new \Sabre\CalDAV\ICSExportPlugin()); - $this->server->addPlugin(new \Sabre\CalDAV\Schedule\Plugin()); + $this->server->addPlugin(new \OCA\DAV\CalDAV\Schedule\Plugin()); $this->server->addPlugin(new IMipPlugin($mailer, $logger)); $this->server->addPlugin(new \Sabre\CalDAV\Subscriptions\Plugin()); $this->server->addPlugin(new \Sabre\CalDAV\Notifications\Plugin()); From 1e6175dfcbb7a0c554fecf62c2d31a422df841e6 Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Fri, 4 Nov 2016 15:40:59 +0100 Subject: [PATCH 6/8] Fix CalendarTest * Made sure delete from self works again (and is tested) Signed-off-by: Roeland Jago Douma --- apps/dav/lib/CalDAV/Calendar.php | 7 ++++++- apps/dav/tests/unit/CalDAV/CalendarTest.php | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/apps/dav/lib/CalDAV/Calendar.php b/apps/dav/lib/CalDAV/Calendar.php index 2df8944b83fc9..9fedbe6f91f7b 100644 --- a/apps/dav/lib/CalDAV/Calendar.php +++ b/apps/dav/lib/CalDAV/Calendar.php @@ -153,7 +153,8 @@ function getOwner() { } function delete() { - if (isset($this->calendarInfo['{http://owncloud.org/ns}owner-principal'])) { + if (isset($this->calendarInfo['{http://owncloud.org/ns}owner-principal']) && + $this->calendarInfo['{http://owncloud.org/ns}owner-principal'] !== $this->calendarInfo['principaluri']) { $principal = 'principal:' . parent::getOwner(); $shares = $this->getShares(); $shares = array_filter($shares, function($share) use ($principal){ @@ -283,6 +284,10 @@ private function isPublic() { } private function isShared() { + if (!isset($this->calendarInfo['{http://owncloud.org/ns}owner-principal'])) { + return false; + } + return $this->calendarInfo['{http://owncloud.org/ns}owner-principal'] !== $this->calendarInfo['principaluri']; } diff --git a/apps/dav/tests/unit/CalDAV/CalendarTest.php b/apps/dav/tests/unit/CalDAV/CalendarTest.php index bd4c1f6aabb99..e585a23a9a201 100644 --- a/apps/dav/tests/unit/CalDAV/CalendarTest.php +++ b/apps/dav/tests/unit/CalDAV/CalendarTest.php @@ -85,6 +85,25 @@ public function testDeleteFromGroup() { $c->delete(); } + public function testDeleteOwn() { + /** @var \PHPUnit_Framework_MockObject_MockObject | CalDavBackend $backend */ + $backend = $this->createMock(CalDavBackend::class); + $backend->expects($this->never())->method('updateShares'); + $backend->expects($this->never())->method('getShares'); + + $backend->expects($this->once())->method('deleteCalendar') + ->with(666); + + $calendarInfo = [ + '{http://owncloud.org/ns}owner-principal' => 'user1', + 'principaluri' => 'user1', + 'id' => 666, + 'uri' => 'cal', + ]; + $c = new Calendar($backend, $calendarInfo, $this->l10n); + $c->delete(); + } + public function dataPropPatch() { return [ [[], true], From 58ca624b62d775436ee8419bc983d904f544cb8d Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Wed, 9 Nov 2016 11:52:40 +0100 Subject: [PATCH 7/8] Add tests Signed-off-by: Lukas Reschke --- apps/dav/tests/unit/CalDAV/PluginTest.php | 60 ++++++++++++++ .../tests/unit/CalDAV/Schedule/PluginTest.php | 83 +++++++++++++++++++ 2 files changed, 143 insertions(+) create mode 100644 apps/dav/tests/unit/CalDAV/PluginTest.php create mode 100644 apps/dav/tests/unit/CalDAV/Schedule/PluginTest.php diff --git a/apps/dav/tests/unit/CalDAV/PluginTest.php b/apps/dav/tests/unit/CalDAV/PluginTest.php new file mode 100644 index 0000000000000..d0330af402a8b --- /dev/null +++ b/apps/dav/tests/unit/CalDAV/PluginTest.php @@ -0,0 +1,60 @@ + + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace OCA\DAV\Tests\unit\CalDAV; + +use OCA\DAV\CalDAV\Plugin; +use Test\TestCase; + +class PluginTest extends TestCase { + /** @var Plugin */ + private $plugin; + + public function setUp() { + parent::setUp(); + + $this->plugin = new Plugin(); + } + + public function linkProvider() { + return [ + [ + 'principals/users/MyUserName', + 'calendars/MyUserName', + ], + [ + 'FooFoo', + null, + ], + ]; + } + + /** + * @dataProvider linkProvider + * + * @param $input + * @param $expected + */ + public function testGetCalendarHomeForPrincipal($input, $expected) { + $this->assertSame($expected, $this->plugin->getCalendarHomeForPrincipal($input)); + } + +} diff --git a/apps/dav/tests/unit/CalDAV/Schedule/PluginTest.php b/apps/dav/tests/unit/CalDAV/Schedule/PluginTest.php new file mode 100644 index 0000000000000..6df8d2da2a218 --- /dev/null +++ b/apps/dav/tests/unit/CalDAV/Schedule/PluginTest.php @@ -0,0 +1,83 @@ + + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace OCA\DAV\Tests\unit\CalDAV\Schedule; + +use OCA\DAV\CalDAV\Schedule\Plugin; +use Sabre\DAV\Server; +use Sabre\DAV\Xml\Property\Href; +use Test\TestCase; + +class PluginTest extends TestCase { + /** @var Plugin */ + private $plugin; + /** @var Server|\PHPUnit_Framework_MockObject_MockObject */ + private $server; + + public function setUp() { + parent::setUp(); + + $this->server = $this->createMock(Server::class); + + $this->plugin = new Plugin(); + $this->plugin->initialize($this->server); + } + + public function testGetAddressesForPrincipal() { + $href = $this->createMock(Href::class); + $href + ->expects($this->once()) + ->method('getHrefs') + ->willReturn(['lukas@nextcloud.com', 'rullzer@nextcloud.com']); + $this->server + ->expects($this->once()) + ->method('getProperties') + ->with( + 'MyPrincipal', + [ + '{urn:ietf:params:xml:ns:caldav}calendar-user-address-set', + ] + ) + ->willReturn([ + '{urn:ietf:params:xml:ns:caldav}calendar-user-address-set' => $href + ]); + + $result = $this->invokePrivate($this->plugin, 'getAddressesForPrincipal', ['MyPrincipal']); + $this->assertSame(['lukas@nextcloud.com', 'rullzer@nextcloud.com'], $result); + } + + + public function testGetAddressesForPrincipalEmpty() { + $this->server + ->expects($this->once()) + ->method('getProperties') + ->with( + 'MyPrincipal', + [ + '{urn:ietf:params:xml:ns:caldav}calendar-user-address-set', + ] + ) + ->willReturn(null); + + $result = $this->invokePrivate($this->plugin, 'getAddressesForPrincipal', ['MyPrincipal']); + $this->assertSame([], $result); + } +} From da55dd1d1f224fec8e61473a48e02759dc1d44e2 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Wed, 9 Nov 2016 11:53:36 +0100 Subject: [PATCH 8/8] Adjust third-party ref Signed-off-by: Lukas Reschke --- 3rdparty | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty b/3rdparty index a5036f09aca6d..f2974c2e72b2a 160000 --- a/3rdparty +++ b/3rdparty @@ -1 +1 @@ -Subproject commit a5036f09aca6d817f55e36c101684ac95120bdea +Subproject commit f2974c2e72b2ad5ab7ae745936c4d866405d2b61