diff --git a/changelogs/unreleased/sh-fix-issue-58103.yml b/changelogs/unreleased/sh-fix-issue-58103.yml new file mode 100644 index 0000000000000000000000000000000000000000..1599af23fedc1811a4269a24dacd77c16e56bd52 --- /dev/null +++ b/changelogs/unreleased/sh-fix-issue-58103.yml @@ -0,0 +1,5 @@ +--- +title: Properly handle multiple X-Forwarded-For addresses in runner IP +merge_request: 25511 +author: +type: fixed diff --git a/lib/api/helpers/runner.rb b/lib/api/helpers/runner.rb index 16df8e830e15986011a8839b9aa3a0215bbebf59..ff73a49d5e8c83df49cda2fb94149f2af2afeb1d 100644 --- a/lib/api/helpers/runner.rb +++ b/lib/api/helpers/runner.rb @@ -26,7 +26,7 @@ module API end def get_runner_ip - { ip_address: request.env["HTTP_X_FORWARDED_FOR"] || request.ip } + { ip_address: env["action_dispatch.remote_ip"].to_s || request.ip } end def current_runner diff --git a/spec/requests/api/runner_spec.rb b/spec/requests/api/runner_spec.rb index d7ddd97e8c80c34ed3434c5aa03837d8c1498076..91981f7c56a1d49901e09bffd740b672f89d0799 100644 --- a/spec/requests/api/runner_spec.rb +++ b/spec/requests/api/runner_spec.rb @@ -526,6 +526,15 @@ describe API::Runner, :clean_gitlab_redis_shared_state do expect(runner.reload.ip_address).to eq('123.222.123.222') end + it "handles multiple X-Forwarded-For addresses" do + post api('/jobs/request'), + params: { token: runner.token }, + headers: { 'User-Agent' => user_agent, 'X-Forwarded-For' => '123.222.123.222, 127.0.0.1' } + + expect(response).to have_gitlab_http_status 201 + expect(runner.reload.ip_address).to eq('123.222.123.222') + end + context 'when concurrently updating a job' do before do expect_any_instance_of(Ci::Build).to receive(:run!)