commit: 81c1303cd6137c8c90794cc0bfdc1a0479eb2153
parent: 4b8e4dca26666c7c0709bf5aa765764023da3bdf
Author: Eugen Rochko <eugen@zeonfederated.com>
Date: Thu, 10 Aug 2017 22:33:12 +0200
Handle ActivityPub follows correctly (#4571)
* Handle ActivityPub follows correctly
ActivityPub follows are follow-requests. Always require an Accept.
If account is not locked, auto-accept.
* Handle ActivityPub Accept/Reject-Follow
* Fix wrong method
* Fix wrong class
Diffstat:
4 files changed, 62 insertions(+), 2 deletions(-)
diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb
@@ -39,6 +39,10 @@ class ActivityPub::Activity
ActivityPub::Activity::Update
when 'Undo'
ActivityPub::Activity::Undo
+ when 'Accept'
+ ActivityPub::Activity::Accept
+ when 'Reject'
+ ActivityPub::Activity::Reject
end
end
end
diff --git a/app/lib/activitypub/activity/accept.rb b/app/lib/activitypub/activity/accept.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+class ActivityPub::Activity::Accept < ActivityPub::Activity
+ def perform
+ case @object['type']
+ when 'Follow'
+ accept_follow
+ end
+ end
+
+ private
+
+ def accept_follow
+ target_account = account_from_uri(target_uri)
+
+ return if target_account.nil? || !target_account.local?
+
+ follow_request = FollowRequest.find_by(account: target_account, target_account: @account)
+ follow_request&.authorize!
+ end
+
+ def target_uri
+ @target_uri ||= @object['object'].is_a?(String) ? @object['object'] : @object['object']['id']
+ end
+end
diff --git a/app/lib/activitypub/activity/follow.rb b/app/lib/activitypub/activity/follow.rb
@@ -6,7 +6,13 @@ class ActivityPub::Activity::Follow < ActivityPub::Activity
return if target_account.nil? || !target_account.local? || delete_arrived_first?(@json['id'])
- follow = @account.follow!(target_account)
- NotifyService.new.call(target_account, follow)
+ follow_request = FollowRequest.create!(account: @account, target_account: target_account)
+
+ if target_account.locked?
+ NotifyService.new.call(target_account, follow_request)
+ else
+ AuthorizeFollowService.new.call(@account, target_account)
+ NotifyService.new.call(target_account, ::Follow.find_by(account: @account, target_account: target_account))
+ end
end
end
diff --git a/app/lib/activitypub/activity/reject.rb b/app/lib/activitypub/activity/reject.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+class ActivityPub::Activity::Reject < ActivityPub::Activity
+ def perform
+ case @object['type']
+ when 'Follow'
+ reject_follow
+ end
+ end
+
+ private
+
+ def reject_follow
+ target_account = account_from_uri(target_uri)
+
+ return if target_account.nil? || !target_account.local?
+
+ follow_request = FollowRequest.find_by(account: target_account, target_account: @account)
+ follow_request&.reject!
+ end
+
+ def target_uri
+ @target_uri ||= @object['object'].is_a?(String) ? @object['object'] : @object['object']['id']
+ end
+end