Skip to content

Commit

Permalink
Properly parse carddav address-data - fixes #1017 (#1028)
Browse files Browse the repository at this point in the history
  • Loading branch information
DeepDiver1975 authored and staabm committed Jan 22, 2018
1 parent b7637f2 commit 9f6edb3
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 15 deletions.
5 changes: 4 additions & 1 deletion lib/CardDAV/Xml/Filter/AddressData.php
Expand Up @@ -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;

}

}
70 changes: 56 additions & 14 deletions tests/Sabre/CardDAV/Xml/Request/AddressBookMultiGetTest.php
Expand Up @@ -10,19 +10,13 @@ class AddressBookMultiGetTest extends XmlTest {
'{urn:ietf:params:xml:ns:carddav}addressbook-multiget' => 'Sabre\\CardDAV\\Xml\\Request\AddressBookMultiGetReport',
];

function testDeserialize() {
/**
* @dataProvider providesAddressDataXml
* @param $xml
*/
function testDeserialize($xml, $expectedProps, $expectedVersion = '3.0') {

/* lines look a bit odd but this triggers an XML parsing bug */
$xml = <<<XML
<?xml version='1.0' encoding='UTF-8' ?>
<CARD:addressbook-multiget xmlns="DAV:" xmlns:CARD="urn:ietf:params:xml:ns:carddav">
<prop>
<getcontenttype />
<getetag />
<CARD:address-data content-type="text/vcard" version="4.0" /></prop><href>/foo.vcf</href>
</CARD:addressbook-multiget>
XML;

$result = $this->parse($xml);
$addressBookMultiGetReport = new AddressBookMultiGetReport();
$addressBookMultiGetReport->properties = [
Expand All @@ -32,8 +26,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(
Expand All @@ -43,5 +37,53 @@ function testDeserialize() {

}


function providesAddressDataXml()
{
$simpleXml = <<<XML
<?xml version='1.0' encoding='UTF-8' ?>
<CARD:addressbook-multiget xmlns:d="DAV:" xmlns:CARD="urn:ietf:params:xml:ns:carddav">
<d:prop>
<d:getcontenttype />
<d:getetag />
<CARD:address-data content-type="text/vcard" version="4.0"/>
</d:prop>
<d:href>/foo.vcf</d:href>
</CARD:addressbook-multiget>
XML;
$allPropsXml = <<<XML
<?xml version='1.0' encoding='UTF-8' ?>
<CARD:addressbook-multiget xmlns:d="DAV:" xmlns:CARD="urn:ietf:params:xml:ns:carddav">
<d:prop>
<d:getcontenttype />
<d:getetag />
<CARD:address-data>
<CARD:allprop/>
</CARD:address-data>
</d:prop>
<d:href>/foo.vcf</d:href>
</CARD:addressbook-multiget>
XML;
$multiplePropsXml = <<<XML
<?xml version='1.0' encoding='UTF-8' ?>
<CARD:addressbook-multiget xmlns:d="DAV:" xmlns:CARD="urn:ietf:params:xml:ns:carddav">
<d:prop>
<d:getcontenttype />
<d:getetag />
<CARD:address-data>
<CARD:prop name="VERSION"/>
<CARD:prop name="UID"/>
<CARD:prop name="NICKNAME"/>
<CARD:prop name="EMAIL"/>
<CARD:prop name="FN"/>
</CARD:address-data>
</d:prop>
<d:href>/foo.vcf</d:href>
</CARD:addressbook-multiget>
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']]
];
}
}

0 comments on commit 9f6edb3

Please sign in to comment.