diff options
Diffstat (limited to 'app/validators/dynamic_path_validator.rb')
-rw-r--r-- | app/validators/dynamic_path_validator.rb | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/app/validators/dynamic_path_validator.rb b/app/validators/dynamic_path_validator.rb new file mode 100644 index 00000000000..4688aabc2a8 --- /dev/null +++ b/app/validators/dynamic_path_validator.rb @@ -0,0 +1,53 @@ +# DynamicPathValidator +# +# Custom validator for GitLab path values. +# These paths are assigned to `Namespace` (& `Group` as a subclass) & `Project` +# +# Values are checked for formatting and exclusion from a list of illegal path +# names. +class DynamicPathValidator < ActiveModel::EachValidator + extend Gitlab::EncodingHelper + + class << self + def valid_user_path?(path) + encode!(path) + "#{path}/" =~ Gitlab::PathRegex.root_namespace_path_regex + end + + def valid_group_path?(path) + encode!(path) + "#{path}/" =~ Gitlab::PathRegex.full_namespace_path_regex + end + + def valid_project_path?(path) + encode!(path) + "#{path}/" =~ Gitlab::PathRegex.full_project_path_regex + end + end + + def path_valid_for_record?(record, value) + full_path = record.respond_to?(:build_full_path) ? record.build_full_path : value + + return true unless full_path + + case record + when Project + self.class.valid_project_path?(full_path) + when Group + self.class.valid_group_path?(full_path) + else # User or non-Group Namespace + self.class.valid_user_path?(full_path) + end + end + + def validate_each(record, attribute, value) + unless value =~ Gitlab::PathRegex.namespace_format_regex + record.errors.add(attribute, Gitlab::PathRegex.namespace_format_message) + return + end + + unless path_valid_for_record?(record, value) + record.errors.add(attribute, "#{value} is a reserved name") + end + end +end |