diff --git a/ee/app/models/gitlab_subscriptions/features.rb b/ee/app/models/gitlab_subscriptions/features.rb index 89316ee19eaf8ff934ddfe8239346219faaa2c3f..e4c26f565753d7f6ef253d9942e289ab1e83a011 100644 --- a/ee/app/models/gitlab_subscriptions/features.rb +++ b/ee/app/models/gitlab_subscriptions/features.rb @@ -150,6 +150,7 @@ class Features microsoft_group_sync operations_dashboard package_forwarding + packages_virtual_registry pages_size_limit pages_multiple_versions productivity_analytics diff --git a/lib/api/concerns/virtual_registries/packages/endpoint.rb b/ee/lib/api/concerns/virtual_registries/packages/endpoint.rb similarity index 100% rename from lib/api/concerns/virtual_registries/packages/endpoint.rb rename to ee/lib/api/concerns/virtual_registries/packages/endpoint.rb diff --git a/ee/lib/api/concerns/virtual_registries/packages/maven/shared_setup.rb b/ee/lib/api/concerns/virtual_registries/packages/maven/shared_setup.rb new file mode 100644 index 0000000000000000000000000000000000000000..10d31e9d14f96b80684542fa087da62c9ce98a5d --- /dev/null +++ b/ee/lib/api/concerns/virtual_registries/packages/maven/shared_setup.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +module API + module Concerns + module VirtualRegistries + module Packages + module Maven + module SharedSetup + extend ActiveSupport::Concern + include ::API::Helpers::Authentication + + included do + feature_category :virtual_registry + urgency :low + + authenticate_with do |accept| + accept.token_types(:personal_access_token).sent_through(:http_private_token_header) + accept.token_types(:deploy_token).sent_through(:http_deploy_token_header) + accept.token_types(:job_token).sent_through(:http_job_token_header) + end + + after_validation do + not_found! unless ::Feature.enabled?(:virtual_registry_maven, current_user) + not_found! unless ::Gitlab.config.dependency_proxy.enabled + not_found! unless target_group.licensed_feature_available?(:packages_virtual_registry) + + authenticate! + end + end + end + end + end + end + end +end diff --git a/lib/api/entities/virtual_registries/packages/maven/cache/entry.rb b/ee/lib/api/entities/virtual_registries/packages/maven/cache/entry.rb similarity index 100% rename from lib/api/entities/virtual_registries/packages/maven/cache/entry.rb rename to ee/lib/api/entities/virtual_registries/packages/maven/cache/entry.rb diff --git a/lib/api/entities/virtual_registries/packages/maven/registry.rb b/ee/lib/api/entities/virtual_registries/packages/maven/registry.rb similarity index 100% rename from lib/api/entities/virtual_registries/packages/maven/registry.rb rename to ee/lib/api/entities/virtual_registries/packages/maven/registry.rb diff --git a/lib/api/entities/virtual_registries/packages/maven/upstream.rb b/ee/lib/api/entities/virtual_registries/packages/maven/upstream.rb similarity index 100% rename from lib/api/entities/virtual_registries/packages/maven/upstream.rb rename to ee/lib/api/entities/virtual_registries/packages/maven/upstream.rb diff --git a/lib/api/virtual_registries/packages/maven/cache/entries.rb b/ee/lib/api/virtual_registries/packages/maven/cache/entries.rb similarity index 83% rename from lib/api/virtual_registries/packages/maven/cache/entries.rb rename to ee/lib/api/virtual_registries/packages/maven/cache/entries.rb index f900b3f1f3bad4181ddb7b6124debd6fd26e925f..deacfc9307f78e239ef93c11be818689da6223cf 100644 --- a/lib/api/virtual_registries/packages/maven/cache/entries.rb +++ b/ee/lib/api/virtual_registries/packages/maven/cache/entries.rb @@ -6,23 +6,14 @@ module Packages module Maven module Cache class Entries < ::API::Base - include ::API::Helpers::Authentication + include ::API::Concerns::VirtualRegistries::Packages::Maven::SharedSetup include ::API::PaginationParams - feature_category :virtual_registry - urgency :low - - authenticate_with do |accept| - accept.token_types(:personal_access_token).sent_through(:http_private_token_header) - accept.token_types(:deploy_token).sent_through(:http_deploy_token_header) - accept.token_types(:job_token).sent_through(:http_job_token_header) - end - helpers do include ::Gitlab::Utils::StrongMemoize - def require_dependency_proxy_enabled! - not_found! unless ::Gitlab.config.dependency_proxy.enabled + def target_group + request.path.include?('/upstreams') ? upstream.group : cache_entry.group end def upstream @@ -42,14 +33,6 @@ def cache_entry strong_memoize_attr :cache_entry end - after_validation do - not_found! unless Feature.enabled?(:virtual_registry_maven, current_user) - - require_dependency_proxy_enabled! - - authenticate! - end - namespace 'virtual_registries/packages/maven' do namespace :upstreams do route_param :id, type: Integer, desc: 'The ID of the maven virtual registry upstream' do diff --git a/lib/api/virtual_registries/packages/maven/endpoints.rb b/ee/lib/api/virtual_registries/packages/maven/endpoints.rb similarity index 91% rename from lib/api/virtual_registries/packages/maven/endpoints.rb rename to ee/lib/api/virtual_registries/packages/maven/endpoints.rb index 5437850785d896807db332f22cbcf388dc4ad016..0e48c012958be3268cbcd28e81f41e016bead0b4 100644 --- a/lib/api/virtual_registries/packages/maven/endpoints.rb +++ b/ee/lib/api/virtual_registries/packages/maven/endpoints.rb @@ -5,13 +5,10 @@ module VirtualRegistries module Packages module Maven class Endpoints < ::API::Base - include ::API::Helpers::Authentication + include ::API::Concerns::VirtualRegistries::Packages::Maven::SharedSetup include ::API::Concerns::VirtualRegistries::Packages::Endpoint include ::API::APIGuard - feature_category :virtual_registry - urgency :low - AUTHENTICATE_REALM_HEADER = 'WWW-Authenticate' AUTHENTICATE_REALM_NAME = 'Basic realm="GitLab Virtual Registry"' @@ -36,10 +33,7 @@ class Endpoints < ::API::Base include ::Gitlab::Utils::StrongMemoize delegate :group, :upstream, :registry_upstream, to: :registry - - def require_dependency_proxy_enabled! - not_found! unless ::Gitlab.config.dependency_proxy.enabled - end + alias_method :target_group, :group def registry ::VirtualRegistries::Packages::Maven::Registry.find(params[:id]) @@ -71,14 +65,6 @@ def unauthorized!(reason = nil) end end - after_validation do - not_found! unless Feature.enabled?(:virtual_registry_maven, current_user) - - require_dependency_proxy_enabled! - - authenticate! - end - namespace 'virtual_registries/packages/maven/:id/*path' do desc 'Download endpoint of the Maven virtual registry.' do detail 'This feature was introduced in GitLab 17.3. \ @@ -137,7 +123,7 @@ def unauthorized!(reason = nil) require_gitlab_workhorse! authorize!(:read_virtual_registry, registry) - etag, content_type, upstream_gid = request.headers.fetch_values( + etag, content_type, upstream_gid = headers.fetch_values( 'Etag', ::Gitlab::Workhorse::SEND_DEPENDENCY_CONTENT_TYPE_HEADER, UPSTREAM_GID_HEADER diff --git a/lib/api/virtual_registries/packages/maven/registries.rb b/ee/lib/api/virtual_registries/packages/maven/registries.rb similarity index 87% rename from lib/api/virtual_registries/packages/maven/registries.rb rename to ee/lib/api/virtual_registries/packages/maven/registries.rb index 7ab9678411f391cee26d4b1d9e3e3e0979d34afc..a5b6a8ad8cfbb89f28106ac0a0ff3d8d9168b714 100644 --- a/lib/api/virtual_registries/packages/maven/registries.rb +++ b/ee/lib/api/virtual_registries/packages/maven/registries.rb @@ -5,20 +5,15 @@ module VirtualRegistries module Packages module Maven class Registries < ::API::Base - include ::API::Helpers::Authentication - - feature_category :virtual_registry - urgency :low - - authenticate_with do |accept| - accept.token_types(:personal_access_token).sent_through(:http_private_token_header) - accept.token_types(:deploy_token).sent_through(:http_deploy_token_header) - accept.token_types(:job_token).sent_through(:http_job_token_header) - end + include ::API::Concerns::VirtualRegistries::Packages::Maven::SharedSetup helpers do include ::Gitlab::Utils::StrongMemoize + def target_group + request.path.include?('/groups') ? group : registry.group + end + def group find_group!(params[:id]) end @@ -32,18 +27,6 @@ def registry def policy_subject ::VirtualRegistries::Packages::Policies::Group.new(group) end - - def require_dependency_proxy_enabled! - not_found! unless ::Gitlab.config.dependency_proxy.enabled - end - end - - after_validation do - not_found! unless Feature.enabled?(:virtual_registry_maven, current_user) - - require_dependency_proxy_enabled! - - authenticate! end resource :groups, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do diff --git a/lib/api/virtual_registries/packages/maven/upstreams.rb b/ee/lib/api/virtual_registries/packages/maven/upstreams.rb similarity index 91% rename from lib/api/virtual_registries/packages/maven/upstreams.rb rename to ee/lib/api/virtual_registries/packages/maven/upstreams.rb index 8bb1c9011914423327581c1313386f1e0d7853c5..9b21822f71173337b7976f2ab97188b45f3ef744 100644 --- a/lib/api/virtual_registries/packages/maven/upstreams.rb +++ b/ee/lib/api/virtual_registries/packages/maven/upstreams.rb @@ -5,24 +5,15 @@ module VirtualRegistries module Packages module Maven class Upstreams < ::API::Base - include ::API::Helpers::Authentication - - feature_category :virtual_registry - urgency :low - - authenticate_with do |accept| - accept.token_types(:personal_access_token).sent_through(:http_private_token_header) - accept.token_types(:deploy_token).sent_through(:http_deploy_token_header) - accept.token_types(:job_token).sent_through(:http_job_token_header) - end + include ::API::Concerns::VirtualRegistries::Packages::Maven::SharedSetup helpers do include ::Gitlab::Utils::StrongMemoize delegate :group, :registry_upstream, to: :registry - def require_dependency_proxy_enabled! - not_found! unless Gitlab.config.dependency_proxy.enabled + def target_group + request.path.include?('/registries') ? group : upstream.group end def registry @@ -36,14 +27,6 @@ def upstream strong_memoize_attr :upstream end - after_validation do - not_found! unless Feature.enabled?(:virtual_registry_maven, current_user) - - require_dependency_proxy_enabled! - - authenticate! - end - namespace 'virtual_registries/packages/maven' do namespace :registries do route_param :id, type: Integer, desc: 'The ID of the maven virtual registry' do diff --git a/ee/lib/ee/api/api.rb b/ee/lib/ee/api/api.rb index e82bbd7bae55bed96137749748692be3245669bf..dba3ed0e650004f73abf489283656966109024bb 100644 --- a/ee/lib/ee/api/api.rb +++ b/ee/lib/ee/api/api.rb @@ -80,6 +80,10 @@ module API mount ::API::Chat mount ::API::DuoCodeReview mount ::API::SecurityScans + mount ::API::VirtualRegistries::Packages::Maven::Registries + mount ::API::VirtualRegistries::Packages::Maven::Upstreams + mount ::API::VirtualRegistries::Packages::Maven::Cache::Entries + mount ::API::VirtualRegistries::Packages::Maven::Endpoints mount ::API::Internal::AppSec::Dast::SiteValidations mount ::API::Internal::Search::Zoekt diff --git a/spec/features/api/virtual_registries/packages/maven_spec.rb b/ee/spec/features/virtual_registries/packages/maven_spec.rb similarity index 95% rename from spec/features/api/virtual_registries/packages/maven_spec.rb rename to ee/spec/features/virtual_registries/packages/maven_spec.rb index af141cc75350d29e234cac078a7e8d8d9fb57950..f1bf4fd143ea790ca0cc98970b97c2ef187bd081 100644 --- a/spec/features/api/virtual_registries/packages/maven_spec.rb +++ b/ee/spec/features/virtual_registries/packages/maven_spec.rb @@ -10,6 +10,7 @@ let_it_be(:user) { create(:user, owner_of: group) } let_it_be(:personal_access_token) { create(:personal_access_token, user: user) } let_it_be(:registry) { create(:virtual_registries_packages_maven_registry, group: group) } + let_it_be(:upstream) { create(:virtual_registries_packages_maven_upstream, registry: registry) } let_it_be(:external_server) do handler = ->(env) do @@ -23,10 +24,6 @@ run_server(handler) end - let_it_be(:upstream) do - create(:virtual_registries_packages_maven_upstream, registry: registry) - end - let(:api_path) { "/virtual_registries/packages/maven/#{registry.id}/file" } let(:url) { capybara_url(api(api_path)) } let(:authorization) do @@ -38,6 +35,7 @@ before do upstream.update_column(:url, external_server.base_url) # avoids guard that rejects local urls stub_config(dependency_proxy: { enabled: true }) + stub_licensed_features(packages_virtual_registry: true) allow(Gitlab::CurrentSettings).to receive(:allow_local_requests_from_web_hooks_and_services?).and_return(true) end diff --git a/spec/lib/api/entities/virtual_registries/packages/maven/cache/entry_spec.rb b/ee/spec/lib/api/entities/virtual_registries/packages/maven/cache/entry_spec.rb similarity index 100% rename from spec/lib/api/entities/virtual_registries/packages/maven/cache/entry_spec.rb rename to ee/spec/lib/api/entities/virtual_registries/packages/maven/cache/entry_spec.rb diff --git a/spec/lib/api/entities/virtual_registries/packages/maven/registry_spec.rb b/ee/spec/lib/api/entities/virtual_registries/packages/maven/registry_spec.rb similarity index 100% rename from spec/lib/api/entities/virtual_registries/packages/maven/registry_spec.rb rename to ee/spec/lib/api/entities/virtual_registries/packages/maven/registry_spec.rb diff --git a/spec/lib/api/entities/virtual_registries/packages/maven/upstream_spec.rb b/ee/spec/lib/api/entities/virtual_registries/packages/maven/upstream_spec.rb similarity index 100% rename from spec/lib/api/entities/virtual_registries/packages/maven/upstream_spec.rb rename to ee/spec/lib/api/entities/virtual_registries/packages/maven/upstream_spec.rb diff --git a/spec/requests/api/virtual_registries/packages/maven/cache/entries_spec.rb b/ee/spec/requests/api/virtual_registries/packages/maven/cache/entries_spec.rb similarity index 97% rename from spec/requests/api/virtual_registries/packages/maven/cache/entries_spec.rb rename to ee/spec/requests/api/virtual_registries/packages/maven/cache/entries_spec.rb index b2069b269f1c8e99c10603ae1801f62d89d95ec6..617bf5726ba5f155215575ea57e7fd8a22c78c99 100644 --- a/spec/requests/api/virtual_registries/packages/maven/cache/entries_spec.rb +++ b/ee/spec/requests/api/virtual_registries/packages/maven/cache/entries_spec.rb @@ -41,6 +41,7 @@ it_behaves_like 'disabled virtual_registry_maven feature flag' it_behaves_like 'maven virtual registry disabled dependency proxy' it_behaves_like 'maven virtual registry not authenticated user' + it_behaves_like 'maven virtual registry feature not licensed' context 'with invalid upstream' do where(:upstream_id, :status) do @@ -132,6 +133,7 @@ it_behaves_like 'disabled virtual_registry_maven feature flag' it_behaves_like 'maven virtual registry disabled dependency proxy' it_behaves_like 'maven virtual registry not authenticated user' + it_behaves_like 'maven virtual registry feature not licensed' context 'for different user roles' do where(:user_role, :status) do diff --git a/spec/requests/api/virtual_registries/packages/maven/endpoints_spec.rb b/ee/spec/requests/api/virtual_registries/packages/maven/endpoints_spec.rb similarity index 98% rename from spec/requests/api/virtual_registries/packages/maven/endpoints_spec.rb rename to ee/spec/requests/api/virtual_registries/packages/maven/endpoints_spec.rb index eb88a1c3e132c6c62181a5862e78a3896be93df8..01dddb1a47fac31bc3e0b073b3362f372815e2be 100644 --- a/spec/requests/api/virtual_registries/packages/maven/endpoints_spec.rb +++ b/ee/spec/requests/api/virtual_registries/packages/maven/endpoints_spec.rb @@ -212,6 +212,7 @@ end it_behaves_like 'maven virtual registry not authenticated user' + it_behaves_like 'maven virtual registry feature not licensed' end describe 'POST /api/v4/virtual_registries/packages/maven/:id/*path/upload' do @@ -311,5 +312,6 @@ end it_behaves_like 'maven virtual registry not authenticated user' + it_behaves_like 'maven virtual registry feature not licensed' end end diff --git a/spec/requests/api/virtual_registries/packages/maven/registries_spec.rb b/ee/spec/requests/api/virtual_registries/packages/maven/registries_spec.rb similarity index 97% rename from spec/requests/api/virtual_registries/packages/maven/registries_spec.rb rename to ee/spec/requests/api/virtual_registries/packages/maven/registries_spec.rb index de71971e8dbbe62121c9eaf605bf4d3278dcdef7..7dccd68270a85fe3c4242cde803d07b5bdba55bd 100644 --- a/spec/requests/api/virtual_registries/packages/maven/registries_spec.rb +++ b/ee/spec/requests/api/virtual_registries/packages/maven/registries_spec.rb @@ -26,6 +26,7 @@ it_behaves_like 'disabled virtual_registry_maven feature flag' it_behaves_like 'maven virtual registry disabled dependency proxy' it_behaves_like 'maven virtual registry not authenticated user' + it_behaves_like 'maven virtual registry feature not licensed' context 'with valid group_id' do it_behaves_like 'successful response' @@ -98,6 +99,7 @@ it_behaves_like 'disabled virtual_registry_maven feature flag' it_behaves_like 'maven virtual registry disabled dependency proxy' it_behaves_like 'maven virtual registry not authenticated user' + it_behaves_like 'maven virtual registry feature not licensed' where(:user_role, :status) do :owner | :created @@ -210,6 +212,7 @@ it_behaves_like 'disabled virtual_registry_maven feature flag' it_behaves_like 'maven virtual registry disabled dependency proxy' it_behaves_like 'maven virtual registry not authenticated user' + it_behaves_like 'maven virtual registry feature not licensed' context 'with valid registry_id' do it_behaves_like 'successful response' @@ -276,6 +279,7 @@ it_behaves_like 'disabled virtual_registry_maven feature flag' it_behaves_like 'maven virtual registry disabled dependency proxy' it_behaves_like 'maven virtual registry not authenticated user' + it_behaves_like 'maven virtual registry feature not licensed' context 'with valid registry_id' do where(:user_role, :status) do diff --git a/spec/requests/api/virtual_registries/packages/maven/upstreams_spec.rb b/ee/spec/requests/api/virtual_registries/packages/maven/upstreams_spec.rb similarity index 97% rename from spec/requests/api/virtual_registries/packages/maven/upstreams_spec.rb rename to ee/spec/requests/api/virtual_registries/packages/maven/upstreams_spec.rb index 6092da87e4ad583bc6b120f170c82c89bb19abec..74253c7a093dac3eda130ac2a3508ff41737a983 100644 --- a/spec/requests/api/virtual_registries/packages/maven/upstreams_spec.rb +++ b/ee/spec/requests/api/virtual_registries/packages/maven/upstreams_spec.rb @@ -26,6 +26,7 @@ it_behaves_like 'disabled virtual_registry_maven feature flag' it_behaves_like 'maven virtual registry disabled dependency proxy' it_behaves_like 'maven virtual registry not authenticated user' + it_behaves_like 'maven virtual registry feature not licensed' context 'with valid registry' do it_behaves_like 'successful response' @@ -103,6 +104,7 @@ it_behaves_like 'disabled virtual_registry_maven feature flag' it_behaves_like 'maven virtual registry disabled dependency proxy' it_behaves_like 'maven virtual registry not authenticated user' + it_behaves_like 'maven virtual registry feature not licensed' context 'with valid params' do where(:user_role, :status) do @@ -220,6 +222,7 @@ it_behaves_like 'disabled virtual_registry_maven feature flag' it_behaves_like 'maven virtual registry disabled dependency proxy' it_behaves_like 'maven virtual registry not authenticated user' + it_behaves_like 'maven virtual registry feature not licensed' context 'with valid params' do it_behaves_like 'successful response' @@ -271,6 +274,7 @@ it_behaves_like 'disabled virtual_registry_maven feature flag' it_behaves_like 'maven virtual registry disabled dependency proxy' it_behaves_like 'maven virtual registry not authenticated user' + it_behaves_like 'maven virtual registry feature not licensed' where(:user_role, :status) do :owner | :ok @@ -353,6 +357,7 @@ it_behaves_like 'disabled virtual_registry_maven feature flag' it_behaves_like 'maven virtual registry disabled dependency proxy' it_behaves_like 'maven virtual registry not authenticated user' + it_behaves_like 'maven virtual registry feature not licensed' context 'for different user roles' do where(:user_role, :status) do diff --git a/spec/support/shared_contexts/requests/api/maven_vreg_shared_context.rb b/ee/spec/support/shared_contexts/maven_vreg_shared_context.rb similarity index 96% rename from spec/support/shared_contexts/requests/api/maven_vreg_shared_context.rb rename to ee/spec/support/shared_contexts/maven_vreg_shared_context.rb index 6787cbc267e9083752703db40f3b335414b214ca..57ec0e5ebbfb2a8988e15ca7b3613fd17060fcb8 100644 --- a/spec/support/shared_contexts/requests/api/maven_vreg_shared_context.rb +++ b/ee/spec/support/shared_contexts/maven_vreg_shared_context.rb @@ -23,6 +23,7 @@ before do stub_config(dependency_proxy: { enabled: true }) # not enabled by default + stub_licensed_features(packages_virtual_registry: true) end def token_header(token) diff --git a/spec/support/shared_examples/requests/api/virtual_registries/maven_packages_shared_examples.rb b/ee/spec/support/shared_examples/requests/api/virtual_registries/maven_packages_shared_examples.rb similarity index 85% rename from spec/support/shared_examples/requests/api/virtual_registries/maven_packages_shared_examples.rb rename to ee/spec/support/shared_examples/requests/api/virtual_registries/maven_packages_shared_examples.rb index 697ce59cb0d6fb375b51a5e6265d8e6c22bb1a9c..4d8e824224c27ef889d54003c055cb7582a42b5a 100644 --- a/spec/support/shared_examples/requests/api/virtual_registries/maven_packages_shared_examples.rb +++ b/ee/spec/support/shared_examples/requests/api/virtual_registries/maven_packages_shared_examples.rb @@ -41,3 +41,11 @@ end end end + +RSpec.shared_examples 'maven virtual registry feature not licensed' do + before do + stub_licensed_features(packages_virtual_registry: false) + end + + it_behaves_like 'returning response status', :not_found +end diff --git a/lib/api/api.rb b/lib/api/api.rb index f5623c218bdc2c56c101da0e46bfc87f36bb1bc9..ecf11f06034122af7acb2e4a8318b304d4316d4c 100644 --- a/lib/api/api.rb +++ b/lib/api/api.rb @@ -359,10 +359,6 @@ def initialize(location_url) mount ::API::Users mount ::API::UserCounts mount ::API::UserRunners - mount ::API::VirtualRegistries::Packages::Maven::Registries - mount ::API::VirtualRegistries::Packages::Maven::Upstreams - mount ::API::VirtualRegistries::Packages::Maven::Cache::Entries - mount ::API::VirtualRegistries::Packages::Maven::Endpoints mount ::API::WebCommits mount ::API::Wikis