Merge branch 'main' into glitch-soc/merge-upstream
Conflicts: - `.github/dependabot.yml`: Updated upstream, removed in glitch-soc to disable noise. Kept removed. - `CODE_OF_CONDUCT.md`: Upstream updated to a new version of the covenant, but I have not read it yet, so kept unchanged. - `Gemfile.lock`: Not a real conflict, one upstream dependency updated textually too close to the glitch-soc only `hcaptcha` dependency. Applied upstream changes. - `app/controllers/admin/base_controller.rb`: Minor conflict due to glitch-soc's theming system. Applied upstream changes. - `app/controllers/application_controller.rb`: Minor conflict due to glitch-soc's theming system. Applied upstream changes. - `app/controllers/disputes/base_controller.rb`: Minor conflict due to glitch-soc's theming system. Applied upstream changes. - `app/controllers/relationships_controller.rb`: Minor conflict due to glitch-soc's theming system. Applied upstream changes. - `app/controllers/statuses_cleanup_controller.rb`: Minor conflict due to glitch-soc's theming system. Applied upstream changes. - `app/helpers/application_helper.rb`: Minor conflict due to glitch-soc's theming system. Applied upstream changes. - `app/javascript/mastodon/features/compose/components/compose_form.jsx`: Upstream added a highlight animation for onboarding, while we changed the max character limit. Applied our local changes on top of upstream's new version. - `app/views/layouts/application.html.haml`: Minor conflict due to glitch-soc's theming system. Applied upstream changes. - `stylelint.config.js`: Upstream added ignore paths, glitch-soc had extra ignore paths. Added the same paths as upstream.
This commit is contained in:
		
							
								
								
									
										13
									
								
								app/controllers/concerns/api_caching_concern.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								app/controllers/concerns/api_caching_concern.rb
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
module ApiCachingConcern
 | 
			
		||||
  extend ActiveSupport::Concern
 | 
			
		||||
 | 
			
		||||
  def cache_if_unauthenticated!
 | 
			
		||||
    expires_in(15.seconds, public: true, stale_while_revalidate: 30.seconds, stale_if_error: 1.day) unless user_signed_in?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def cache_even_if_authenticated!
 | 
			
		||||
    expires_in(5.minutes, public: true, stale_while_revalidate: 30.seconds, stale_if_error: 1.day) unless whitelist_mode?
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
@@ -155,8 +155,30 @@ module CacheConcern
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  class_methods do
 | 
			
		||||
    def vary_by(value, **kwargs)
 | 
			
		||||
      before_action(**kwargs) do |controller|
 | 
			
		||||
        response.headers['Vary'] = value.respond_to?(:call) ? controller.instance_exec(&value) : value
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  included do
 | 
			
		||||
    after_action :enforce_cache_control!
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  # Prevents high-entropy headers such as `Cookie`, `Signature` or `Authorization`
 | 
			
		||||
  # from being used as cache keys, while allowing to `Vary` on them (to not serve
 | 
			
		||||
  # anonymous cached data to authenticated requests when authentication matters)
 | 
			
		||||
  def enforce_cache_control!
 | 
			
		||||
    vary = response.headers['Vary']&.split&.map { |x| x.strip.downcase }
 | 
			
		||||
    return unless vary.present? && %w(cookie authorization signature).any? { |header| vary.include?(header) && request.headers[header].present? }
 | 
			
		||||
 | 
			
		||||
    response.cache_control.replace(private: true, no_store: true)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def render_with_cache(**options)
 | 
			
		||||
    raise ArgumentError, 'only JSON render calls are supported' unless options.key?(:json) || block_given?
 | 
			
		||||
    raise ArgumentError, 'Only JSON render calls are supported' unless options.key?(:json) || block_given?
 | 
			
		||||
 | 
			
		||||
    key        = options.delete(:key) || [[params[:controller], params[:action]].join('/'), options[:json].respond_to?(:cache_key) ? options[:json].cache_key : nil, options[:fields].nil? ? nil : options[:fields].join(',')].compact.join(':')
 | 
			
		||||
    expires_in = options.delete(:expires_in) || 3.minutes
 | 
			
		||||
@@ -176,10 +198,6 @@ module CacheConcern
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def set_cache_headers
 | 
			
		||||
    response.headers['Vary'] = public_fetch_mode? ? 'Accept' : 'Accept, Signature'
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def cache_collection(raw, klass)
 | 
			
		||||
    return raw unless klass.respond_to?(:with_includes)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,12 @@ module WebAppControllerConcern
 | 
			
		||||
    prepend_before_action :redirect_unauthenticated_to_permalinks!
 | 
			
		||||
    before_action :set_pack
 | 
			
		||||
    before_action :set_app_body_class
 | 
			
		||||
 | 
			
		||||
    vary_by 'Accept, Accept-Language, Cookie'
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def skip_csrf_meta_tags?
 | 
			
		||||
    current_user.nil?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def set_app_body_class
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user