2016-01-11 16:34:17 +03:00
|
|
|
<?php
|
2016-01-12 17:02:16 +03:00
|
|
|
/**
|
2016-07-21 17:49:16 +03:00
|
|
|
* @copyright Copyright (c) 2016, ownCloud, Inc.
|
|
|
|
*
|
2017-11-06 17:56:42 +03:00
|
|
|
* @author Bjoern Schiessle <bjoern@schiessle.org>
|
2017-11-06 22:15:27 +03:00
|
|
|
* @author Georg Ehrke <oc.list@georgehrke.com>
|
2016-07-21 17:49:16 +03:00
|
|
|
* @author Joas Schilling <coding@schilljs.com>
|
2019-12-03 21:57:53 +03:00
|
|
|
* @author John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
|
2017-11-06 17:56:42 +03:00
|
|
|
* @author Roeland Jago Douma <roeland@famdouma.nl>
|
2020-03-31 11:49:10 +03:00
|
|
|
* @author Thomas Citharel <nextcloud@tcit.fr>
|
2016-01-12 17:02:16 +03:00
|
|
|
* @author Thomas Müller <thomas.mueller@tmit.eu>
|
2019-12-03 21:57:53 +03:00
|
|
|
* @author Tobia De Koninck <tobia@ledfan.be>
|
2016-01-12 17:02:16 +03:00
|
|
|
*
|
|
|
|
* @license AGPL-3.0
|
|
|
|
*
|
|
|
|
* This code is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU Affero General Public License, version 3,
|
|
|
|
* as published by the Free Software Foundation.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU Affero General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Affero General Public License, version 3,
|
2019-12-03 21:57:53 +03:00
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
2016-01-12 17:02:16 +03:00
|
|
|
*
|
|
|
|
*/
|
2019-11-22 22:52:10 +03:00
|
|
|
|
2016-05-12 10:42:40 +03:00
|
|
|
namespace OCA\DAV\AppInfo;
|
2016-01-11 16:34:17 +03:00
|
|
|
|
2017-05-03 15:22:02 +03:00
|
|
|
use OC\AppFramework\Utility\SimpleContainer;
|
2016-10-13 16:34:26 +03:00
|
|
|
use OCA\DAV\CalDAV\Activity\Backend;
|
2016-11-29 18:21:36 +03:00
|
|
|
use OCA\DAV\CalDAV\Activity\Provider\Event;
|
2016-02-03 17:43:45 +03:00
|
|
|
use OCA\DAV\CalDAV\BirthdayService;
|
2017-11-07 03:31:28 +03:00
|
|
|
use OCA\DAV\CalDAV\CalendarManager;
|
2019-03-16 18:19:25 +03:00
|
|
|
use OCA\DAV\CalDAV\Reminder\Backend as ReminderBackend;
|
2019-08-02 17:49:53 +03:00
|
|
|
use OCA\DAV\CalDAV\Reminder\NotificationProvider\AudioProvider;
|
2019-03-16 18:19:25 +03:00
|
|
|
use OCA\DAV\CalDAV\Reminder\NotificationProvider\EmailProvider;
|
|
|
|
use OCA\DAV\CalDAV\Reminder\NotificationProvider\PushProvider;
|
|
|
|
use OCA\DAV\CalDAV\Reminder\NotificationProviderManager;
|
|
|
|
use OCA\DAV\CalDAV\Reminder\Notifier;
|
|
|
|
use OCA\DAV\CalDAV\Reminder\ReminderService;
|
2016-10-21 12:45:17 +03:00
|
|
|
use OCA\DAV\Capabilities;
|
2016-01-11 16:34:17 +03:00
|
|
|
use OCA\DAV\CardDAV\ContactsManager;
|
2017-05-03 15:22:02 +03:00
|
|
|
use OCA\DAV\CardDAV\PhotoCache;
|
2016-01-13 22:56:25 +03:00
|
|
|
use OCA\DAV\CardDAV\SyncService;
|
|
|
|
use OCA\DAV\HookManager;
|
2019-11-22 22:52:10 +03:00
|
|
|
use OCP\AppFramework\App;
|
2017-11-07 03:31:28 +03:00
|
|
|
use OCP\Calendar\IManager as ICalendarManager;
|
2019-11-22 22:52:10 +03:00
|
|
|
use OCP\Contacts\IManager as IContactsManager;
|
2016-09-23 18:21:07 +03:00
|
|
|
use OCP\IUser;
|
2016-02-03 17:43:45 +03:00
|
|
|
use Symfony\Component\EventDispatcher\GenericEvent;
|
2016-01-11 16:34:17 +03:00
|
|
|
|
|
|
|
class Application extends App {
|
2019-03-16 18:19:25 +03:00
|
|
|
const APP_ID = 'dav';
|
|
|
|
|
2016-01-11 16:34:17 +03:00
|
|
|
/**
|
|
|
|
* Application constructor.
|
|
|
|
*/
|
2016-09-20 02:15:24 +03:00
|
|
|
public function __construct() {
|
|
|
|
parent::__construct('dav');
|
2016-10-21 12:45:17 +03:00
|
|
|
|
2017-05-03 15:22:02 +03:00
|
|
|
$container = $this->getContainer();
|
|
|
|
$server = $container->getServer();
|
|
|
|
|
2020-04-09 14:53:40 +03:00
|
|
|
$container->registerService(PhotoCache::class, function (SimpleContainer $s) use ($server) {
|
2017-05-03 15:22:02 +03:00
|
|
|
return new PhotoCache(
|
2018-12-17 19:28:19 +03:00
|
|
|
$server->getAppDataDir('dav-photocache'),
|
|
|
|
$server->getLogger()
|
2017-05-03 15:22:02 +03:00
|
|
|
);
|
|
|
|
});
|
|
|
|
|
2016-10-21 12:45:17 +03:00
|
|
|
/*
|
|
|
|
* Register capabilities
|
|
|
|
*/
|
2017-05-03 15:22:02 +03:00
|
|
|
$container->registerCapability(Capabilities::class);
|
2016-01-11 16:34:17 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2017-11-07 03:31:28 +03:00
|
|
|
* @param IContactsManager $contactsManager
|
2016-01-11 16:34:17 +03:00
|
|
|
* @param string $userID
|
|
|
|
*/
|
2017-11-07 03:31:28 +03:00
|
|
|
public function setupContactsProvider(IContactsManager $contactsManager, $userID) {
|
2016-01-11 16:34:17 +03:00
|
|
|
/** @var ContactsManager $cm */
|
2016-09-20 02:15:24 +03:00
|
|
|
$cm = $this->getContainer()->query(ContactsManager::class);
|
2016-06-21 16:25:44 +03:00
|
|
|
$urlGenerator = $this->getContainer()->getServer()->getURLGenerator();
|
|
|
|
$cm->setupContactsProvider($contactsManager, $userID, $urlGenerator);
|
2016-01-11 16:34:17 +03:00
|
|
|
}
|
|
|
|
|
2017-09-16 14:42:46 +03:00
|
|
|
/**
|
2019-03-06 13:06:03 +03:00
|
|
|
* @param IContactsManager $contactsManager
|
2017-09-16 14:42:46 +03:00
|
|
|
*/
|
|
|
|
public function setupSystemContactsProvider(IContactsManager $contactsManager) {
|
|
|
|
/** @var ContactsManager $cm */
|
|
|
|
$cm = $this->getContainer()->query(ContactsManager::class);
|
|
|
|
$urlGenerator = $this->getContainer()->getServer()->getURLGenerator();
|
|
|
|
$cm->setupSystemContactsProvider($contactsManager, $urlGenerator);
|
|
|
|
}
|
|
|
|
|
2017-11-07 03:31:28 +03:00
|
|
|
/**
|
|
|
|
* @param ICalendarManager $calendarManager
|
|
|
|
* @param string $userId
|
|
|
|
*/
|
|
|
|
public function setupCalendarProvider(ICalendarManager $calendarManager, $userId) {
|
|
|
|
$cm = $this->getContainer()->query(CalendarManager::class);
|
|
|
|
$cm->setupCalendarProvider($calendarManager, $userId);
|
|
|
|
}
|
|
|
|
|
2016-01-13 22:56:25 +03:00
|
|
|
public function registerHooks() {
|
|
|
|
/** @var HookManager $hm */
|
2016-09-20 02:15:24 +03:00
|
|
|
$hm = $this->getContainer()->query(HookManager::class);
|
2016-01-13 22:56:25 +03:00
|
|
|
$hm->setup();
|
2016-02-03 17:43:45 +03:00
|
|
|
|
2016-09-23 18:21:07 +03:00
|
|
|
$dispatcher = $this->getContainer()->getServer()->getEventDispatcher();
|
|
|
|
|
|
|
|
// first time login event setup
|
|
|
|
$dispatcher->addListener(IUser::class . '::firstLogin', function ($event) use ($hm) {
|
|
|
|
if ($event instanceof GenericEvent) {
|
|
|
|
$hm->firstLogin($event->getSubject());
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2019-03-16 18:19:25 +03:00
|
|
|
$birthdayListener = function ($event) {
|
2016-02-03 17:43:45 +03:00
|
|
|
if ($event instanceof GenericEvent) {
|
2016-03-23 14:28:54 +03:00
|
|
|
/** @var BirthdayService $b */
|
2016-09-20 02:15:24 +03:00
|
|
|
$b = $this->getContainer()->query(BirthdayService::class);
|
2016-02-03 17:43:45 +03:00
|
|
|
$b->onCardChanged(
|
|
|
|
$event->getArgument('addressBookId'),
|
|
|
|
$event->getArgument('cardUri'),
|
|
|
|
$event->getArgument('cardData')
|
|
|
|
);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2019-03-16 18:19:25 +03:00
|
|
|
$dispatcher->addListener('\OCA\DAV\CardDAV\CardDavBackend::createCard', $birthdayListener);
|
|
|
|
$dispatcher->addListener('\OCA\DAV\CardDAV\CardDavBackend::updateCard', $birthdayListener);
|
|
|
|
$dispatcher->addListener('\OCA\DAV\CardDAV\CardDavBackend::deleteCard', function ($event) {
|
2016-02-03 17:43:45 +03:00
|
|
|
if ($event instanceof GenericEvent) {
|
2016-03-23 14:28:54 +03:00
|
|
|
/** @var BirthdayService $b */
|
2016-09-20 02:15:24 +03:00
|
|
|
$b = $this->getContainer()->query(BirthdayService::class);
|
2016-02-03 17:43:45 +03:00
|
|
|
$b->onCardDeleted(
|
|
|
|
$event->getArgument('addressBookId'),
|
|
|
|
$event->getArgument('cardUri')
|
|
|
|
);
|
|
|
|
}
|
|
|
|
});
|
2016-09-26 14:50:39 +03:00
|
|
|
|
2020-04-09 14:53:40 +03:00
|
|
|
$clearPhotoCache = function ($event) {
|
2017-05-03 16:11:26 +03:00
|
|
|
if ($event instanceof GenericEvent) {
|
|
|
|
/** @var PhotoCache $p */
|
|
|
|
$p = $this->getContainer()->query(PhotoCache::class);
|
|
|
|
$p->delete(
|
|
|
|
$event->getArgument('addressBookId'),
|
|
|
|
$event->getArgument('cardUri')
|
|
|
|
);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
$dispatcher->addListener('\OCA\DAV\CardDAV\CardDavBackend::updateCard', $clearPhotoCache);
|
|
|
|
$dispatcher->addListener('\OCA\DAV\CardDAV\CardDavBackend::deleteCard', $clearPhotoCache);
|
|
|
|
|
2020-04-09 14:53:40 +03:00
|
|
|
$dispatcher->addListener('OC\AccountManager::userUpdated', function (GenericEvent $event) {
|
2016-11-11 16:36:17 +03:00
|
|
|
$user = $event->getSubject();
|
|
|
|
$syncService = $this->getContainer()->query(SyncService::class);
|
|
|
|
$syncService->updateUser($user);
|
|
|
|
});
|
|
|
|
|
2020-04-09 14:53:40 +03:00
|
|
|
$dispatcher->addListener('\OCA\DAV\CalDAV\CalDavBackend::createCalendar', function (GenericEvent $event) {
|
2016-10-13 16:34:26 +03:00
|
|
|
/** @var Backend $backend */
|
|
|
|
$backend = $this->getContainer()->query(Backend::class);
|
|
|
|
$backend->onCalendarAdd(
|
|
|
|
$event->getArgument('calendarData')
|
|
|
|
);
|
|
|
|
});
|
2020-04-09 14:53:40 +03:00
|
|
|
$dispatcher->addListener('\OCA\DAV\CalDAV\CalDavBackend::updateCalendar', function (GenericEvent $event) {
|
2016-10-13 16:34:26 +03:00
|
|
|
/** @var Backend $backend */
|
|
|
|
$backend = $this->getContainer()->query(Backend::class);
|
|
|
|
$backend->onCalendarUpdate(
|
|
|
|
$event->getArgument('calendarData'),
|
|
|
|
$event->getArgument('shares'),
|
|
|
|
$event->getArgument('propertyMutations')
|
|
|
|
);
|
|
|
|
});
|
2020-04-09 14:53:40 +03:00
|
|
|
$dispatcher->addListener('\OCA\DAV\CalDAV\CalDavBackend::deleteCalendar', function (GenericEvent $event) {
|
2016-10-13 16:34:26 +03:00
|
|
|
/** @var Backend $backend */
|
|
|
|
$backend = $this->getContainer()->query(Backend::class);
|
|
|
|
$backend->onCalendarDelete(
|
|
|
|
$event->getArgument('calendarData'),
|
|
|
|
$event->getArgument('shares')
|
|
|
|
);
|
2019-03-16 18:19:25 +03:00
|
|
|
|
|
|
|
$reminderBackend = $this->getContainer()->query(ReminderBackend::class);
|
|
|
|
$reminderBackend->cleanRemindersForCalendar(
|
|
|
|
$event->getArgument('calendarId')
|
|
|
|
);
|
2016-10-13 16:34:26 +03:00
|
|
|
});
|
2020-04-09 14:53:40 +03:00
|
|
|
$dispatcher->addListener('\OCA\DAV\CalDAV\CalDavBackend::updateShares', function (GenericEvent $event) {
|
2016-10-13 16:34:26 +03:00
|
|
|
/** @var Backend $backend */
|
|
|
|
$backend = $this->getContainer()->query(Backend::class);
|
|
|
|
$backend->onCalendarUpdateShares(
|
|
|
|
$event->getArgument('calendarData'),
|
|
|
|
$event->getArgument('shares'),
|
|
|
|
$event->getArgument('add'),
|
|
|
|
$event->getArgument('remove')
|
|
|
|
);
|
2019-03-16 18:19:25 +03:00
|
|
|
|
|
|
|
// Here we should recalculate if reminders should be sent to new or old sharees
|
2017-09-20 18:33:51 +03:00
|
|
|
});
|
|
|
|
|
2020-04-09 14:53:40 +03:00
|
|
|
$dispatcher->addListener('\OCA\DAV\CalDAV\CalDavBackend::publishCalendar', function (GenericEvent $event) {
|
2017-09-20 18:33:51 +03:00
|
|
|
/** @var Backend $backend */
|
|
|
|
$backend = $this->getContainer()->query(Backend::class);
|
|
|
|
$backend->onCalendarPublication(
|
|
|
|
$event->getArgument('calendarData'),
|
|
|
|
$event->getArgument('public')
|
|
|
|
);
|
2016-10-13 16:34:26 +03:00
|
|
|
});
|
|
|
|
|
2020-04-09 14:53:40 +03:00
|
|
|
$listener = function (GenericEvent $event, $eventName) {
|
2016-10-13 16:34:26 +03:00
|
|
|
/** @var Backend $backend */
|
|
|
|
$backend = $this->getContainer()->query(Backend::class);
|
|
|
|
|
2016-11-29 18:21:36 +03:00
|
|
|
$subject = Event::SUBJECT_OBJECT_ADD;
|
2016-10-13 16:34:26 +03:00
|
|
|
if ($eventName === '\OCA\DAV\CalDAV\CalDavBackend::updateCalendarObject') {
|
2016-11-29 18:21:36 +03:00
|
|
|
$subject = Event::SUBJECT_OBJECT_UPDATE;
|
2020-04-10 11:35:09 +03:00
|
|
|
} elseif ($eventName === '\OCA\DAV\CalDAV\CalDavBackend::deleteCalendarObject') {
|
2016-11-29 18:21:36 +03:00
|
|
|
$subject = Event::SUBJECT_OBJECT_DELETE;
|
2016-10-13 16:34:26 +03:00
|
|
|
}
|
|
|
|
$backend->onTouchCalendarObject(
|
|
|
|
$subject,
|
|
|
|
$event->getArgument('calendarData'),
|
|
|
|
$event->getArgument('shares'),
|
|
|
|
$event->getArgument('objectData')
|
|
|
|
);
|
2019-03-16 18:19:25 +03:00
|
|
|
|
|
|
|
/** @var ReminderService $reminderBackend */
|
2019-08-09 21:25:21 +03:00
|
|
|
$reminderService = $this->getContainer()->query(ReminderService::class);
|
2019-03-16 18:19:25 +03:00
|
|
|
|
|
|
|
$reminderService->onTouchCalendarObject(
|
|
|
|
$eventName,
|
|
|
|
$event->getArgument('objectData')
|
|
|
|
);
|
2016-10-13 16:34:26 +03:00
|
|
|
};
|
|
|
|
$dispatcher->addListener('\OCA\DAV\CalDAV\CalDavBackend::createCalendarObject', $listener);
|
|
|
|
$dispatcher->addListener('\OCA\DAV\CalDAV\CalDavBackend::updateCalendarObject', $listener);
|
|
|
|
$dispatcher->addListener('\OCA\DAV\CalDAV\CalDavBackend::deleteCalendarObject', $listener);
|
2016-01-13 22:56:25 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
public function getSyncService() {
|
2016-09-20 02:15:24 +03:00
|
|
|
return $this->getContainer()->query(SyncService::class);
|
2016-01-13 22:56:25 +03:00
|
|
|
}
|
|
|
|
|
2019-08-02 17:40:35 +03:00
|
|
|
public function registerNotifier():void {
|
|
|
|
$this->getContainer()
|
|
|
|
->getServer()
|
|
|
|
->getNotificationManager()
|
|
|
|
->registerNotifierService(Notifier::class);
|
2019-03-16 18:19:25 +03:00
|
|
|
}
|
|
|
|
|
2019-08-02 17:40:35 +03:00
|
|
|
public function registerCalendarReminders():void {
|
2019-03-16 18:19:25 +03:00
|
|
|
try {
|
|
|
|
/** @var NotificationProviderManager $notificationProviderManager */
|
|
|
|
$notificationProviderManager = $this->getContainer()->query(NotificationProviderManager::class);
|
2019-08-02 17:49:53 +03:00
|
|
|
$notificationProviderManager->registerProvider(AudioProvider::class);
|
2019-03-16 18:19:25 +03:00
|
|
|
$notificationProviderManager->registerProvider(EmailProvider::class);
|
|
|
|
$notificationProviderManager->registerProvider(PushProvider::class);
|
2020-04-10 15:19:56 +03:00
|
|
|
} catch (\Exception $ex) {
|
2019-03-16 18:19:25 +03:00
|
|
|
$this->getContainer()->getServer()->getLogger()->logException($ex);
|
|
|
|
}
|
|
|
|
}
|
2016-01-11 16:34:17 +03:00
|
|
|
}
|