diff options
Diffstat (limited to 'app/controllers/concerns')
-rw-r--r-- | app/controllers/concerns/controller_with_feature_category.rb | 48 | ||||
-rw-r--r-- | app/controllers/concerns/dependency_proxy_access.rb | 24 | ||||
-rw-r--r-- | app/controllers/concerns/integrations_actions.rb | 2 | ||||
-rw-r--r-- | app/controllers/concerns/issuable_actions.rb | 3 | ||||
-rw-r--r-- | app/controllers/concerns/lfs_request.rb | 24 | ||||
-rw-r--r-- | app/controllers/concerns/notes_actions.rb | 6 | ||||
-rw-r--r-- | app/controllers/concerns/routable_actions.rb | 2 | ||||
-rw-r--r-- | app/controllers/concerns/send_file_upload.rb | 11 | ||||
-rw-r--r-- | app/controllers/concerns/sends_blob.rb | 1 | ||||
-rw-r--r-- | app/controllers/concerns/snippets_actions.rb | 5 | ||||
-rw-r--r-- | app/controllers/concerns/wiki_actions.rb | 15 |
11 files changed, 56 insertions, 85 deletions
diff --git a/app/controllers/concerns/controller_with_feature_category.rb b/app/controllers/concerns/controller_with_feature_category.rb deleted file mode 100644 index c1ff9ef2e69..00000000000 --- a/app/controllers/concerns/controller_with_feature_category.rb +++ /dev/null @@ -1,48 +0,0 @@ -# frozen_string_literal: true - -module ControllerWithFeatureCategory - extend ActiveSupport::Concern - include Gitlab::ClassAttributes - - class_methods do - def feature_category(category, actions = []) - feature_category_configuration[category] ||= [] - feature_category_configuration[category] += actions.map(&:to_s) - - validate_config!(feature_category_configuration) - end - - def feature_category_for_action(action) - category_config = feature_category_configuration.find do |_, actions| - actions.empty? || actions.include?(action) - end - - category_config&.first || superclass_feature_category_for_action(action) - end - - private - - def validate_config!(config) - empty = config.find { |_, actions| actions.empty? } - duplicate_actions = config.values.flatten.group_by(&:itself).select { |_, v| v.count > 1 }.keys - - if config.length > 1 && empty - raise ArgumentError, "#{empty.first} is defined for all actions, but other categories are set" - end - - if duplicate_actions.any? - raise ArgumentError, "Actions have multiple feature categories: #{duplicate_actions.join(', ')}" - end - end - - def feature_category_configuration - class_attributes[:feature_category_config] ||= {} - end - - def superclass_feature_category_for_action(action) - return unless superclass.respond_to?(:feature_category_for_action) - - superclass.feature_category_for_action(action) - end - end -end diff --git a/app/controllers/concerns/dependency_proxy_access.rb b/app/controllers/concerns/dependency_proxy_access.rb new file mode 100644 index 00000000000..5036d0cfce4 --- /dev/null +++ b/app/controllers/concerns/dependency_proxy_access.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +module DependencyProxyAccess + extend ActiveSupport::Concern + + included do + before_action :verify_dependency_proxy_enabled! + before_action :authorize_read_dependency_proxy! + end + + private + + def verify_dependency_proxy_enabled! + render_404 unless group.dependency_proxy_feature_available? + end + + def authorize_read_dependency_proxy! + access_denied! unless can?(current_user, :read_dependency_proxy, group) + end + + def authorize_admin_dependency_proxy! + access_denied! unless can?(current_user, :admin_dependency_proxy, group) + end +end diff --git a/app/controllers/concerns/integrations_actions.rb b/app/controllers/concerns/integrations_actions.rb index 39f63bbaaec..8e9b038437d 100644 --- a/app/controllers/concerns/integrations_actions.rb +++ b/app/controllers/concerns/integrations_actions.rb @@ -52,7 +52,7 @@ module IntegrationsActions def integration # Using instance variable `@service` still required as it's used in ServiceParams. # Should be removed once that is refactored to use `@integration`. - @integration = @service ||= find_or_initialize_integration(params[:id]) # rubocop:disable Gitlab/ModuleWithInstanceVariables + @integration = @service ||= find_or_initialize_non_project_specific_integration(params[:id]) # rubocop:disable Gitlab/ModuleWithInstanceVariables end def success_message diff --git a/app/controllers/concerns/issuable_actions.rb b/app/controllers/concerns/issuable_actions.rb index a1a2740cde2..3b46a547d47 100644 --- a/app/controllers/concerns/issuable_actions.rb +++ b/app/controllers/concerns/issuable_actions.rb @@ -8,9 +8,6 @@ module IssuableActions before_action :authorize_destroy_issuable!, only: :destroy before_action :check_destroy_confirmation!, only: :destroy before_action :authorize_admin_issuable!, only: :bulk_update - before_action only: :show do - push_frontend_feature_flag(:scoped_labels, type: :licensed, default_enabled: true) - end before_action do push_frontend_feature_flag(:not_issuable_queries, @project, default_enabled: true) end diff --git a/app/controllers/concerns/lfs_request.rb b/app/controllers/concerns/lfs_request.rb index 2844acea271..bc3fd32759f 100644 --- a/app/controllers/concerns/lfs_request.rb +++ b/app/controllers/concerns/lfs_request.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true # This concern assumes: +# - a `#container` accessor # - a `#project` accessor # - a `#user` accessor # - a `#authentication_result` accessor @@ -11,6 +12,7 @@ # - a `#has_authentication_ability?(ability)` method module LfsRequest extend ActiveSupport::Concern + include Gitlab::Utils::StrongMemoize CONTENT_TYPE = 'application/vnd.git-lfs+json' @@ -29,16 +31,19 @@ module LfsRequest message: _('Git LFS is not enabled on this GitLab server, contact your admin.'), documentation_url: help_url }, + content_type: CONTENT_TYPE, status: :not_implemented ) end def lfs_check_access! - return render_lfs_not_found unless project + return render_lfs_not_found unless container&.lfs_enabled? return if download_request? && lfs_download_access? return if upload_request? && lfs_upload_access? - if project.public? || can?(user, :read_project, project) + # Only return a 403 response if the user has download access permission, + # otherwise return a 404 to avoid exposing the existence of the container. + if lfs_download_access? lfs_forbidden! else render_lfs_not_found @@ -72,9 +77,9 @@ module LfsRequest end def lfs_download_access? - return false unless project.lfs_enabled? - - ci? || lfs_deploy_token? || user_can_download_code? || build_can_download_code? || deploy_token_can_download_code? + strong_memoize(:lfs_download_access) do + ci? || lfs_deploy_token? || user_can_download_code? || build_can_download_code? || deploy_token_can_download_code? + end end def deploy_token_can_download_code? @@ -93,11 +98,12 @@ module LfsRequest end def lfs_upload_access? - return false unless project.lfs_enabled? - return false unless has_authentication_ability?(:push_code) - return false if limit_exceeded? + strong_memoize(:lfs_upload_access) do + next false unless has_authentication_ability?(:push_code) + next false if limit_exceeded? - lfs_deploy_token? || can?(user, :push_code, project) + lfs_deploy_token? || can?(user, :push_code, project) + end end def lfs_deploy_token? diff --git a/app/controllers/concerns/notes_actions.rb b/app/controllers/concerns/notes_actions.rb index 7a5b470f366..bfa7a30bc65 100644 --- a/app/controllers/concerns/notes_actions.rb +++ b/app/controllers/concerns/notes_actions.rb @@ -31,6 +31,10 @@ module NotesActions # We know there's more data, so tell the frontend to poll again after 1ms set_polling_interval_header(interval: 1) if meta[:more] + # Only present an ETag for the empty response to ensure pagination works + # as expected + ::Gitlab::EtagCaching::Middleware.skip!(response) if notes.present? + render json: meta.merge(notes: notes) end @@ -115,7 +119,7 @@ module NotesActions end def gather_some_notes - paginator = Gitlab::UpdatedNotesPaginator.new( + paginator = ::Gitlab::UpdatedNotesPaginator.new( notes_finder.execute.inc_relations_for_view, last_fetched_at: last_fetched_at ) diff --git a/app/controllers/concerns/routable_actions.rb b/app/controllers/concerns/routable_actions.rb index 1b2e6461dee..bc2e7fba288 100644 --- a/app/controllers/concerns/routable_actions.rb +++ b/app/controllers/concerns/routable_actions.rb @@ -51,7 +51,7 @@ module RoutableActions flash[:notice] = "#{routable.class.to_s.titleize} '#{requested_full_path}' was moved to '#{canonical_path}'. Please update any links and bookmarks that may still have the old path." end - redirect_to build_canonical_path(routable) + redirect_to build_canonical_path(routable), status: :moved_permanently end end end diff --git a/app/controllers/concerns/send_file_upload.rb b/app/controllers/concerns/send_file_upload.rb index 2f06cd84ee5..8b053ef7c59 100644 --- a/app/controllers/concerns/send_file_upload.rb +++ b/app/controllers/concerns/send_file_upload.rb @@ -70,16 +70,7 @@ module SendFileUpload Avatarable::ALLOWED_IMAGE_SCALER_WIDTHS.include?(params[:width]&.to_i) end - # We use two separate feature gates to allow image resizing. - # The first, `:dynamic_image_resizing_requester`, based on the content requester. - # Enabling it for the user would allow that user to send resizing requests for any avatar. - # The second, `:dynamic_image_resizing_owner`, based on the content owner. - # Enabling it for the user would allow anyone to send resizing requests against the mentioned user avatar only. - # This flag allows us to operate on trusted data only, more in https://gitlab.com/gitlab-org/gitlab/-/issues/241533. - # Because of this, you need to enable BOTH to serve resized image, - # as you would need at least one allowed requester and at least one allowed avatar. def scaling_allowed_by_feature_flags?(file_upload) - Feature.enabled?(:dynamic_image_resizing_requester, current_user) && - Feature.enabled?(:dynamic_image_resizing_owner, file_upload.model) + Feature.enabled?(:dynamic_image_resizing, default_enabled: true, type: :ops) end end diff --git a/app/controllers/concerns/sends_blob.rb b/app/controllers/concerns/sends_blob.rb index 9bba61fda84..381f2eba352 100644 --- a/app/controllers/concerns/sends_blob.rb +++ b/app/controllers/concerns/sends_blob.rb @@ -44,7 +44,6 @@ module SendsBlob Blob::CACHE_TIME end - response.etag = blob.id !stale end diff --git a/app/controllers/concerns/snippets_actions.rb b/app/controllers/concerns/snippets_actions.rb index e4c3df6ccc3..0153ede2821 100644 --- a/app/controllers/concerns/snippets_actions.rb +++ b/app/controllers/concerns/snippets_actions.rb @@ -57,11 +57,6 @@ module SnippetsActions render 'show' end - format.json do - conditionally_expand_blob(blob) - render_blob_json(blob) - end - format.js do if @snippet.embeddable? conditionally_expand_blobs(blobs) diff --git a/app/controllers/concerns/wiki_actions.rb b/app/controllers/concerns/wiki_actions.rb index aed109309e3..6abb2e16226 100644 --- a/app/controllers/concerns/wiki_actions.rb +++ b/app/controllers/concerns/wiki_actions.rb @@ -103,9 +103,10 @@ module WikiActions @page = response.payload[:page] if response.success? + flash[:toast] = _('Wiki page was successfully updated.') + redirect_to( - wiki_page_path(wiki, page), - notice: _('Wiki was successfully updated.') + wiki_page_path(wiki, page) ) else render 'shared/wikis/edit' @@ -122,9 +123,10 @@ module WikiActions @page = response.payload[:page] if response.success? + flash[:toast] = _('Wiki page was successfully created.') + redirect_to( - wiki_page_path(wiki, page), - notice: _('Wiki was successfully updated.') + wiki_page_path(wiki, page) ) else render 'shared/wikis/edit' @@ -169,9 +171,10 @@ module WikiActions response = WikiPages::DestroyService.new(container: container, current_user: current_user).execute(page) if response.success? + flash[:toast] = _("Wiki page was successfully deleted.") + redirect_to wiki_path(wiki), - status: :found, - notice: _("Page was successfully deleted") + status: :found else @error = response render 'shared/wikis/edit' |