summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThibG <thib@sitedethib.com>2020-08-24 14:11:47 +0200
committerEugen Rochko <eugen@zeonfederated.com>2020-10-19 15:40:42 +0200
commitaea0161e83ba0d154a3b3824e4d14d31773486b0 (patch)
treef0bd8a647234a5f4ee057dcf62ac1fdf101a0518
parent8b448aecef9495353a1cd18d9e5d95b576cdede2 (diff)
Add support for inlined objects in activity audience (#14514)
* Add support for inlined objects in activity audience * Add tests
-rw-r--r--app/lib/activitypub/activity.rb2
-rw-r--r--app/lib/activitypub/activity/announce.rb14
-rw-r--r--app/lib/activitypub/activity/create.rb16
-rw-r--r--spec/lib/activitypub/activity/announce_spec.rb20
-rw-r--r--spec/lib/activitypub/activity/create_spec.rb22
5 files changed, 62 insertions, 12 deletions
diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb
index ab946470b9f..f0ef4d553d8 100644
--- a/app/lib/activitypub/activity.rb
+++ b/app/lib/activitypub/activity.rb
@@ -172,7 +172,7 @@ class ActivityPub::Activity
end
def first_mentioned_local_account
- audience = (as_array(@json['to']) + as_array(@json['cc'])).uniq
+ audience = (as_array(@json['to']) + as_array(@json['cc'])).map { |x| value_or_id(x) }.uniq
local_usernames = audience.select { |uri| ActivityPub::TagManager.instance.local_uri?(uri) }
.map { |uri| ActivityPub::TagManager.instance.uri_to_local_id(uri, :username) }
diff --git a/app/lib/activitypub/activity/announce.rb b/app/lib/activitypub/activity/announce.rb
index 9e108985a3e..349e8f77e71 100644
--- a/app/lib/activitypub/activity/announce.rb
+++ b/app/lib/activitypub/activity/announce.rb
@@ -34,12 +34,20 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity
private
+ def audience_to
+ as_array(@json['to']).map { |x| value_or_id(x) }
+ end
+
+ def audience_cc
+ as_array(@json['cc']).map { |x| value_or_id(x) }
+ end
+
def visibility_from_audience
- if equals_or_includes?(@json['to'], ActivityPub::TagManager::COLLECTIONS[:public])
+ if audience_to.include?(ActivityPub::TagManager::COLLECTIONS[:public])
:public
- elsif equals_or_includes?(@json['cc'], ActivityPub::TagManager::COLLECTIONS[:public])
+ elsif audience_cc.include?(ActivityPub::TagManager::COLLECTIONS[:public])
:unlisted
- elsif equals_or_includes?(@json['to'], @account.followers_url)
+ elsif audience_to.include?(@account.followers_url)
:private
else
:direct
diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb
index 08dd98e942d..a60b79d159d 100644
--- a/app/lib/activitypub/activity/create.rb
+++ b/app/lib/activitypub/activity/create.rb
@@ -65,11 +65,11 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
end
def audience_to
- @object['to'] || @json['to']
+ as_array(@object['to'] || @json['to']).map { |x| value_or_id(x) }
end
def audience_cc
- @object['cc'] || @json['cc']
+ as_array(@object['cc'] || @json['cc']).map { |x| value_or_id(x) }
end
def process_status
@@ -122,7 +122,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
end
def process_audience
- (as_array(audience_to) + as_array(audience_cc)).uniq.each do |audience|
+ (audience_to + audience_cc).uniq.each do |audience|
next if audience == ActivityPub::TagManager::COLLECTIONS[:public]
# Unlike with tags, there is no point in resolving accounts we don't already
@@ -352,11 +352,11 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
end
def visibility_from_audience
- if equals_or_includes?(audience_to, ActivityPub::TagManager::COLLECTIONS[:public])
+ if audience_to.include?(ActivityPub::TagManager::COLLECTIONS[:public])
:public
- elsif equals_or_includes?(audience_cc, ActivityPub::TagManager::COLLECTIONS[:public])
+ elsif audience_cc.include?(ActivityPub::TagManager::COLLECTIONS[:public])
:unlisted
- elsif equals_or_includes?(audience_to, @account.followers_url)
+ elsif audience_to.include?(@account.followers_url)
:private
else
:direct
@@ -365,7 +365,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
def audience_includes?(account)
uri = ActivityPub::TagManager.instance.uri_for(account)
- equals_or_includes?(audience_to, uri) || equals_or_includes?(audience_cc, uri)
+ audience_to.include?(uri) || audience_cc.include?(uri)
end
def replied_to_status
@@ -477,7 +477,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
def addresses_local_accounts?
return true if @options[:delivered_to_account_id]
- local_usernames = (as_array(audience_to) + as_array(audience_cc)).uniq.select { |uri| ActivityPub::TagManager.instance.local_uri?(uri) }.map { |uri| ActivityPub::TagManager.instance.uri_to_local_id(uri, :username) }
+ local_usernames = (audience_to + audience_cc).uniq.select { |uri| ActivityPub::TagManager.instance.local_uri?(uri) }.map { |uri| ActivityPub::TagManager.instance.uri_to_local_id(uri, :username) }
return false if local_usernames.empty?
diff --git a/spec/lib/activitypub/activity/announce_spec.rb b/spec/lib/activitypub/activity/announce_spec.rb
index 60fd96a18ac..b93fcbe6656 100644
--- a/spec/lib/activitypub/activity/announce_spec.rb
+++ b/spec/lib/activitypub/activity/announce_spec.rb
@@ -73,6 +73,26 @@ RSpec.describe ActivityPub::Activity::Announce do
expect(sender.reblogged?(sender.statuses.first)).to be true
end
end
+
+ context 'self-boost of a previously unknown status with correct attributedTo, inlined Collection in audience' do
+ let(:object_json) do
+ {
+ id: 'https://example.com/actor#bar',
+ type: 'Note',
+ content: 'Lorem ipsum',
+ attributedTo: 'https://example.com/actor',
+ to: {
+ 'type': 'OrderedCollection',
+ 'id': 'http://example.com/followers',
+ 'first': 'http://example.com/followers?page=true',
+ }
+ }
+ end
+
+ it 'creates a reblog by sender of status' do
+ expect(sender.reblogged?(sender.statuses.first)).to be true
+ end
+ end
end
context 'when the status belongs to a local user' do
diff --git a/spec/lib/activitypub/activity/create_spec.rb b/spec/lib/activitypub/activity/create_spec.rb
index 51e0b8caff9..d2e9fe33ce4 100644
--- a/spec/lib/activitypub/activity/create_spec.rb
+++ b/spec/lib/activitypub/activity/create_spec.rb
@@ -121,6 +121,28 @@ RSpec.describe ActivityPub::Activity::Create do
end
end
+ context 'private with inlined Collection in audience' do
+ let(:object_json) do
+ {
+ id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+ type: 'Note',
+ content: 'Lorem ipsum',
+ to: {
+ 'type': 'OrderedCollection',
+ 'id': 'http://example.com/followers',
+ 'first': 'http://example.com/followers?page=true',
+ }
+ }
+ end
+
+ it 'creates status' do
+ status = sender.statuses.first
+
+ expect(status).to_not be_nil
+ expect(status.visibility).to eq 'private'
+ end
+ end
+
context 'limited' do
let(:recipient) { Fabricate(:account) }