From 9276f6823bc6dcaa5f6d93af1549735c70f2f55d Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 24 Jun 2021 17:30:22 +0000 Subject: [PATCH] New class for external resources --- src/Core/StorageManager.php | 5 +- src/Model/Photo.php | 23 ++++++ src/Model/Storage/ExternalResource.php | 99 ++++++++++++++++++++++++++ src/Model/Storage/SystemResource.php | 11 --- src/Module/Photo.php | 11 ++- 5 files changed, 134 insertions(+), 15 deletions(-) create mode 100644 src/Model/Storage/ExternalResource.php diff --git a/src/Core/StorageManager.php b/src/Core/StorageManager.php index 9e35aa6a36..b8cde14bd0 100644 --- a/src/Core/StorageManager.php +++ b/src/Core/StorageManager.php @@ -126,6 +126,9 @@ class StorageManager case Storage\SystemResource::getName(): $this->backendInstances[$name] = new Storage\SystemResource(); break; + case Storage\ExternalResource::getName(): + $this->backendInstances[$name] = new Storage\ExternalResource(); + break; default: $data = [ 'name' => $name, @@ -158,7 +161,7 @@ class StorageManager public function isValidBackend(string $name = null, bool $onlyUserBackend = false) { return array_key_exists($name, $this->backends) || - (!$onlyUserBackend && $name === Storage\SystemResource::getName()); + (!$onlyUserBackend && in_array($name, [Storage\SystemResource::getName(), Storage\ExternalResource::getName()])); } /** diff --git a/src/Model/Photo.php b/src/Model/Photo.php index f79409e3f5..acc6b0d197 100644 --- a/src/Model/Photo.php +++ b/src/Model/Photo.php @@ -27,6 +27,7 @@ use Friendica\Core\System; use Friendica\Database\DBA; use Friendica\Database\DBStructure; use Friendica\DI; +use Friendica\Model\Storage\ExternalResource; use Friendica\Model\Storage\SystemResource; use Friendica\Object\Image; use Friendica\Util\DateTimeFormat; @@ -263,6 +264,28 @@ class 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 diff --git a/src/Model/Storage/ExternalResource.php b/src/Model/Storage/ExternalResource.php new file mode 100644 index 0000000000..e0e0a6279e --- /dev/null +++ b/src/Model/Storage/ExternalResource.php @@ -0,0 +1,99 @@ +. + * + */ + +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; + } +} diff --git a/src/Model/Storage/SystemResource.php b/src/Model/Storage/SystemResource.php index 00af522ca5..c7699c2b79 100644 --- a/src/Model/Storage/SystemResource.php +++ b/src/Model/Storage/SystemResource.php @@ -22,7 +22,6 @@ namespace Friendica\Model\Storage; use \BadMethodCallException; -use Friendica\DI; /** * System resource storage class @@ -42,16 +41,6 @@ class SystemResource implements IStorage */ 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); if (!in_array($folder, self::VALID_FOLDERS)) { return ""; diff --git a/src/Module/Photo.php b/src/Module/Photo.php index f193f9c6b0..d430fa9b02 100644 --- a/src/Module/Photo.php +++ b/src/Module/Photo.php @@ -167,7 +167,7 @@ class Photo extends BaseModule } else { $url = DI::baseUrl() . Contact::DEFAULT_AVATAR_PHOTO; } - return MPhoto::createPhotoForSystemResource($url); + return MPhoto::createPhotoForExternalResource($url); case "header": $contact = Contact::getById($uid, ['uid', 'url', 'header']); if (empty($contact)) { @@ -181,7 +181,7 @@ class Photo extends BaseModule } else { $url = DI::baseUrl() . '/images/blank.png'; } - return MPhoto::createPhotoForSystemResource($url); + return MPhoto::createPhotoForExternalResource($url); case "profile": case "custom": $scale = 4; @@ -211,7 +211,12 @@ class Photo extends BaseModule $default = Contact::getDefaultAvatar($contact, Proxy::SIZE_THUMB); } - $photo = MPhoto::createPhotoForSystemResource($default); + $parts = parse_url($default); + if (!empty($parts['scheme']) || !empty($parts['host'])) { + $photo = MPhoto::createPhotoForExternalResource($default); + } else { + $photo = MPhoto::createPhotoForSystemResource($default); + } } return $photo; }