X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModel%2FPhoto.php;h=0f03b54b0dbac9677dfaca7ee2cb48a6211f5e76;hb=c3d0ab56a560809f0d331f3f45f1f213a2094358;hp=e70ac2d97bda1c9a1493d2c1ac2b70719ea38523;hpb=6ccf038053431ae55100f061ee96d4549fe8f8ed;p=friendica.git diff --git a/src/Model/Photo.php b/src/Model/Photo.php index e70ac2d97b..0f03b54b0d 100644 --- a/src/Model/Photo.php +++ b/src/Model/Photo.php @@ -1,14 +1,27 @@ . + * */ + namespace Friendica\Model; -use Friendica\Core\Cache\Cache; -use Friendica\Core\Config; -use Friendica\Core\L10n; +use Friendica\Core\Cache\Duration; use Friendica\Core\Logger; use Friendica\Core\System; use Friendica\Database\DBA; @@ -18,8 +31,8 @@ use Friendica\Model\Storage\SystemResource; use Friendica\Object\Image; use Friendica\Util\DateTimeFormat; use Friendica\Util\Images; -use Friendica\Util\Network; -use Friendica\Util\Security; +use Friendica\Security\Security; +use Friendica\Util\Proxy; use Friendica\Util\Strings; require_once "include/dba.php"; @@ -29,8 +42,10 @@ require_once "include/dba.php"; */ class Photo { + const CONTACT_PHOTOS = 'Contact Photos'; + /** - * @brief Select rows from the photo table and returns them as array + * Select rows from the photo table and returns them as array * * @param array $fields Array of selected fields, empty for all * @param array $conditions Array of fields for conditions @@ -51,7 +66,7 @@ class Photo } /** - * @brief Retrieve a single record from the photo table + * 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 @@ -72,7 +87,7 @@ class Photo } /** - * @brief Get photos for user id + * Get photos for user id * * @param integer $uid User id * @param string $resourceid Rescource ID of the photo @@ -93,7 +108,7 @@ class Photo } /** - * @brief Get a photo for user id + * Get a photo for user id * * @param integer $uid User id * @param string $resourceid Rescource ID of the photo @@ -116,7 +131,7 @@ class Photo } /** - * @brief Get a single photo given resource id and scale + * Get a single photo given resource id and scale * * This method checks for permissions. Returns associative array * on success, "no sign" image info, if user has no permission, @@ -128,7 +143,7 @@ class Photo * @return boolean|array * @throws \Exception */ - public static function getPhoto($resourceid, $scale = 0) + public static function getPhoto(string $resourceid, int $scale = 0) { $r = self::selectFirst(["uid"], ["resource-id" => $resourceid]); if (!DBA::isResult($r)) { @@ -137,7 +152,9 @@ class Photo $uid = $r["uid"]; - $sql_acl = Security::getPermissionsSQLByUserId($uid); + $accessible = $uid ? (bool)DI::pConfig()->get($uid, 'system', 'accessible-photos', false) : false; + + $sql_acl = Security::getPermissionsSQLByUserId($uid, $accessible); $conditions = ["`resource-id` = ? AND `scale` <= ? " . $sql_acl, $resourceid, $scale]; $params = ["order" => ["scale" => true]]; @@ -147,7 +164,7 @@ class Photo } /** - * @brief Check if photo with given conditions exists + * Check if photo with given conditions exists * * @param array $conditions Array of extra conditions * @@ -161,7 +178,7 @@ class Photo /** - * @brief Get Image object for given row id. null if row id does not exist + * 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' * @@ -192,7 +209,7 @@ class Photo } /** - * @brief Return a list of fields that are associated with the photo table + * Return a list of fields that are associated with the photo table * * @return array field list * @throws \Exception @@ -206,7 +223,7 @@ class Photo } /** - * @brief Construct a photo array for a system resource image + * 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" @@ -230,7 +247,7 @@ class Photo /** - * @brief store photo metadata in db and binary in default backend + * store photo metadata in db and binary in default backend * * @param Image $Image Image object with data * @param integer $uid User ID @@ -283,7 +300,6 @@ class Photo $backend_ref = $storage->put($Image->asString(), $backend_ref); } - $fields = [ "uid" => $uid, "contact-id" => $cid, @@ -320,7 +336,7 @@ class Photo /** - * @brief Delete info from table and data from storage + * Delete info from table and data from storage * * @param array $conditions Field condition(s) * @param array $options Options array, Optional @@ -346,7 +362,7 @@ class Photo } /** - * @brief Update a photo + * Update a photo * * @param array $fields Contains the fields that are updated * @param array $conditions Condition array with the key values @@ -395,7 +411,7 @@ class Photo $micro = ""; $photo = DBA::selectFirst( - "photo", ["resource-id"], ["uid" => $uid, "contact-id" => $cid, "scale" => 4, "album" => "Contact Photos"] + "photo", ["resource-id"], ["uid" => $uid, "contact-id" => $cid, "scale" => 4, "album" => self::CONTACT_PHOTOS] ); if (!empty($photo['resource-id'])) { $resource_id = $photo["resource-id"]; @@ -407,7 +423,7 @@ class Photo $filename = basename($image_url); if (!empty($image_url)) { - $ret = Network::curl($image_url, true); + $ret = DI::httpRequest()->get($image_url); $img_str = $ret->getBody(); $type = $ret->getContentType(); } else { @@ -418,15 +434,13 @@ class Photo return false; } - if (empty($type)) { - $type = Images::guessType($image_url, true); - } + $type = Images::getMimeTypeByData($img_str, $image_url, $type); $Image = new Image($img_str, $type); if ($Image->isValid()) { $Image->scaleToSquare(300); - $r = self::store($Image, $uid, $cid, $resource_id, $filename, "Contact Photos", 4); + $r = self::store($Image, $uid, $cid, $resource_id, $filename, self::CONTACT_PHOTOS, 4); if ($r === false) { $photo_failure = true; @@ -434,7 +448,7 @@ class Photo $Image->scaleDown(80); - $r = self::store($Image, $uid, $cid, $resource_id, $filename, "Contact Photos", 5); + $r = self::store($Image, $uid, $cid, $resource_id, $filename, self::CONTACT_PHOTOS, 5); if ($r === false) { $photo_failure = true; @@ -442,7 +456,7 @@ class Photo $Image->scaleDown(48); - $r = self::store($Image, $uid, $cid, $resource_id, $filename, "Contact Photos", 6); + $r = self::store($Image, $uid, $cid, $resource_id, $filename, self::CONTACT_PHOTOS, 6); if ($r === false) { $photo_failure = true; @@ -481,9 +495,10 @@ class Photo } if ($photo_failure) { - $image_url = DI::baseUrl() . "/images/person-300.jpg"; - $thumb = DI::baseUrl() . "/images/person-80.jpg"; - $micro = DI::baseUrl() . "/images/person-48.jpg"; + $contact = Contact::getById($cid) ?: []; + $image_url = Contact::getDefaultAvatar($contact, Proxy::SIZE_SMALL); + $thumb = Contact::getDefaultAvatar($contact, Proxy::SIZE_THUMB); + $micro = Contact::getDefaultAvatar($contact, Proxy::SIZE_MICRO); } return [$image_url, $thumb, $micro]; @@ -525,7 +540,7 @@ class Photo } /** - * @brief Fetch the photo albums that are available for a viewer + * Fetch the photo albums that are available for a viewer * * The query in this function is cost intensive, so it is cached. * @@ -542,7 +557,7 @@ class Photo $key = "photo_albums:".$uid.":".local_user().":".remote_user(); $albums = DI::cache()->get($key); if (is_null($albums) || $update) { - if (!Config::get("system", "no_count", false)) { + if (!DI::config()->get("system", "no_count", false)) { /// @todo This query needs to be renewed. It is really slow // At this time we just store the data in the cache $albums = q("SELECT COUNT(DISTINCT `resource-id`) AS `total`, `album`, ANY_VALUE(`created`) AS `created` @@ -550,8 +565,8 @@ class Photo WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s' $sql_extra GROUP BY `album` ORDER BY `created` DESC", intval($uid), - DBA::escape("Contact Photos"), - DBA::escape(L10n::t("Contact Photos")) + DBA::escape(self::CONTACT_PHOTOS), + DBA::escape(DI::l10n()->t(self::CONTACT_PHOTOS)) ); } else { // This query doesn't do the count and is much faster @@ -559,11 +574,11 @@ class Photo FROM `photo` USE INDEX (`uid_album_scale_created`) WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s' $sql_extra", intval($uid), - DBA::escape("Contact Photos"), - DBA::escape(L10n::t("Contact Photos")) + DBA::escape(self::CONTACT_PHOTOS), + DBA::escape(DI::l10n()->t(self::CONTACT_PHOTOS)) ); } - DI::cache()->set($key, $albums, Cache::DAY); + DI::cache()->set($key, $albums, Duration::DAY); } return $albums; } @@ -576,7 +591,7 @@ class Photo public static function clearAlbumCache($uid) { $key = "photo_albums:".$uid.":".local_user().":".remote_user(); - DI::cache()->set($key, null, Cache::DAY); + DI::cache()->set($key, null, Duration::DAY); } /** @@ -648,13 +663,26 @@ class Photo 'resource-id' => $image_rid, 'uid' => $uid ]; if (!Photo::exists($condition)) { + $photo = self::selectFirst(['allow_cid', 'allow_gid', 'deny_cid', 'deny_gid', 'uid'], ['resource-id' => $image_rid]); + if (!DBA::isResult($photo)) { + Logger::info('Image not found', ['resource-id' => $image_rid]); + } else { + Logger::info('Mismatching permissions', ['condition' => $condition, 'photo' => $photo]); + } continue; } - /// @todo Check if $str_contact_allow does contain a public forum. Then set the permissions to public. + /** + * @todo Existing permissions need to be mixed with the new ones. + * Otherwise this creates problems with sharing the same picture multiple times + * Also check if $str_contact_allow does contain a public forum. + * Then set the permissions to public. + */ $fields = ['allow_cid' => $str_contact_allow, 'allow_gid' => $str_group_allow, - 'deny_cid' => $str_contact_deny, 'deny_gid' => $str_group_deny]; + 'deny_cid' => $str_contact_deny, 'deny_gid' => $str_group_deny, + 'accessible' => DI::pConfig()->get($uid, 'system', 'accessible-photos', false)]; + $condition = ['resource-id' => $image_rid, 'uid' => $uid]; Logger::info('Set permissions', ['condition' => $condition, 'permissions' => $fields]); Photo::update($fields, $condition);