From e278cdfd00701d991e9c00ecf268d31d4aabae0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Fri, 19 Jan 2018 12:05:05 +0100 Subject: [PATCH] Properly parse carddav address-data - fixes #1017 --- lib/CardDAV/Xml/Filter/AddressData.php | 5 +- .../Xml/Request/AddressBookMultiGetTest.php | 71 +++++++++++++++---- 2 files changed, 60 insertions(+), 16 deletions(-) diff --git a/lib/CardDAV/Xml/Filter/AddressData.php b/lib/CardDAV/Xml/Filter/AddressData.php index a130cd61d2..5b7b2ee17b 100644 --- a/lib/CardDAV/Xml/Filter/AddressData.php +++ b/lib/CardDAV/Xml/Filter/AddressData.php @@ -52,12 +52,15 @@ static function xmlDeserialize(Reader $reader) { ]; $elems = (array)$reader->parseInnerTree(); + $elems = array_filter($elems, function($element) { + return $element['name'] === '{urn:ietf:params:xml:ns:carddav}prop' && + isset($element['attributes']['name']); + }); $result['addressDataProperties'] = array_map(function($element) { return $element['attributes']['name']; }, $elems); return $result; - } } diff --git a/tests/Sabre/CardDAV/Xml/Request/AddressBookMultiGetTest.php b/tests/Sabre/CardDAV/Xml/Request/AddressBookMultiGetTest.php index ea2ab75cee..9dcfd2f692 100644 --- a/tests/Sabre/CardDAV/Xml/Request/AddressBookMultiGetTest.php +++ b/tests/Sabre/CardDAV/Xml/Request/AddressBookMultiGetTest.php @@ -10,18 +10,11 @@ class AddressBookMultiGetTest extends XmlTest { '{urn:ietf:params:xml:ns:carddav}addressbook-multiget' => 'Sabre\\CardDAV\\Xml\\Request\AddressBookMultiGetReport', ]; - function testDeserialize() { - - /* lines look a bit odd but this triggers an XML parsing bug */ - $xml = << - - - - - /foo.vcf - -XML; + /** + * @dataProvider providesAddressDataXml + * @param $xml + */ + function testDeserialize($xml, $expectedProps, $expectedVersion = '3.0') { $result = $this->parse($xml); $addressBookMultiGetReport = new AddressBookMultiGetReport(); @@ -32,8 +25,8 @@ function testDeserialize() { ]; $addressBookMultiGetReport->hrefs = ['/foo.vcf']; $addressBookMultiGetReport->contentType = 'text/vcard'; - $addressBookMultiGetReport->version = '4.0'; - $addressBookMultiGetReport->addressDataProperties = []; + $addressBookMultiGetReport->version = $expectedVersion; + $addressBookMultiGetReport->addressDataProperties = $expectedProps; $this->assertEquals( @@ -43,5 +36,53 @@ function testDeserialize() { } - + function providesAddressDataXml() + { + $simpleXml = << + + + + + + + /foo.vcf + +XML; + $allPropsXml = << + + + + + + + + + /foo.vcf + +XML; + $multiplePropsXml = << + + + + + + + + + + + + + /foo.vcf + +XML; + return [ + 'address data with version' => [$simpleXml, [], '4.0'], + 'address data with inner all props' => [$allPropsXml, []], + 'address data with mutliple props' => [$multiplePropsXml, ['VERSION', 'UID', 'NICKNAME', 'EMAIL', 'FN']] + ]; + } }