diff --git a/src/Model/Item.php b/src/Model/Item.php index 78e0321b47..fb88da8a28 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -2742,6 +2742,23 @@ class Item } $body = $item['body'] ?? ''; + $shared = BBCode::fetchShareAttributes($body); + if (!empty($shared['guid'])) { + $shared_item = Post::selectFirst(['uri-id', 'plink'], ['guid' => $shared['guid']]); + $shared_uri_id = $shared_item['uri-id'] ?? 0; + $shared_links = [strtolower($shared_item['plink'] ?? '')]; + $shared_attachments = Post\Media::splitAttachments($shared_uri_id, $shared['guid']); + $shared_links = array_merge($shared_links, array_column($shared_attachments['visual'], 'url')); + $shared_links = array_merge($shared_links, array_column($shared_attachments['link'], 'url')); + $shared_links = array_merge($shared_links, array_column($shared_attachments['additional'], 'url')); + $item['body'] = self::replaceVisualAttachments($shared_attachments, $item['body']); + } else { + $shared_uri_id = 0; + $shared_links = []; + } + $attachments = Post\Media::splitAttachments($item['uri-id'], $item['guid'] ?? '', $shared_links); + $item['body'] = self::replaceVisualAttachments($attachments, $item['body'] ?? ''); + $item['body'] = preg_replace("/\s*\[attachment .*?\].*?\[\/attachment\]\s*/ism", "\n", $item['body']); self::putInCache($item); $item['body'] = $body; @@ -2764,25 +2781,13 @@ class Item return $s; } - $shared = BBCode::fetchShareAttributes($item['body']); - if (!empty($shared['guid'])) { - $shared_item = Post::selectFirst(['uri-id', 'plink'], ['guid' => $shared['guid']]); - $shared_uri_id = $shared_item['uri-id'] ?? 0; - $shared_links = [strtolower($shared_item['plink'] ?? '')]; - $attachments = Post\Media::splitAttachments($shared_uri_id, $shared['guid']); - $s = self::addVisualAttachments($attachments, $item, $s, true); - $s = self::addLinkAttachment($attachments, $body, $s, true, []); - $s = self::addNonVisualAttachments($attachments, $item, $s, true); - $shared_links = array_merge($shared_links, array_column($attachments['visual'], 'url')); - $shared_links = array_merge($shared_links, array_column($attachments['link'], 'url')); - $shared_links = array_merge($shared_links, array_column($attachments['additional'], 'url')); + if (!empty($shared_attachments)) { + $s = self::addVisualAttachments($shared_attachments, $item, $s, true); + $s = self::addLinkAttachment($shared_attachments, $body, $s, true, []); + $s = self::addNonVisualAttachments($shared_attachments, $item, $s, true); $body = preg_replace("/\s*\[share .*?\].*?\[\/share\]\s*/ism", '', $body); - } else { - $shared_uri_id = 0; - $shared_links = []; } - $attachments = Post\Media::splitAttachments($item['uri-id'], $item['guid'] ?? '', $shared_links); $s = self::addVisualAttachments($attachments, $item, $s, false); $s = self::addLinkAttachment($attachments, $body, $s, false, $shared_links); $s = self::addNonVisualAttachments($attachments, $item, $s, false); @@ -2843,6 +2848,28 @@ class Item return false; } + /** + * Replace visual attachments in the body + * + * @param array $attachments + * @param string $body + * @return string modified body + */ + private static function replaceVisualAttachments(array $attachments, string $body) + { + $stamp1 = microtime(true); + + foreach ($attachments['visual'] as $attachment) { + if (!empty($attachment['preview'])) { + $body = str_replace($attachment['preview'], Post\Media::getPreviewUrlForId($attachment['id'], Proxy::SIZE_LARGE), $body); + } elseif ($attachment['filetype'] == 'image') { + $body = str_replace($attachment['url'], Post\Media::getUrlForId($attachment['id']), $body); + } + } + DI::profiler()->saveTimestamp($stamp1, 'rendering'); + return $body; + } + /** * Add visual attachments to the content * @@ -2864,7 +2891,7 @@ class Item } if (!empty($attachment['preview'])) { - $preview_url = Post\Media::getPreviewUrlForId($attachment['id'], Proxy::SIZE_LARGE); + $preview_url = Post\Media::getPreviewUrlForId($attachment['id'], Proxy::SIZE_LARGE); } else { $preview_url = ''; } @@ -2901,7 +2928,7 @@ class Item } } elseif ($attachment['filetype'] == 'image') { $media = Renderer::replaceMacros(Renderer::getMarkupTemplate('content/image.tpl'), [ - '$image' => [ + '$image' => [ 'src' => Post\Media::getUrlForId($attachment['id']), 'preview' => Post\Media::getPreviewUrlForId($attachment['id'], ($attachment['width'] > $attachment['height']) ? Proxy::SIZE_MEDIUM : Proxy::SIZE_LARGE), 'attachment' => $attachment, @@ -2984,7 +3011,7 @@ class Item if ($preview && !empty($attachment['preview'])) { if ($attachment['preview-width'] >= 500) { - $data['image'] = Post\Media::getPreviewUrlForId($attachment['id'], Proxy::SIZE_MEDIUM); + $data['image'] = Post\Media::getPreviewUrlForId($attachment['id'], Proxy::SIZE_MEDIUM); } else { $data['preview'] = Post\Media::getPreviewUrlForId($attachment['id'], Proxy::SIZE_MEDIUM); } diff --git a/src/Model/Photo.php b/src/Model/Photo.php index acc6b0d197..fe416c360f 100644 --- a/src/Model/Photo.php +++ b/src/Model/Photo.php @@ -268,21 +268,22 @@ class Photo * Construct a photo array for an external resource image * * @param string $url Image URL + * @param int $uid User ID of the requesting person * @param string $mimetype Image mime type. Defaults to "image/jpeg" * * @return array * @throws \Exception */ - public static function createPhotoForExternalResource($url, $mimetype = "image/jpeg") + public static function createPhotoForExternalResource($url, $uid = 0, $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['backend-ref'] = json_encode(['url' => $url, 'uid' => $uid]); $photo['type'] = $mimetype; - $photo['cacheable'] = false; + $photo['cacheable'] = true; return $photo; } diff --git a/src/Model/Storage/ExternalResource.php b/src/Model/Storage/ExternalResource.php index 8d1aded151..5c78e6d546 100644 --- a/src/Model/Storage/ExternalResource.php +++ b/src/Model/Storage/ExternalResource.php @@ -22,6 +22,7 @@ namespace Friendica\Model\Storage; use BadMethodCallException; +use Friendica\Util\HTTPSignature; use Friendica\Network\IHTTPRequest; /** @@ -45,16 +46,21 @@ class ExternalResource implements IStorage /** * @inheritDoc */ - public function get(string $filename) + public function get(string $reference) { - $parts = parse_url($filename); + $data = json_decode($reference); + if (empty($data->url)) { + return ""; + } + + $parts = parse_url($data->url); if (empty($parts['scheme']) || empty($parts['host'])) { return ""; } - $curlResult = $this->httpRequest->get($filename); - if ($curlResult->isSuccess()) { - return $curlResult->getBody(); + $fetchResult = HTTPSignature::fetchRaw($data->url, $data->uid); + if ($fetchResult->isSuccess()) { + return $fetchResult->getBody(); } else { return ""; } @@ -63,12 +69,12 @@ class ExternalResource implements IStorage /** * @inheritDoc */ - public function put(string $data, string $filename = '') + public function put(string $data, string $reference = '') { throw new BadMethodCallException(); } - public function delete(string $filename) + public function delete(string $reference) { throw new BadMethodCallException(); } diff --git a/src/Module/Photo.php b/src/Module/Photo.php index 9fdda1a8d0..f61a4564d6 100644 --- a/src/Module/Photo.php +++ b/src/Module/Photo.php @@ -171,17 +171,17 @@ class Photo extends BaseModule $author = Contact::selectFirst([], ["`id` IN (SELECT `author-id` FROM `post` WHERE `uri-id` = ?)", $media['uri-id']]); $url = Contact::magicLinkByContact($author, $url); - return MPhoto::createPhotoForExternalResource($url); + return MPhoto::createPhotoForExternalResource($url, (int)local_user()); case "media": - $media = DBA::selectFirst('post-media', ['url'], ['id' => $uid, 'type' => Post\Media::IMAGE]); - if (empty($media['url'])) { + $media = DBA::selectFirst('post-media', ['url', 'uri-id'], ['id' => $uid, 'type' => Post\Media::IMAGE]); + if (empty($media)) { return false; } $author = Contact::selectFirst([], ["`id` IN (SELECT `author-id` FROM `post` WHERE `uri-id` = ?)", $media['uri-id']]); $url = Contact::magicLinkByContact($author, $media['url']); - return MPhoto::createPhotoForExternalResource($url); + return MPhoto::createPhotoForExternalResource($url, (int)local_user()); case "contact": $contact = Contact::getById($uid, ['uid', 'url', 'avatar', 'photo', 'xmpp', 'addr']); if (empty($contact)) {