|
|
|
|
@ -35,6 +35,14 @@ use Sabre\VObject\Reader;
|
|
|
|
|
|
|
|
|
|
class PhotoCache {
|
|
|
|
|
|
|
|
|
|
/** @var array */
|
|
|
|
|
protected const ALLOWED_CONTENT_TYPES = [
|
|
|
|
|
'image/png' => 'png',
|
|
|
|
|
'image/jpeg' => 'jpg',
|
|
|
|
|
'image/gif' => 'gif',
|
|
|
|
|
'image/vnd.microsoft.icon' => 'ico',
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
/** @var IAppData */
|
|
|
|
|
protected $appData;
|
|
|
|
|
|
|
|
|
|
@ -90,27 +98,26 @@ class PhotoCache {
|
|
|
|
|
/**
|
|
|
|
|
* @param ISimpleFolder $folder
|
|
|
|
|
* @param Card $card
|
|
|
|
|
* @throws NotPermittedException
|
|
|
|
|
*/
|
|
|
|
|
private function init(ISimpleFolder $folder, Card $card) {
|
|
|
|
|
private function init(ISimpleFolder $folder, Card $card): void {
|
|
|
|
|
$data = $this->getPhoto($card);
|
|
|
|
|
|
|
|
|
|
if ($data === false) {
|
|
|
|
|
if ($data === false || !isset($data['Content-Type'])) {
|
|
|
|
|
$folder->newFile('nophoto');
|
|
|
|
|
} else {
|
|
|
|
|
switch ($data['Content-Type']) {
|
|
|
|
|
case 'image/png':
|
|
|
|
|
$ext = 'png';
|
|
|
|
|
break;
|
|
|
|
|
case 'image/jpeg':
|
|
|
|
|
$ext = 'jpg';
|
|
|
|
|
break;
|
|
|
|
|
case 'image/gif':
|
|
|
|
|
$ext = 'gif';
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
$file = $folder->newFile('photo.' . $ext);
|
|
|
|
|
$file->putContent($data['body']);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$contentType = $data['Content-Type'];
|
|
|
|
|
$extension = self::ALLOWED_CONTENT_TYPES[$contentType] ?? null;
|
|
|
|
|
|
|
|
|
|
if ($extension === null) {
|
|
|
|
|
$folder->newFile('nophoto');
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$file = $folder->newFile('photo.' . $extension);
|
|
|
|
|
$file->putContent($data['body']);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private function hasPhoto(ISimpleFolder $folder) {
|
|
|
|
|
@ -147,7 +154,7 @@ class PhotoCache {
|
|
|
|
|
if ($size !== -1) {
|
|
|
|
|
$photo->resize($size);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
$file = $folder->newFile($path);
|
|
|
|
|
$file->putContent($photo->data());
|
|
|
|
|
@ -180,15 +187,14 @@ class PhotoCache {
|
|
|
|
|
* @return string
|
|
|
|
|
* @throws NotFoundException
|
|
|
|
|
*/
|
|
|
|
|
private function getExtension(ISimpleFolder $folder) {
|
|
|
|
|
if ($folder->fileExists('photo.jpg')) {
|
|
|
|
|
return 'jpg';
|
|
|
|
|
} elseif ($folder->fileExists('photo.png')) {
|
|
|
|
|
return 'png';
|
|
|
|
|
} elseif ($folder->fileExists('photo.gif')) {
|
|
|
|
|
return 'gif';
|
|
|
|
|
private function getExtension(ISimpleFolder $folder): string {
|
|
|
|
|
foreach (self::ALLOWED_CONTENT_TYPES as $extension) {
|
|
|
|
|
if ($folder->fileExists('photo.' . $extension)) {
|
|
|
|
|
return $extension;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
throw new NotFoundException;
|
|
|
|
|
|
|
|
|
|
throw new NotFoundException('Avatar not found');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private function getPhoto(Card $node) {
|
|
|
|
|
@ -218,13 +224,7 @@ class PhotoCache {
|
|
|
|
|
$type = $this->getBinaryType($photo);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$allowedContentTypes = [
|
|
|
|
|
'image/png',
|
|
|
|
|
'image/jpeg',
|
|
|
|
|
'image/gif',
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
if (!in_array($type, $allowedContentTypes, true)) {
|
|
|
|
|
if (empty($type) || !isset(self::ALLOWED_CONTENT_TYPES[$type])) {
|
|
|
|
|
$type = 'application/octet-stream';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|