Merge pull request #23317 from nextcloud/fix/contact-update

handle nested properties for contact updates
This commit is contained in:
Morris Jobke 2020-10-12 21:49:04 +02:00 committed by GitHub
commit 78da9532ba
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 54 additions and 2 deletions

View 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) {

View 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
*