diff --git a/app/services/keys/create_service.rb b/app/services/keys/create_service.rb index 32c4ab645dfaec2615423daaecdfce640b8bea2b..c256de7b35ddd11976fe1ee94ed07da6aca7ee74 100644 --- a/app/services/keys/create_service.rb +++ b/app/services/keys/create_service.rb @@ -2,6 +2,14 @@ module Keys class CreateService < ::Keys::BaseService + attr_accessor :current_user + + def initialize(current_user, params = {}) + @current_user, @params = current_user, params + @ip_address = @params.delete(:ip_address) + @user = params.delete(:user) || current_user + end + def execute key = user.keys.create(params) notification_service.new_key(key) if key.persisted? diff --git a/changelogs/unreleased/services-usage-1.yml b/changelogs/unreleased/services-usage-1.yml new file mode 100644 index 0000000000000000000000000000000000000000..d202273ca8c5a2a546614f2c5e3b554d6786a9e3 --- /dev/null +++ b/changelogs/unreleased/services-usage-1.yml @@ -0,0 +1,5 @@ +--- +title: Record audit event when an admin creates a new SSH Key for a user via the API +merge_request: 33859 +author: Rajendra Kadam +type: fixed diff --git a/ee/app/services/ee/keys/create_service.rb b/ee/app/services/ee/keys/create_service.rb index 4d11784460428c702e46f5e269ed8384662d578e..62126e0dd72e5cd48158e42493527715585c54e7 100644 --- a/ee/app/services/ee/keys/create_service.rb +++ b/ee/app/services/ee/keys/create_service.rb @@ -14,7 +14,7 @@ def log_audit_event(key) end def audit_event_service - ::AuditEventService.new(user, + ::AuditEventService.new(current_user, user, action: :custom, custom_message: 'Added SSH key', diff --git a/ee/spec/services/keys/create_service_spec.rb b/ee/spec/services/keys/create_service_spec.rb index 88fd1fda556180a5991dde8c1d89066a83647b98..f39c113868c1ca09e1fa589235725662b0ea0a13 100644 --- a/ee/spec/services/keys/create_service_spec.rb +++ b/ee/spec/services/keys/create_service_spec.rb @@ -3,14 +3,20 @@ require 'spec_helper' RSpec.describe Keys::CreateService do + let(:admin) { create(:admin) } let(:user) { create(:user) } - let(:params) { attributes_for(:key) } + let(:params) { attributes_for(:key).merge(user: user) } - subject { described_class.new(user, params) } + subject { described_class.new(admin, params) } it 'creates' do stub_licensed_features(extended_audit_events: true) expect { subject.execute }.to change { SecurityEvent.count }.by(1) + + event = SecurityEvent.last + + expect(event.author_name).to eq(admin.name) + expect(event.entity_id).to eq(user.id) end end diff --git a/lib/api/users.rb b/lib/api/users.rb index ed9dac8b4943a11dbb3a03a59cf1b2c2962e18d8..831e6efe20350eecaa67458ccdacddabe7b9c46b 100644 --- a/lib/api/users.rb +++ b/lib/api/users.rb @@ -264,9 +264,9 @@ def reorder_users(users) user = User.find_by(id: params.delete(:id)) not_found!('User') unless user - key = user.keys.new(declared_params(include_missing: false)) + key = ::Keys::CreateService.new(current_user, declared_params(include_missing: false).merge(user: user)).execute - if key.save + if key.persisted? present key, with: Entities::SSHKey else render_validation_error!(key)