Skip to content

Commit

Permalink
Merge pull request #1027 from sabre-io/3.2-be053a75ed08e375961373f5f7…
Browse files Browse the repository at this point in the history
…05c2fa8023f913

Properly parse carddav address-data - fixes #1017
  • Loading branch information
DeepDiver1975 committed Jan 22, 2018
2 parents 0a21668 + e278cdf commit 4acf420
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 16 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;

}

}
71 changes: 56 additions & 15 deletions tests/Sabre/CardDAV/Xml/Request/AddressBookMultiGetTest.php
Expand Up @@ -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 = <<<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;
/**
* @dataProvider providesAddressDataXml
* @param $xml
*/
function testDeserialize($xml, $expectedProps, $expectedVersion = '3.0') {

$result = $this->parse($xml);
$addressBookMultiGetReport = new AddressBookMultiGetReport();
Expand All @@ -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(
Expand All @@ -43,5 +36,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 4acf420

Please sign in to comment.