Compare commits
	
		
			4 Commits
		
	
	
		
			2b67d2abc1
			...
			b7258f6d06
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					b7258f6d06 | ||
| 
						 | 
					8965e1bfa9 | ||
| 
						 | 
					1e27ab0885 | ||
| 
						 | 
					cef2c50a71 | 
@@ -2,6 +2,14 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
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.4.7] - 2025-10-15
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Fix forwarder being called with `nil` status when quote post is soft-deleted (#36463 by @ClearlyClaire)
 | 
				
			||||||
 | 
					- Fix moderation warning e-mails that include posts (#36462 by @ClearlyClaire)
 | 
				
			||||||
 | 
					- Fix allow_referrer_origin typo (#36460 by @ShadowJonathan)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## [4.4.6] - 2025-10-13
 | 
					## [4.4.6] - 2025-10-13
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Security
 | 
					### Security
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -59,9 +59,11 @@ class ActivityPub::Activity::Delete < ActivityPub::Activity
 | 
				
			|||||||
    @quote = Quote.find_by(approval_uri: object_uri, quoted_account: @account)
 | 
					    @quote = Quote.find_by(approval_uri: object_uri, quoted_account: @account)
 | 
				
			||||||
    return if @quote.nil?
 | 
					    return if @quote.nil?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ActivityPub::Forwarder.new(@account, @json, @quote.status).forward!
 | 
					    ActivityPub::Forwarder.new(@account, @json, @quote.status).forward! if @quote.status.present?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @quote.reject!
 | 
					    @quote.reject!
 | 
				
			||||||
    DistributionWorker.perform_async(@quote.status_id, { 'update' => true })
 | 
					
 | 
				
			||||||
 | 
					    DistributionWorker.perform_async(@quote.status_id, { 'update' => true }) if @quote.status.present?
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def forwarder
 | 
					  def forwarder
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,7 +12,7 @@ class REST::InstanceSerializer < ActiveModel::Serializer
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  attributes :domain, :title, :version, :source_url, :description,
 | 
					  attributes :domain, :title, :version, :source_url, :description,
 | 
				
			||||||
             :usage, :thumbnail, :icon, :languages, :configuration,
 | 
					             :usage, :thumbnail, :icon, :languages, :configuration,
 | 
				
			||||||
             :registrations, :api_versions
 | 
					             :registrations, :api_versions, :max_toot_chars
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  has_one :contact, serializer: ContactSerializer
 | 
					  has_one :contact, serializer: ContactSerializer
 | 
				
			||||||
  has_many :rules, serializer: REST::RuleSerializer
 | 
					  has_many :rules, serializer: REST::RuleSerializer
 | 
				
			||||||
@@ -119,6 +119,10 @@ class REST::InstanceSerializer < ActiveModel::Serializer
 | 
				
			|||||||
    Mastodon::Version.api_versions
 | 
					    Mastodon::Version.api_versions
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def max_toot_chars
 | 
				
			||||||
 | 
					    StatusLengthValidator::MAX_CHARS
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private
 | 
					  private
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def registrations_enabled?
 | 
					  def registrations_enabled?
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
# frozen_string_literal: true
 | 
					# frozen_string_literal: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class StatusLengthValidator < ActiveModel::Validator
 | 
					class StatusLengthValidator < ActiveModel::Validator
 | 
				
			||||||
  MAX_CHARS = 500
 | 
					  MAX_CHARS = 1024
 | 
				
			||||||
  URL_PLACEHOLDER_CHARS = 23
 | 
					  URL_PLACEHOLDER_CHARS = 23
 | 
				
			||||||
  URL_PLACEHOLDER = 'x' * 23
 | 
					  URL_PLACEHOLDER = 'x' * 23
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,7 +11,7 @@
 | 
				
			|||||||
%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' }
 | 
					%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' }
 | 
				
			||||||
  %tr
 | 
					  %tr
 | 
				
			||||||
    %td.email-status-content
 | 
					    %td.email-status-content
 | 
				
			||||||
      = render 'status_content', status: status
 | 
					      = render 'notification_mailer/status_content', status: status
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      %p.email-status-footer
 | 
					      %p.email-status-footer
 | 
				
			||||||
        = link_to l(status.created_at.in_time_zone(time_zone.presence), format: :with_time_zone), web_url("@#{status.account.pretty_acct}/#{status.id}")
 | 
					        = link_to l(status.created_at.in_time_zone(time_zone.presence), format: :with_time_zone), web_url("@#{status.account.pretty_acct}/#{status.id}")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,12 +11,12 @@
 | 
				
			|||||||
%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' }
 | 
					%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' }
 | 
				
			||||||
  %tr
 | 
					  %tr
 | 
				
			||||||
    %td.email-status-content
 | 
					    %td.email-status-content
 | 
				
			||||||
      = render 'status_content', status: status
 | 
					      = render 'notification_mailer/status_content', status: status
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      - if status.local? && status.quote
 | 
					      - if status.local? && status.quote
 | 
				
			||||||
        %table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' }
 | 
					        %table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' }
 | 
				
			||||||
          %tr
 | 
					          %tr
 | 
				
			||||||
            %td.email-inner-nested-card-td
 | 
					            %td.email-inner-nested-card-td
 | 
				
			||||||
              = render 'nested_quote', status: status.quote.quoted_status, time_zone: time_zone
 | 
					              = render 'notification_mailer/nested_quote', status: status.quote.quoted_status, time_zone: time_zone
 | 
				
			||||||
      %p.email-status-footer
 | 
					      %p.email-status-footer
 | 
				
			||||||
        = link_to l(status.created_at.in_time_zone(time_zone.presence), format: :with_time_zone), web_url("@#{status.account.pretty_acct}/#{status.id}")
 | 
					        = link_to l(status.created_at.in_time_zone(time_zone.presence), format: :with_time_zone), web_url("@#{status.account.pretty_acct}/#{status.id}")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -51,7 +51,7 @@ defaults: &defaults
 | 
				
			|||||||
  require_invite_text: false
 | 
					  require_invite_text: false
 | 
				
			||||||
  backups_retention_period: 7
 | 
					  backups_retention_period: 7
 | 
				
			||||||
  captcha_enabled: false
 | 
					  captcha_enabled: false
 | 
				
			||||||
  allow_referer_origin: false
 | 
					  allow_referrer_origin: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
development:
 | 
					development:
 | 
				
			||||||
  <<: *defaults
 | 
					  <<: *defaults
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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/mastodon/mastodon:v4.4.6
 | 
					    image: ghcr.io/mastodon/mastodon:v4.4.7
 | 
				
			||||||
    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/mastodon/mastodon-streaming:v4.4.6
 | 
					    image: ghcr.io/mastodon/mastodon-streaming:v4.4.7
 | 
				
			||||||
    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/mastodon/mastodon:v4.4.6
 | 
					    image: ghcr.io/mastodon/mastodon:v4.4.7
 | 
				
			||||||
    restart: always
 | 
					    restart: always
 | 
				
			||||||
    env_file: .env.production
 | 
					    env_file: .env.production
 | 
				
			||||||
    command: bundle exec sidekiq
 | 
					    command: bundle exec sidekiq
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,7 +13,7 @@ module Mastodon
 | 
				
			|||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def patch
 | 
					    def patch
 | 
				
			||||||
      6
 | 
					      7
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def default_prerelease
 | 
					    def default_prerelease
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -141,7 +141,9 @@ RSpec.describe UserMailer do
 | 
				
			|||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  describe '#warning' do
 | 
					  describe '#warning' do
 | 
				
			||||||
    let(:strike) { Fabricate(:account_warning, target_account: receiver.account, text: 'dont worry its just the testsuite', action: 'suspend') }
 | 
					    let(:status) { Fabricate(:status, account: receiver.account) }
 | 
				
			||||||
 | 
					    let(:quote) { Fabricate(:quote, state: :accepted, status: status) }
 | 
				
			||||||
 | 
					    let(:strike) { Fabricate(:account_warning, target_account: receiver.account, text: 'dont worry its just the testsuite', action: 'suspend', status_ids: [quote.status_id]) }
 | 
				
			||||||
    let(:mail)   { described_class.warning(receiver, strike) }
 | 
					    let(:mail)   { described_class.warning(receiver, strike) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it 'renders warning notification' do
 | 
					    it 'renders warning notification' do
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user