Fix error when passing unknown filter param in REST API (#20626)
Fix #19156
This commit is contained in:
		
							parent
							
								
									5c826c408d
								
							
						
					
					
						commit
						b31afc6294
					
				
					 16 changed files with 31 additions and 28 deletions
				
			
		| 
						 | 
				
			
			@ -57,7 +57,7 @@ class Api::BaseController < ApplicationController
 | 
			
		|||
    render json: { error: I18n.t('errors.429') }, status: 429
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  rescue_from ActionController::ParameterMissing do |e|
 | 
			
		||||
  rescue_from ActionController::ParameterMissing, Mastodon::InvalidParameterError do |e|
 | 
			
		||||
    render json: { error: e.to_s }, status: 400
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -57,7 +57,7 @@ class AccountFilter
 | 
			
		|||
    when 'order'
 | 
			
		||||
      order_scope(value)
 | 
			
		||||
    else
 | 
			
		||||
      raise "Unknown filter: #{key}"
 | 
			
		||||
      raise Mastodon::InvalidParameterError, "Unknown filter: #{key}"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -68,7 +68,7 @@ class AccountFilter
 | 
			
		|||
    when 'remote'
 | 
			
		||||
      Account.remote
 | 
			
		||||
    else
 | 
			
		||||
      raise "Unknown origin: #{value}"
 | 
			
		||||
      raise Mastodon::InvalidParameterError, "Unknown origin: #{value}"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -84,8 +84,10 @@ class AccountFilter
 | 
			
		|||
      accounts_with_users.merge(User.disabled)
 | 
			
		||||
    when 'silenced'
 | 
			
		||||
      Account.silenced
 | 
			
		||||
    when 'sensitized'
 | 
			
		||||
      Account.sensitized
 | 
			
		||||
    else
 | 
			
		||||
      raise "Unknown status: #{value}"
 | 
			
		||||
      raise Mastodon::InvalidParameterError, "Unknown status: #{value}"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -96,7 +98,7 @@ class AccountFilter
 | 
			
		|||
    when 'recent'
 | 
			
		||||
      Account.recent
 | 
			
		||||
    else
 | 
			
		||||
      raise "Unknown order: #{value}"
 | 
			
		||||
      raise Mastodon::InvalidParameterError, "Unknown order: #{value}"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -95,7 +95,7 @@ class Admin::ActionLogFilter
 | 
			
		|||
      account = Account.find_or_initialize_by(id: value)
 | 
			
		||||
      Admin::ActionLog.where(target: [account, account.user].compact)
 | 
			
		||||
    else
 | 
			
		||||
      raise "Unknown filter: #{key}"
 | 
			
		||||
      raise Mastodon::InvalidParameterError, "Unknown filter: #{key}"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,7 +30,7 @@ class Admin::AppealFilter
 | 
			
		|||
    when 'status'
 | 
			
		||||
      status_scope(value)
 | 
			
		||||
    else
 | 
			
		||||
      raise "Unknown filter: #{key}"
 | 
			
		||||
      raise Mastodon::InvalidParameterError, "Unknown filter: #{key}"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -43,7 +43,7 @@ class Admin::AppealFilter
 | 
			
		|||
    when 'pending'
 | 
			
		||||
      Appeal.pending
 | 
			
		||||
    else
 | 
			
		||||
      raise "Unknown status: #{value}"
 | 
			
		||||
      raise Mastodon::InvalidParameterError, "Unknown status: #{value}"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,7 +32,7 @@ class Admin::StatusFilter
 | 
			
		|||
    when 'media'
 | 
			
		||||
      Status.joins(:media_attachments).merge(@account.media_attachments.reorder(nil)).group(:id).reorder('statuses.id desc')
 | 
			
		||||
    else
 | 
			
		||||
      raise "Unknown filter: #{key}"
 | 
			
		||||
      raise Mastodon::InvalidParameterError, "Unknown filter: #{key}"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,7 +33,7 @@ class AnnouncementFilter
 | 
			
		|||
    when 'unpublished'
 | 
			
		||||
      Announcement.unpublished
 | 
			
		||||
    else
 | 
			
		||||
      raise "Unknown filter: #{key}"
 | 
			
		||||
      raise Mastodon::InvalidParameterError, "Unknown filter: #{key}"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -39,7 +39,7 @@ class CustomEmojiFilter
 | 
			
		|||
    when 'shortcode'
 | 
			
		||||
      CustomEmoji.search(value.strip)
 | 
			
		||||
    else
 | 
			
		||||
      raise "Unknown filter: #{key}"
 | 
			
		||||
      raise Mastodon::InvalidParameterError, "Unknown filter: #{key}"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,7 +36,7 @@ class InstanceFilter
 | 
			
		|||
    when 'availability'
 | 
			
		||||
      availability_scope(value)
 | 
			
		||||
    else
 | 
			
		||||
      raise "Unknown filter: #{key}"
 | 
			
		||||
      raise Mastodon::InvalidParameterError, "Unknown filter: #{key}"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -47,7 +47,7 @@ class InstanceFilter
 | 
			
		|||
    when 'unavailable'
 | 
			
		||||
      Instance.joins(:unavailable_domain)
 | 
			
		||||
    else
 | 
			
		||||
      raise "Unknown availability: #{value}"
 | 
			
		||||
      raise Mastodon::InvalidParameterError, "Unknown availability: #{value}"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,7 +31,7 @@ class InviteFilter
 | 
			
		|||
    when 'expired'
 | 
			
		||||
      Invite.expired
 | 
			
		||||
    else
 | 
			
		||||
      raise "Unknown filter: #{key}"
 | 
			
		||||
      raise Mastodon::InvalidParameterError, "Unknown filter: #{key}"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -53,7 +53,7 @@ class RelationshipFilter
 | 
			
		|||
    when 'activity'
 | 
			
		||||
      activity_scope(value)
 | 
			
		||||
    else
 | 
			
		||||
      raise "Unknown filter: #{key}"
 | 
			
		||||
      raise Mastodon::InvalidParameterError, "Unknown filter: #{key}"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -68,7 +68,7 @@ class RelationshipFilter
 | 
			
		|||
    when 'invited'
 | 
			
		||||
      Account.joins(user: :invite).merge(Invite.where(user: account.user)).eager_load(:account_stat).reorder(nil)
 | 
			
		||||
    else
 | 
			
		||||
      raise "Unknown relationship: #{value}"
 | 
			
		||||
      raise Mastodon::InvalidParameterError, "Unknown relationship: #{value}"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -83,7 +83,7 @@ class RelationshipFilter
 | 
			
		|||
    when 'remote'
 | 
			
		||||
      Account.remote
 | 
			
		||||
    else
 | 
			
		||||
      raise "Unknown location: #{value}"
 | 
			
		||||
      raise Mastodon::InvalidParameterError, "Unknown location: #{value}"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -94,7 +94,7 @@ class RelationshipFilter
 | 
			
		|||
    when 'primary'
 | 
			
		||||
      Account.where(moved_to_account_id: nil)
 | 
			
		||||
    else
 | 
			
		||||
      raise "Unknown status: #{value}"
 | 
			
		||||
      raise Mastodon::InvalidParameterError, "Unknown status: #{value}"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -105,7 +105,7 @@ class RelationshipFilter
 | 
			
		|||
    when 'recent'
 | 
			
		||||
      params[:relationship] == 'invited' ? Account.recent : Follow.recent
 | 
			
		||||
    else
 | 
			
		||||
      raise "Unknown order: #{value}"
 | 
			
		||||
      raise Mastodon::InvalidParameterError, "Unknown order: #{value}"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -114,7 +114,7 @@ class RelationshipFilter
 | 
			
		|||
    when 'dormant'
 | 
			
		||||
      AccountStat.where(last_status_at: nil).or(AccountStat.where(AccountStat.arel_table[:last_status_at].lt(1.month.ago)))
 | 
			
		||||
    else
 | 
			
		||||
      raise "Unknown activity: #{value}"
 | 
			
		||||
      raise Mastodon::InvalidParameterError, "Unknown activity: #{value}"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -38,7 +38,7 @@ class ReportFilter
 | 
			
		|||
    when :target_origin
 | 
			
		||||
      target_origin_scope(value)
 | 
			
		||||
    else
 | 
			
		||||
      raise "Unknown filter: #{key}"
 | 
			
		||||
      raise Mastodon::InvalidParameterError, "Unknown filter: #{key}"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -49,7 +49,7 @@ class ReportFilter
 | 
			
		|||
    when :remote
 | 
			
		||||
      Report.where(target_account: Account.remote)
 | 
			
		||||
    else
 | 
			
		||||
      raise "Unknown value: #{value}"
 | 
			
		||||
      raise Mastodon::InvalidParameterError, "Unknown value: #{value}"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,7 +40,7 @@ class Trends::PreviewCardFilter
 | 
			
		|||
    when 'locale'
 | 
			
		||||
      PreviewCardTrend.where(language: value)
 | 
			
		||||
    else
 | 
			
		||||
      raise "Unknown filter: #{key}"
 | 
			
		||||
      raise Mastodon::InvalidParameterError, "Unknown filter: #{key}"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,7 +30,7 @@ class Trends::PreviewCardProviderFilter
 | 
			
		|||
    when 'status'
 | 
			
		||||
      status_scope(value)
 | 
			
		||||
    else
 | 
			
		||||
      raise "Unknown filter: #{key}"
 | 
			
		||||
      raise Mastodon::InvalidParameterError, "Unknown filter: #{key}"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -43,7 +43,7 @@ class Trends::PreviewCardProviderFilter
 | 
			
		|||
    when 'pending_review'
 | 
			
		||||
      PreviewCardProvider.pending_review
 | 
			
		||||
    else
 | 
			
		||||
      raise "Unknown status: #{value}"
 | 
			
		||||
      raise Mastodon::InvalidParameterError, "Unknown status: #{value}"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,7 +40,7 @@ class Trends::StatusFilter
 | 
			
		|||
    when 'locale'
 | 
			
		||||
      StatusTrend.where(language: value)
 | 
			
		||||
    else
 | 
			
		||||
      raise "Unknown filter: #{key}"
 | 
			
		||||
      raise Mastodon::InvalidParameterError, "Unknown filter: #{key}"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,6 +11,7 @@ module Mastodon
 | 
			
		|||
  class RaceConditionError < Error; end
 | 
			
		||||
  class RateLimitExceededError < Error; end
 | 
			
		||||
  class SyntaxError < Error; end
 | 
			
		||||
  class InvalidParameterError < Error; end
 | 
			
		||||
 | 
			
		||||
  class UnexpectedResponseError < Error
 | 
			
		||||
    attr_reader :response
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -50,10 +50,10 @@ RSpec.describe CustomEmojiFilter do
 | 
			
		|||
      context 'else' do
 | 
			
		||||
        let(:params) { { else: 'else' } }
 | 
			
		||||
 | 
			
		||||
        it 'raises RuntimeError' do
 | 
			
		||||
        it 'raises Mastodon::InvalidParameterError' do
 | 
			
		||||
          expect do
 | 
			
		||||
            subject
 | 
			
		||||
          end.to raise_error(RuntimeError, /Unknown filter: else/)
 | 
			
		||||
          end.to raise_error(Mastodon::InvalidParameterError, /Unknown filter: else/)
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Reference in a new issue