summaryrefslogtreecommitdiff
path: root/app/validators/project_path_validator.rb
blob: 927c67b65b07522f636be1c854901916ec62c7ab (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
# ProjectPathValidator
#
# Custom validator for GitLab project path values.
#
# Values are checked for formatting and exclusion from a list of reserved path
# names.
class ProjectPathValidator < ActiveModel::EachValidator
  # All project routes with wildcard argument must be listed here.
  # Otherwise it can lead to routing issues when route considered as project name.
  #
  # Example:
  #  /group/project/tree/deploy_keys
  #
  #  without tree as reserved name routing can match 'group/project' as group name,
  #  'tree' as project name and 'deploy_keys' as route.
  #
  RESERVED = (NamespaceValidator::RESERVED +
              %w[tree commits wikis new edit create update logs_tree
                 preview blob blame raw files create_dir find_file]).freeze

  def self.valid?(value)
    !reserved?(value)
  end

  def self.reserved?(value)
    RESERVED.include?(value)
  end

  delegate :reserved?, to: :class

  def validate_each(record, attribute, value)
    if reserved?(value)
      record.errors.add(attribute, "#{value} is a reserved name")
    end
  end
end