]> git.mxchange.org Git - friendica.git/commitdiff
New class for external resources
authorMichael <heluecht@pirati.ca>
Thu, 24 Jun 2021 17:30:22 +0000 (17:30 +0000)
committerMichael <heluecht@pirati.ca>
Thu, 24 Jun 2021 17:30:22 +0000 (17:30 +0000)
src/Core/StorageManager.php
src/Model/Photo.php
src/Model/Storage/ExternalResource.php [new file with mode: 0644]
src/Model/Storage/SystemResource.php
src/Module/Photo.php

index 9e35aa6a36dad113355297c80215da2fd596b9b3..b8cde14bd0c1397a1d96391605adae401912545b 100644 (file)
@@ -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()]));
        }
 
        /**
index f79409e3f5c332f1115002d9b265f0388fbd2813..acc6b0d19731a80b6d724fbae5d466ec8c588772 100644 (file)
@@ -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 (file)
index 0000000..e0e0a62
--- /dev/null
@@ -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;
+       }
+}
index 00af522ca5e4f06a1b0105fc3d4d5cfd48eccee8..c7699c2b79e8300a2cf57bc039ce665160f99c43 100644 (file)
@@ -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 "";
index f193f9c6b0e233ee0425159c1adf0dbbc4362b8a..d430fa9b02591c4bfad0f1e40e8a62cf9a1c16a4 100644 (file)
@@ -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;
        }