From dd6db1f33778e43fb6eeedfb4ad407bd37d99a41 Mon Sep 17 00:00:00 2001 From: KMY Date: Mon, 23 Oct 2023 09:11:45 +0900 Subject: [PATCH] =?UTF-8?q?Fix:=20#172=20=E4=BB=96=E3=81=AE=E3=82=B5?= =?UTF-8?q?=E3=83=BC=E3=83=90=E3=83=BC=E3=81=8B=E3=82=89=E3=81=AE=E7=9B=B8?= =?UTF-8?q?=E4=B9=97=E3=82=8A=E7=B5=B5=E6=96=87=E5=AD=97=E5=89=8A=E9=99=A4?= =?UTF-8?q?=E3=81=8C=E5=8F=8D=E6=98=A0=E3=81=95=E3=82=8C=E3=81=AA=E3=81=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/lib/activitypub/activity/undo.rb | 7 ++- spec/lib/activitypub/activity/undo_spec.rb | 60 ++++++++++++++++++++-- 2 files changed, 62 insertions(+), 5 deletions(-) diff --git a/app/lib/activitypub/activity/undo.rb b/app/lib/activitypub/activity/undo.rb index eac34efdc9..f99d949c39 100644 --- a/app/lib/activitypub/activity/undo.rb +++ b/app/lib/activitypub/activity/undo.rb @@ -135,7 +135,12 @@ class ActivityPub::Activity::Undo < ActivityPub::Activity 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 diff --git a/spec/lib/activitypub/activity/undo_spec.rb b/spec/lib/activitypub/activity/undo_spec.rb index feda725654..cd12c5bd0c 100644 --- a/spec/lib/activitypub/activity/undo_spec.rb +++ b/spec/lib/activitypub/activity/undo_spec.rb @@ -5,7 +5,8 @@ require 'rails_helper' 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 { @@ -218,6 +219,8 @@ RSpec.describe ActivityPub::Activity::Undo do let(:status) { Fabricate(:status) } let(:content) { '😀' } + let(:name) { '😀' } + let(:tag) { nil } let(:object_json) do { id: 'bar', @@ -225,20 +228,69 @@ RSpec.describe ActivityPub::Activity::Undo do 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: content) + Fabricate(:emoji_reaction, account: sender, status: status, name: name, custom_emoji: custom_emoji) end it 'delete emoji reaction' do subject.perform - reaction = EmojiReaction.find_by(account: sender, status: status) - expect(reaction).to be_nil + 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