Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bump version to 5.7 LTS #171

Merged
merged 5 commits into from
Oct 25, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 16 additions & 1 deletion app/lib/activitypub/activity/like.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
class ActivityPub::Activity::Like < ActivityPub::Activity
include Redisable
include Lockable
include JsonLdHelper

def perform
@original_status = status_from_uri(object_uri)
Expand Down Expand Up @@ -93,7 +94,7 @@ def process_emoji(tag)

return if custom_emoji_parser.shortcode.blank? || custom_emoji_parser.image_remote_url.blank?

domain = tag['domain'] || URI.split(custom_emoji_parser.uri)[2] || @account.domain
domain = URI.split(custom_emoji_parser.uri)[2] || @account.domain

if domain == Rails.configuration.x.local_domain || domain == Rails.configuration.x.web_domain
# Block overwriting remote-but-local data
Expand All @@ -109,6 +110,9 @@ def process_emoji(tag)
(custom_emoji_parser.updated_at && custom_emoji_parser.updated_at >= emoji.updated_at) ||
custom_emoji_parser.license != emoji.license

custom_emoji_parser = original_emoji_parser(custom_emoji_parser) if @account.domain != domain
return if custom_emoji_parser.nil?

begin
emoji ||= CustomEmoji.new(
domain: domain,
Expand All @@ -126,6 +130,17 @@ def process_emoji(tag)
emoji
end

def original_emoji_parser(custom_emoji_parser)
uri = custom_emoji_parser.uri
emoji = fetch_resource_without_id_validation(uri)
return nil unless emoji

parser = ActivityPub::Parser::CustomEmojiParser.new(emoji)
return nil unless parser.uri == uri && custom_emoji_parser.shortcode == parser.shortcode

parser
end

def skip_download?(domain)
DomainBlock.reject_media?(domain)
end
Expand Down
7 changes: 6 additions & 1 deletion app/lib/activitypub/activity/undo.rb
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,12 @@ def undo_like
if shortcode.present?
emoji_tag = @object['tag'].is_a?(Array) ? @object['tag']&.first : @object['tag']

emoji = CustomEmoji.find_by(shortcode: shortcode, domain: @account.domain) if emoji_tag.present? && emoji_tag['id'].present?
emoji = nil
if emoji_tag.present? && emoji_tag['id'].present?
domain = URI.split(emoji_tag['id'])[2]
domain = nil if domain == Rails.configuration.x.local_domain || domain == Rails.configuration.x.web_domain
emoji = CustomEmoji.find_by(shortcode: shortcode, domain: domain) if emoji_tag.present? && emoji_tag['id'].present?
end

emoji_reaction = @original_status.emoji_reactions.where(account: @account, name: shortcode, custom_emoji: emoji).first

Expand Down
1 change: 1 addition & 0 deletions app/models/account.rb
Original file line number Diff line number Diff line change
Expand Up @@ -392,6 +392,7 @@ def show_emoji_reaction?(account)

def allow_emoji_reaction?(account)
return false if account.nil?
return true unless local? || account.local?

show_emoji_reaction?(account)
end
Expand Down
12 changes: 10 additions & 2 deletions app/models/concerns/account_interactions.rb
Original file line number Diff line number Diff line change
Expand Up @@ -247,8 +247,16 @@ def favourited?(status)
status.proper.favourites.where(account: self).exists?
end

def emoji_reactioned?(status)
status.proper.emoji_reactions.where(account: self).exists?
def emoji_reacted?(status, shortcode = nil, domain = nil, domain_force = false) # rubocop:disable Style/OptionalBooleanParameter
if shortcode.present?
if domain.present? || domain_force
status.proper.emoji_reactions.joins(:custom_emoji).where(account: self, name: shortcode, custom_emoji: { domain: domain }).exists?
else
status.proper.emoji_reactions.where(account: self, name: shortcode).exists?
end
else
status.proper.emoji_reactions.where(account: self).exists?
end
end

def bookmarked?(status)
Expand Down
6 changes: 1 addition & 5 deletions app/serializers/activitypub/emoji_serializer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ class ActivityPub::EmojiSerializer < ActivityPub::Serializer

context_extensions :emoji

attributes :id, :type, :domain, :name, :is_sensitive, :updated
attributes :id, :type, :name, :is_sensitive, :updated

attribute :license, if: -> { object.license.present? }

Expand All @@ -19,10 +19,6 @@ def type
'Emoji'
end

def domain
object.domain.presence || Rails.configuration.x.local_domain
end

def icon
object.image
end
Expand Down
2 changes: 1 addition & 1 deletion lib/mastodon/version.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ def kmyblue_major
end

def kmyblue_minor
6
7
end

def kmyblue_flag
Expand Down
120 changes: 116 additions & 4 deletions spec/lib/activitypub/activity/like_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,28 @@
object: ActivityPub::TagManager.instance.uri_for(status),
}.with_indifferent_access
end
let(:original_emoji) do
{
id: 'https://example.com/aaa',
type: 'Emoji',
icon: {
url: 'http://example.com/emoji.png',
},
name: 'tinking',
license: 'This is ohagi',
}
end
let(:original_invalid_emoji) do
{
id: 'https://example.com/invalid',
type: 'Emoji',
icon: {
url: 'http://example.com/emoji.png',
},
name: 'other',
license: 'This is other ohagi',
}
end

