diff --git a/app/services/users/unblock_service.rb b/app/services/users/unblock_service.rb index 1302395662fc194e808471faf55e37935d8b9a66..d80f65b5757f8f45bd65f3fbbafe7e2490ac6269 100644 --- a/app/services/users/unblock_service.rb +++ b/app/services/users/unblock_service.rb @@ -27,3 +27,5 @@ def after_unblock_hook(user) end end end + +Users::UnblockService.prepend_mod_with('Users::UnblockService') diff --git a/ee/app/services/ee/users/unblock_service.rb b/ee/app/services/ee/users/unblock_service.rb new file mode 100644 index 0000000000000000000000000000000000000000..5b648780cd43e544eccc25ab6ce6ae1d2b46bce1 --- /dev/null +++ b/ee/app/services/ee/users/unblock_service.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +module EE + module Users + module UnblockService + extend ::Gitlab::Utils::Override + + override :after_unblock_hook + def after_unblock_hook(user) + super + log_audit_event(user) + end + + private + + def log_audit_event(user) + audit_context = { + name: 'unblock_user', + author: current_user, + scope: user, + target: user, + message: "Unblocked user", + target_details: user.username + } + + ::Gitlab::Audit::Auditor.audit(audit_context) + end + end + end +end diff --git a/ee/config/audit_events/types/unblock_user.yml b/ee/config/audit_events/types/unblock_user.yml new file mode 100644 index 0000000000000000000000000000000000000000..7ecdf30652947fe036cd46ad94766ec0b376267e --- /dev/null +++ b/ee/config/audit_events/types/unblock_user.yml @@ -0,0 +1,8 @@ +name: unblock_user +description: Event triggered on user unblock action +introduced_by_issue: https://gitlab.com/gitlab-org/gitlab/-/issues/377620 +introduced_by_mr: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/115727 +feature_category: "compliance_management" +milestone: "15.11" +saved_to_database: true +streamed: true diff --git a/ee/spec/services/ee/users/unblock_service_spec.rb b/ee/spec/services/ee/users/unblock_service_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..2a91d5de8a9c68b353fb8ffeb971db2b430d9acd --- /dev/null +++ b/ee/spec/services/ee/users/unblock_service_spec.rb @@ -0,0 +1,63 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Users::UnblockService, feature_category: :user_management do + let_it_be(:current_user) { create(:admin) } + + subject(:service) { described_class.new(current_user) } + + describe '#execute' do + let!(:user) { create(:user, :blocked) } + + subject(:operation) { service.execute(user) } + + describe 'audit events' do + context 'when licensed' do + before do + stub_licensed_features(admin_audit_log: true) + end + + context 'when user unblock operation succeeds' do + it 'logs an audit event' do + expect { operation }.to change { AuditEvent.count }.by(1) + end + + it 'logs the audit event info' do + operation + + expect(AuditEvent.last).to have_attributes( + details: hash_including(custom_message: 'Unblocked user') + ) + end + end + + context 'when user unblock operation fails' do + let!(:user) { create(:user) } + + before do + allow(user).to receive(:unblock).and_return(false) + end + + it 'does not log any audit event' do + expect { operation }.not_to change { AuditEvent.count } + end + end + end + + context 'when not licensed' do + before do + stub_licensed_features( + admin_audit_log: false, + audit_events: false, + extended_audit_events: false + ) + end + + it 'does not log any audit event' do + expect { operation }.not_to change { AuditEvent.count } + end + end + end + end +end