summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorThomas Müller <thomas.mueller@tmit.eu>2016-03-23 12:28:54 +0100
committerThomas Müller <thomas.mueller@tmit.eu>2016-03-23 12:29:45 +0100
commite979b9c73561cb28f2be4c783477d8bdc34489b2 (patch)
tree43fe9e36355aee3baeff827e0f004f63c6371a88 /apps
parent7800b9dbc82dfcb6f1fe46f89a215d97afec071c (diff)
downloadnextcloud-server-e979b9c73561cb28f2be4c783477d8bdc34489b2.tar.gz
nextcloud-server-e979b9c73561cb28f2be4c783477d8bdc34489b2.zip
Propagate birthdays of shared addressbooks to the sharee's birthday calendar as well
Diffstat (limited to 'apps')
-rw-r--r--apps/dav/appinfo/application.php2
-rw-r--r--apps/dav/lib/caldav/birthdayservice.php58
-rw-r--r--apps/dav/lib/dav/sharing/backend.php3
3 files changed, 44 insertions, 19 deletions
diff --git a/apps/dav/appinfo/application.php b/apps/dav/appinfo/application.php
index d06daf97f54..4ddd23d86b1 100644
--- a/apps/dav/appinfo/application.php
+++ b/apps/dav/appinfo/application.php
@@ -147,6 +147,7 @@ class Application extends App {
$listener = function($event) {
if ($event instanceof GenericEvent) {
+ /** @var BirthdayService $b */
$b = $this->getContainer()->query('BirthdayService');
$b->onCardChanged(
$event->getArgument('addressBookId'),
@@ -161,6 +162,7 @@ class Application extends App {
$dispatcher->addListener('\OCA\DAV\CardDAV\CardDavBackend::updateCard', $listener);
$dispatcher->addListener('\OCA\DAV\CardDAV\CardDavBackend::deleteCard', function($event) {
if ($event instanceof GenericEvent) {
+ /** @var BirthdayService $b */
$b = $this->getContainer()->query('BirthdayService');
$b->onCardDeleted(
$event->getArgument('addressBookId'),
diff --git a/apps/dav/lib/caldav/birthdayservice.php b/apps/dav/lib/caldav/birthdayservice.php
index 274341949b3..7fca4dc8c64 100644
--- a/apps/dav/lib/caldav/birthdayservice.php
+++ b/apps/dav/lib/caldav/birthdayservice.php
@@ -48,22 +48,33 @@ class BirthdayService {
*/
public function onCardChanged($addressBookId, $cardUri, $cardData) {
+ $shares = $this->cardDavBackEnd->getShares($addressBookId);
+ // TODO: resolve group shares
+ $shares = array_filter($shares, function($share) {
+ return !$share['{http://owncloud.org/ns}group-share'];
+ });
+ $targetPrincipals = array_map(function($share) {
+ return $share['{http://owncloud.org/ns}principal'];
+ }, $shares);
+
$book = $this->cardDavBackEnd->getAddressBookById($addressBookId);
- $principalUri = $book['principaluri'];
- $calendar = $this->ensureCalendarExists($principalUri);
- $objectUri = $book['uri'] . '-' . $cardUri. '.ics';
- $calendarData = $this->buildBirthdayFromContact($cardData);
- $existing = $this->calDavBackEnd->getCalendarObject($calendar['id'], $objectUri);
- if (is_null($calendarData)) {
- if (!is_null($existing)) {
- $this->calDavBackEnd->deleteCalendarObject($calendar['id'], $objectUri);
- }
- } else {
- if (is_null($existing)) {
- $this->calDavBackEnd->createCalendarObject($calendar['id'], $objectUri, $calendarData->serialize());
+ $targetPrincipals[] = $book['principaluri'];
+ foreach ($targetPrincipals as $principalUri) {
+ $calendar = $this->ensureCalendarExists($principalUri);
+ $objectUri = $book['uri'] . '-' . $cardUri. '.ics';
+ $calendarData = $this->buildBirthdayFromContact($cardData);
+ $existing = $this->calDavBackEnd->getCalendarObject($calendar['id'], $objectUri);
+ if (is_null($calendarData)) {
+ if (!is_null($existing)) {
+ $this->calDavBackEnd->deleteCalendarObject($calendar['id'], $objectUri);
+ }
} else {
- if ($this->birthdayEvenChanged($existing['calendardata'], $calendarData)) {
- $this->calDavBackEnd->updateCalendarObject($calendar['id'], $objectUri, $calendarData->serialize());
+ if (is_null($existing)) {
+ $this->calDavBackEnd->createCalendarObject($calendar['id'], $objectUri, $calendarData->serialize());
+ } else {
+ if ($this->birthdayEvenChanged($existing['calendardata'], $calendarData)) {
+ $this->calDavBackEnd->updateCalendarObject($calendar['id'], $objectUri, $calendarData->serialize());
+ }
}
}
}
@@ -74,11 +85,22 @@ class BirthdayService {
* @param string $cardUri
*/
public function onCardDeleted($addressBookId, $cardUri) {
+ $shares = $this->cardDavBackEnd->getShares($addressBookId);
+ // TODO: resolve group shares
+ $shares = array_filter($shares, function($share) {
+ return !$share['{http://owncloud.org/ns}group-share'];
+ });
+ $targetPrincipals = array_map(function($share) {
+ return $share['href'];
+ }, $shares);
+
$book = $this->cardDavBackEnd->getAddressBookById($addressBookId);
- $principalUri = $book['principaluri'];
- $calendar = $this->ensureCalendarExists($principalUri);
- $objectUri = $book['uri'] . '-' . $cardUri. '.ics';
- $this->calDavBackEnd->deleteCalendarObject($calendar['id'], $objectUri);
+ $targetPrincipals[] = $book['principaluri'];
+ foreach ($targetPrincipals as $principalUri) {
+ $calendar = $this->ensureCalendarExists($principalUri);
+ $objectUri = $book['uri'] . '-' . $cardUri . '.ics';
+ $this->calDavBackEnd->deleteCalendarObject($calendar['id'], $objectUri);
+ }
}
/**
diff --git a/apps/dav/lib/dav/sharing/backend.php b/apps/dav/lib/dav/sharing/backend.php
index ffc4193e34b..225b773713d 100644
--- a/apps/dav/lib/dav/sharing/backend.php
+++ b/apps/dav/lib/dav/sharing/backend.php
@@ -161,7 +161,8 @@ class Backend {
'commonName' => isset($p['{DAV:}displayname']) ? $p['{DAV:}displayname'] : '',
'status' => 1,
'readOnly' => ($row['access'] == self::ACCESS_READ),
- '{'.\OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD.'}principal' => $row['principaluri']
+ '{http://owncloud.org/ns}principal' => $row['principaluri'],
+ '{http://owncloud.org/ns}group-share' => is_null($p)
];
}