6683fdcfb0
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
61 lines
1.1 KiB
Ruby
61 lines
1.1 KiB
Ruby
# NamespaceValidator
|
|
#
|
|
# Custom validator for GitLab namespace values.
|
|
#
|
|
# Values are checked for formatting and exclusion from a list of reserved path
|
|
# names.
|
|
class NamespaceValidator < ActiveModel::EachValidator
|
|
RESERVED = %w[
|
|
.well-known
|
|
admin
|
|
all
|
|
assets
|
|
ci
|
|
dashboard
|
|
files
|
|
groups
|
|
help
|
|
hooks
|
|
issues
|
|
merge_requests
|
|
new
|
|
notes
|
|
profile
|
|
projects
|
|
public
|
|
repository
|
|
robots.txt
|
|
s
|
|
search
|
|
services
|
|
snippets
|
|
teams
|
|
u
|
|
unsubscribes
|
|
users
|
|
].freeze
|
|
|
|
def self.valid?(value)
|
|
!reserved?(value) && follow_format?(value)
|
|
end
|
|
|
|
def self.reserved?(value)
|
|
RESERVED.include?(value)
|
|
end
|
|
|
|
def self.follow_format?(value)
|
|
value =~ Gitlab::Regex.namespace_regex
|
|
end
|
|
|
|
delegate :reserved?, :follow_format?, to: :class
|
|
|
|
def validate_each(record, attribute, value)
|
|
unless follow_format?(value)
|
|
record.errors.add(attribute, Gitlab::Regex.namespace_regex_message)
|
|
end
|
|
|
|
if reserved?(value)
|
|
record.errors.add(attribute, "#{value} is a reserved name")
|
|
end
|
|
end
|
|
end
|