summaryrefslogtreecommitdiff
path: root/lib/gitlab/search/abuse_validators/no_abusive_term_length_validator.rb
blob: 8a94520d8fd1f7011b41c103910f0ee03c69fbae (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# frozen_string_literal: true

module Gitlab
  module Search
    module AbuseValidators
      class NoAbusiveTermLengthValidator < ActiveModel::EachValidator
        def validate_each(instance, attribute, value)
          return unless value.is_a?(String)

          if value.split.any? { |term| term_too_long?(term) }
            instance.errors.add attribute, 'abusive term length detected'
          end
        end

        private

        def term_too_long?(term)
          char_limit = url_detected?(term) ? maximum_for_url : maximum
          term.length >= char_limit
        end

        def url_detected?(uri_str)
          URI::DEFAULT_PARSER.regexp[:ABS_URI].match? uri_str
        end

        def maximum_for_url
          options.fetch(:maximum_for_url, maximum)
        end

        def maximum
          options.fetch(:maximum)
        end
      end
    end
  end
end