summaryrefslogtreecommitdiffstats
path: root/app/lib/activitypub/activity.rb
diff options
context:
space:
mode:
authorThibG <thib@sitedethib.com>2019-02-13 18:36:23 +0100
committerEugen Rochko <eugen@zeonfederated.com>2019-02-13 18:36:23 +0100
commit6a5307a5733e7872e7827f32b27111434e0307c4 (patch)
tree2980ccee1259a7a36b40ce86c3711eed676a0614 /app/lib/activitypub/activity.rb
parent169b9d4428d8e54d7bee365fd76be9a6e2a92da5 (diff)
Alternative handling of private self-boosts (#9998)
* When self-boosting, embed original toot into Announce serialization * Process unknown self-boosts from Announce object if it is more than an URI * Add some self-boost specs * Only serialize private toots in self-Announces
Diffstat (limited to 'app/lib/activitypub/activity.rb')
-rw-r--r--app/lib/activitypub/activity.rb32
1 files changed, 32 insertions, 0 deletions
diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb
index 919678618a3..7e4e195313a 100644
--- a/app/lib/activitypub/activity.rb
+++ b/app/lib/activitypub/activity.rb
@@ -4,6 +4,9 @@ class ActivityPub::Activity
include JsonLdHelper
include Redisable
+ SUPPORTED_TYPES = %w(Note).freeze
+ CONVERTED_TYPES = %w(Image Video Article Page).freeze
+
def initialize(json, account, **options)
@json = json
@account = account
@@ -71,6 +74,18 @@ class ActivityPub::Activity
@object_uri ||= value_or_id(@object)
end
+ def unsupported_object_type?
+ @object.is_a?(String) || !(supported_object_type? || converted_object_type?)
+ end
+
+ def supported_object_type?
+ equals_or_includes_any?(@object['type'], SUPPORTED_TYPES)
+ end
+
+ def converted_object_type?
+ equals_or_includes_any?(@object['type'], CONVERTED_TYPES)
+ end
+
def distribute(status)
crawl_links(status)
@@ -120,6 +135,23 @@ class ActivityPub::Activity
redis.setex("delete_upon_arrival:#{@account.id}:#{uri}", 6.hours.seconds, uri)
end
+ def status_from_object
+ # If the status is already known, return it
+ status = status_from_uri(object_uri)
+ return status unless status.nil?
+
+ # If the boosted toot is embedded and it is a self-boost, handle it like a Create
+ unless unsupported_object_type?
+ actor_id = value_or_id(first_of_value(@object['attributedTo'])) || @account.uri
+ if actor_id == @account.uri
+ return ActivityPub::Activity.factory({ 'type' => 'Create', 'actor' => actor_id, 'object' => @object }, @account).perform
+ end
+ end
+
+ # If the status is not from the actor, try to fetch it
+ return fetch_remote_original_status if value_or_id(first_of_value(@json['attributedTo'])) == @account.uri
+ end
+
def fetch_remote_original_status
if object_uri.start_with?('http')
return if ActivityPub::TagManager.instance.local_uri?(object_uri)