From 3ab53d000f5e5e9d35e459109fc61c2ef936752d Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Wed, 3 May 2017 15:11:26 +0200 Subject: [PATCH] Clear cache on vcard change/delete Signed-off-by: Roeland Jago Douma --- apps/dav/lib/AppInfo/Application.php | 13 +++++++++++++ apps/dav/lib/CardDAV/ImageExportPlugin.php | 4 +--- apps/dav/lib/CardDAV/PhotoCache.php | 22 +++++++++++++++++----- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/apps/dav/lib/AppInfo/Application.php b/apps/dav/lib/AppInfo/Application.php index d13f24d369..5d89324d4a 100644 --- a/apps/dav/lib/AppInfo/Application.php +++ b/apps/dav/lib/AppInfo/Application.php @@ -112,6 +112,19 @@ class Application extends App { } }); + $clearPhotoCache = function($event) { + 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); + $dispatcher->addListener('OC\AccountManager::userUpdated', function(GenericEvent $event) { $user = $event->getSubject(); $syncService = $this->getContainer()->query(SyncService::class); diff --git a/apps/dav/lib/CardDAV/ImageExportPlugin.php b/apps/dav/lib/CardDAV/ImageExportPlugin.php index 9d5eba453f..fd9223c855 100644 --- a/apps/dav/lib/CardDAV/ImageExportPlugin.php +++ b/apps/dav/lib/CardDAV/ImageExportPlugin.php @@ -103,14 +103,12 @@ class ImageExportPlugin extends ServerPlugin { /** @var AddressBook $addressbook */ $addressbook = $this->server->tree->getNodeForPath($addressbookpath); - $hash = md5($addressbook->getResourceId() . $node->getName()); - $response->setHeader('Cache-Control', 'private, max-age=3600, must-revalidate'); $response->setHeader('Etag', $node->getETag() ); $response->setHeader('Pragma', 'public'); try { - $file = $this->cache->get($hash, $size, $node); + $file = $this->cache->get($addressbook->getResourceId(), $node->getName(), $size, $node); $response->setHeader('Content-Type', $file->getMimeType()); $response->setHeader('Content-Disposition', 'inline'); $response->setStatus(200); diff --git a/apps/dav/lib/CardDAV/PhotoCache.php b/apps/dav/lib/CardDAV/PhotoCache.php index 29c45debde..c962591426 100644 --- a/apps/dav/lib/CardDAV/PhotoCache.php +++ b/apps/dav/lib/CardDAV/PhotoCache.php @@ -26,15 +26,16 @@ class PhotoCache { } /** - * @param string $hash + * @param int $addressBookId + * @param string $cardUri * @param int $size * @param Card $card * * @return ISimpleFile * @throws NotFoundException */ - public function get($hash, $size, Card $card) { - $folder = $this->getFolder($hash); + public function get($addressBookId, $cardUri, $size, Card $card) { + $folder = $this->getFolder($addressBookId, $cardUri); if ($this->isEmpty($folder)) { $this->init($folder, $card); @@ -132,10 +133,12 @@ class PhotoCache { /** - * @param $hash + * @param int $addressBookId + * @param string $cardUri * @return ISimpleFolder */ - private function getFolder($hash) { + private function getFolder($addressBookId, $cardUri) { + $hash = md5($addressBookId . ' ' . $cardUri); try { return $this->appData->getFolder($hash); } catch (NotFoundException $e) { @@ -231,4 +234,13 @@ class PhotoCache { } return ''; } + + /** + * @param int $addressBookId + * @param string $cardUri + */ + public function delete($addressBookId, $cardUri) { + $folder = $this->getFolder($addressBookId, $cardUri); + $folder->delete(); + } }