summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThibG <thib@sitedethib.com>2018-05-12 16:48:32 +0200
committerEugen Rochko <eugen@zeonfederated.com>2018-05-12 16:48:32 +0200
commit7467361d706e38aa53b6bd2fcb919153327175ed (patch)
treee08c62ee1b6695f7c22fe9f337d5a7c1592398ed
parentf9afd06221baf7f635b346dfbe350652ba6ffbd0 (diff)
Fetch boosted statuses on behalf of a follower (fixes #7426) (#7459)
When an ActivityPub Announce is processed and the boosted toot is not known, fetch it on behalf of one of the booster's followers. This is to allow fetching self-boosts of previously-unknown private toots. If fetching on behalf of a user fails, try fetching it anonymously: the selected follower of a boosting user may be banned by the boosted toot's author.
-rw-r--r--app/helpers/jsonld_helper.rb15
-rw-r--r--app/lib/activitypub/activity/announce.rb2
-rw-r--r--app/services/activitypub/fetch_remote_status_service.rb4
3 files changed, 13 insertions, 8 deletions
diff --git a/app/helpers/jsonld_helper.rb b/app/helpers/jsonld_helper.rb
index e9056166c10..9d2b6cf00d2 100644
--- a/app/helpers/jsonld_helper.rb
+++ b/app/helpers/jsonld_helper.rb
@@ -52,18 +52,22 @@ module JsonLdHelper
graph.dump(:normalize)
end
- def fetch_resource(uri, id)
+ def fetch_resource(uri, id, on_behalf_of = nil)
unless id
- json = fetch_resource_without_id_validation(uri)
+ json = fetch_resource_without_id_validation(uri, on_behalf_of)
return unless json
uri = json['id']
end
- json = fetch_resource_without_id_validation(uri)
+ json = fetch_resource_without_id_validation(uri, on_behalf_of)
json.present? && json['id'] == uri ? json : nil
end
- def fetch_resource_without_id_validation(uri)
+ def fetch_resource_without_id_validation(uri, on_behalf_of = nil)
+ build_request(uri, on_behalf_of).perform do |response|
+ return body_to_json(response.body_with_limit) if response.code == 200
+ end
+ # If request failed, retry without doing it on behalf of a user
build_request(uri).perform do |response|
response.code == 200 ? body_to_json(response.body_with_limit) : nil
end
@@ -85,8 +89,9 @@ module JsonLdHelper
private
- def build_request(uri)
+ def build_request(uri, on_behalf_of = nil)
request = Request.new(:get, uri)
+ request.on_behalf_of(on_behalf_of) if on_behalf_of
request.add_headers('Accept' => 'application/activity+json, application/ld+json')
request
end
diff --git a/app/lib/activitypub/activity/announce.rb b/app/lib/activitypub/activity/announce.rb
index 7e146ea8c43..f810c88a27a 100644
--- a/app/lib/activitypub/activity/announce.rb
+++ b/app/lib/activitypub/activity/announce.rb
@@ -30,7 +30,7 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity
if object_uri.start_with?('http')
return if ActivityPub::TagManager.instance.local_uri?(object_uri)
- ActivityPub::FetchRemoteStatusService.new.call(object_uri, id: true)
+ ActivityPub::FetchRemoteStatusService.new.call(object_uri, id: true, on_behalf_of: @account.followers.local.first)
elsif @object['url'].present?
::FetchRemoteStatusService.new.call(@object['url'])
end
diff --git a/app/services/activitypub/fetch_remote_status_service.rb b/app/services/activitypub/fetch_remote_status_service.rb
index b6c00a9e7e2..2b447abb32e 100644
--- a/app/services/activitypub/fetch_remote_status_service.rb
+++ b/app/services/activitypub/fetch_remote_status_service.rb
@@ -4,9 +4,9 @@ class ActivityPub::FetchRemoteStatusService < BaseService
include JsonLdHelper
# Should be called when uri has already been checked for locality
- def call(uri, id: true, prefetched_body: nil)
+ def call(uri, id: true, prefetched_body: nil, on_behalf_of: nil)
@json = if prefetched_body.nil?
- fetch_resource(uri, id)
+ fetch_resource(uri, id, on_behalf_of)
else
body_to_json(prefetched_body)
end