describe '#perform' do
subject { described_class.new(json, sender) }
Expand All @@ -37,6 +59,9 @@

before do
stub_request(:get, 'http://example.com/emoji.png').to_return(body: attachment_fixture('emojo.png'))
stub_request(:get, 'http://foo.bar/emoji2.png').to_return(body: attachment_fixture('emojo.png'))
stub_request(:get, 'https://example.com/aaa').to_return(status: 200, body: Oj.dump(original_emoji))
stub_request(:get, 'https://example.com/invalid').to_return(status: 200, body: Oj.dump(original_invalid_emoji))
end

let(:json) do
Expand Down Expand Up @@ -122,31 +147,111 @@
end
end

context 'with custom emoji and custom domain' do
context 'with custom emoji from non-original server account' do
let(:content) { ':tinking:' }
let(:tag) do
{
id: 'https://example.com/aaa',
type: 'Emoji',
domain: 'post.kmycode.net',
icon: {
url: 'http://example.com/emoji.png',
},
name: 'tinking',
}
end

before do
sender.update(domain: 'ohagi.com')
Fabricate(:custom_emoji, domain: 'example.com', uri: 'https://example.com/aaa', shortcode: 'tinking')
end

it 'create emoji reaction' do
expect(subject.count).to eq 1
expect(subject.first.name).to eq 'tinking'
expect(subject.first.account).to eq sender
expect(subject.first.custom_emoji).to_not be_nil
expect(subject.first.custom_emoji.shortcode).to eq 'tinking'
expect(subject.first.custom_emoji.domain).to eq 'post.kmycode.net'
expect(subject.first.custom_emoji.domain).to eq 'example.com'
expect(sender.favourited?(status)).to be false
end
end

context 'with custom emoji and update license from non-original server account' do
let(:content) { ':tinking:' }
let(:tag) do
{
id: 'https://example.com/aaa',
type: 'Emoji',
icon: {
url: 'http://example.com/emoji.png',
},
name: 'tinking',
license: 'Old license',
}
end

before do
sender.update(domain: 'ohagi.com')
Fabricate(:custom_emoji, domain: 'example.com', uri: 'https://example.com/aaa', shortcode: 'tinking')
end

it 'create emoji reaction' do
expect(subject.count).to eq 1
expect(subject.first.custom_emoji.license).to eq 'This is ohagi'
expect(sender.favourited?(status)).to be false
end
end

context 'with custom emoji but icon url is not valid' do
let(:content) { ':tinking:' }
let(:tag) do
{
id: 'https://example.com/aaa',
type: 'Emoji',
icon: {
url: 'http://foo.bar/emoji.png',
},
name: 'tinking',
license: 'Good for using darwin',
}
end

before do
sender.update(domain: 'ohagi.com')
Fabricate(:custom_emoji, domain: 'example.com', uri: 'https://example.com/aaa', shortcode: 'tinking', image_remote_url: 'http://example.com/emoji.png')
end

it 'create emoji reaction' do
expect(subject.count).to eq 1
expect(subject.first.custom_emoji.reload.license).to eq 'This is ohagi'
expect(subject.first.custom_emoji.image_remote_url).to eq 'http://example.com/emoji.png'
end
end

