]> source.dussan.org Git - nextcloud-server.git/commitdiff
handle nested properties, fixes #20544 23317/head
authorcall-me-matt <nextcloud@matthiasheinisch.de>
Fri, 9 Oct 2020 14:27:41 +0000 (16:27 +0200)
committercall-me-matt <nextcloud@matthiasheinisch.de>
Mon, 12 Oct 2020 19:27:38 +0000 (21:27 +0200)
Signed-off-by: call-me-matt <nextcloud@matthiasheinisch.de>
apps/dav/lib/CardDAV/AddressBookImpl.php
apps/dav/tests/unit/CardDAV/AddressBookImplTest.php

index 1c35e2c400cc1dc299b3b9cb1d5e2e98a93d266a..785ec2b7a0197891ba489f6e14c2e13539ffd861 100644 (file)
@@ -146,7 +146,22 @@ class AddressBookImpl implements IAddressBook {
                }
 
                foreach ($properties as $key => $value) {
-                       $vCard->$key = $vCard->createProperty($key, $value);
+                       if (is_array($value)) {
+                               $vCard->remove($key);
+                               foreach ($value as $entry) {
+                                       if (($key === "ADR" || $key === "PHOTO") && is_string($entry["value"])) {
+                                               $entry["value"] = stripslashes($entry["value"]);
+                                               $entry["value"] = explode(';', $entry["value"]);
+                                       }
+                                       $property = $vCard->createProperty($key, $entry["value"]);
+                                       if (isset($entry["type"])) {
+                                               $property->add('TYPE', $entry["type"]);
+                                       }
+                                       $vCard->add($property);
+                               }
+                       } elseif ($key !== 'URI') {
+                               $vCard->$key = $vCard->createProperty($key, $value);
+                       }
                }
 
                if ($update) {
index 67748cc0883f11bce347ef2f365b4baf6da2f7b4..9261dc4057b193c0a93942cfaa1f4c9a976cf67b 100644 (file)
@@ -10,6 +10,7 @@
  * @author Morris Jobke <hey@morrisjobke.de>
  * @author Roeland Jago Douma <roeland@famdouma.nl>
  * @author Thomas Müller <thomas.mueller@tmit.eu>
+ * @author Matthias Heinisch <nextcloud@matthiasheinisch.de>
  *
  * @license AGPL-3.0
  *
@@ -35,6 +36,7 @@ use OCA\DAV\CardDAV\CardDavBackend;
 use OCP\IURLGenerator;
 use Sabre\VObject\Component\VCard;
 use Sabre\VObject\Property\Text;
+//use Sabre\VObject\Property\;
 use Test\TestCase;
 
 class AddressBookImplTest extends TestCase {
@@ -199,7 +201,7 @@ class AddressBookImplTest extends TestCase {
                        ->willReturn(['carddata' => 'data']);
                $addressBookImpl->expects($this->once())->method('readCard')
                        ->with('data')->willReturn($this->vCard);
-               $this->vCard->expects($this->exactly(count($properties)))
+               $this->vCard->expects($this->exactly(count($properties)-1))
                        ->method('createProperty');
                $this->backend->expects($this->never())->method('createCard');
                $this->backend->expects($this->once())->method('updateCard');
@@ -209,6 +211,41 @@ class AddressBookImplTest extends TestCase {
                $this->assertTrue($addressBookImpl->createOrUpdate($properties));
        }
 
+       public function testUpdateWithTypes() {
+               $uid = 'uid';
+               $uri = 'bla.vcf';
+               $properties = ['URI' => $uri, 'UID' => $uid, 'FN' => 'John Doe', 'ADR' => [['type' => 'HOME', 'value' => ';;street;city;;;country']]];
+               $vCard = new vCard;
+               $textProperty = $vCard->createProperty('KEY','value');
+
+               /** @var \PHPUnit\Framework\MockObject\MockObject | AddressBookImpl $addressBookImpl */
+               $addressBookImpl = $this->getMockBuilder(AddressBookImpl::class)
+                       ->setConstructorArgs(
+                               [
+                                       $this->addressBook,
+                                       $this->addressBookInfo,
+                                       $this->backend,
+                                       $this->urlGenerator,
+                               ]
+                       )
+                       ->setMethods(['vCard2Array', 'createUid', 'createEmptyVCard', 'readCard'])
+                       ->getMock();
+
+               $this->backend->expects($this->once())->method('getCard')
+                       ->with($this->addressBookInfo['id'], $uri)
+                       ->willReturn(['carddata' => 'data']);
+               $addressBookImpl->expects($this->once())->method('readCard')
+                       ->with('data')->willReturn($this->vCard);
+               $this->vCard->method('createProperty')->willReturn($textProperty);
+               $this->vCard->expects($this->exactly(count($properties)-1))
+                       ->method('createProperty');
+               $this->vCard->expects($this->once())->method('remove')
+                       ->with('ADR');
+               $this->vCard->expects($this->once())->method('add');
+
+               $addressBookImpl->createOrUpdate($properties);
+       }
+
        /**
         * @dataProvider dataTestGetPermissions
         *