Skip to content
Snippets Groups Projects
Commit 72f59ddf authored by Alejandro Rodríguez's avatar Alejandro Rodríguez
Browse files

Use Pathname to make the repository storage path validations more robust

parent d2598f62
No related branches found
No related tags found
No related merge requests found
Loading
Loading
@@ -3,22 +3,23 @@ def storage_name_valid?(name)
end
 
def find_parent_path(name, path)
parent = Pathname.new(path).realpath.parent
Gitlab.config.repositories.storages.detect do |n, p|
name != n && path.chomp('/').start_with?(p.chomp('/'))
name != n && Pathname.new(p).realpath == parent
end
end
 
def error(message)
def storage_validation_error(message)
raise "#{message}. Please fix this in your gitlab.yml before starting GitLab."
end
 
error('No repository storage path defined') if Gitlab.config.repositories.storages.empty?
storage_validation_error('No repository storage path defined') if Gitlab.config.repositories.storages.empty?
 
Gitlab.config.repositories.storages.each do |name, path|
error("\"#{name}\" is not a valid storage name") unless storage_name_valid?(name)
storage_validation_error("\"#{name}\" is not a valid storage name") unless storage_name_valid?(name)
 
parent_name, _parent_path = find_parent_path(name, path)
if parent_name
error("#{name} is a nested path of #{parent_name}. Nested paths are not supported for repository storages")
storage_validation_error("#{name} is a nested path of #{parent_name}. Nested paths are not supported for repository storages")
end
end
require 'spec_helper'
 
describe '6_validations', lib: true do
before :all do
FileUtils.mkdir_p('tmp/tests/paths/a/b/c/d')
FileUtils.mkdir_p('tmp/tests/paths/a/b/c2')
FileUtils.mkdir_p('tmp/tests/paths/a/b/d')
end
after :all do
FileUtils.rm_rf('tmp/tests/paths')
end
context 'with correct settings' do
before do
mock_storages('foo' => '/a/b/c', 'bar' => 'a/b/d')
mock_storages('foo' => 'tmp/tests/paths/a/b/c', 'bar' => 'tmp/tests/paths/a/b/d')
end
 
it 'passes through' do
Loading
Loading
@@ -13,7 +23,7 @@ describe '6_validations', lib: true do
 
context 'with invalid storage names' do
before do
mock_storages('name with spaces' => '/a/b/c')
mock_storages('name with spaces' => 'tmp/tests/paths/a/b/c')
end
 
it 'throws an error' do
Loading
Loading
@@ -23,7 +33,7 @@ describe '6_validations', lib: true do
 
context 'with nested storage paths' do
before do
mock_storages('foo' => '/a/b/c', 'bar' => '/a/b/c/d')
mock_storages('foo' => 'tmp/tests/paths/a/b/c', 'bar' => 'tmp/tests/paths/a/b/c/d')
end
 
it 'throws an error' do
Loading
Loading
@@ -31,6 +41,16 @@ describe '6_validations', lib: true do
end
end
 
context 'with similar but un-nested storage paths' do
before do
mock_storages('foo' => 'tmp/tests/paths/a/b/c', 'bar' => 'tmp/tests/paths/a/b/c2')
end
it 'passes through' do
expect { load_validations }.not_to raise_error
end
end
def mock_storages(storages)
allow(Gitlab.config.repositories).to receive(:storages).and_return(storages)
end
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment