X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModel%2FPhoto.php;h=0e3661b0f33e4110915908a8542353e35823112b;hb=6bb418c5a7cdd71d28a8a572059efb14401b70bd;hp=88f6d4269b3678c991c5681bb76270f83da75837;hpb=bbbc15a5ebd3127909e6fca0a5cc21d84f080ee1;p=friendica.git diff --git a/src/Model/Photo.php b/src/Model/Photo.php index 88f6d4269b..0e3661b0f3 100644 --- a/src/Model/Photo.php +++ b/src/Model/Photo.php @@ -10,11 +10,13 @@ use Friendica\BaseObject; use Friendica\Core\Cache; use Friendica\Core\Config; use Friendica\Core\L10n; -use Friendica\Core\System; use Friendica\Core\StorageManager; +use Friendica\Core\System; use Friendica\Database\DBA; use Friendica\Database\DBStructure; +use Friendica\Model\Storage\IStorage; use Friendica\Object\Image; +use Friendica\Protocol\DFRN; use Friendica\Util\DateTimeFormat; use Friendica\Util\Network; use Friendica\Util\Security; @@ -29,18 +31,19 @@ class Photo extends BaseObject /** * @brief Select rows from the photo table * - * @param array $fields Array of selected fields, empty for all - * @param array $conditions Array of fields for conditions - * @param array $params Array of several parameters + * @param array $fields Array of selected fields, empty for all + * @param array $conditions Array of fields for conditions + * @param array $params Array of several parameters * * @return boolean|array * - * @see \Friendica\Database\DBA::select + * @throws \Exception + * @see \Friendica\Database\DBA::select */ public static function select(array $fields = [], array $conditions = [], array $params = []) { if (empty($fields)) { - $selected = self::getFields(); + $fields = self::getFields(); } $r = DBA::select("photo", $fields, $conditions, $params); @@ -50,13 +53,14 @@ class Photo extends BaseObject /** * @brief Retrieve a single record from the photo table * - * @param array $fields Array of selected fields, empty for all - * @param array $conditions Array of fields for conditions - * @param array $params Array of several parameters + * @param array $fields Array of selected fields, empty for all + * @param array $conditions Array of fields for conditions + * @param array $params Array of several parameters * * @return bool|array * - * @see \Friendica\Database\DBA::select + * @throws \Exception + * @see \Friendica\Database\DBA::select */ public static function selectFirst(array $fields = [], array $conditions = [], array $params = []) { @@ -70,14 +74,15 @@ class Photo extends BaseObject /** * @brief Get photos for user id * - * @param integer $uid User id - * @param string $resourceid Rescource ID of the photo - * @param array $conditions Array of fields for conditions - * @param array $params Array of several parameters + * @param integer $uid User id + * @param string $resourceid Rescource ID of the photo + * @param array $conditions Array of fields for conditions + * @param array $params Array of several parameters * * @return bool|array * - * @see \Friendica\Database\DBA::select + * @throws \Exception + * @see \Friendica\Database\DBA::select */ public static function getPhotosForUser($uid, $resourceid, array $conditions = [], array $params = []) { @@ -90,15 +95,16 @@ class Photo extends BaseObject /** * @brief Get a photo for user id * - * @param integer $uid User id - * @param string $resourceid Rescource ID of the photo - * @param integer $scale Scale of the photo. Defaults to 0 - * @param array $conditions Array of fields for conditions - * @param array $params Array of several parameters + * @param integer $uid User id + * @param string $resourceid Rescource ID of the photo + * @param integer $scale Scale of the photo. Defaults to 0 + * @param array $conditions Array of fields for conditions + * @param array $params Array of several parameters * * @return bool|array * - * @see \Friendica\Database\DBA::select + * @throws \Exception + * @see \Friendica\Database\DBA::select */ public static function getPhotoForUser($uid, $resourceid, $scale = 0, array $conditions = [], array $params = []) { @@ -116,19 +122,31 @@ class Photo extends BaseObject * on success, "no sign" image info, if user has no permission, * false if photo does not exists * - * @param string $resourceid Rescource ID of the photo - * @param integer $scale Scale of the photo. Defaults to 0 + * @param string $resourceid Rescource ID of the photo + * @param integer $scale Scale of the photo. Defaults to 0 * * @return boolean|array + * @throws \Exception */ public static function getPhoto($resourceid, $scale = 0) { - $r = self::selectFirst(["uid"], ["resource-id" => $resourceid]); + $r = self::selectFirst(["uid", "allow_cid", "allow_gid", "deny_cid", "deny_gid"], ["resource-id" => $resourceid]); if ($r === false) { return false; } + $uid = $r["uid"]; + + // This is the first place, when retrieving just a photo, that we know who owns the photo. + // Check if the photo is public (empty allow and deny means public), if so, skip auth attempt, if not + // make sure that the requester's session is appropriately authenticated to that user + // otherwise permissions checks done by getPermissionsSQLByUserId() won't work correctly + if (!empty($r["allow_cid"]) || !empty($r["allow_gid"]) || !empty($r["deny_cid"]) || !empty($r["deny_gid"])) { + $r = DBA::selectFirst("user", ["nickname"], ["uid" => $uid], []); + // this will either just return (if auth all ok) or will redirect and exit (starting over) + DFRN::autoRedir(self::getApp(), $r["nickname"]); + } - $sql_acl = Security::getPermissionsSQLByUserId($r["uid"]); + $sql_acl = Security::getPermissionsSQLByUserId($uid); $conditions = [ "`resource-id` = ? AND `scale` <= ? " . $sql_acl, @@ -145,9 +163,10 @@ class Photo extends BaseObject /** * @brief Check if photo with given conditions exists * - * @param array $conditions Array of extra conditions + * @param array $conditions Array of extra conditions * * @return boolean + * @throws \Exception */ public static function exists(array $conditions) { @@ -158,13 +177,16 @@ class Photo extends BaseObject /** * @brief Get Image object for given row id. null if row id does not exist * - * @param array $photo Photo data. Needs at least 'id', 'type', 'backend-class', 'backend-ref' + * @param array $photo Photo data. Needs at least 'id', 'type', 'backend-class', 'backend-ref' * * @return \Friendica\Object\Image + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + * @throws \ImagickException */ public static function getImageForPhoto(array $photo) { $data = ""; + if ($photo["backend-class"] == "") { // legacy data storage in "data" column $i = self::selectFirst(["data"], ["id" => $photo["id"]]); @@ -181,6 +203,7 @@ class Photo extends BaseObject if ($data === "") { return null; } + return new Image($data, $photo["type"]); } @@ -188,10 +211,11 @@ class Photo extends BaseObject * @brief Return a list of fields that are associated with the photo table * * @return array field list + * @throws \Exception */ private static function getFields() { - $allfields = DBStructure::definition(false); + $allfields = DBStructure::definition(self::getApp()->getBasePath(), false); $fields = array_keys($allfields["photo"]["fields"]); array_splice($fields, array_search("data", $fields), 1); return $fields; @@ -200,20 +224,23 @@ class Photo extends BaseObject /** * @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" + * @param string $filename Image file name relative to code root + * @param string $mimetype Image mime type. Defaults to "image/jpeg" * * @return array + * @throws \Exception */ 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::class; + $photo["backend-class"] = Storage\SystemResource::class; $photo["backend-ref"] = $filename; $photo["type"] = $mimetype; $photo["cacheable"] = false; + return $photo; } @@ -236,6 +263,7 @@ class Photo extends BaseObject * @param string $desc Photo caption. optional, default = "" * * @return boolean True on success + * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ public static function store(Image $Image, $uid, $cid, $rid, $filename, $album, $scale, $profile = 0, $allow_cid = "", $allow_gid = "", $deny_cid = "", $deny_gid = "", $desc = "") { @@ -257,14 +285,15 @@ class Photo extends BaseObject // if is an existing photo, reuse same backend $data = ""; $backend_ref = ""; - $backend_class = ""; + /** @var IStorage $backend_class */ if (DBA::isResult($existing_photo)) { $backend_ref = (string)$existing_photo["backend-ref"]; $backend_class = (string)$existing_photo["backend-class"]; } else { $backend_class = StorageManager::getBackend(); } + if ($backend_class === "") { $data = $Image->asString(); } else { @@ -306,15 +335,17 @@ class Photo extends BaseObject return $r; } + /** * @brief Delete info from table and data from storage * - * @param array $conditions Field condition(s) - * @param array $options Options array, Optional + * @param array $conditions Field condition(s) + * @param array $options Options array, Optional * * @return boolean * - * @see \Friendica\Database\DBA::delete + * @throws \Exception + * @see \Friendica\Database\DBA::delete */ public static function delete(array $conditions, array $options = []) { @@ -322,6 +353,7 @@ class Photo extends BaseObject $photos = self::select(["backend-class","backend-ref"], $conditions); foreach($photos as $photo) { + /** @var IStorage $backend_class */ $backend_class = (string)$photo["backend-class"]; if ($backend_class !== "") { $backend_class::delete($photo["backend-ref"]); @@ -341,7 +373,8 @@ class Photo extends BaseObject * * @return boolean Was the update successfull? * - * @see \Friendica\Database\DBA::update + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + * @see \Friendica\Database\DBA::update */ public static function update($fields, $conditions, Image $img = null, array $old_fields = []) { @@ -350,6 +383,7 @@ class Photo extends BaseObject $photos = self::select(["backend-class","backend-ref"], $conditions); foreach($photos as $photo) { + /** @var IStorage $backend_class */ $backend_class = (string)$photo["backend-class"]; if ($backend_class !== "") { $fields["backend-ref"] = $backend_class::put($img->asString(), $photo["backend-ref"]); @@ -362,7 +396,7 @@ class Photo extends BaseObject $fields['edited'] = DateTimeFormat::utcNow(); - return DBA::update("photo", $fields, $conditions); + return DBA::update("photo", $fields, $conditions, $old_fields); } /** @@ -371,6 +405,8 @@ class Photo extends BaseObject * @param integer $cid contact id * @param boolean $quit_on_error optional, default false * @return array + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + * @throws \ImagickException */ public static function importProfilePhoto($image_url, $uid, $cid, $quit_on_error = false) { @@ -389,13 +425,22 @@ class Photo extends BaseObject $photo_failure = false; $filename = basename($image_url); - $img_str = Network::fetchUrl($image_url, true); + if (!empty($image_url)) { + $ret = Network::curl($image_url, true); + $img_str = $ret->getBody(); + $type = $ret->getContentType(); + } else { + $img_str = ''; + } if ($quit_on_error && ($img_str == "")) { return false; } - $type = Image::guessType($image_url, true); + if (empty($type)) { + $type = Image::guessType($image_url, true); + } + $Image = new Image($img_str, $type); if ($Image->isValid()) { $Image->scaleToSquare(300); @@ -464,7 +509,7 @@ class Photo extends BaseObject } /** - * @param string $exifCoord coordinate + * @param array $exifCoord coordinate * @param string $hemi hemi * @return float */ @@ -507,6 +552,7 @@ class Photo extends BaseObject * @param bool $update Update the cache * * @return array Returns array of the photo albums + * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ public static function getAlbums($uid, $update = false) { @@ -544,6 +590,7 @@ class Photo extends BaseObject /** * @param int $uid User id of the photos * @return void + * @throws \Exception */ public static function clearAlbumCache($uid) { @@ -555,6 +602,7 @@ class Photo extends BaseObject * Generate a unique photo ID. * * @return string + * @throws \Exception */ public static function newResource() {