Merge pull request #13117 from nextcloud/vcard-avatar-fixes
Allow URI as data for vcard PHOTO
This commit is contained in:
commit
846d21e7f5
|
@ -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!
|
||||
|
|
|
@ -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()
|
||||
);
|
||||
});
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue