Commit 35634bd2 authored by Michał Zając's avatar Michał Zając

Fix group level vulnerability permissions

Bulk vulnerability dismissal checkboxes were not shown in the group
Vulnerability Report section.

This MR changes the GroupPolicy so that read_group_security_dashboard
policy enables admin_vulnerabilty rule when the access level is
developer or higher.

Update specs to reflect this

Changelog: fixed
EE: true
parent 5bb160d3
...@@ -46,7 +46,8 @@ module Groups::SecurityFeaturesHelper ...@@ -46,7 +46,8 @@ module Groups::SecurityFeaturesHelper
survey_request_svg_path: image_path('illustrations/security-dashboard_empty.svg'), survey_request_svg_path: image_path('illustrations/security-dashboard_empty.svg'),
dashboard_documentation: help_page_path('user/application_security/security_dashboard/index'), dashboard_documentation: help_page_path('user/application_security/security_dashboard/index'),
vulnerabilities_export_endpoint: expose_path(api_v4_security_groups_vulnerability_exports_path(id: group.id)), vulnerabilities_export_endpoint: expose_path(api_v4_security_groups_vulnerability_exports_path(id: group.id)),
scanners: VulnerabilityScanners::ListService.new(group).execute.to_json scanners: VulnerabilityScanners::ListService.new(group).execute.to_json,
can_admin_vulnerability: can?(current_user, :admin_vulnerability, group).to_s
} }
end end
end end
...@@ -281,7 +281,10 @@ module EE ...@@ -281,7 +281,10 @@ module EE
enable :read_group_audit_events enable :read_group_audit_events
end end
rule { security_dashboard_enabled & developer }.enable :read_group_security_dashboard rule { security_dashboard_enabled & developer }.policy do
enable :read_group_security_dashboard
enable :admin_vulnerability
end
rule { can?(:read_group_security_dashboard) }.policy do rule { can?(:read_group_security_dashboard) }.policy do
enable :create_vulnerability_export enable :create_vulnerability_export
......
...@@ -154,21 +154,27 @@ RSpec.describe Groups::SecurityFeaturesHelper do ...@@ -154,21 +154,27 @@ RSpec.describe Groups::SecurityFeaturesHelper do
end end
describe '#group_level_security_dashboard_data' do describe '#group_level_security_dashboard_data' do
subject { helper.group_level_security_dashboard_data(group) }
before do
allow(helper).to receive(:current_user).and_return(:user)
allow(helper).to receive(:can?).and_return(true)
end
let(:expected_data) do let(:expected_data) do
{ {
projects_endpoint: "http://localhost/api/v4/groups/#{group.id}/projects", projects_endpoint: "http://localhost/api/v4/groups/#{group.id}/projects",
group_full_path: group.full_path, group_full_path: group.full_path,
no_vulnerabilities_svg_path: '/images/illustrations/issues.svg', no_vulnerabilities_svg_path: helper.image_path('illustrations/issues.svg'),
empty_state_svg_path: '/images/illustrations/security-dashboard-empty-state.svg', empty_state_svg_path: helper.image_path('illustrations/security-dashboard-empty-state.svg'),
survey_request_svg_path: '/images/illustrations/security-dashboard_empty.svg', survey_request_svg_path: helper.image_path('illustrations/security-dashboard_empty.svg'),
dashboard_documentation: '/help/user/application_security/security_dashboard/index', dashboard_documentation: help_page_path('user/application_security/security_dashboard/index'),
vulnerabilities_export_endpoint: "/api/v4/security/groups/#{group.id}/vulnerability_exports", vulnerabilities_export_endpoint: "/api/v4/security/groups/#{group.id}/vulnerability_exports",
scanners: '[]' scanners: '[]',
can_admin_vulnerability: 'true'
} }
end end
subject { group_level_security_dashboard_data(group) }
it { is_expected.to eq(expected_data) } it { is_expected.to eq(expected_data) }
end end
end end
...@@ -6,6 +6,9 @@ RSpec.describe GroupPolicy do ...@@ -6,6 +6,9 @@ RSpec.describe GroupPolicy do
include AdminModeHelper include AdminModeHelper
include_context 'GroupPolicy context' include_context 'GroupPolicy context'
# Can't move to GroupPolicy context because auditor trait is not present
# outside of EE context and foss-impact will fail on this
let_it_be(:auditor) { create(:user, :auditor) }
let(:epic_rules) do let(:epic_rules) do
%i(read_epic create_epic admin_epic destroy_epic read_confidential_epic %i(read_epic create_epic admin_epic destroy_epic read_confidential_epic
...@@ -846,6 +849,66 @@ RSpec.describe GroupPolicy do ...@@ -846,6 +849,66 @@ RSpec.describe GroupPolicy do
end end
end end
describe 'admin_vulnerability' do
before do
stub_licensed_features(security_dashboard: true)
end
context 'with guest' do
let(:current_user) { auditor }
it { is_expected.to be_disallowed(:admin_vulnerability) }
end
context 'with reporter' do
let(:current_user) { reporter }
it { is_expected.to be_disallowed(:admin_vulnerability) }
end
context 'with developer' do
let(:current_user) { developer }
it { is_expected.to be_allowed(:admin_vulnerability) }
end
context 'with maintainer' do
let(:current_user) { maintainer }
it { is_expected.to be_allowed(:admin_vulnerability) }
end
context 'with owner' do
let(:current_user) { owner }
it { is_expected.to be_allowed(:admin_vulnerability) }
end
context 'with auditor' do
let(:current_user) { auditor }
context "when auditor is not a group member" do
it { is_expected.to be_disallowed(:admin_vulnerability) }
end
context "when developer doesn't have developer-level access to a group" do
before do
group.add_reporter(auditor)
end
it { is_expected.to be_disallowed(:admin_vulnerability) }
end
context 'when auditor has developer-level access to a group' do
before do
group.add_developer(auditor)
end
it { is_expected.to be_allowed(:admin_vulnerability) }
end
end
end
describe 'read_group_security_dashboard & create_vulnerability_export' do describe 'read_group_security_dashboard & create_vulnerability_export' do
let(:abilities) do let(:abilities) do
%i[read_group_security_dashboard create_vulnerability_export read_security_resource] %i[read_group_security_dashboard create_vulnerability_export read_security_resource]
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment