Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/components/list/package_search.vue7
-rw-r--r--app/models/ci/pipeline_schedule.rb1
-rw-r--r--app/models/user.rb21
-rw-r--r--app/models/user_custom_attribute.rb1
-rw-r--r--app/services/ci/disable_user_pipeline_schedules_service.rb11
-rw-r--r--app/services/ci/drop_pipelines_and_disable_schedules_for_user_service.rb62
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