context 'with custom emoji but uri is not valid' do
let(:content) { ':tinking:' }
let(:tag) do
{
id: 'https://example.com/invalid',
type: 'Emoji',
icon: {
url: 'http://foo.bar/emoji2.png',
},
name: 'tinking',
license: 'Good for using darwin',
}
end

before do
sender.update(domain: 'ohagi.com')
Fabricate(:custom_emoji, domain: 'example.com', uri: 'https://example.com/aaa', shortcode: 'tinking', image_remote_url: 'http://example.com/emoji.png')
end

it 'create emoji reaction' do
expect(subject.count).to eq 0
end
end

context 'with custom emoji but invalid id' do
let(:content) { ':tinking:' }
let(:tag) do
Expand Down Expand Up @@ -175,13 +280,14 @@
let(:content) { ':tinking:' }
let(:tag) do
{
id: 'aaa',
id: 'https://cb6e6126.ngrok.io/aaa',
type: 'Emoji',
domain: Rails.configuration.x.local_domain,
icon: {
url: 'http://example.com/emoji.png',
},
name: 'tinking',
license: 'Ohagi but everyone',
}
end

Expand All @@ -196,8 +302,14 @@
expect(subject.first.custom_emoji).to_not be_nil
expect(subject.first.custom_emoji.shortcode).to eq 'tinking'
expect(subject.first.custom_emoji.domain).to be_nil
expect(subject.first.custom_emoji.license).to eq 'Everyone but Ohagi'
expect(sender.favourited?(status)).to be false
end

it 'not change license' do
expect(subject.first.custom_emoji.reload.license).to eq 'Everyone but Ohagi'
expect(subject.first.custom_emoji.reload.uri).to be_nil
end
end

context 'with unicode emoji and reject_media enabled' do
Expand Down
81 changes: 80 additions & 1 deletion spec/lib/activitypub/activity/undo_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
RSpec.describe ActivityPub::Activity::Undo do
subject { described_class.new(json, sender) }

let(:sender) { Fabricate(:account, domain: 'example.com') }
let(:sender_domain) { 'example.com' }
let(:sender) { Fabricate(:account, domain: sender_domain) }

let(:json) do
{
Expand Down Expand Up @@ -176,5 +177,83 @@
expect(sender.favourited?(status)).to be false
end
end

context 'with EmojiReact' do
let(:status) { Fabricate(:status) }

let(:content) { '😀' }
let(:name) { '😀' }
let(:tag) { nil }
let(:object_json) do
{
id: 'bar',
type: 'Like',
actor: ActivityPub::TagManager.instance.uri_for(sender),
object: ActivityPub::TagManager.instance.uri_for(status),
content: content,
tag: tag,
}
end
let(:custom_emoji) { nil }

before do
Fabricate(:favourite, account: sender, status: status)
Fabricate(:emoji_reaction, account: sender, status: status, name: name, custom_emoji: custom_emoji)
end

it 'delete emoji reaction' do
subject.perform
expect(sender.emoji_reacted?(status)).to be false
expect(sender.favourited?(status)).to be true
end

context 'with custom emoji' do
let(:content) { ':tinking:' }
let(:name) { 'tinking' }
let(:tag) do
{
id: custom_emoji_uri,
type: 'Emoji',
icon: {
url: 'http://example.com/emoji.png',
},
name: name,
}
end
let(:custom_emoji_domain) { 'example.com' }
let(:custom_emoji_uri) { "https://#{custom_emoji_domain}/aaa" }
let(:custom_emoji) { Fabricate(:custom_emoji, uri: custom_emoji_uri, domain: custom_emoji_domain, shortcode: name) }

it 'delete emoji reaction' do
subject.perform
expect(sender.emoji_reacted?(status)).to be false
expect(sender.favourited?(status)).to be true
end

context 'when third server' do
let(:sender_domain) { 'foo.bar' }

it 'delete emoji reaction' do
subject.perform
expect(sender.emoji_reacted?(status)).to be false
expect(sender.favourited?(status)).to be true
end
end

context 'when local' do
let(:custom_emoji_domain) { 'cb6e6126.ngrok.io' }

before do
custom_emoji.update(domain: nil, uri: nil)
end

it 'delete emoji reaction' do
subject.perform
expect(sender.emoji_reacted?(status)).to be false
expect(sender.favourited?(status)).to be true
end
end
end
end
end
end
Loading