diff --git a/ee/app/services/security/scan_result_policies/sync_preexisting_states_approval_rules_service.rb b/ee/app/services/security/scan_result_policies/sync_preexisting_states_approval_rules_service.rb index 48d6405992cc49906d3063da90cbb8cd4039ce58..09c7bd536165154b04f1010c27620d85e4087947 100644 --- a/ee/app/services/security/scan_result_policies/sync_preexisting_states_approval_rules_service.rb +++ b/ee/app/services/security/scan_result_policies/sync_preexisting_states_approval_rules_service.rb @@ -24,13 +24,15 @@ def execute delegate :project, to: :merge_request, private: true def sync_required_approvals - rules_with_preexisting_states = merge_request.approval_rules.scan_finding.reject do |rule| + all_scan_finding_rules = merge_request.approval_rules.scan_finding + rules_with_preexisting_states = all_scan_finding_rules.reject do |rule| include_newly_detected?(rule) end return unless rules_with_preexisting_states.any? update_scan_finding_rules_with_preexisting_states(rules_with_preexisting_states) + generate_policy_bot_comment(merge_request, all_scan_finding_rules, :scan_finding) end def update_scan_finding_rules_with_preexisting_states(approval_rules) @@ -47,8 +49,6 @@ def update_required_approvals(violated_rules, unviolated_rules) log_violated_rules(violated_rules) violations.add(violated_rules.map(&:scan_result_policy_id), unviolated_rules.map(&:scan_result_policy_id)) violations.execute - - generate_policy_bot_comment(merge_request, violated_rules, :scan_finding) end def preexisting_findings_count_violated?(approval_rule) diff --git a/ee/app/services/security/scan_result_policies/update_approvals_service.rb b/ee/app/services/security/scan_result_policies/update_approvals_service.rb index 05cc922e834e94360d36fb951261ca5b559c0115..7639b724d661ac3fbc059906d2d98b16eff3466a 100644 --- a/ee/app/services/security/scan_result_policies/update_approvals_service.rb +++ b/ee/app/services/security/scan_result_policies/update_approvals_service.rb @@ -19,11 +19,13 @@ def execute return if pipeline.incomplete? return unless pipeline.can_store_security_reports? - approval_rules = merge_request.approval_rules.scan_finding + all_scan_finding_rules = merge_request.approval_rules.scan_finding - if security_policies_sync_preexisting_state_enabled? - approval_rules = approval_rules.select { |rule| include_newly_detected?(rule) } - end + approval_rules = if security_policies_sync_preexisting_state_enabled? + all_scan_finding_rules.select { |rule| include_newly_detected?(rule) } + else + all_scan_finding_rules + end return if approval_rules.empty? @@ -37,7 +39,7 @@ def execute update_required_approvals(violated_rules, unviolated_rules) violations.add(violated_rules.pluck(:scan_result_policy_id), unviolated_rules.pluck(:scan_result_policy_id)) # rubocop:disable CodeReuse/ActiveRecord violations.execute - generate_policy_bot_comment(merge_request, violated_rules, :scan_finding) + generate_policy_bot_comment(merge_request, all_scan_finding_rules, :scan_finding) end private diff --git a/ee/app/services/security/sync_license_scanning_rules_service.rb b/ee/app/services/security/sync_license_scanning_rules_service.rb index 3d29484cbe20fdae2c758d0edc27d2b21153f180..c025afa6dd4b27e54933a6cf9429901b32950dc6 100644 --- a/ee/app/services/security/sync_license_scanning_rules_service.rb +++ b/ee/app/services/security/sync_license_scanning_rules_service.rb @@ -53,7 +53,7 @@ def remove_required_license_finding_approval(merge_request) log_violated_rules(merge_request, violated_rules) violations.add(violated_rules.pluck(:scan_result_policy_id), unviolated_rules.pluck(:scan_result_policy_id)) # rubocop:disable CodeReuse/ActiveRecord violations.execute - generate_policy_bot_comment(merge_request, violated_rules, :license_scanning) + generate_policy_bot_comment(merge_request, license_approval_rules, :license_scanning) end def update_required_approvals(merge_request, violated_rules, unviolated_rules) diff --git a/ee/spec/services/security/scan_result_policies/sync_any_merge_request_rules_service_spec.rb b/ee/spec/services/security/scan_result_policies/sync_any_merge_request_rules_service_spec.rb index da9de77589755384250a313a95d7c208c18de2a2..300bd79245232579621f88e3dc1df09982958575 100644 --- a/ee/spec/services/security/scan_result_policies/sync_any_merge_request_rules_service_spec.rb +++ b/ee/spec/services/security/scan_result_policies/sync_any_merge_request_rules_service_spec.rb @@ -70,7 +70,7 @@ end it_behaves_like 'sets approvals_required to 0' - it_behaves_like 'triggers policy bot comment', :any_merge_request, false + it_behaves_like 'triggers policy bot comment', :any_merge_request, false, requires_approval: false it_behaves_like 'merge request without scan result violations' it 'does not create a log' do @@ -87,7 +87,7 @@ end it_behaves_like 'sets approvals_required to 0' - it_behaves_like 'triggers policy bot comment', :any_merge_request, false + it_behaves_like 'triggers policy bot comment', :any_merge_request, false, requires_approval: false it_behaves_like 'merge request without scan result violations' end end @@ -201,7 +201,7 @@ end end - it_behaves_like 'triggers policy bot comment', :any_merge_request, false + it_behaves_like 'triggers policy bot comment', :any_merge_request, false, requires_approval: false it_behaves_like 'merge request without scan result violations' do let(:scan_result_policy_read) { scan_result_policy_read_with_commits } end diff --git a/ee/spec/services/security/scan_result_policies/sync_preexisting_states_approval_rules_service_spec.rb b/ee/spec/services/security/scan_result_policies/sync_preexisting_states_approval_rules_service_spec.rb index 9189a83a8de07f8125bc9acf7faa81642ff3d428..636e073a5d76b1e4c6a85eb8571ac3d27a172896 100644 --- a/ee/spec/services/security/scan_result_policies/sync_preexisting_states_approval_rules_service_spec.rb +++ b/ee/spec/services/security/scan_result_policies/sync_preexisting_states_approval_rules_service_spec.rb @@ -71,7 +71,7 @@ it_behaves_like 'does not log violations' end - context 'when rules does not contain pre-existing states' do + context 'when rules do not contain pre-existing states' do let!(:approver_rule) do create(:report_approver_rule, :scan_finding, merge_request: merge_request, approval_project_rule: approval_project_rule, approvals_required: approvals_required, @@ -103,7 +103,7 @@ end it_behaves_like 'does not update approval rules' - it_behaves_like 'triggers policy bot comment', :scan_finding, false, requires_approval: true + it_behaves_like 'triggers policy bot comment', :scan_finding, false it_behaves_like 'merge request without scan result violations', previous_violation: false it 'logs update' do @@ -128,6 +128,28 @@ it_behaves_like 'sets approvals_required to 0' it_behaves_like 'triggers policy bot comment', :scan_finding, false it_behaves_like 'does not log violations' + + context 'when there are other scan_finding violations' do + let_it_be(:scan_result_policy_read_other_scan_finding) { create(:scan_result_policy_read, project: project) } + let_it_be(:approval_project_rule_other) do + create(:approval_project_rule, :scan_finding, project: project, approvals_required: 1, + scan_result_policy_read: scan_result_policy_read_other_scan_finding) + end + + let_it_be(:approver_rule_other) do + create(:report_approver_rule, :scan_finding, + merge_request: merge_request, vulnerability_states: ['new_needs_triage'], + approval_project_rule: approval_project_rule_other, approvals_required: 1, + scan_result_policy_read: scan_result_policy_read_other_scan_finding) + end + + let_it_be(:other_violation) do + create(:scan_result_policy_violation, scan_result_policy_read: scan_result_policy_read_other_scan_finding, + merge_request: merge_request) + end + + it_behaves_like 'triggers policy bot comment', :scan_finding, true + end end end end diff --git a/ee/spec/services/security/scan_result_policies/update_approvals_service_spec.rb b/ee/spec/services/security/scan_result_policies/update_approvals_service_spec.rb index 375dc5738cc783d2bcea145c426740555f674578..b1fd897fed5c1c496273a288d352b9760def3a21 100644 --- a/ee/spec/services/security/scan_result_policies/update_approvals_service_spec.rb +++ b/ee/spec/services/security/scan_result_policies/update_approvals_service_spec.rb @@ -168,6 +168,28 @@ it_behaves_like 'sets approvals_required to 0' it_behaves_like 'triggers policy bot comment', :scan_finding, false + + context 'when there are other scan_finding violations' do + let_it_be(:scan_result_policy_read_other_scan_finding) { create(:scan_result_policy_read, project: project) } + let_it_be(:approval_project_rule_other) do + create(:approval_project_rule, :scan_finding, project: project, approvals_required: 1, + scan_result_policy_read: scan_result_policy_read_other_scan_finding) + end + + let_it_be(:approver_rule_other) do + create(:report_approver_rule, :scan_finding, + merge_request: merge_request, vulnerability_states: ['detected'], + approval_project_rule: approval_project_rule_other, approvals_required: 1, + scan_result_policy_read: scan_result_policy_read_other_scan_finding) + end + + let_it_be(:other_violation) do + create(:scan_result_policy_violation, scan_result_policy_read: scan_result_policy_read_other_scan_finding, + merge_request: merge_request) + end + + it_behaves_like 'triggers policy bot comment', :scan_finding, true + end end context 'when there are no required approvals' do diff --git a/ee/spec/services/security/unenforceable_policy_rules_notification_service_spec.rb b/ee/spec/services/security/unenforceable_policy_rules_notification_service_spec.rb index e4595a70b245377d2520eb74e140bc51df327d53..b4808aea00aa67db886c96510bd9a7f43e8f1c22 100644 --- a/ee/spec/services/security/unenforceable_policy_rules_notification_service_spec.rb +++ b/ee/spec/services/security/unenforceable_policy_rules_notification_service_spec.rb @@ -66,7 +66,7 @@ end shared_examples_for 'unenforceable report' do |report_type| - it_behaves_like 'triggers policy bot comment', report_type, false + it_behaves_like 'triggers policy bot comment', report_type, false, requires_approval: false context 'with violated approval rules' do let(:approvals_required) { 1 } @@ -112,7 +112,7 @@ end end - it_behaves_like 'triggers policy bot comment', report_type, false + it_behaves_like 'triggers policy bot comment', report_type, false, requires_approval: false end end end diff --git a/ee/spec/support/shared_examples/services/security/policy_violation_comment_shared_examples.rb b/ee/spec/support/shared_examples/services/security/policy_violation_comment_shared_examples.rb index c48a706085e98d3848836ec802ba7a60668b974f..c8b9ddfa982b3c3982ecf5f669593751a109d5f8 100644 --- a/ee/spec/support/shared_examples/services/security/policy_violation_comment_shared_examples.rb +++ b/ee/spec/support/shared_examples/services/security/policy_violation_comment_shared_examples.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true RSpec.shared_examples_for 'triggers policy bot comment' do |report_type, expected_violation, - requires_approval: expected_violation| + requires_approval: true| it 'enqueues Security::GeneratePolicyViolationCommentWorker' do expect(Security::GeneratePolicyViolationCommentWorker).to receive(:perform_async).with( merge_request.id,