From 6438df3a1e0fb944485cebf07976160184697d72 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 20 Jan 2021 13:34:23 -0600 Subject: Add latest changes from gitlab-org/gitlab@13-8-stable-ee --- app/finders/alert_management/alerts_finder.rb | 2 + app/finders/autocomplete/group_finder.rb | 3 +- app/finders/autocomplete/project_finder.rb | 3 +- .../ci/pipelines_for_merge_request_finder.rb | 18 +------- app/finders/concerns/finder_methods.rb | 2 +- app/finders/concerns/packages/finder_helper.rb | 29 ++++++++++++ app/finders/concerns/time_frame_filter.rb | 2 +- app/finders/deployments_finder.rb | 4 +- app/finders/issuable_finder.rb | 8 ++++ app/finders/issuable_finder/params.rb | 33 ++++++++------ app/finders/merge_requests_finder.rb | 4 +- .../packages/debian/distributions_finder.rb | 52 ++++++++++++++++++++++ app/finders/packages/group_packages_finder.rb | 8 +++- app/finders/packages/maven/package_finder.rb | 16 ++++--- app/finders/packages/nuget/package_finder.rb | 35 ++++++++++++--- app/finders/packages/packages_finder.rb | 8 +++- app/finders/projects_finder.rb | 2 +- app/finders/template_finder.rb | 1 + app/finders/users_finder.rb | 7 +++ 19 files changed, 182 insertions(+), 55 deletions(-) create mode 100644 app/finders/concerns/packages/finder_helper.rb create mode 100644 app/finders/packages/debian/distributions_finder.rb (limited to 'app/finders') diff --git a/app/finders/alert_management/alerts_finder.rb b/app/finders/alert_management/alerts_finder.rb index be3b329fb6f..8e0444d324a 100644 --- a/app/finders/alert_management/alerts_finder.rb +++ b/app/finders/alert_management/alerts_finder.rb @@ -32,6 +32,8 @@ module AlertManagement attr_reader :current_user, :project, :params def by_domain(collection) + return collection if params[:iid].present? + collection.with_operations_alerts end diff --git a/app/finders/autocomplete/group_finder.rb b/app/finders/autocomplete/group_finder.rb index dd97ac4c817..90fa48c2dc9 100644 --- a/app/finders/autocomplete/group_finder.rb +++ b/app/finders/autocomplete/group_finder.rb @@ -27,8 +27,7 @@ module Autocomplete # This removes the need for using `return render_404` and similar patterns # in controllers that use this finder. unless Ability.allowed?(current_user, :read_group, group) - raise ActiveRecord::RecordNotFound - .new("Could not find a Group with ID #{group_id}") + raise ActiveRecord::RecordNotFound, "Could not find a Group with ID #{group_id}" end group diff --git a/app/finders/autocomplete/project_finder.rb b/app/finders/autocomplete/project_finder.rb index 3a4696f4c2e..6e51ae4c70d 100644 --- a/app/finders/autocomplete/project_finder.rb +++ b/app/finders/autocomplete/project_finder.rb @@ -25,8 +25,7 @@ module Autocomplete # This removes the need for using `return render_404` and similar patterns # in controllers that use this finder. unless Ability.allowed?(current_user, :read_project, project) - raise ActiveRecord::RecordNotFound - .new("Could not find a Project with ID #{project_id}") + raise ActiveRecord::RecordNotFound, "Could not find a Project with ID #{project_id}" end project diff --git a/app/finders/ci/pipelines_for_merge_request_finder.rb b/app/finders/ci/pipelines_for_merge_request_finder.rb index da8dfc2579a..1f6ee9d75ad 100644 --- a/app/finders/ci/pipelines_for_merge_request_finder.rb +++ b/app/finders/ci/pipelines_for_merge_request_finder.rb @@ -34,11 +34,7 @@ module Ci pipelines = if merge_request.persisted? - if Feature.enabled?(:ci_pipelines_for_merge_request_finder_new_cte, target_project) - pipelines_using_cte - else - pipelines_using_legacy_cte - end + pipelines_using_cte else triggered_for_branch.for_sha(commit_shas) end @@ -49,18 +45,6 @@ module Ci private - def pipelines_using_legacy_cte - cte = Gitlab::SQL::CTE.new(:shas, merge_request.all_commits.select(:sha)) - - source_sha_join = cte.table[:sha].eq(Ci::Pipeline.arel_table[:source_sha]) - merged_result_pipelines = filter_by(triggered_by_merge_request, cte, source_sha_join) - detached_merge_request_pipelines = filter_by_sha(triggered_by_merge_request, cte) - pipelines_for_branch = filter_by_sha(triggered_for_branch, cte) - - Ci::Pipeline.with(cte.to_arel) # rubocop: disable CodeReuse/ActiveRecord - .from_union([merged_result_pipelines, detached_merge_request_pipelines, pipelines_for_branch]) - end - def pipelines_using_cte cte = Gitlab::SQL::CTE.new(:shas, merge_request.all_commits.select(:sha)) diff --git a/app/finders/concerns/finder_methods.rb b/app/finders/concerns/finder_methods.rb index 622cbcf4928..193b52b1694 100644 --- a/app/finders/concerns/finder_methods.rb +++ b/app/finders/concerns/finder_methods.rb @@ -22,7 +22,7 @@ module FinderMethods def raise_not_found_unless_authorized(result) result = if_authorized(result) - raise ActiveRecord::RecordNotFound.new("Couldn't find #{model}") unless result + raise(ActiveRecord::RecordNotFound, "Couldn't find #{model}") unless result result end diff --git a/app/finders/concerns/packages/finder_helper.rb b/app/finders/concerns/packages/finder_helper.rb new file mode 100644 index 00000000000..524e7aa7ff9 --- /dev/null +++ b/app/finders/concerns/packages/finder_helper.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +module Packages + module FinderHelper + extend ActiveSupport::Concern + + private + + def packages_visible_to_user(user, within_group:) + return ::Packages::Package.none unless within_group + return ::Packages::Package.none unless Ability.allowed?(user, :read_package, within_group) + + projects = projects_visible_to_reporters(user, within_group.self_and_descendants.select(:id)) + ::Packages::Package.for_projects(projects.select(:id)) + end + + def projects_visible_to_user(user, within_group:) + return ::Project.none unless within_group + return ::Project.none unless Ability.allowed?(user, :read_package, within_group) + + projects_visible_to_reporters(user, within_group.self_and_descendants.select(:id)) + end + + def projects_visible_to_reporters(user, namespace_ids) + ::Project.in_namespace(namespace_ids) + .public_or_visible_to_user(user, ::Gitlab::Access::REPORTER) + end + end +end diff --git a/app/finders/concerns/time_frame_filter.rb b/app/finders/concerns/time_frame_filter.rb index d1ebed730f6..7412bea340e 100644 --- a/app/finders/concerns/time_frame_filter.rb +++ b/app/finders/concerns/time_frame_filter.rb @@ -2,7 +2,7 @@ module TimeFrameFilter def by_timeframe(items) - return items unless params[:start_date] && params[:start_date] + return items unless params[:start_date] && params[:end_date] start_date = params[:start_date].to_date end_date = params[:end_date].to_date diff --git a/app/finders/deployments_finder.rb b/app/finders/deployments_finder.rb index 0bb8ce6b4da..4038f93cf2d 100644 --- a/app/finders/deployments_finder.rb +++ b/app/finders/deployments_finder.rb @@ -4,10 +4,10 @@ class DeploymentsFinder attr_reader :project, :params ALLOWED_SORT_VALUES = %w[id iid created_at updated_at ref].freeze - DEFAULT_SORT_VALUE = 'id'.freeze + DEFAULT_SORT_VALUE = 'id' ALLOWED_SORT_DIRECTIONS = %w[asc desc].freeze - DEFAULT_SORT_DIRECTION = 'asc'.freeze + DEFAULT_SORT_DIRECTION = 'asc' def initialize(project, params = {}) @project = project diff --git a/app/finders/issuable_finder.rb b/app/finders/issuable_finder.rb index 922b53b514d..fc03d5cd90c 100644 --- a/app/finders/issuable_finder.rb +++ b/app/finders/issuable_finder.rb @@ -4,6 +4,9 @@ # # Used to filter Issues and MergeRequests collections by set of params # +# Note: This class is NOT meant to be instantiated. Instead you should +# look at IssuesFinder or EpicsFinder, which inherit from this. +# # Arguments: # klass - actual class like Issue or MergeRequest # current_user - which user use @@ -92,6 +95,10 @@ class IssuableFinder IssuableFinder::Params end + def klass + raise NotImplementedError + end + def initialize(current_user, params = {}) @current_user = current_user @params = params_class.new(params, current_user, klass) @@ -451,6 +458,7 @@ class IssuableFinder def by_release(items) return items unless params.releases? + return items if params.group? # don't allow release filtering at group level if params.filter_by_no_release? items.without_release diff --git a/app/finders/issuable_finder/params.rb b/app/finders/issuable_finder/params.rb index b481afee338..803b30e86ac 100644 --- a/app/finders/issuable_finder/params.rb +++ b/app/finders/issuable_finder/params.rb @@ -108,16 +108,8 @@ class IssuableFinder project_id.present? end - def group - strong_memoize(:group) do - if params[:group_id].is_a?(Group) - params[:group_id] - elsif params[:group_id].present? - Group.find(params[:group_id]) - else - nil - end - end + def group? + group_id.present? end def related_groups @@ -143,10 +135,25 @@ class IssuableFinder end end + def group + strong_memoize(:group) do + next nil unless group? + + group = group_id.is_a?(Group) ? group_id : Group.find(group_id) + group = nil unless Ability.allowed?(current_user, :read_group, group) + + group + end + end + def project_id params[:project_id] end + def group_id + params[:group_id] + end + def projects strong_memoize(:projects) do next [project] if project? @@ -216,14 +223,14 @@ class IssuableFinder strong_memoize(:milestones) do if milestones? if project? - group_id = project.group&.id + project_group_id = project.group&.id project_id = project.id end - group_id = group.id if group + project_group_id = group.id if group search_params = - { title: params[:milestone_title], project_ids: project_id, group_ids: group_id } + { title: params[:milestone_title], project_ids: project_id, group_ids: project_group_id } MilestonesFinder.new(search_params).execute # rubocop: disable CodeReuse/Finder else diff --git a/app/finders/merge_requests_finder.rb b/app/finders/merge_requests_finder.rb index 978550aedaf..9f9e2afa7fe 100644 --- a/app/finders/merge_requests_finder.rb +++ b/app/finders/merge_requests_finder.rb @@ -57,7 +57,7 @@ class MergeRequestsFinder < IssuableFinder end def params_class - MergeRequestsFinder::Params + MergeRequestsFinder.const_get(:Params, false) # rubocop: disable CodeReuse/Finder end def filter_items(_items) @@ -84,7 +84,7 @@ class MergeRequestsFinder < IssuableFinder def by_commit(items) return items unless params[:commit_sha].presence - items.by_commit_sha(params[:commit_sha]) + items.by_related_commit_sha(params[:commit_sha]) end def source_branch diff --git a/app/finders/packages/debian/distributions_finder.rb b/app/finders/packages/debian/distributions_finder.rb new file mode 100644 index 00000000000..e64b6bdfec1 --- /dev/null +++ b/app/finders/packages/debian/distributions_finder.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +module Packages + module Debian + class DistributionsFinder + def initialize(container, params = {}) + @container, @params = container, params + end + + def execute + collection = relation.with_container(container) + collection = by_codename(collection) + collection = by_suite(collection) + collection = by_codename_or_suite(collection) + collection + end + + private + + attr_reader :container, :params + + def relation + case container + when Project + Packages::Debian::ProjectDistribution + when Group + Packages::Debian::GroupDistribution + else + raise ArgumentError, "Unexpected container type of '#{container.class}'" + end + end + + def by_codename(collection) + return collection unless params[:codename].present? + + collection.with_codename(params[:codename]) + end + + def by_suite(collection) + return collection unless params[:suite].present? + + collection.with_suite(params[:suite]) + end + + def by_codename_or_suite(collection) + return collection unless params[:codename_or_suite].present? + + collection.with_codename_or_suite(params[:codename_or_suite]) + end + end + end +end diff --git a/app/finders/packages/group_packages_finder.rb b/app/finders/packages/group_packages_finder.rb index a51057571f1..860c4068b31 100644 --- a/app/finders/packages/group_packages_finder.rb +++ b/app/finders/packages/group_packages_finder.rb @@ -27,9 +27,9 @@ module Packages .including_tags .for_projects(group_projects_visible_to_current_user.select(:id)) .processed - .has_version .sort_by_attribute("#{params[:order_by]}_#{params[:sort]}") + packages = filter_with_version(packages) packages = filter_by_package_type(packages) packages = filter_by_package_name(packages) packages @@ -72,5 +72,11 @@ module Packages packages.search_by_name(params[:package_name]) end + + def filter_with_version(packages) + return packages if params[:include_versionless].present? + + packages.has_version + end end end diff --git a/app/finders/packages/maven/package_finder.rb b/app/finders/packages/maven/package_finder.rb index 775db12adb7..7e753705cbd 100644 --- a/app/finders/packages/maven/package_finder.rb +++ b/app/finders/packages/maven/package_finder.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + module Packages module Maven class PackageFinder @@ -27,17 +28,22 @@ module Packages elsif group packages_for_multiple_projects else - packages + ::Packages::Package.none end end def packages_with_path - base.only_maven_packages_with_path(path) + matching_packages = base.only_maven_packages_with_path(path) + matching_packages = matching_packages.order_by_package_file if versionless_package?(matching_packages) + + matching_packages end - # Produces a query that returns all packages. - def packages - ::Packages::Package.all + def versionless_package?(matching_packages) + return if matching_packages.empty? + + # if one matching package is versionless, they all are. + matching_packages.first&.version.nil? end # Produces a query that retrieves packages from a single project. diff --git a/app/finders/packages/nuget/package_finder.rb b/app/finders/packages/nuget/package_finder.rb index e6fb6712d47..8f585f045a1 100644 --- a/app/finders/packages/nuget/package_finder.rb +++ b/app/finders/packages/nuget/package_finder.rb @@ -1,11 +1,15 @@ # frozen_string_literal: true + module Packages module Nuget class PackageFinder + include ::Packages::FinderHelper + MAX_PACKAGES_COUNT = 50 - def initialize(project, package_name:, package_version: nil, limit: MAX_PACKAGES_COUNT) - @project = project + def initialize(current_user, project_or_group, package_name:, package_version: nil, limit: MAX_PACKAGES_COUNT) + @current_user = current_user + @project_or_group = project_or_group @package_name = package_name @package_version = package_version @limit = limit @@ -17,15 +21,32 @@ module Packages private + def base + if project? + @project_or_group.packages + elsif group? + packages_visible_to_user(@current_user, within_group: @project_or_group) + else + ::Packages::Package.none + end + end + def packages - result = @project.packages - .nuget - .has_version - .processed - .with_name_like(@package_name) + result = base.nuget + .has_version + .processed + .with_name_like(@package_name) result = result.with_version(@package_version) if @package_version.present? result end + + def project? + @project_or_group.is_a?(::Project) + end + + def group? + @project_or_group.is_a?(::Group) + end end end end diff --git a/app/finders/packages/packages_finder.rb b/app/finders/packages/packages_finder.rb index 519e8bf9c34..72a63224d2f 100644 --- a/app/finders/packages/packages_finder.rb +++ b/app/finders/packages/packages_finder.rb @@ -18,7 +18,7 @@ module Packages .including_project_route .including_tags .processed - .has_version + packages = filter_with_version(packages) packages = filter_by_package_type(packages) packages = filter_by_package_name(packages) packages = order_packages(packages) @@ -27,6 +27,12 @@ module Packages private + def filter_with_version(packages) + return packages if params[:include_versionless].present? + + packages.has_version + end + def filter_by_package_type(packages) return packages unless params[:package_type] diff --git a/app/finders/projects_finder.rb b/app/finders/projects_finder.rb index 05dc69ebff6..f1df4fbb0d8 100644 --- a/app/finders/projects_finder.rb +++ b/app/finders/projects_finder.rb @@ -52,7 +52,7 @@ class ProjectsFinder < UnionFinder collection = Project.wrap_with_cte(collection) if use_cte collection = filter_projects(collection) - if params[:sort] == 'similarity' && params[:search] && Feature.enabled?(:project_finder_similarity_sort) + if params[:sort] == 'similarity' && params[:search] && Feature.enabled?(:project_finder_similarity_sort, current_user) collection.sorted_by_similarity_desc(params[:search]) else sort(collection) diff --git a/app/finders/template_finder.rb b/app/finders/template_finder.rb index a35376e905e..dac7c526474 100644 --- a/app/finders/template_finder.rb +++ b/app/finders/template_finder.rb @@ -7,6 +7,7 @@ class TemplateFinder dockerfiles: ::Gitlab::Template::DockerfileTemplate, gitignores: ::Gitlab::Template::GitignoreTemplate, gitlab_ci_ymls: ::Gitlab::Template::GitlabCiYmlTemplate, + gitlab_ci_syntax_ymls: ::Gitlab::Template::GitlabCiSyntaxYmlTemplate, metrics_dashboard_ymls: ::Gitlab::Template::MetricsDashboardTemplate, issues: ::Gitlab::Template::IssueTemplate, merge_requests: ::Gitlab::Template::MergeRequestTemplate diff --git a/app/finders/users_finder.rb b/app/finders/users_finder.rb index cc94536bf79..42042406f3f 100644 --- a/app/finders/users_finder.rb +++ b/app/finders/users_finder.rb @@ -34,6 +34,7 @@ class UsersFinder users = User.all.order_id_desc users = by_username(users) users = by_id(users) + users = by_admins(users) users = by_search(users) users = by_blocked(users) users = by_active(users) @@ -62,6 +63,12 @@ class UsersFinder users.id_in(params[:id]) end + def by_admins(users) + return users unless params[:admins] && current_user&.can_read_all_resources? + + users.admins + end + def by_search(users) return users unless params[:search].present? -- cgit v1.2.1