From 1a58f60a45c0da454deefe7431e023ca55732202 Mon Sep 17 00:00:00 2001 From: Mariia Solodovnik Date: Thu, 12 Jan 2023 12:52:41 +0200 Subject: [PATCH 01/13] Use proxy base url for http_url_to_repo Fix HTTP and SSH clone URLs in the clone dialog for Geo secondary sites that exposed the external URL of the Primary site Changelog: fixed EE: true --- app/helpers/projects_helper.rb | 8 ++++++++ app/views/projects/buttons/_clone.html.haml | 4 ++-- ee/app/helpers/ee/gitlab_routing_helper.rb | 4 ++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index e312a45839952a..5d45fe282e6cf9 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -828,4 +828,12 @@ def can_admin_group_clusters?(project) project.group && project.group.clusters.any? && can?(current_user, :admin_cluster, project.group) end +def http_url_to_repo(project) + ::Gitlab::Geo.proxied_request?(request.env) ? proxied_url(project) : project.http_url_to_repo +end + +def proxied_url(project) + geo_proxied_http_url_to_repo(Gitlab::Geo.proxied_site(request.env).url, project.repository) +end + ProjectsHelper.prepend_mod_with('ProjectsHelper') diff --git a/app/views/projects/buttons/_clone.html.haml b/app/views/projects/buttons/_clone.html.haml index a8a911adb7d45e..463b5160d975d5 100644 --- a/app/views/projects/buttons/_clone.html.haml +++ b/app/views/projects/buttons/_clone.html.haml @@ -22,7 +22,7 @@ %label.label-bold = _('Clone with %{http_label}') % { http_label: gitlab_config.protocol.upcase } .input-group.btn-group - = text_field_tag :http_project_clone, project.http_url_to_repo, class: "js-select-on-focus form-control", readonly: true, aria: { label: _('Repository clone URL') }, data: { qa_selector: 'http_clone_url_content' } + = text_field_tag :http_project_clone, http_url_to_repo(project), class: "js-select-on-focus form-control", readonly: true, aria: { label: _('Repository clone URL') }, data: { qa_selector: 'http_clone_url_content' } .input-group-append = clipboard_button(target: '#http_project_clone', title: _("Copy URL"), class: "input-group-text gl-button btn btn-icon btn-default") = render_if_exists 'projects/buttons/geo' @@ -37,7 +37,7 @@ .gl-dropdown-item-text-wrapper = _('Visual Studio Code (SSH)') - if http_enabled? - - escaped_http_url_to_repo = CGI.escape(project.http_url_to_repo) + - escaped_http_url_to_repo = CGI.escape(http_url_to_repo(project)) %a.dropdown-item.open-with-link{ href: 'vscode://vscode.git/clone?url=' + escaped_http_url_to_repo } .gl-dropdown-item-text-wrapper = _('Visual Studio Code (HTTPS)') diff --git a/ee/app/helpers/ee/gitlab_routing_helper.rb b/ee/app/helpers/ee/gitlab_routing_helper.rb index a27da02d29e207..92ffa54f0298d3 100644 --- a/ee/app/helpers/ee/gitlab_routing_helper.rb +++ b/ee/app/helpers/ee/gitlab_routing_helper.rb @@ -20,6 +20,10 @@ def geo_primary_http_url_to_repo(container) geo_primary_web_url(container) + '.git' end + def geo_proxied_http_url_to_repo(proxy_base_url, container) + "#{File.join(proxy_base_url, container.full_path)}.git" + end + def geo_primary_http_internal_url_to_repo(container) geo_primary_web_url(container, internal: true) + '.git' end -- GitLab From 0b042587c09609b9f908c7e6df623bcd351b12f3 Mon Sep 17 00:00:00 2001 From: Mariia Solodovnik Date: Fri, 20 Jan 2023 17:41:43 +0200 Subject: [PATCH 02/13] Move http_url_to_repo logic to EE module Add http_url_to_repo methods to both CE and EE modules, update references in views, add spec for http clone url link --- app/helpers/projects_helper.rb | 8 ++------ app/views/projects/buttons/_clone.html.haml | 4 ++-- app/views/shared/_mobile_clone_panel.html.haml | 2 +- ee/app/helpers/ee/projects_helper.rb | 8 ++++++++ ee/spec/helpers/ee/gitlab_routing_helper_spec.rb | 9 +++++++++ 5 files changed, 22 insertions(+), 9 deletions(-) diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 5d45fe282e6cf9..cd50af8f3ae570 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -828,12 +828,8 @@ def can_admin_group_clusters?(project) project.group && project.group.clusters.any? && can?(current_user, :admin_cluster, project.group) end -def http_url_to_repo(project) - ::Gitlab::Geo.proxied_request?(request.env) ? proxied_url(project) : project.http_url_to_repo -end - -def proxied_url(project) - geo_proxied_http_url_to_repo(Gitlab::Geo.proxied_site(request.env).url, project.repository) +def http_clone_url_to_repo(project) + project.http_url_to_repo end ProjectsHelper.prepend_mod_with('ProjectsHelper') diff --git a/app/views/projects/buttons/_clone.html.haml b/app/views/projects/buttons/_clone.html.haml index 463b5160d975d5..42e9209f646443 100644 --- a/app/views/projects/buttons/_clone.html.haml +++ b/app/views/projects/buttons/_clone.html.haml @@ -22,7 +22,7 @@ %label.label-bold = _('Clone with %{http_label}') % { http_label: gitlab_config.protocol.upcase } .input-group.btn-group - = text_field_tag :http_project_clone, http_url_to_repo(project), class: "js-select-on-focus form-control", readonly: true, aria: { label: _('Repository clone URL') }, data: { qa_selector: 'http_clone_url_content' } + = text_field_tag :http_project_clone, http_clone_url_to_repo(project), class: "js-select-on-focus form-control", readonly: true, aria: { label: _('Repository clone URL') }, data: { qa_selector: 'http_clone_url_content' } .input-group-append = clipboard_button(target: '#http_project_clone', title: _("Copy URL"), class: "input-group-text gl-button btn btn-icon btn-default") = render_if_exists 'projects/buttons/geo' @@ -37,7 +37,7 @@ .gl-dropdown-item-text-wrapper = _('Visual Studio Code (SSH)') - if http_enabled? - - escaped_http_url_to_repo = CGI.escape(http_url_to_repo(project)) + - escaped_http_url_to_repo = CGI.escape(http_clone_url_to_repo(project)) %a.dropdown-item.open-with-link{ href: 'vscode://vscode.git/clone?url=' + escaped_http_url_to_repo } .gl-dropdown-item-text-wrapper = _('Visual Studio Code (HTTPS)') diff --git a/app/views/shared/_mobile_clone_panel.html.haml b/app/views/shared/_mobile_clone_panel.html.haml index 8b7ef838d2bf5a..40d5b71bf0143d 100644 --- a/app/views/shared/_mobile_clone_panel.html.haml +++ b/app/views/shared/_mobile_clone_panel.html.haml @@ -12,5 +12,5 @@ = dropdown_item_with_description(ssh_copy_label, project.ssh_url_to_repo, href: project.ssh_url_to_repo, data: { clone_type: 'ssh' }, default: true) - if http_enabled? %li - = dropdown_item_with_description(http_copy_label, project.http_url_to_repo, href: project.http_url_to_repo, data: { clone_type: 'http' }) + = dropdown_item_with_description(http_copy_label, http_clone_url_to_repo(project), href: http_clone_url_to_repo(project), data: { clone_type: 'http' }) = render_if_exists 'shared/mobile_kerberos_clone' diff --git a/ee/app/helpers/ee/projects_helper.rb b/ee/app/helpers/ee/projects_helper.rb index f55a5964ed9ebd..2d2a24367e08ac 100644 --- a/ee/app/helpers/ee/projects_helper.rb +++ b/ee/app/helpers/ee/projects_helper.rb @@ -281,6 +281,14 @@ def project_compliance_framework_app_data(project, can_edit) end end + def http_clone_url_to_repo(project) + ::Gitlab::Geo.proxied_request?(request.env) ? geo_proxied_http_url(project) : project.http_url_to_repo + end + + def geo_proxied_http_url(project) + geo_proxied_http_url_to_repo(::Gitlab::Geo.proxied_site(request.env).url, project) + end + private def remove_message_data(project) diff --git a/ee/spec/helpers/ee/gitlab_routing_helper_spec.rb b/ee/spec/helpers/ee/gitlab_routing_helper_spec.rb index 962eabab39098e..04a3521a867372 100644 --- a/ee/spec/helpers/ee/gitlab_routing_helper_spec.rb +++ b/ee/spec/helpers/ee/gitlab_routing_helper_spec.rb @@ -53,6 +53,15 @@ end end + describe '#geo_proxied_http_url_to_repo' do + subject { helper.geo_proxied_http_url_to_repo(base_url, repo) } + + let(:repo) { project } + let(:base_url) { primary.url } + + it { is_expected.to eq('http://localhost:123/relative/foo/bar.git') } + end + describe '#geo_primary_default_url_to_repo' do subject { helper.geo_primary_default_url_to_repo(repo) } -- GitLab From bf04f75f55056f31a00260dff259e53133a2f355 Mon Sep 17 00:00:00 2001 From: Mariia Solodovnik Date: Tue, 31 Jan 2023 16:46:19 +0200 Subject: [PATCH 03/13] Fix secondary ssh clone url using the same port as the primary --- app/helpers/projects_helper.rb | 4 ++++ app/views/projects/buttons/_clone.html.haml | 4 ++-- ee/app/helpers/ee/gitlab_routing_helper.rb | 7 +++++++ ee/app/helpers/ee/projects_helper.rb | 6 ++++++ ee/spec/helpers/ee/gitlab_routing_helper_spec.rb | 9 +++++++++ 5 files changed, 28 insertions(+), 2 deletions(-) diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index cd50af8f3ae570..d5d7095af09ee0 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -832,4 +832,8 @@ def http_clone_url_to_repo(project) project.http_url_to_repo end +def ssh_clone_url_to_repo(project) + project.ssh_url_to_repo +end + ProjectsHelper.prepend_mod_with('ProjectsHelper') diff --git a/app/views/projects/buttons/_clone.html.haml b/app/views/projects/buttons/_clone.html.haml index 42e9209f646443..ab026d9c6ac2d5 100644 --- a/app/views/projects/buttons/_clone.html.haml +++ b/app/views/projects/buttons/_clone.html.haml @@ -13,7 +13,7 @@ %label.label-bold = _('Clone with SSH') .input-group.btn-group - = text_field_tag :ssh_project_clone, project.ssh_url_to_repo, class: "js-select-on-focus form-control", readonly: true, aria: { label: _('Repository clone URL') }, data: { qa_selector: 'ssh_clone_url_content' } + = text_field_tag :ssh_project_clone, ssh_clone_url_to_repo(project), class: "js-select-on-focus form-control", readonly: true, aria: { label: _('Repository clone URL') }, data: { qa_selector: 'ssh_clone_url_content' } .input-group-append = clipboard_button(target: '#ssh_project_clone', title: _("Copy URL"), class: "input-group-text gl-button btn btn-icon btn-default") = render_if_exists 'projects/buttons/geo' @@ -32,7 +32,7 @@ %label.label-bold{ class: 'gl-px-4!' } = _('Open in your IDE') - if ssh_enabled? - - escaped_ssh_url_to_repo = CGI.escape(project.ssh_url_to_repo) + - escaped_ssh_url_to_repo = CGI.escape(ssh_clone_url_to_repo(project)) %a.dropdown-item.open-with-link{ href: 'vscode://vscode.git/clone?url=' + escaped_ssh_url_to_repo } .gl-dropdown-item-text-wrapper = _('Visual Studio Code (SSH)') diff --git a/ee/app/helpers/ee/gitlab_routing_helper.rb b/ee/app/helpers/ee/gitlab_routing_helper.rb index 92ffa54f0298d3..09ad62fd3ba5dd 100644 --- a/ee/app/helpers/ee/gitlab_routing_helper.rb +++ b/ee/app/helpers/ee/gitlab_routing_helper.rb @@ -24,6 +24,13 @@ def geo_proxied_http_url_to_repo(proxy_base_url, container) "#{File.join(proxy_base_url, container.full_path)}.git" end + def geo_proxied_ssh_url_to_repo(proxied_site, primary_ssh_url) + ssh_uri = URI.parse(primary_ssh_url) + http_uri = proxied_site.uri + ssh_uri.host = http_uri.host + ssh_uri.to_s + end + def geo_primary_http_internal_url_to_repo(container) geo_primary_web_url(container, internal: true) + '.git' end diff --git a/ee/app/helpers/ee/projects_helper.rb b/ee/app/helpers/ee/projects_helper.rb index 2d2a24367e08ac..f13f3974873fa1 100644 --- a/ee/app/helpers/ee/projects_helper.rb +++ b/ee/app/helpers/ee/projects_helper.rb @@ -289,6 +289,12 @@ def geo_proxied_http_url(project) geo_proxied_http_url_to_repo(::Gitlab::Geo.proxied_site(request.env).url, project) end + def ssh_clone_url_to_repo(project) + proxied_site = ::Gitlab::Geo.proxied_site(request.env) + + ::Gitlab::Geo.proxied_request?(request.env) ? geo_proxied_ssh_url_to_repo(proxied_site, project.ssh_url_to_repo) : project.ssh_url_to_repo + end + private def remove_message_data(project) diff --git a/ee/spec/helpers/ee/gitlab_routing_helper_spec.rb b/ee/spec/helpers/ee/gitlab_routing_helper_spec.rb index 04a3521a867372..fcbc6d61cc39cf 100644 --- a/ee/spec/helpers/ee/gitlab_routing_helper_spec.rb +++ b/ee/spec/helpers/ee/gitlab_routing_helper_spec.rb @@ -62,6 +62,15 @@ it { is_expected.to eq('http://localhost:123/relative/foo/bar.git') } end + describe '#geo_proxied_ssh_url_to_repo' do + subject { helper.geo_proxied_ssh_url_to_repo(secondary_site, primary_ssh_url) } + + let(:secondary_site) { instance_double(GeoNode, uri: URI::HTTP.build(host: 'localhost', port: '321')) } + let(:primary_ssh_url) { 'ssh://git@primary:123/bar.git' } + + it { is_expected.to eq('ssh://git@localhost:123/bar.git') } + end + describe '#geo_primary_default_url_to_repo' do subject { helper.geo_primary_default_url_to_repo(repo) } -- GitLab From 7cebf39d3671220e1e91afb7c65e1e004dac3d14 Mon Sep 17 00:00:00 2001 From: Mariia Solodovnik Date: Tue, 7 Feb 2023 01:18:08 +0200 Subject: [PATCH 04/13] Add spec for geo_proxied_http_url method --- ee/spec/helpers/projects_helper_spec.rb | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/ee/spec/helpers/projects_helper_spec.rb b/ee/spec/helpers/projects_helper_spec.rb index 4ed11070bd60a0..8fedeb8f3bc5fd 100644 --- a/ee/spec/helpers/projects_helper_spec.rb +++ b/ee/spec/helpers/projects_helper_spec.rb @@ -3,6 +3,8 @@ require 'spec_helper' RSpec.describe ProjectsHelper do + include ::EE::GeoHelpers + let_it_be_with_refind(:project) { create(:project) } before do @@ -579,4 +581,19 @@ def dismiss_banner end end end + + describe '#geo_proxied_http_url' do + let(:geo_url) { 'http://localhost/geonode_url' } + let(:geo_node) { instance_double(GeoNode, url: geo_url) } + + subject { helper.geo_proxied_http_url(project) } + + before do + stub_proxied_site(geo_node) + + allow(helper).to receive(:geo_proxied_http_url_to_repo).with(geo_node.url, project).and_return(geo_url) + end + + it { expect(subject).to eq geo_url } + end end -- GitLab From f24b1b2d9452ad18b59644d606bcf13d7a376f74 Mon Sep 17 00:00:00 2001 From: Mariia Solodovnik Date: Fri, 10 Feb 2023 22:38:19 +0200 Subject: [PATCH 05/13] Refactor clone url methods Update ssh clone url for the mobile view, refactor http and ssh methods, update specs --- app/views/shared/_mobile_clone_panel.html.haml | 2 +- ee/app/helpers/ee/gitlab_routing_helper.rb | 11 ++++++----- ee/app/helpers/ee/projects_helper.rb | 12 +++++------- ee/lib/gitlab/geo.rb | 8 +++++--- ee/spec/helpers/ee/gitlab_routing_helper_spec.rb | 7 +++---- ee/spec/helpers/projects_helper_spec.rb | 4 ++-- 6 files changed, 22 insertions(+), 22 deletions(-) diff --git a/app/views/shared/_mobile_clone_panel.html.haml b/app/views/shared/_mobile_clone_panel.html.haml index 40d5b71bf0143d..909090eed58b94 100644 --- a/app/views/shared/_mobile_clone_panel.html.haml +++ b/app/views/shared/_mobile_clone_panel.html.haml @@ -9,7 +9,7 @@ %ul.dropdown-menu.dropdown-menu-selectable.dropdown-menu-right.clone-options-dropdown{ data: { dropdown: true } } - if ssh_enabled? %li - = dropdown_item_with_description(ssh_copy_label, project.ssh_url_to_repo, href: project.ssh_url_to_repo, data: { clone_type: 'ssh' }, default: true) + = dropdown_item_with_description(ssh_copy_label, ssh_clone_url_to_repo(project), href: project.ssh_url_to_repo, data: { clone_type: 'ssh' }, default: true) - if http_enabled? %li = dropdown_item_with_description(http_copy_label, http_clone_url_to_repo(project), href: http_clone_url_to_repo(project), data: { clone_type: 'http' }) diff --git a/ee/app/helpers/ee/gitlab_routing_helper.rb b/ee/app/helpers/ee/gitlab_routing_helper.rb index 09ad62fd3ba5dd..700c9110f8d163 100644 --- a/ee/app/helpers/ee/gitlab_routing_helper.rb +++ b/ee/app/helpers/ee/gitlab_routing_helper.rb @@ -20,14 +20,15 @@ def geo_primary_http_url_to_repo(container) geo_primary_web_url(container) + '.git' end - def geo_proxied_http_url_to_repo(proxy_base_url, container) - "#{File.join(proxy_base_url, container.full_path)}.git" + def geo_proxied_http_url_to_repo(proxied_site, container) + "#{File.join(proxied_site.url, container.full_path)}.git" end - def geo_proxied_ssh_url_to_repo(proxied_site, primary_ssh_url) + def geo_proxied_ssh_url_to_repo(proxied_site, container) + primary_ssh_url = container.ssh_url_to_repo + ssh_uri = URI.parse(primary_ssh_url) - http_uri = proxied_site.uri - ssh_uri.host = http_uri.host + ssh_uri.host = proxied_site.uri.host ssh_uri.to_s end diff --git a/ee/app/helpers/ee/projects_helper.rb b/ee/app/helpers/ee/projects_helper.rb index f13f3974873fa1..d3ece9042660ad 100644 --- a/ee/app/helpers/ee/projects_helper.rb +++ b/ee/app/helpers/ee/projects_helper.rb @@ -281,18 +281,16 @@ def project_compliance_framework_app_data(project, can_edit) end end - def http_clone_url_to_repo(project) - ::Gitlab::Geo.proxied_request?(request.env) ? geo_proxied_http_url(project) : project.http_url_to_repo + def proxied_site + ::Gitlab::Geo.proxied_site(request.env) end - def geo_proxied_http_url(project) - geo_proxied_http_url_to_repo(::Gitlab::Geo.proxied_site(request.env).url, project) + def http_clone_url_to_repo(project) + ::Gitlab::Geo.proxied_request?(request.env) ? geo_proxied_http_url_to_repo(proxied_site, project) : project.http_url_to_repo end def ssh_clone_url_to_repo(project) - proxied_site = ::Gitlab::Geo.proxied_site(request.env) - - ::Gitlab::Geo.proxied_request?(request.env) ? geo_proxied_ssh_url_to_repo(proxied_site, project.ssh_url_to_repo) : project.ssh_url_to_repo + ::Gitlab::Geo.proxied_request?(request.env) ? geo_proxied_ssh_url_to_repo(proxied_site, project) : project.ssh_url_to_repo end private diff --git a/ee/lib/gitlab/geo.rb b/ee/lib/gitlab/geo.rb index d7b1a95191bbc0..eefdc363b7611b 100644 --- a/ee/lib/gitlab/geo.rb +++ b/ee/lib/gitlab/geo.rb @@ -184,10 +184,12 @@ def self.proxied_site(env) return unless ::Gitlab::Geo.primary? return unless proxied_request?(env) && env[GEO_PROXIED_EXTRA_DATA_HEADER].present? - signed_data = Gitlab::Geo::SignedData.new - signed_data.decode_data(env[GEO_PROXIED_EXTRA_DATA_HEADER]) + strong_memoize(:proxied_site) do + signed_data = Gitlab::Geo::SignedData.new + signed_data.decode_data(env[GEO_PROXIED_EXTRA_DATA_HEADER]) - signed_data.geo_node + signed_data.geo_node + end end def self.license_allows? diff --git a/ee/spec/helpers/ee/gitlab_routing_helper_spec.rb b/ee/spec/helpers/ee/gitlab_routing_helper_spec.rb index fcbc6d61cc39cf..154b34f0571301 100644 --- a/ee/spec/helpers/ee/gitlab_routing_helper_spec.rb +++ b/ee/spec/helpers/ee/gitlab_routing_helper_spec.rb @@ -54,19 +54,18 @@ end describe '#geo_proxied_http_url_to_repo' do - subject { helper.geo_proxied_http_url_to_repo(base_url, repo) } + subject { helper.geo_proxied_http_url_to_repo(primary, repo) } let(:repo) { project } - let(:base_url) { primary.url } it { is_expected.to eq('http://localhost:123/relative/foo/bar.git') } end describe '#geo_proxied_ssh_url_to_repo' do - subject { helper.geo_proxied_ssh_url_to_repo(secondary_site, primary_ssh_url) } + subject { helper.geo_proxied_ssh_url_to_repo(secondary_site, primary_container) } let(:secondary_site) { instance_double(GeoNode, uri: URI::HTTP.build(host: 'localhost', port: '321')) } - let(:primary_ssh_url) { 'ssh://git@primary:123/bar.git' } + let(:primary_container) { instance_double(Project, ssh_url_to_repo: 'ssh://git@primary:123/bar.git') } it { is_expected.to eq('ssh://git@localhost:123/bar.git') } end diff --git a/ee/spec/helpers/projects_helper_spec.rb b/ee/spec/helpers/projects_helper_spec.rb index 8fedeb8f3bc5fd..774a259403de0d 100644 --- a/ee/spec/helpers/projects_helper_spec.rb +++ b/ee/spec/helpers/projects_helper_spec.rb @@ -586,12 +586,12 @@ def dismiss_banner let(:geo_url) { 'http://localhost/geonode_url' } let(:geo_node) { instance_double(GeoNode, url: geo_url) } - subject { helper.geo_proxied_http_url(project) } + subject { helper.http_clone_url_to_repo(project) } before do stub_proxied_site(geo_node) - allow(helper).to receive(:geo_proxied_http_url_to_repo).with(geo_node.url, project).and_return(geo_url) + allow(helper).to receive(:geo_proxied_http_url_to_repo).with(geo_node, project).and_return(geo_url) end it { expect(subject).to eq geo_url } -- GitLab From 40b4522ae339fd40279e1486f1a2fc2c5a5a791a Mon Sep 17 00:00:00 2001 From: Mariia Solodovnik Date: Wed, 15 Feb 2023 21:39:35 +0200 Subject: [PATCH 06/13] Fix typos, add explanation comment for strong_memoize --- app/views/shared/_mobile_clone_panel.html.haml | 2 +- ee/lib/gitlab/geo.rb | 2 ++ ee/spec/helpers/projects_helper_spec.rb | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/views/shared/_mobile_clone_panel.html.haml b/app/views/shared/_mobile_clone_panel.html.haml index 909090eed58b94..aa3043b8fd600e 100644 --- a/app/views/shared/_mobile_clone_panel.html.haml +++ b/app/views/shared/_mobile_clone_panel.html.haml @@ -9,7 +9,7 @@ %ul.dropdown-menu.dropdown-menu-selectable.dropdown-menu-right.clone-options-dropdown{ data: { dropdown: true } } - if ssh_enabled? %li - = dropdown_item_with_description(ssh_copy_label, ssh_clone_url_to_repo(project), href: project.ssh_url_to_repo, data: { clone_type: 'ssh' }, default: true) + = dropdown_item_with_description(ssh_copy_label, ssh_clone_url_to_repo(project), href: ssh_clone_url_to_repo(project), data: { clone_type: 'ssh' }, default: true) - if http_enabled? %li = dropdown_item_with_description(http_copy_label, http_clone_url_to_repo(project), href: http_clone_url_to_repo(project), data: { clone_type: 'http' }) diff --git a/ee/lib/gitlab/geo.rb b/ee/lib/gitlab/geo.rb index eefdc363b7611b..42aa9614f186a7 100644 --- a/ee/lib/gitlab/geo.rb +++ b/ee/lib/gitlab/geo.rb @@ -184,6 +184,8 @@ def self.proxied_site(env) return unless ::Gitlab::Geo.primary? return unless proxied_request?(env) && env[GEO_PROXIED_EXTRA_DATA_HEADER].present? + # Note: The env argument is not needed after the first call within a request context. + # All subsequent calls within a request should return the same GeoNode record. strong_memoize(:proxied_site) do signed_data = Gitlab::Geo::SignedData.new signed_data.decode_data(env[GEO_PROXIED_EXTRA_DATA_HEADER]) diff --git a/ee/spec/helpers/projects_helper_spec.rb b/ee/spec/helpers/projects_helper_spec.rb index 774a259403de0d..1472cd241f9ff8 100644 --- a/ee/spec/helpers/projects_helper_spec.rb +++ b/ee/spec/helpers/projects_helper_spec.rb @@ -582,7 +582,7 @@ def dismiss_banner end end - describe '#geo_proxied_http_url' do + describe '#http_clone_url_to_repo' do let(:geo_url) { 'http://localhost/geonode_url' } let(:geo_node) { instance_double(GeoNode, url: geo_url) } -- GitLab From 883675b647de8530266e58beb45e1df7dffbd171 Mon Sep 17 00:00:00 2001 From: Mariia Solodovnik Date: Thu, 16 Feb 2023 18:26:29 +0200 Subject: [PATCH 07/13] Use Addressable::URI instead of URI for ssh_url parsing --- ee/app/helpers/ee/gitlab_routing_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ee/app/helpers/ee/gitlab_routing_helper.rb b/ee/app/helpers/ee/gitlab_routing_helper.rb index 700c9110f8d163..24b4234b210de4 100644 --- a/ee/app/helpers/ee/gitlab_routing_helper.rb +++ b/ee/app/helpers/ee/gitlab_routing_helper.rb @@ -27,7 +27,7 @@ def geo_proxied_http_url_to_repo(proxied_site, container) def geo_proxied_ssh_url_to_repo(proxied_site, container) primary_ssh_url = container.ssh_url_to_repo - ssh_uri = URI.parse(primary_ssh_url) + ssh_uri = Addressable::URI.parse(primary_ssh_url) ssh_uri.host = proxied_site.uri.host ssh_uri.to_s end -- GitLab From 1aa4e49d6823499e50f8e80a6acc3ddc5743e44b Mon Sep 17 00:00:00 2001 From: Mariia Solodovnik Date: Sat, 18 Feb 2023 22:48:17 +0200 Subject: [PATCH 08/13] Refactor geo_proxied_ssh_url_to_repo to work with ssh urls without port --- ee/app/helpers/ee/gitlab_routing_helper.rb | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/ee/app/helpers/ee/gitlab_routing_helper.rb b/ee/app/helpers/ee/gitlab_routing_helper.rb index 24b4234b210de4..84393cdc0badda 100644 --- a/ee/app/helpers/ee/gitlab_routing_helper.rb +++ b/ee/app/helpers/ee/gitlab_routing_helper.rb @@ -26,10 +26,19 @@ def geo_proxied_http_url_to_repo(proxied_site, container) def geo_proxied_ssh_url_to_repo(proxied_site, container) primary_ssh_url = container.ssh_url_to_repo + secondary_host = proxied_site.uri.host - ssh_uri = Addressable::URI.parse(primary_ssh_url) - ssh_uri.host = proxied_site.uri.host - ssh_uri.to_s + if ::Gitlab.config.gitlab_shell.ssh_port != 22 + ssh_uri = URI.parse(primary_ssh_url) + ssh_uri.host = secondary_host + ssh_uri.to_s + else + # Note: if ssh_port is configured to 22, resulting ssh url does not contain the port + # URI.parse does not parse urls with no port + # Substitute original ssh_host with the proxied site host + + primary_ssh_url.gsub(::Gitlab.config.gitlab_shell.ssh_host, secondary_host) + end end def geo_primary_http_internal_url_to_repo(container) -- GitLab From bc1cba7f81bed256376094815183c6dcb5048977 Mon Sep 17 00:00:00 2001 From: Mariia Solodovnik Date: Mon, 20 Feb 2023 21:52:56 +0200 Subject: [PATCH 09/13] Stub secondary site in spec for proxy behaviour, add default port spec --- .../helpers/ee/gitlab_routing_helper_spec.rb | 37 +++++++++++++++++-- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/ee/spec/helpers/ee/gitlab_routing_helper_spec.rb b/ee/spec/helpers/ee/gitlab_routing_helper_spec.rb index 154b34f0571301..d22665465d86f2 100644 --- a/ee/spec/helpers/ee/gitlab_routing_helper_spec.rb +++ b/ee/spec/helpers/ee/gitlab_routing_helper_spec.rb @@ -5,6 +5,7 @@ RSpec.describe EE::GitlabRoutingHelper do include ProjectsHelper include ApplicationSettingsHelper + include EE::GeoHelpers let_it_be(:primary, reload: true) do create( @@ -62,12 +63,40 @@ end describe '#geo_proxied_ssh_url_to_repo' do - subject { helper.geo_proxied_ssh_url_to_repo(secondary_site, primary_container) } + subject { helper.geo_proxied_ssh_url_to_repo(proxied_site, primary_container) } - let(:secondary_site) { instance_double(GeoNode, uri: URI::HTTP.build(host: 'localhost', port: '321')) } - let(:primary_container) { instance_double(Project, ssh_url_to_repo: 'ssh://git@primary:123/bar.git') } + let(:proxied_site) { instance_double(GeoNode, uri: URI::HTTP.build(host: 'proxied-host', port: 5678)) } + let(:primary_container) { instance_double(Project, ssh_url_to_repo: ssh_url_to_repo) } - it { is_expected.to eq('ssh://git@localhost:123/bar.git') } + context 'with default gitlab shell ssh_port' do + let(:ssh_url_to_repo) { 'git@primary:bar.git' } + + before do + stub_config( + gitlab_shell: { + ssh_port: 22, + ssh_host: 'primary' + } + ) + end + + it { is_expected.to eq('git@proxied-host:bar.git') } + end + + context 'with custom gitlab shell ssh_port' do + let(:ssh_url_to_repo) { 'ssh://git@primary:123/bar.git' } + + before do + stub_config( + gitlab_shell: { + ssh_port: 123, + ssh_host: 'primary' + } + ) + end + + it { is_expected.to eq('ssh://git@proxied-host:123/bar.git') } + end end describe '#geo_primary_default_url_to_repo' do -- GitLab From 9c8754b2a2feb354ebb4943ce7249d1c0d1f71ee Mon Sep 17 00:00:00 2001 From: Mariia Solodovnik Date: Thu, 23 Feb 2023 17:26:29 +0200 Subject: [PATCH 10/13] Use gsub for proxy ssh_url for both default and non-default ports --- ee/app/helpers/ee/gitlab_routing_helper.rb | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/ee/app/helpers/ee/gitlab_routing_helper.rb b/ee/app/helpers/ee/gitlab_routing_helper.rb index 84393cdc0badda..d089929de04c98 100644 --- a/ee/app/helpers/ee/gitlab_routing_helper.rb +++ b/ee/app/helpers/ee/gitlab_routing_helper.rb @@ -28,17 +28,10 @@ def geo_proxied_ssh_url_to_repo(proxied_site, container) primary_ssh_url = container.ssh_url_to_repo secondary_host = proxied_site.uri.host - if ::Gitlab.config.gitlab_shell.ssh_port != 22 - ssh_uri = URI.parse(primary_ssh_url) - ssh_uri.host = secondary_host - ssh_uri.to_s - else - # Note: if ssh_port is configured to 22, resulting ssh url does not contain the port - # URI.parse does not parse urls with no port - # Substitute original ssh_host with the proxied site host - - primary_ssh_url.gsub(::Gitlab.config.gitlab_shell.ssh_host, secondary_host) - end + # Note: if ssh_port is configured to 22, resulting ssh url does not contain the port + # URI.parse does not parse urls with no port + # Substitute original ssh_host with the proxied site host + primary_ssh_url.gsub(::Gitlab.config.gitlab_shell.ssh_host, secondary_host) end def geo_primary_http_internal_url_to_repo(container) -- GitLab From 77c425d0eeec073517439a5680a2c4958e8f018e Mon Sep 17 00:00:00 2001 From: Sean Arnold Date: Mon, 27 Feb 2023 13:09:15 +0000 Subject: [PATCH 11/13] Use override / super flow for EE http_clone_url_to_repo method --- app/helpers/projects_helper.rb | 16 ++++++++-------- ee/app/helpers/ee/projects_helper.rb | 3 ++- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index d5d7095af09ee0..74e32e00bbf7d3 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -502,6 +502,14 @@ def remote_mirror_setting_enabled? false end + def http_clone_url_to_repo(project) + project.http_url_to_repo + end + + def ssh_clone_url_to_repo(project) + project.ssh_url_to_repo + end + private def localized_access_names @@ -828,12 +836,4 @@ def can_admin_group_clusters?(project) project.group && project.group.clusters.any? && can?(current_user, :admin_cluster, project.group) end -def http_clone_url_to_repo(project) - project.http_url_to_repo -end - -def ssh_clone_url_to_repo(project) - project.ssh_url_to_repo -end - ProjectsHelper.prepend_mod_with('ProjectsHelper') diff --git a/ee/app/helpers/ee/projects_helper.rb b/ee/app/helpers/ee/projects_helper.rb index d3ece9042660ad..233c41fac65b9f 100644 --- a/ee/app/helpers/ee/projects_helper.rb +++ b/ee/app/helpers/ee/projects_helper.rb @@ -285,8 +285,9 @@ def proxied_site ::Gitlab::Geo.proxied_site(request.env) end + override :http_clone_url_to_repo def http_clone_url_to_repo(project) - ::Gitlab::Geo.proxied_request?(request.env) ? geo_proxied_http_url_to_repo(proxied_site, project) : project.http_url_to_repo + ::Gitlab::Geo.proxied_request?(request.env) ? geo_proxied_http_url_to_repo(proxied_site, project) : super end def ssh_clone_url_to_repo(project) -- GitLab From 2a789c285c8db3a7e1fa6adc990b886ec527f0f2 Mon Sep 17 00:00:00 2001 From: Mariia Solodovnik Date: Mon, 27 Feb 2023 20:48:21 +0200 Subject: [PATCH 12/13] Add specs for http and ssh clone url links --- spec/helpers/projects_helper_spec.rb | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/spec/helpers/projects_helper_spec.rb b/spec/helpers/projects_helper_spec.rb index 3c8a692b0b3d4f..978fbddcfe5f30 100644 --- a/spec/helpers/projects_helper_spec.rb +++ b/spec/helpers/projects_helper_spec.rb @@ -1384,4 +1384,24 @@ def license_name expect(helper.remote_mirror_setting_enabled?).to be_falsy end end + + describe '#http_clone_url_to_repo' do + before do + allow(project).to receive(:http_url_to_repo).and_return('http_url_to_repo') + end + + subject { helper.http_clone_url_to_repo(project) } + + it { expect(subject).to eq('http_url_to_repo') } + end + + describe '#ssh_clone_url_to_repo' do + before do + allow(project).to receive(:ssh_url_to_repo).and_return('ssh_url_to_repo') + end + + subject { helper.ssh_clone_url_to_repo(project) } + + it { expect(subject).to eq('ssh_url_to_repo') } + end end -- GitLab From 751c0f7c0f98eb32db8b08bc376bf381b680a39f Mon Sep 17 00:00:00 2001 From: Mariia Solodovnik Date: Fri, 3 Mar 2023 18:29:03 +0200 Subject: [PATCH 13/13] Add override and spec for ssh_clone_url_to_repo --- ee/app/helpers/ee/projects_helper.rb | 3 ++- ee/spec/helpers/projects_helper_spec.rb | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/ee/app/helpers/ee/projects_helper.rb b/ee/app/helpers/ee/projects_helper.rb index 233c41fac65b9f..7c5957fcf2435f 100644 --- a/ee/app/helpers/ee/projects_helper.rb +++ b/ee/app/helpers/ee/projects_helper.rb @@ -290,8 +290,9 @@ def http_clone_url_to_repo(project) ::Gitlab::Geo.proxied_request?(request.env) ? geo_proxied_http_url_to_repo(proxied_site, project) : super end + override :ssh_clone_url_to_repo def ssh_clone_url_to_repo(project) - ::Gitlab::Geo.proxied_request?(request.env) ? geo_proxied_ssh_url_to_repo(proxied_site, project) : project.ssh_url_to_repo + ::Gitlab::Geo.proxied_request?(request.env) ? geo_proxied_ssh_url_to_repo(proxied_site, project) : super end private diff --git a/ee/spec/helpers/projects_helper_spec.rb b/ee/spec/helpers/projects_helper_spec.rb index 1472cd241f9ff8..dc7073973184e5 100644 --- a/ee/spec/helpers/projects_helper_spec.rb +++ b/ee/spec/helpers/projects_helper_spec.rb @@ -596,4 +596,19 @@ def dismiss_banner it { expect(subject).to eq geo_url } end + + describe '#ssh_clone_url_to_repo' do + let(:geo_url) { 'git@localhost/geonode_url' } + let(:geo_node) { instance_double(GeoNode, url: geo_url) } + + subject { helper.ssh_clone_url_to_repo(project) } + + before do + stub_proxied_site(geo_node) + + allow(helper).to receive(:geo_proxied_ssh_url_to_repo).with(geo_node, project).and_return(geo_url) + end + + it { expect(subject).to eq geo_url } + end end -- GitLab