Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/server.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorRoeland Jago Douma <rullzer@users.noreply.github.com>2019-01-04 23:33:59 +0300
committerGitHub <noreply@github.com>2019-01-04 23:33:59 +0300
commit846d21e7f5477ca23b2385353016faade51b6496 (patch)
treef353303a987534e07c7a5c53ae1c167bf6aeab41 /apps
parent5ef74e29525c13e041ef1f50994b404664b77ece (diff)
parent7f5c38bb604f54889071de7dfe529abf0d38eaa5 (diff)
Merge pull request #13117 from nextcloud/vcard-avatar-fixes
Allow URI as data for vcard PHOTO
Diffstat (limited to 'apps')
-rw-r--r--apps/dav/appinfo/v1/carddav.php5
-rw-r--r--apps/dav/lib/AppInfo/Application.php3
-rw-r--r--apps/dav/lib/CardDAV/PhotoCache.php40
-rw-r--r--apps/dav/lib/Server.php5
4 files changed, 36 insertions, 17 deletions
diff --git a/apps/dav/appinfo/v1/carddav.php b/apps/dav/appinfo/v1/carddav.php
index e55eee610ef..a424d7afab9 100644
--- a/apps/dav/appinfo/v1/carddav.php
+++ b/apps/dav/appinfo/v1/carddav.php
@@ -84,7 +84,10 @@ if ($debugging) {
$server->addPlugin(new \Sabre\DAV\Sync\Plugin());
$server->addPlugin(new \Sabre\CardDAV\VCFExportPlugin());
-$server->addPlugin(new \OCA\DAV\CardDAV\ImageExportPlugin(new \OCA\DAV\CardDAV\PhotoCache(\OC::$server->getAppDataDir('dav-photocache'))));
+$server->addPlugin(new \OCA\DAV\CardDAV\ImageExportPlugin(new \OCA\DAV\CardDAV\PhotoCache(
+ \OC::$server->getAppDataDir('dav-photocache'),
+ \OC::$server->getLogger()
+)));
$server->addPlugin(new ExceptionLoggerPlugin('carddav', \OC::$server->getLogger()));
// And off we go!
diff --git a/apps/dav/lib/AppInfo/Application.php b/apps/dav/lib/AppInfo/Application.php
index a5571286354..a90e42d56f8 100644
--- a/apps/dav/lib/AppInfo/Application.php
+++ b/apps/dav/lib/AppInfo/Application.php
@@ -54,7 +54,8 @@ class Application extends App {
$container->registerService(PhotoCache::class, function(SimpleContainer $s) use ($server) {
return new PhotoCache(
- $server->getAppDataDir('dav-photocache')
+ $server->getAppDataDir('dav-photocache'),
+ $server->getLogger()
);
});
diff --git a/apps/dav/lib/CardDAV/PhotoCache.php b/apps/dav/lib/CardDAV/PhotoCache.php
index 0029af7bff7..fa244857e39 100644
--- a/apps/dav/lib/CardDAV/PhotoCache.php
+++ b/apps/dav/lib/CardDAV/PhotoCache.php
@@ -24,6 +24,7 @@
namespace OCA\DAV\CardDAV;
use OCP\Files\IAppData;
+use OCP\ILogger;
use OCP\Files\NotFoundException;
use OCP\Files\NotPermittedException;
use OCP\Files\SimpleFS\ISimpleFile;
@@ -34,16 +35,21 @@ use Sabre\VObject\Reader;
class PhotoCache {
- /** @var IAppData $appData */
+ /** @var IAppData */
protected $appData;
+ /** @var ILogger */
+ protected $logger;
+
/**
* PhotoCache constructor.
*
* @param IAppData $appData
+ * @param ILogger $logger
*/
- public function __construct(IAppData $appData) {
+ public function __construct(IAppData $appData, ILogger $logger) {
$this->appData = $appData;
+ $this->logger = $logger;
}
/**
@@ -134,13 +140,14 @@ class PhotoCache {
$ratio = $photo->width() / $photo->height();
if ($ratio < 1) {
- $ratio = 1/$ratio;
+ $ratio = 1 / $ratio;
}
- $size = (int)($size * $ratio);
+ $size = (int) ($size * $ratio);
if ($size !== -1) {
$photo->resize($size);
}
+
try {
$file = $folder->newFile($path);
$file->putContent($photo->data());
@@ -152,7 +159,6 @@ class PhotoCache {
return $file;
}
-
/**
* @param int $addressBookId
* @param string $cardUri
@@ -193,19 +199,23 @@ class PhotoCache {
}
$photo = $vObject->PHOTO;
- $type = $this->getType($photo);
-
$val = $photo->getValue();
+
+ // handle data URI. e.g PHOTO;VALUE=URI:data:image/jpeg;base64,/9j/4AAQSkZJRgABAQE
if ($photo->getValueType() === 'URI') {
$parsed = \Sabre\URI\parse($val);
- //only allow data://
+
+ // only allow data://
if ($parsed['scheme'] !== 'data') {
return false;
}
if (substr_count($parsed['path'], ';') === 1) {
- list($type,) = explode(';', $parsed['path']);
+ list($type) = explode(';', $parsed['path']);
}
$val = file_get_contents($val);
+ } else {
+ // get type if binary data
+ $type = $this->getBinaryType($photo);
}
$allowedContentTypes = [
@@ -214,16 +224,18 @@ class PhotoCache {
'image/gif',
];
- if(!in_array($type, $allowedContentTypes, true)) {
+ if (!in_array($type, $allowedContentTypes, true)) {
$type = 'application/octet-stream';
}
return [
'Content-Type' => $type,
- 'body' => $val
+ 'body' => $val
];
- } catch(\Exception $ex) {
-
+ } catch (\Exception $e) {
+ $this->logger->logException($e, [
+ 'message' => 'Exception during vcard photo parsing'
+ ]);
}
return false;
}
@@ -240,7 +252,7 @@ class PhotoCache {
* @param Binary $photo
* @return string
*/
- private function getType(Binary $photo) {
+ private function getBinaryType(Binary $photo) {
$params = $photo->parameters();
if (isset($params['TYPE']) || isset($params['MEDIATYPE'])) {
/** @var Parameter $typeParam */
diff --git a/apps/dav/lib/Server.php b/apps/dav/lib/Server.php
index dac2fa102b3..c2c903fa198 100644
--- a/apps/dav/lib/Server.php
+++ b/apps/dav/lib/Server.php
@@ -167,7 +167,10 @@ class Server {
$this->server->addPlugin(new \OCA\DAV\CardDAV\Plugin());
$this->server->addPlugin(new VCFExportPlugin());
$this->server->addPlugin(new MultiGetExportPlugin());
- $this->server->addPlugin(new ImageExportPlugin(new PhotoCache(\OC::$server->getAppDataDir('dav-photocache'))));
+ $this->server->addPlugin(new ImageExportPlugin(new PhotoCache(
+ \OC::$server->getAppDataDir('dav-photocache'),
+ \OC::$server->getLogger())
+ ));
}
// system tags plugins