summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrzegorz Bizon <grzesiek.bizon@gmail.com>2017-04-03 11:38:39 +0200
committerGrzegorz Bizon <grzesiek.bizon@gmail.com>2017-04-03 11:38:39 +0200
commit1a47986b3d7cd8e6d5bdbfbc20a841cf5586f773 (patch)
tree50d421d260f6ef1fb7d5d9f564494fe9d23d09bf
parent01280a5ad56f67ae653dade815faa5649bcee81f (diff)
downloadgitlab-ce-1a47986b3d7cd8e6d5bdbfbc20a841cf5586f773.tar.gz
Check registry repository name against regexp
This regexp is extracted from Docker Distribution 2.4.1 docs, contains additional `/` element that can be a separator of components.
-rw-r--r--lib/container_registry/path.rb4
-rw-r--r--lib/gitlab/regex.rb7
-rw-r--r--spec/lib/container_registry/path_spec.rb24
3 files changed, 25 insertions, 10 deletions
diff --git a/lib/container_registry/path.rb b/lib/container_registry/path.rb
index 27e0e7897ff..6e8d62b77c7 100644
--- a/lib/container_registry/path.rb
+++ b/lib/container_registry/path.rb
@@ -22,7 +22,9 @@ module ContainerRegistry
end
def valid?
- @nodes.size > 1 && @nodes.size < Namespace::NUMBER_OF_ANCESTORS_ALLOWED
+ @path =~ Gitlab::Regex.container_repository_name_regex &&
+ @nodes.size > 1 &&
+ @nodes.size < Namespace::NUMBER_OF_ANCESTORS_ALLOWED
end
def components
diff --git a/lib/gitlab/regex.rb b/lib/gitlab/regex.rb
index 5e5f5ff1589..e599dd4a656 100644
--- a/lib/gitlab/regex.rb
+++ b/lib/gitlab/regex.rb
@@ -121,6 +121,13 @@ module Gitlab
git_reference_regex
end
+ ##
+ # Docker Distribution Registry 2.4.1 repository name rules
+ #
+ def container_repository_name_regex
+ @container_repository_regex ||= %r{\A[a-z0-9]+(?:[-._/][a-z0-9]+)*\Z}
+ end
+
def environment_name_regex
@environment_name_regex ||= /\A[a-zA-Z0-9_\\\/\${}. -]+\z/.freeze
end
diff --git a/spec/lib/container_registry/path_spec.rb b/spec/lib/container_registry/path_spec.rb
index 68732b12542..1973da65f0a 100644
--- a/spec/lib/container_registry/path_spec.rb
+++ b/spec/lib/container_registry/path_spec.rb
@@ -36,25 +36,31 @@ describe ContainerRegistry::Path do
context 'when path has less than two components' do
let(:path) { 'something/' }
- it 'is not valid' do
- expect(subject).not_to be_valid
- end
+ it { is_expected.not_to be_valid }
end
context 'when path has more than allowed number of components' do
let(:path) { 'a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/r/s/t/u/w/y/z' }
- it 'is not valid' do
- expect(subject).not_to be_valid
- end
+ it { is_expected.not_to be_valid }
+ end
+
+ context 'when path has invalid characters' do
+ let(:path) { 'some\path' }
+
+ it { is_expected.not_to be_valid }
end
context 'when path has two or more components' do
let(:path) { 'some/path' }
- it 'is valid' do
- expect(subject).to be_valid
- end
+ it { is_expected.to be_valid }
+ end
+
+ context 'when path is related to multi-level image' do
+ let(:path) { 'some/path/my/image' }
+
+ it { is_expected.to be_valid }
end
end