diff --git a/app/models/deploy_key.rb b/app/models/deploy_key.rb index 4ed38f578ee3d7b573525fef3836d464b4f3bec6..f9acd398374a999d0b2971bbfaa6d6511305a4e6 100644 --- a/app/models/deploy_key.rb +++ b/app/models/deploy_key.rb @@ -40,6 +40,10 @@ def user super || User.ghost end + def audit_details + title + end + def has_access_to?(project) deploy_keys_project_for(project).present? end diff --git a/ee/app/services/ee/deploy_keys/create_service.rb b/ee/app/services/ee/deploy_keys/create_service.rb index 353791322d5034782d0e5b629c6da1ffe7a20e0e..8354218bf69caf361f230a671815de6a66812b3b 100644 --- a/ee/app/services/ee/deploy_keys/create_service.rb +++ b/ee/app/services/ee/deploy_keys/create_service.rb @@ -9,16 +9,24 @@ module CreateService def execute(project: nil) super.tap do |key| if project && key.persisted? - log_audit_event(key.title, project, action: :create) + log_audit_event(key, project) end end end private - def log_audit_event(key_title, project, options = {}) - ::AuditEventService.new(user, project, options) - .for_deploy_key(key_title).security_event + def log_audit_event(key, project) + audit_context = { + name: 'deploy_key_added', + author: user, + scope: project, + target: key, + message: "Added deploy key", + additional_details: { add: "deploy_key" } + } + + ::Gitlab::Audit::Auditor.audit(audit_context) end end end diff --git a/ee/app/services/ee/projects/disable_deploy_key_service.rb b/ee/app/services/ee/projects/disable_deploy_key_service.rb index deab70c26e7a6e4890bd91c92bbf0967e0b3de3c..6f284d97b72e7c63e9202184c2f3126c72baefc0 100644 --- a/ee/app/services/ee/projects/disable_deploy_key_service.rb +++ b/ee/app/services/ee/projects/disable_deploy_key_service.rb @@ -9,14 +9,22 @@ def execute super.tap do |deploy_key_project| break unless deploy_key_project - log_audit_event(deploy_key_project.deploy_key.title, action: :destroy) + log_audit_event(deploy_key_project.deploy_key) end end private - def log_audit_event(key_title, options = {}) - AuditEventService.new(current_user, project, options) - .for_deploy_key(key_title).security_event + def log_audit_event(key) + audit_context = { + name: 'deploy_key_removed', + author: current_user, + scope: project, + target: key, + message: "Removed deploy key", + additional_details: { remove: "deploy_key" } + } + + ::Gitlab::Audit::Auditor.audit(audit_context) end end diff --git a/ee/app/services/ee/projects/enable_deploy_key_service.rb b/ee/app/services/ee/projects/enable_deploy_key_service.rb index 2e966b121304fb33ab8df7b1c8991b6ae3a0065c..284c8e67b76fa168b01e4fbc23d2cca734f7c9b9 100644 --- a/ee/app/services/ee/projects/enable_deploy_key_service.rb +++ b/ee/app/services/ee/projects/enable_deploy_key_service.rb @@ -9,14 +9,22 @@ def execute super.tap do |key| break unless key - log_audit_event(key.title, action: :create) + log_audit_event(key) end end private - def log_audit_event(key_title, options = {}) - AuditEventService.new(current_user, project, options) - .for_deploy_key(key_title).security_event + def log_audit_event(key) + audit_context = { + name: 'deploy_key_added', + author: current_user, + scope: project, + target: key, + message: "Added deploy key", + additional_details: { add: "deploy_key" } + } + + ::Gitlab::Audit::Auditor.audit(audit_context) end end diff --git a/ee/spec/services/deploy_keys/create_service_spec.rb b/ee/spec/services/deploy_keys/create_service_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..48c2d3659095922e026e767d200bc514c6e640b1 --- /dev/null +++ b/ee/spec/services/deploy_keys/create_service_spec.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe DeployKeys::CreateService do + let_it_be(:group) { create(:group) } + let_it_be(:destination) { create(:external_audit_event_destination, group: group) } + let_it_be(:project) { create(:project, :repository, group: group) } + let_it_be(:user) { create(:user) } + let_it_be(:params) { attributes_for(:deploy_key) } + + subject { described_class.new(user, params).execute(project: project) } + + before do + stub_licensed_features(audit_events: true, external_audit_events: true) + end + + it "creates a deploy key" do + expect { subject }.to change { DeployKey.where(params.merge(user: user)).count }.by(1) + end + + it 'records an audit event', :aggregate_failures do + expect { subject }.to change { AuditEvent.count }.by(1) + audit_event = AuditEvent.last + + expect(audit_event.author_id).to eq(user.id) + expect(audit_event.entity_id).to eq(project.id) + expect(audit_event.entity_type).to eq(project.class.name) + expect(audit_event.details).to include({ + add: "deploy_key", + author_name: user.name, + custom_message: "Added deploy key", + target_details: params[:title], + target_type: "DeployKey" + }) + end + + it_behaves_like 'sends correct event type in audit event stream' do + let_it_be(:event_type) { "deploy_key_added" } + end +end diff --git a/ee/spec/services/projects/disable_deploy_key_service_spec.rb b/ee/spec/services/projects/disable_deploy_key_service_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..cb322f352f46754edc2fed00f8740960f023b8f4 --- /dev/null +++ b/ee/spec/services/projects/disable_deploy_key_service_spec.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Projects::DisableDeployKeyService do + let_it_be(:group) { create(:group) } + let_it_be(:destination) { create(:external_audit_event_destination, group: group) } + let_it_be(:deploy_key) { create(:deploy_key) } + let_it_be(:project) { create(:project, group: group) } + let_it_be(:deploy_key_project) { create(:deploy_keys_project, project: project, deploy_key: deploy_key) } + let_it_be(:user) { project.creator } + let_it_be(:params) { { id: deploy_key.id } } + + let_it_be(:service) { described_class.new(project, user, params) } + + before do + stub_licensed_features(audit_events: true, external_audit_events: true) + end + + it 'records an audit event' do + expect { service.execute }.to change { AuditEvent.count }.by(1) + + audit_event = AuditEvent.last + + expect(audit_event.author_id).to eq(user.id) + expect(audit_event.entity_id).to eq(project.id) + expect(audit_event.entity_type).to eq(project.class.name) + expect(audit_event.details).to include({ + remove: "deploy_key", + author_name: user.name, + custom_message: "Removed deploy key", + target_details: deploy_key.title, + target_type: "DeployKey" + }) + end + + it_behaves_like 'sends correct event type in audit event stream' do + let(:subject) { service.execute } + + let_it_be(:event_type) { "deploy_key_removed" } + end +end diff --git a/ee/spec/services/projects/enable_deploy_key_service_spec.rb b/ee/spec/services/projects/enable_deploy_key_service_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..a2f42a23321c3ed912cfdd01cf1ec57e797c42f1 --- /dev/null +++ b/ee/spec/services/projects/enable_deploy_key_service_spec.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Projects::EnableDeployKeyService do + let_it_be(:group) { create(:group) } + let_it_be(:destination) { create(:external_audit_event_destination, group: group) } + let_it_be(:deploy_key) { create(:deploy_key, public: true) } + let_it_be(:project) { create(:project, group: group) } + let_it_be(:user) { project.creator } + let_it_be(:params) { { key_id: deploy_key.id } } + + let_it_be(:service) { described_class.new(project, user, params) } + + before do + stub_licensed_features(audit_events: true, external_audit_events: true) + end + + it 'records an audit event' do + expect { service.execute }.to change { AuditEvent.count }.by(1) + + audit_event = AuditEvent.last + + expect(audit_event.author_id).to eq(user.id) + expect(audit_event.entity_id).to eq(project.id) + expect(audit_event.entity_type).to eq(project.class.name) + expect(audit_event.details).to include({ + add: "deploy_key", + author_name: user.name, + custom_message: "Added deploy key", + target_details: deploy_key.title, + target_type: "DeployKey" + }) + end + + it_behaves_like 'sends correct event type in audit event stream' do + let(:subject) { service.execute } + + let_it_be(:event_type) { "deploy_key_added" } + end +end diff --git a/spec/models/deploy_key_spec.rb b/spec/models/deploy_key_spec.rb index c22bad0e062441f0b06698af0741403dd6c57b7e..8c3b02427ae992c74405d1712cb5b86c9311ff7d 100644 --- a/spec/models/deploy_key_spec.rb +++ b/spec/models/deploy_key_spec.rb @@ -146,4 +146,10 @@ end end end + + describe '#audit_details' do + it "equals to the key's title" do + expect(subject.audit_details).to eq(subject.title) + end + end end