From b4a380e9de570c6692bec151cf562cac8d41a440 Mon Sep 17 00:00:00 2001
From: Michael <heluecht@pirati.ca>
Date: Thu, 21 Dec 2023 10:26:34 +0000
Subject: [PATCH] Handle "commentsEnabled"

---
 src/Protocol/ActivityPub/Processor.php | 19 +++++++++++++++++--
 src/Protocol/ActivityPub/Receiver.php  |  5 +++++
 2 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/src/Protocol/ActivityPub/Processor.php b/src/Protocol/ActivityPub/Processor.php
index efd1e00ced..3c0d57caa5 100644
--- a/src/Protocol/ActivityPub/Processor.php
+++ b/src/Protocol/ActivityPub/Processor.php
@@ -918,7 +918,15 @@ class Processor
 
 		self::storeReceivers($item['uri-id'], $activity['receiver_urls'] ?? []);
 
-		self::storeCapabilities($item['uri-id'], $activity['capabilities'] ?? []);
+		if (!empty($activity['capabilities'])) {
+			$restrictions = self::storeCapabilities($item['uri-id'], $activity['capabilities']);
+		} elseif (!is_null($activity['can-comment']) && !$activity['can-comment']) {
+			$restrictions = [Tag::CAN_REPLY];
+		} else {
+			$restrictions = [];
+		}
+
+		// @todo Store restrictions
 
 		$item['location'] = $activity['location'];
 
@@ -1343,9 +1351,11 @@ class Processor
 		}
 	}
 
-	private static function storeCapabilities(int $uriid, array $capabilities)
+	private static function storeCapabilities(int $uriid, array $capabilities): array
 	{
+		$restrictions = [];
 		foreach (['pixelfed:canAnnounce' => Tag::CAN_ANNOUNCE, 'pixelfed:canLike' => Tag::CAN_LIKE, 'pixelfed:canReply' => Tag::CAN_REPLY] as $element => $type) {
+			$restricted = true;
 			foreach ($capabilities[$element] ?? [] as $capability) {
 				if ($capability == ActivityPub::PUBLIC_COLLECTION) {
 					$name = Receiver::PUBLIC_COLLECTION;
@@ -1359,9 +1369,14 @@ class Processor
 					Logger::warning('Unable to coerce name from capability', ['element' => $element, 'type' => $type, 'capability' => $capability]);
  					$name = '';
 				}
+				$restricted = false;
 				Tag::store($uriid, $type, $name, $capability);
 			}
+			if ($restricted) {
+				$restrictions[] = $type;
+			}
 		}
+		return $restrictions;
 	}
 
 	/**
diff --git a/src/Protocol/ActivityPub/Receiver.php b/src/Protocol/ActivityPub/Receiver.php
index 7e8ba6fe01..94233c8a89 100644
--- a/src/Protocol/ActivityPub/Receiver.php
+++ b/src/Protocol/ActivityPub/Receiver.php
@@ -2074,6 +2074,11 @@ class Receiver
 			$object_data['attachments'] = array_merge($object_data['attachments'], self::processAttachmentUrls($object['as:url'] ?? []));
 		}
 
+		$object_data['can-comment'] = JsonLD::fetchElement($object, 'pt:commentsEnabled', '@value');
+		if (is_null($object_data['can-comment'])) {
+			$object_data['can-comment'] = JsonLD::fetchElement($object, 'pixelfed:commentsEnabled', '@value');
+		}
+
 		// Support for quoted posts (Pleroma, Fedibird and Misskey)
 		$object_data['quote-url'] = JsonLD::fetchElement($object, 'as:quoteUrl', '@value');
 		if (empty($object_data['quote-url'])) {
-- 
2.39.5