use Friendica\Database\DBA;
if (!defined('DB_UPDATE_VERSION')) {
- define('DB_UPDATE_VERSION', 1293);
+ define('DB_UPDATE_VERSION', 1294);
}
return [
"allow_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of allowed groups"],
"deny_cid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied contact.id"],
"deny_gid" => ["type" => "mediumtext", "comment" => "Access Control - list of denied groups"],
+ "backend-class" => ["type" => "tinytext", "default" => "", "comment" => "Storage backend class"],
+ "backend-ref" => ["type" => "text", "default" => "", "comment" => "Storage backend data reference"]
],
"indexes" => [
"PRIMARY" => ["id"],
public static function selectFirst(array $fields = [], array $condition = [], array $params = [])
{
if (empty($fields)) {
- $selected = self::getFields();
+ $fields = self::getFields();
}
return DBA::selectFirst("photo", $fields, $condition, $params);
* @brief Get a single photo given resource id and scale
*
* This method checks for permissions. Returns associative array
- * on success, a generic "red sign" data if user has no permission,
+ * on success, "no sign" image info, if user has no permission,
* false if photo does not exists
*
* @param string $resourceid Rescource ID for the photo
$photo = self::selectFirst([], $condition, $params);
if ($photo === false) {
- return false; ///TODO: Return info for red sign image
+ return self::createPhotoForSystemResource("images/nosign.jpg");
}
return $photo;
}
*
* @return \Friendica\Object\Image
*/
- public static function getImageForPhotoId($id)
+ public static function getImageForPhoto($photo)
{
- $i = self::selectFirst(["data", "type"],["id"=>$id]);
- if ($i===false) {
+ $data = "";
+ if ($photo["backend-class"] == "") {
+ // legacy data storage in "data" column
+ $i = self::selectFirst(["data"], ["id"=>$photo["id"]]);
+ if ($i===false) {
+ return null;
+ }
+ $data = $i["data"];
+ } else {
+ $backendClass = $photo["backend-class"];
+ $backendRef = $photo["backend-ref"];
+ $data = $backendClass::get($backendRef);
+ }
+
+ if ($data === "") {
return null;
}
- return new Image($i["data"], $i["type"]);
+ return new Image($data, $photo["type"]);
}
/**
return $fields;
}
+ /**
+ * @brief Construct a photo array for a system resource image
+ *
+ * @param string $filename Image file name relative to code root
+ * @param string $mimetype Image mime type. Defaults to "image/jpeg"
+ *
+ * @return array
+ */
+ public static function createPhotoForSystemResource($filename, $mimetype = "image/jpeg")
+ {
+ $fields = self::getFields();
+ $values = array_fill(0, count($fields), "");
+ $photo = array_combine($fields, $values);
+ $photo["backend-class"] = "\Friendica\Model\Storage\SystemResource";
+ $photo["backend-ref"] = $filename;
+ $photo["type"] = $mimetype;
+ $photo['cacheable'] = false;
+ return $photo;
+ }
/**
--- /dev/null
+<?php
+/**
+ * @file src/Model/Storage/SystemStorage.php
+ */
+
+namespace Friendica\Model\Storage;
+
+/**
+ * @brief System resource storage class
+ *
+ * This class is used to load system resources, like images.
+ * Is not itended to be selectable by admins as default storage class.
+ */
+class SystemResource
+{
+ // Valid folders to look for resources
+ const VALID_FOLDERS = [ "images" ];
+
+ /**
+ * @brief get data
+ *
+ * @param string $resourceid
+ *
+ * @return string
+ */
+ static function get($filename)
+ {
+ $folder = dirname($filename);
+ if (!in_array($folder, self::VALID_FOLDERS)) return "";
+ if (!file_exists($filename)) return "";
+ return file_get_contents($filename);
+ }
+
+ static function put($filename, $data)
+ {
+ throw new \BadMethodCallException();
+ }
+}
+