New class for external resources

This commit is contained in:
Michael 2021-06-24 17:30:22 +00:00
parent 96809b3fdd
commit 9276f6823b
5 changed files with 134 additions and 15 deletions

View file

@ -126,6 +126,9 @@ class StorageManager
case Storage\SystemResource::getName(): case Storage\SystemResource::getName():
$this->backendInstances[$name] = new Storage\SystemResource(); $this->backendInstances[$name] = new Storage\SystemResource();
break; break;
case Storage\ExternalResource::getName():
$this->backendInstances[$name] = new Storage\ExternalResource();
break;
default: default:
$data = [ $data = [
'name' => $name, 'name' => $name,
@ -158,7 +161,7 @@ class StorageManager
public function isValidBackend(string $name = null, bool $onlyUserBackend = false) public function isValidBackend(string $name = null, bool $onlyUserBackend = false)
{ {
return array_key_exists($name, $this->backends) || return array_key_exists($name, $this->backends) ||
(!$onlyUserBackend && $name === Storage\SystemResource::getName()); (!$onlyUserBackend && in_array($name, [Storage\SystemResource::getName(), Storage\ExternalResource::getName()]));
} }
/** /**

View file

@ -27,6 +27,7 @@ use Friendica\Core\System;
use Friendica\Database\DBA; use Friendica\Database\DBA;
use Friendica\Database\DBStructure; use Friendica\Database\DBStructure;
use Friendica\DI; use Friendica\DI;
use Friendica\Model\Storage\ExternalResource;
use Friendica\Model\Storage\SystemResource; use Friendica\Model\Storage\SystemResource;
use Friendica\Object\Image; use Friendica\Object\Image;
use Friendica\Util\DateTimeFormat; use Friendica\Util\DateTimeFormat;
@ -263,6 +264,28 @@ class Photo
return $photo; return $photo;
} }
/**
* Construct a photo array for an external resource image
*
* @param string $url Image URL
* @param string $mimetype Image mime type. Defaults to "image/jpeg"
*
* @return array
* @throws \Exception
*/
public static function createPhotoForExternalResource($url, $mimetype = "image/jpeg")
{
$fields = self::getFields();
$values = array_fill(0, count($fields), "");
$photo = array_combine($fields, $values);
$photo['backend-class'] = ExternalResource::NAME;
$photo['backend-ref'] = $url;
$photo['type'] = $mimetype;
$photo['cacheable'] = false;
return $photo;
}
/** /**
* store photo metadata in db and binary in default backend * store photo metadata in db and binary in default backend

View file

@ -0,0 +1,99 @@
<?php
/**
* @copyright Copyright (C) 2010-2021, the Friendica project
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* 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
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
namespace Friendica\Model\Storage;
use \BadMethodCallException;
use Friendica\DI;
/**
* External resource storage class
*
* This class is used to load external resources, like images.
* Is not intended to be selectable by admins as default storage class.
*/
class ExternalResource implements IStorage
{
const NAME = 'ExternalResource';
/**
* @inheritDoc
*/
public function get(string $filename)
{
$parts = parse_url($filename);
if (empty($parts['scheme']) || empty($parts['host'])) {
return "";
}
$curlResult = DI::httpRequest()->get($filename);
if ($curlResult->isSuccess()) {
return $curlResult->getBody();
} else {
return "";
}
}
/**
* @inheritDoc
*/
public function put(string $data, string $filename = '')
{
throw new BadMethodCallException();
}
public function delete(string $filename)
{
throw new BadMethodCallException();
}
/**
* @inheritDoc
*/
public function getOptions()
{
return [];
}
/**
* @inheritDoc
*/
public function saveOptions(array $data)
{
return [];
}
/**
* @inheritDoc
*/
public function __toString()
{
return self::NAME;
}
/**
* @inheritDoc
*/
public static function getName()
{
return self::NAME;
}
}

View file

@ -22,7 +22,6 @@
namespace Friendica\Model\Storage; namespace Friendica\Model\Storage;
use \BadMethodCallException; use \BadMethodCallException;
use Friendica\DI;
/** /**
* System resource storage class * System resource storage class
@ -42,16 +41,6 @@ class SystemResource implements IStorage
*/ */
public function get(string $filename) public function get(string $filename)
{ {
$parts = parse_url($filename);
if (!empty($parts['scheme']) && !empty($parts['host'])) {
$curlResult = DI::httpRequest()->get($filename);
if ($curlResult->isSuccess()) {
return $curlResult->getBody();
} else {
return "";
}
}
$folder = dirname($filename); $folder = dirname($filename);
if (!in_array($folder, self::VALID_FOLDERS)) { if (!in_array($folder, self::VALID_FOLDERS)) {
return ""; return "";

View file

@ -167,7 +167,7 @@ class Photo extends BaseModule
} else { } else {
$url = DI::baseUrl() . Contact::DEFAULT_AVATAR_PHOTO; $url = DI::baseUrl() . Contact::DEFAULT_AVATAR_PHOTO;
} }
return MPhoto::createPhotoForSystemResource($url); return MPhoto::createPhotoForExternalResource($url);
case "header": case "header":
$contact = Contact::getById($uid, ['uid', 'url', 'header']); $contact = Contact::getById($uid, ['uid', 'url', 'header']);
if (empty($contact)) { if (empty($contact)) {
@ -181,7 +181,7 @@ class Photo extends BaseModule
} else { } else {
$url = DI::baseUrl() . '/images/blank.png'; $url = DI::baseUrl() . '/images/blank.png';
} }
return MPhoto::createPhotoForSystemResource($url); return MPhoto::createPhotoForExternalResource($url);
case "profile": case "profile":
case "custom": case "custom":
$scale = 4; $scale = 4;
@ -211,8 +211,13 @@ class Photo extends BaseModule
$default = Contact::getDefaultAvatar($contact, Proxy::SIZE_THUMB); $default = Contact::getDefaultAvatar($contact, Proxy::SIZE_THUMB);
} }
$parts = parse_url($default);
if (!empty($parts['scheme']) || !empty($parts['host'])) {
$photo = MPhoto::createPhotoForExternalResource($default);
} else {
$photo = MPhoto::createPhotoForSystemResource($default); $photo = MPhoto::createPhotoForSystemResource($default);
} }
}
return $photo; return $photo;
} }
} }