summaryrefslogtreecommitdiff
path: root/app/validators/project_path_validator.rb
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2016-11-14 16:55:31 +0200
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2016-11-23 14:08:36 +0200
commit6683fdcfb0ae4ceb368b6f5f63dde0a10a4a3e1b (patch)
tree7530562c2e0702df3e74fc8ca8288e2e3f4ef0a2 /app/validators/project_path_validator.rb
parentb1b5060dbad15975184ec20a1914c7c48fc804db (diff)
downloadgitlab-ce-dz-allow-nested-group-routing.tar.gz
Add nested groups support to the routingdz-allow-nested-group-routing
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Diffstat (limited to 'app/validators/project_path_validator.rb')
-rw-r--r--app/validators/project_path_validator.rb36
1 files changed, 36 insertions, 0 deletions
diff --git a/app/validators/project_path_validator.rb b/app/validators/project_path_validator.rb
new file mode 100644
index 00000000000..927c67b65b0
--- /dev/null
+++ b/app/validators/project_path_validator.rb
@@ -0,0 +1,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