mirror of
https://github.com/glitch-soc/mastodon.git
synced 2026-03-29 03:00:33 +02:00
Merge pull request #3417 from ClearlyClaire/glitch-soc/merge-4.3
Merge upstream changes up to 9437cddda1 into stable-4.3
This commit is contained in:
10
CHANGELOG.md
10
CHANGELOG.md
@@ -2,6 +2,16 @@
|
|||||||
|
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
|
## [4.3.20] - 2026-02-24
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add `--suspended-only` option to `tootctl emoji purge` (#37828 and #37861 by @ClearlyClaire and @mjankowski)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix processing of object updates with duplicate hashtags (#37756 by @ClearlyClaire)
|
||||||
|
|
||||||
## [4.3.19] - 2026-02-03
|
## [4.3.19] - 2026-02-03
|
||||||
|
|
||||||
### Security
|
### Security
|
||||||
|
|||||||
@@ -194,7 +194,7 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
|
|||||||
Tag.find_or_create_by_names([tag]).filter(&:valid?)
|
Tag.find_or_create_by_names([tag]).filter(&:valid?)
|
||||||
rescue ActiveRecord::RecordInvalid
|
rescue ActiveRecord::RecordInvalid
|
||||||
[]
|
[]
|
||||||
end
|
end.uniq
|
||||||
|
|
||||||
return unless @status.distributable?
|
return unless @status.distributable?
|
||||||
|
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ services:
|
|||||||
web:
|
web:
|
||||||
# You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes
|
# You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes
|
||||||
# build: .
|
# build: .
|
||||||
image: ghcr.io/glitch-soc/mastodon:v4.3.19
|
image: ghcr.io/glitch-soc/mastodon:v4.3.20
|
||||||
restart: always
|
restart: always
|
||||||
env_file: .env.production
|
env_file: .env.production
|
||||||
command: bundle exec puma -C config/puma.rb
|
command: bundle exec puma -C config/puma.rb
|
||||||
@@ -83,7 +83,7 @@ services:
|
|||||||
# build:
|
# build:
|
||||||
# dockerfile: ./streaming/Dockerfile
|
# dockerfile: ./streaming/Dockerfile
|
||||||
# context: .
|
# context: .
|
||||||
image: ghcr.io/glitch-soc/mastodon-streaming:v4.3.19
|
image: ghcr.io/glitch-soc/mastodon-streaming:v4.3.20
|
||||||
restart: always
|
restart: always
|
||||||
env_file: .env.production
|
env_file: .env.production
|
||||||
command: node ./streaming/index.js
|
command: node ./streaming/index.js
|
||||||
@@ -102,7 +102,7 @@ services:
|
|||||||
sidekiq:
|
sidekiq:
|
||||||
# You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes
|
# You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes
|
||||||
# build: .
|
# build: .
|
||||||
image: ghcr.io/glitch-soc/mastodon:v4.3.19
|
image: ghcr.io/glitch-soc/mastodon:v4.3.20
|
||||||
restart: always
|
restart: always
|
||||||
env_file: .env.production
|
env_file: .env.production
|
||||||
command: bundle exec sidekiq
|
command: bundle exec sidekiq
|
||||||
|
|||||||
@@ -107,15 +107,27 @@ module Mastodon::CLI
|
|||||||
end
|
end
|
||||||
|
|
||||||
option :remote_only, type: :boolean
|
option :remote_only, type: :boolean
|
||||||
|
option :suspended_only, type: :boolean
|
||||||
desc 'purge', 'Remove all custom emoji'
|
desc 'purge', 'Remove all custom emoji'
|
||||||
long_desc <<-LONG_DESC
|
long_desc <<-LONG_DESC
|
||||||
Removes all custom emoji.
|
Removes all custom emoji.
|
||||||
|
|
||||||
With the --remote-only option, only remote emoji will be deleted.
|
With the --remote-only option, only remote emoji will be deleted.
|
||||||
|
|
||||||
|
With the --suspended-only option, only emoji from suspended servers will be deleted.
|
||||||
LONG_DESC
|
LONG_DESC
|
||||||
def purge
|
def purge
|
||||||
scope = options[:remote_only] ? CustomEmoji.remote : CustomEmoji
|
if options[:suspended_only]
|
||||||
scope.in_batches.destroy_all
|
DomainBlock.where(severity: :suspend).find_each do |domain_block|
|
||||||
|
CustomEmoji.by_domain_and_subdomains(domain_block.domain).find_in_batches do |custom_emojis|
|
||||||
|
AttachmentBatch.new(CustomEmoji, custom_emojis).delete
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
scope = options[:remote_only] ? CustomEmoji.remote : CustomEmoji
|
||||||
|
scope.in_batches.destroy_all
|
||||||
|
end
|
||||||
|
|
||||||
say('OK', :green)
|
say('OK', :green)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ module Mastodon
|
|||||||
end
|
end
|
||||||
|
|
||||||
def patch
|
def patch
|
||||||
19
|
20
|
||||||
end
|
end
|
||||||
|
|
||||||
def default_prerelease
|
def default_prerelease
|
||||||
|
|||||||
@@ -23,6 +23,36 @@ RSpec.describe Mastodon::CLI::Emoji do
|
|||||||
.to output_results('OK')
|
.to output_results('OK')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'with --suspended-only and existing custom emoji on blocked servers' do
|
||||||
|
let(:blocked_domain) { 'evil.com' }
|
||||||
|
let(:blocked_subdomain) { 'subdomain.evil.org' }
|
||||||
|
let(:blocked_domain_without_emoji) { 'blocked.com' }
|
||||||
|
let(:silenced_domain) { 'silenced.com' }
|
||||||
|
|
||||||
|
let(:options) { { suspended_only: true } }
|
||||||
|
|
||||||
|
before do
|
||||||
|
Fabricate(:custom_emoji)
|
||||||
|
Fabricate(:custom_emoji, domain: blocked_domain)
|
||||||
|
Fabricate(:custom_emoji, domain: blocked_subdomain)
|
||||||
|
Fabricate(:custom_emoji, domain: silenced_domain)
|
||||||
|
|
||||||
|
Fabricate(:domain_block, severity: :suspend, domain: blocked_domain)
|
||||||
|
Fabricate(:domain_block, severity: :suspend, domain: 'evil.org')
|
||||||
|
Fabricate(:domain_block, severity: :suspend, domain: blocked_domain_without_emoji)
|
||||||
|
Fabricate(:domain_block, severity: :silence, domain: silenced_domain)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'reports a successful purge' do
|
||||||
|
expect { subject }
|
||||||
|
.to output_results('OK')
|
||||||
|
.and change { CustomEmoji.by_domain_and_subdomains(blocked_domain).count }.to(0)
|
||||||
|
.and change { CustomEmoji.by_domain_and_subdomains('evil.org').count }.to(0)
|
||||||
|
.and not_change { CustomEmoji.by_domain_and_subdomains(silenced_domain).count }
|
||||||
|
.and(not_change { CustomEmoji.local.count })
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#import' do
|
describe '#import' do
|
||||||
|
|||||||
@@ -259,6 +259,8 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService do
|
|||||||
{ type: 'Hashtag', name: 'foo' },
|
{ type: 'Hashtag', name: 'foo' },
|
||||||
{ type: 'Hashtag', name: 'bar' },
|
{ type: 'Hashtag', name: 'bar' },
|
||||||
{ type: 'Hashtag', name: '#2024' },
|
{ type: 'Hashtag', name: '#2024' },
|
||||||
|
{ type: 'Hashtag', name: 'Foo Bar' },
|
||||||
|
{ type: 'Hashtag', name: 'FooBar' },
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
@@ -270,7 +272,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService do
|
|||||||
|
|
||||||
it 'updates tags and featured tags' do
|
it 'updates tags and featured tags' do
|
||||||
expect { subject.call(status, json, json) }
|
expect { subject.call(status, json, json) }
|
||||||
.to change { status.tags.reload.pluck(:name) }.from(%w(test foo)).to(%w(foo bar))
|
.to change { status.tags.reload.pluck(:name) }.from(contain_exactly('test', 'foo')).to(contain_exactly('foo', 'bar', 'foobar'))
|
||||||
.and change { status.account.featured_tags.find_by(name: 'test').statuses_count }.by(-1)
|
.and change { status.account.featured_tags.find_by(name: 'test').statuses_count }.by(-1)
|
||||||
.and change { status.account.featured_tags.find_by(name: 'bar').statuses_count }.by(1)
|
.and change { status.account.featured_tags.find_by(name: 'bar').statuses_count }.by(1)
|
||||||
.and change { status.account.featured_tags.find_by(name: 'bar').last_status_at }.from(nil).to(be_present)
|
.and change { status.account.featured_tags.find_by(name: 'bar').last_status_at }.from(nil).to(be_present)
|
||||||
|
|||||||
Reference in New Issue
Block a user