diff options
Diffstat (limited to 'app')
6 files changed, 88 insertions, 15 deletions
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/components/list/package_search.vue b/app/assets/javascripts/packages_and_registries/package_registry/components/list/package_search.vue index df50f5a52b4..c3dd3bf0fac 100644 --- a/app/assets/javascripts/packages_and_registries/package_registry/components/list/package_search.vue +++ b/app/assets/javascripts/packages_and_registries/package_registry/components/list/package_search.vue @@ -49,6 +49,11 @@ export default { }; }, computed: { + localStorageKey() { + return this.isGroupPage + ? 'group_package_registry_list_sorting' + : 'package_registry_list_sorting'; + }, sortableFields() { return sortableFields(this.isGroupPage); }, @@ -114,7 +119,7 @@ export default { <template> <local-storage-sync - storage-key="package_registry_list_sorting" + :storage-key="localStorageKey" :value="sorting" @input="updateSortingFromLocalStorage" > diff --git a/app/models/ci/pipeline_schedule.rb b/app/models/ci/pipeline_schedule.rb index 49d27053745..eaef5608ad9 100644 --- a/app/models/ci/pipeline_schedule.rb +++ b/app/models/ci/pipeline_schedule.rb @@ -31,6 +31,7 @@ module Ci scope :inactive, -> { where(active: false) } scope :preloaded, -> { preload(:owner, project: [:route]) } scope :owned_by, ->(user) { where(owner: user) } + scope :for_project, ->(project_id) { where(project_id: project_id) } accepts_nested_attributes_for :variables, allow_destroy: true diff --git a/app/models/user.rb b/app/models/user.rb index dca6570661e..3e62b755f33 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -500,8 +500,11 @@ class User < MainClusterwide::ApplicationRecord # rubocop: disable CodeReuse/ServiceClass after_transition any => :blocked do |user| user.run_after_commit do - Ci::DropPipelineService.new.execute_async_for_all(user.pipelines, :user_blocked, user) - Ci::DisableUserPipelineSchedulesService.new.execute(user) + Ci::DropPipelinesAndDisableSchedulesForUserService.new.execute( + user, + reason: :user_blocked, + include_owned_projects_and_groups: false + ) end end @@ -512,11 +515,23 @@ class User < MainClusterwide::ApplicationRecord NotificationService.new.user_deactivated(user.name, user.notification_email_or_default) end end - # rubocop: enable CodeReuse/ServiceClass after_transition active: :banned do |user| user.create_banned_user + + if Gitlab.com? # rubocop:disable Gitlab/AvoidGitlabInstanceChecks -- this is always necessary on GitLab.com + user.run_after_commit do + deep_clean_ci = user.custom_attributes.by_key(UserCustomAttribute::DEEP_CLEAN_CI_USAGE_WHEN_BANNED).exists? + + Ci::DropPipelinesAndDisableSchedulesForUserService.new.execute( + user, + reason: :user_banned, + include_owned_projects_and_groups: deep_clean_ci + ) + end + end end + # rubocop: enable CodeReuse/ServiceClass after_transition banned: :active do |user| user.banned_user&.destroy diff --git a/app/models/user_custom_attribute.rb b/app/models/user_custom_attribute.rb index d294ea49352..8d82910d29a 100644 --- a/app/models/user_custom_attribute.rb +++ b/app/models/user_custom_attribute.rb @@ -24,6 +24,7 @@ class UserCustomAttribute < ApplicationRecord DELETED_OWN_ACCOUNT_AT = 'deleted_own_account_at' SKIPPED_ACCOUNT_DELETION_AT = 'skipped_account_deletion_at' ASSUMED_HIGH_RISK_REASON = 'assumed_high_risk_reason' + DEEP_CLEAN_CI_USAGE_WHEN_BANNED = 'deep_clean_ci_usage_when_banned' class << self def upsert_custom_attributes(custom_attributes) diff --git a/app/services/ci/disable_user_pipeline_schedules_service.rb b/app/services/ci/disable_user_pipeline_schedules_service.rb deleted file mode 100644 index 6499fbba0ec..00000000000 --- a/app/services/ci/disable_user_pipeline_schedules_service.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module Ci - class DisableUserPipelineSchedulesService - def execute(user) - Ci::PipelineSchedule.active.owned_by(user).each_batch do |relation| - relation.update_all(active: false) - end - end - end -end diff --git a/app/services/ci/drop_pipelines_and_disable_schedules_for_user_service.rb b/app/services/ci/drop_pipelines_and_disable_schedules_for_user_service.rb new file mode 100644 index 00000000000..e6c18b2f27b --- /dev/null +++ b/app/services/ci/drop_pipelines_and_disable_schedules_for_user_service.rb @@ -0,0 +1,62 @@ +# frozen_string_literal: true + +module Ci + class DropPipelinesAndDisableSchedulesForUserService + def execute(user, reason: :user_blocked, include_owned_projects_and_groups: false) + if include_owned_projects_and_groups + # Projects in the user namespace + Project.personal(user).each_batch do |relation| + project_ids = relation.pluck_primary_key + + drop_pipelines_for_projects(user, project_ids, reason) + disable_schedules_for_projects(project_ids) + end + + # Projects in group and descendant namespaces owned by the user + user.owned_groups.select(:id).each_batch do |owned_groups_relation| + owned_groups_relation.each do |owned_group| + Project.in_namespace(owned_group.self_and_descendant_ids).each_batch do |project_relation| + project_ids = project_relation.pluck_primary_key + + drop_pipelines_for_projects(user, project_ids, reason) + disable_schedules_for_projects(project_ids) + end + end + end + end + + drop_pipelines_for_user(user, reason) + disable_schedules_for_user(user) + end + + private + + def drop_pipelines_for_user(user, reason) + Ci::DropPipelineService.new.execute_async_for_all( + Ci::Pipeline.for_user(user), + reason, + user + ) + end + + def drop_pipelines_for_projects(user, project_ids, reason) + Ci::DropPipelineService.new.execute_async_for_all( + Ci::Pipeline.for_project(project_ids), + reason, + user + ) + end + + def disable_schedules_for_user(user) + Ci::PipelineSchedule.owned_by(user).active.each_batch do |relation| + relation.update_all(active: false) + end + end + + def disable_schedules_for_projects(project_ids) + Ci::PipelineSchedule.for_project(project_ids).active.each_batch do |relation| + relation.update_all(active: false) + end + end + end +end |