From 9eec2bf5f3642566a09d66d2d40f5b8de89e8761 Mon Sep 17 00:00:00 2001
From: Michael <heluecht@pirati.ca>
Date: Thu, 27 Jan 2022 17:51:23 +0000
Subject: [PATCH] Improved support for "Page" type

---
 src/Model/Post/Media.php               | 6 ++++++
 src/Protocol/ActivityPub/Processor.php | 2 +-
 src/Protocol/ActivityPub/Receiver.php  | 8 ++++++++
 3 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/src/Model/Post/Media.php b/src/Model/Post/Media.php
index c9e3128c4e..07cad9cf6f 100644
--- a/src/Model/Post/Media.php
+++ b/src/Model/Post/Media.php
@@ -169,6 +169,12 @@ class Media
 		if (empty($media['mimetype']) || empty($media['size'])) {
 			$timeout = DI::config()->get('system', 'xrd_timeout');
 			$curlResult = DI::httpClient()->head($media['url'], [HttpClientOptions::TIMEOUT => $timeout]);
+
+			// Workaround for systems that can't handle a HEAD request
+			if (!$curlResult->isSuccess() && ($curlResult->getReturnCode() == 405)) {
+				$curlResult = DI::httpClient()->get($media['url'], [HttpClientOptions::TIMEOUT => $timeout]);
+			}
+
 			if ($curlResult->isSuccess()) {
 				if (empty($media['mimetype'])) {
 					$media['mimetype'] = $curlResult->getHeader('Content-Type')[0] ?? '';
diff --git a/src/Protocol/ActivityPub/Processor.php b/src/Protocol/ActivityPub/Processor.php
index 38999eb0da..4a9dc352d4 100644
--- a/src/Protocol/ActivityPub/Processor.php
+++ b/src/Protocol/ActivityPub/Processor.php
@@ -125,7 +125,7 @@ class Processor
 		$data = ['uri-id' => $uriid];
 		$data['type'] = Post\Media::UNKNOWN;
 		$data['url'] = $attachment['url'];
-		$data['mimetype'] = $attachment['mediaType'];
+		$data['mimetype'] = $attachment['mediaType'] ?? null;
 		$data['height'] = $attachment['height'] ?? null;
 		$data['width'] = $attachment['width'] ?? null;
 		$data['size'] = $attachment['size'] ?? null;
diff --git a/src/Protocol/ActivityPub/Receiver.php b/src/Protocol/ActivityPub/Receiver.php
index 4504cee4c4..a28cc96170 100644
--- a/src/Protocol/ActivityPub/Receiver.php
+++ b/src/Protocol/ActivityPub/Receiver.php
@@ -1454,6 +1454,14 @@ class Receiver
 			$object_data['attachments'] = array_merge($object_data['attachments'], self::processAttachmentUrls($object['as:url'] ?? []));
 		}
 
+		// For page types we expect that the alternate url posts to some page.
+		// So we add this to the attachments if it differs from the id.
+		// Currently only Lemmy is using the page type.
+		if (($object_data['object_type'] == 'as:Page') && !empty($object_data['alternate-url']) && !Strings::compareLink($object_data['alternate-url'], $object_data['id'])) {
+			$object_data['attachments'][] = ['url' => $object_data['alternate-url']];
+			$object_data['alternate-url'] = null;
+		}
+
 		$receiverdata = self::getReceivers($object, $object_data['actor'], $object_data['tags'], true);
 		$receivers = $reception_types = [];
 		foreach ($receiverdata as $key => $data) {