From 74a90a5c283dd0ad00e1fd93a7d57ac468e86905 Mon Sep 17 00:00:00 2001 From: KMY Date: Mon, 1 May 2023 15:27:52 +0900 Subject: [PATCH 1/8] Change locale hint --- config/locales/simple_form.ja.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml index bb213f08e4..e9345e42da 100644 --- a/config/locales/simple_form.ja.yml +++ b/config/locales/simple_form.ja.yml @@ -63,7 +63,7 @@ ja: setting_display_media_expand: Misskeyなどは4個を超えて投稿可能です。その追加分を最大8個まで表示します。kmyblueからアップロードはできません setting_noindex: 公開プロフィールおよび各投稿ページに影響します setting_public_post_to_unlisted: 未対応のサードパーティアプリからもローカル公開で投稿できますが、公開投稿はWeb以外できなくなります - setting_reject_unlisted_subscription: Misskeyやそのフォーク(Calckeyなど)は、フォローしていないアカウントの「未収載」投稿を **購読・検索** することができます。これはMastodonにおける「未収載」投稿の基本的な考え方、扱い方と矛盾します。そのようなサーバーのうち管理人が指定したものに、指定した公開範囲の投稿を「フォロワーのみ」として配送します。ただし構造上、完璧な対応は困難でたまに未収載として配信されること、ご理解ください + setting_reject_unlisted_subscription: Misskeyやそのフォーク(Calckeyなど)は、フォローしていないアカウントの「未収載」投稿を **購読・検索** することができます。これはkmyblueの挙動と異なります。そのようなサーバーのうち管理人が指定したものに、指定した公開範囲の投稿を「フォロワーのみ」として配送します。ただし構造上、完璧な対応は困難でたまに未収載として配信されること、ご理解ください setting_show_application: 投稿するのに使用したアプリが投稿の詳細ビューに表示されるようになります setting_use_blurhash: ぼかしはメディアの色を元に生成されますが、細部は見えにくくなっています setting_use_pending_items: 新着があってもタイムラインを自動的にスクロールしないようにします From 7330e929aa0be5a1fd23a7e15b591cc68a98e489 Mon Sep 17 00:00:00 2001 From: KMY Date: Mon, 1 May 2023 21:37:39 +0900 Subject: [PATCH 2/8] Fix send misskey removing statuses --- app/services/remove_status_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/remove_status_service.rb b/app/services/remove_status_service.rb index 45cfb75f47..16d8f48738 100644 --- a/app/services/remove_status_service.rb +++ b/app/services/remove_status_service.rb @@ -88,7 +88,7 @@ class RemoveStatusService < BaseService status_reach_finder = StatusReachFinder.new(@status, unsafe: true) - ActivityPub::DeliveryWorker.push_bulk(status_reach_finder.inboxes) do |inbox_url| + ActivityPub::DeliveryWorker.push_bulk(status_reach_finder.inboxes + status_reach_finder.inboxes_for_misskey) do |inbox_url| [signed_activity_json, @account.id, inbox_url] end end From c320f781dfbff686ffa276937adda911b3da6457 Mon Sep 17 00:00:00 2001 From: KMY Date: Mon, 1 May 2023 21:37:59 +0900 Subject: [PATCH 3/8] Refactoring to get misskey domains when send status --- app/lib/status_reach_finder.rb | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/app/lib/status_reach_finder.rb b/app/lib/status_reach_finder.rb index 5d972ebcd4..c198243a35 100644 --- a/app/lib/status_reach_finder.rb +++ b/app/lib/status_reach_finder.rb @@ -14,7 +14,11 @@ class StatusReachFinder end def inboxes_for_misskey - (reached_account_inboxes_for_misskey + followers_inboxes_for_misskey).uniq + if banned_domains_for_misskey.empty? + [] + else + (reached_account_inboxes_for_misskey + followers_inboxes_for_misskey).uniq + end end private @@ -121,26 +125,30 @@ class StatusReachFinder domains = banned_domains_of_status(@status) domains = domains + banned_domains_of_status(@status.reblog) if @status.reblog? && @status.reblog.local? - return @banned_domains = domains.uniq + return @banned_domains = domains.uniq + banned_domains_for_misskey end def banned_domains_of_status(status) - blocks = DomainBlock.where(domain: nil) unless status.account.user&.send_without_domain_blocks? + blocks = DomainBlock.where(domain: nil) blocks = blocks.or(DomainBlock.where(reject_send_not_public_searchability: true)) if status.compute_searchability != 'public' blocks = blocks.or(DomainBlock.where(reject_send_public_unlisted: true)) if status.public_unlisted_visibility? blocks = blocks.or(DomainBlock.where(reject_send_dissubscribable: true)) if status.account.dissubscribable blocks = blocks.or(DomainBlock.where(reject_send_media: true)) if status.with_media? blocks = blocks.or(DomainBlock.where(reject_send_sensitive: true)) if (status.with_media? && status.sensitive) || status.spoiler_text? + blocks.pluck(:domain).uniq + else + [] end - blocks = blocks.or(DomainBlock.where(detect_invalid_subscription: true)) if status.public_unlisted_visibility? && status.account.user&.reject_public_unlisted_subscription? - blocks = blocks.or(DomainBlock.where(detect_invalid_subscription: true)) if status.unlisted_visibility? && status.account.user&.reject_unlisted_subscription? - blocks.pluck(:domain).uniq end def banned_domains_for_misskey return @banned_domains_for_misskey if @banned_domains_for_misskey + if (!status.account.user&.reject_public_unlisted_subscription? && !status.account.user&.reject_unlisted_subscription?) || (!@status.public_unlisted_visibility? && !@status.unlisted_visibility?) + return @banned_domains_for_misskey = [] + end + domains = banned_domains_for_misskey_of_status(@status) domains = domains + banned_domains_for_misskey_of_status(@status.reblog) if @status.reblog? && @status.reblog.local? return @banned_domains_for_misskey = domains.uniq From b0234ec75bb96c751cd43c82155b52bc7e35b28e Mon Sep 17 00:00:00 2001 From: KMY Date: Tue, 2 May 2023 18:41:15 +0900 Subject: [PATCH 4/8] Add config page new section --- app/views/settings/preferences/other/show.html.haml | 2 ++ config/locales/en.yml | 1 + config/locales/ja.yml | 1 + 3 files changed, 4 insertions(+) diff --git a/app/views/settings/preferences/other/show.html.haml b/app/views/settings/preferences/other/show.html.haml index a0890b7185..12142a479a 100644 --- a/app/views/settings/preferences/other/show.html.haml +++ b/app/views/settings/preferences/other/show.html.haml @@ -34,6 +34,8 @@ .fields-group = f.input :setting_show_application, as: :boolean, wrapper: :with_label, recommended: true + %h4= t 'preferences.stop_deliver' + .fields-group = f.input :setting_send_without_domain_blocks, as: :boolean, wrapper: :with_label diff --git a/config/locales/en.yml b/config/locales/en.yml index c74cad58b3..7b987dea20 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1490,6 +1490,7 @@ en: other: Other posting_defaults: Posting defaults public_timelines: Public timelines + stop_deliver: Stop delivering privacy_policy: title: Privacy Policy reactions: diff --git a/config/locales/ja.yml b/config/locales/ja.yml index e79ba26023..e7a7a09b2c 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -1474,6 +1474,7 @@ ja: other: その他 posting_defaults: デフォルトの投稿設定 public_timelines: 公開タイムライン + stop_deliver: 配送停止 privacy_policy: title: プライバシーポリシー reactions: From 828fdba282109c8f7995664ebb8214e94ec2286b Mon Sep 17 00:00:00 2001 From: KMY Date: Tue, 2 May 2023 18:41:37 +0900 Subject: [PATCH 5/8] Fix distribution error --- app/lib/status_reach_finder.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/lib/status_reach_finder.rb b/app/lib/status_reach_finder.rb index c198243a35..165de2d0b1 100644 --- a/app/lib/status_reach_finder.rb +++ b/app/lib/status_reach_finder.rb @@ -145,7 +145,7 @@ class StatusReachFinder def banned_domains_for_misskey return @banned_domains_for_misskey if @banned_domains_for_misskey - if (!status.account.user&.reject_public_unlisted_subscription? && !status.account.user&.reject_unlisted_subscription?) || (!@status.public_unlisted_visibility? && !@status.unlisted_visibility?) + if (!@status.account.user&.reject_public_unlisted_subscription? && !@status.account.user&.reject_unlisted_subscription?) || (!@status.public_unlisted_visibility? && !@status.unlisted_visibility?) return @banned_domains_for_misskey = [] end From 239687820b3fdc59fb69ccad6b4c81d0ca325d0a Mon Sep 17 00:00:00 2001 From: KMY Date: Tue, 2 May 2023 18:41:47 +0900 Subject: [PATCH 6/8] Fix rejecting reply from remote --- app/lib/activitypub/activity/create.rb | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index f53c0f06b6..c36e7edb8b 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -46,6 +46,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity def create_status return reject_payload! if unsupported_object_type? || invalid_origin?(object_uri) || tombstone_exists? || !related_to_local_activity? + return reject_payload! if (reply_to_local? || reply_to_local_account?) && reject_reply_to_local? with_lock("create:#{object_uri}") do return if delete_arrived_first?(object_uri) || poll_vote? @@ -136,7 +137,13 @@ class ActivityPub::Activity::Create < ActivityPub::Activity } end - def process_audience + def reply_to_local_account? + accounts_in_audience.any? { |account| account.local? } + end + + def accounts_in_audience + return @accounts_in_audience if @accounts_in_audience + # Unlike with tags, there is no point in resolving accounts we don't already # know here, because silent mentions would only be used for local access control anyway accounts_in_audience = (audience_to + audience_cc).uniq.filter_map do |audience| @@ -150,6 +157,10 @@ class ActivityPub::Activity::Create < ActivityPub::Activity accounts_in_audience.uniq! end + return @accounts_in_audience = accounts_in_audience + end + + def process_audience accounts_in_audience.each do |account| # This runs after tags are processed, and those translate into non-silent # mentions, which take precedence From 50118163f754bdedffd3c4e302dfbb69f9d4a6ce Mon Sep 17 00:00:00 2001 From: KMY Date: Tue, 2 May 2023 20:21:35 +0900 Subject: [PATCH 7/8] Fix antenna sql --- app/services/fan_out_on_write_service.rb | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/app/services/fan_out_on_write_service.rb b/app/services/fan_out_on_write_service.rb index 4d1e604efc..0172d6fa43 100644 --- a/app/services/fan_out_on_write_service.rb +++ b/app/services/fan_out_on_write_service.rb @@ -122,12 +122,17 @@ class FanOutOnWriteService < BaseService domain = @account.domain || Rails.configuration.x.local_domain antennas = Antenna.availables - antennas = antennas.left_joins(:antenna_accounts).where(any_accounts: true).or(Antenna.availables.left_joins(:antenna_accounts) .where(antenna_accounts: { exclude: false, account: @account })) - antennas = antennas.left_joins(:antenna_domains) .where(any_domains: true) .or(Antenna.availables.left_joins(:antenna_accounts).left_joins(:antenna_domains) .where(antenna_domains: { exclude: false, name: domain })) - antennas = antennas.left_joins(:antenna_tags) .where(any_tags: true) .or(Antenna.availables.left_joins(:antenna_accounts).left_joins(:antenna_domains).left_joins(:antenna_tags).where(antenna_tags: { exclude: false, tag: @status.tags })) - antennas = antennas.where(account: @account.followers) if @status.visibility.to_sym == :unlisted + antennas = antennas.left_joins(:antenna_domains).where(any_domains: true).or(Antenna.left_joins(:antenna_domains).where(antenna_domains: { name: domain })) antennas = antennas.where(with_media_only: false) if !@status.with_media? antennas = antennas.where.not(account: @account.blocking) + + antennas = Antenna.where(id: antennas.select(:id)) + antennas = antennas.left_joins(:antenna_accounts).where(any_accounts: true).or(Antenna.left_joins(:antenna_accounts).where(antenna_accounts: { account: @account })) + + tag_ids = @status.tags.pluck(:id) + antennas = Antenna.where(id: antennas.select(:id)) + antennas = antennas.left_joins(:antenna_tags).where(any_tags: true).or(Antenna.left_joins(:antenna_tags).where(antenna_tags: { tag_id: tag_ids })) + antennas.in_batches do |ans| ans.each do |antenna| next if !antenna.enabled? From 7b82dbe135ae279ac11811fa03efdb29e3c55f76 Mon Sep 17 00:00:00 2001 From: KMY Date: Wed, 3 May 2023 13:20:53 +0900 Subject: [PATCH 8/8] Reverse distribution order --- app/workers/activitypub/raw_distribution_worker.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/workers/activitypub/raw_distribution_worker.rb b/app/workers/activitypub/raw_distribution_worker.rb index 41760aa443..53d1152c2e 100644 --- a/app/workers/activitypub/raw_distribution_worker.rb +++ b/app/workers/activitypub/raw_distribution_worker.rb @@ -23,17 +23,17 @@ class ActivityPub::RawDistributionWorker protected def distribute! - unless inboxes.empty? - ActivityPub::DeliveryWorker.push_bulk(inboxes) do |inbox_url| - [payload, source_account_id, inbox_url, options] - end - end - unless inboxes_for_misskey.empty? ActivityPub::DeliveryWorker.push_bulk(inboxes_for_misskey) do |inbox_url| [payload_for_misskey, source_account_id, inbox_url, options] end end + + unless inboxes.empty? + ActivityPub::DeliveryWorker.push_bulk(inboxes) do |inbox_url| + [payload, source_account_id, inbox_url, options] + end + end end def payload