Commit 04ac1711 authored by Robert Speicher's avatar Robert Speicher

Merge branch '3232-lfs-files-pull-from-secondary' into 'master'

Geo - Whitelist LFS requests to download objects on a secondary node

Closes #3232

See merge request !2758
parents 0ae313c4 8a0724ce
class Projects::LfsApiController < Projects::GitHttpClientController class Projects::LfsApiController < Projects::GitHttpClientController
include ApplicationSettingsHelper
include ApplicationHelper
include GitlabRoutingHelper
include LfsRequest include LfsRequest
skip_before_action :lfs_check_access!, only: [:deprecated] skip_before_action :lfs_check_access!, only: [:deprecated]
before_action :lfs_check_batch_operation!, only: [:batch]
def batch def batch
unless objects.present? unless objects.present?
...@@ -90,4 +94,16 @@ class Projects::LfsApiController < Projects::GitHttpClientController ...@@ -90,4 +94,16 @@ class Projects::LfsApiController < Projects::GitHttpClientController
} }
} }
end end
def lfs_check_batch_operation!
if upload_request? && Gitlab::Geo.secondary?
render(
json: {
message: "You cannot write to a secondary GitLab Geo instance. Please use #{geo_primary_default_url_to_repo(project)} instead."
},
content_type: "application/vnd.git-lfs+json",
status: 403
)
end
end
end end
---
title: Geo - Whitelist LFS requests to download objects on a secondary node
merge_request: 2758
author:
type: fixed
...@@ -65,7 +65,7 @@ module Gitlab ...@@ -65,7 +65,7 @@ module Gitlab
end end
def whitelisted_routes def whitelisted_routes
logout_route || grack_route || @whitelisted.any? { |path| request.path.include?(path) } || sidekiq_route logout_route || grack_route || @whitelisted.any? { |path| request.path.include?(path) } || lfs_route || sidekiq_route
end end
def logout_route def logout_route
...@@ -79,6 +79,10 @@ module Gitlab ...@@ -79,6 +79,10 @@ module Gitlab
def grack_route def grack_route
request.path.end_with?('.git/git-upload-pack') request.path.end_with?('.git/git-upload-pack')
end end
def lfs_route
request.path.end_with?('/info/lfs/objects/batch')
end
end end
end end
end end
...@@ -35,6 +35,7 @@ describe Gitlab::Middleware::ReadonlyGeo do ...@@ -35,6 +35,7 @@ describe Gitlab::Middleware::ReadonlyGeo do
end end
subject { described_class.new(fake_app) } subject { described_class.new(fake_app) }
let(:request) { Rack::MockRequest.new(rack_stack) } let(:request) { Rack::MockRequest.new(rack_stack) }
context 'normal requests to a secondary Gitlab Geo' do context 'normal requests to a secondary Gitlab Geo' do
...@@ -103,6 +104,13 @@ describe Gitlab::Middleware::ReadonlyGeo do ...@@ -103,6 +104,13 @@ describe Gitlab::Middleware::ReadonlyGeo do
expect(response).not_to be_a_redirect expect(response).not_to be_a_redirect
expect(subject).not_to disallow_request expect(subject).not_to disallow_request
end end
it 'expects a POST LFS request to batch URL to be allowed' do
response = request.post('/root/rouge.git/info/lfs/objects/batch')
expect(response).not_to be_a_redirect
expect(subject).not_to disallow_request
end
end end
end end
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment