diff --git a/app/assets/javascripts/access_level/constants.js b/app/assets/javascripts/access_level/constants.js index d346f3ed40e011abb778be7248301a70a9779c6b..fab02c28969eaf017d50ec23911501916b83e986 100644 --- a/app/assets/javascripts/access_level/constants.js +++ b/app/assets/javascripts/access_level/constants.js @@ -6,6 +6,7 @@ export const ACCESS_LEVEL_MINIMAL_ACCESS_INTEGER = 5; export const ACCESS_LEVEL_GUEST_INTEGER = 10; export const ACCESS_LEVEL_PLANNER_INTEGER = 15; export const ACCESS_LEVEL_REPORTER_INTEGER = 20; +export const ACCESS_LEVEL_SECURITY_MANAGER_INTEGER = 25; export const ACCESS_LEVEL_DEVELOPER_INTEGER = 30; export const ACCESS_LEVEL_MAINTAINER_INTEGER = 40; export const ACCESS_LEVEL_OWNER_INTEGER = 50; @@ -17,6 +18,7 @@ export const ACCESS_LEVEL_MINIMAL_ACCESS_STRING = 'MINIMAL_ACCESS'; export const ACCESS_LEVEL_GUEST_STRING = 'GUEST'; export const ACCESS_LEVEL_PLANNER_STRING = 'PLANNER'; export const ACCESS_LEVEL_REPORTER_STRING = 'REPORTER'; +export const ACCESS_LEVEL_SECURITY_MANAGER_STRING = 'SECURITY_MANAGER'; export const ACCESS_LEVEL_DEVELOPER_STRING = 'DEVELOPER'; export const ACCESS_LEVEL_MAINTAINER_STRING = 'MAINTAINER'; export const ACCESS_LEVEL_OWNER_STRING = 'OWNER'; @@ -27,6 +29,9 @@ export const ACCESS_LEVELS_INTEGER_TO_STRING = { [ACCESS_LEVEL_GUEST_INTEGER]: ACCESS_LEVEL_GUEST_STRING, [ACCESS_LEVEL_PLANNER_INTEGER]: ACCESS_LEVEL_PLANNER_STRING, [ACCESS_LEVEL_REPORTER_INTEGER]: ACCESS_LEVEL_REPORTER_STRING, + ...(window.gon?.features?.securityManagerRoleEnabled + ? { [ACCESS_LEVEL_SECURITY_MANAGER_INTEGER]: ACCESS_LEVEL_SECURITY_MANAGER_STRING } + : {}), [ACCESS_LEVEL_DEVELOPER_INTEGER]: ACCESS_LEVEL_DEVELOPER_STRING, [ACCESS_LEVEL_MAINTAINER_INTEGER]: ACCESS_LEVEL_MAINTAINER_STRING, [ACCESS_LEVEL_OWNER_INTEGER]: ACCESS_LEVEL_OWNER_STRING, @@ -38,6 +43,9 @@ export const ACCESS_LEVELS_STRING_TO_INTEGER = { [ACCESS_LEVEL_GUEST_STRING]: ACCESS_LEVEL_GUEST_INTEGER, [ACCESS_LEVEL_PLANNER_STRING]: ACCESS_LEVEL_PLANNER_INTEGER, [ACCESS_LEVEL_REPORTER_STRING]: ACCESS_LEVEL_REPORTER_INTEGER, + ...(window.gon?.features?.securityManagerRoleEnabled + ? { [ACCESS_LEVEL_SECURITY_MANAGER_STRING]: ACCESS_LEVEL_SECURITY_MANAGER_INTEGER } + : {}), [ACCESS_LEVEL_DEVELOPER_STRING]: ACCESS_LEVEL_DEVELOPER_INTEGER, [ACCESS_LEVEL_MAINTAINER_STRING]: ACCESS_LEVEL_MAINTAINER_INTEGER, [ACCESS_LEVEL_OWNER_STRING]: ACCESS_LEVEL_OWNER_INTEGER, @@ -48,11 +56,22 @@ const ACCESS_LEVEL_MINIMAL_ACCESS = __('Minimal Access'); const ACCESS_LEVEL_GUEST = __('Guest'); const ACCESS_LEVEL_PLANNER = __('Planner'); const ACCESS_LEVEL_REPORTER = __('Reporter'); +const ACCESS_LEVEL_SECURITY_MANAGER = __('Security Manager'); const ACCESS_LEVEL_DEVELOPER = __('Developer'); const ACCESS_LEVEL_MAINTAINER = __('Maintainer'); const ACCESS_LEVEL_OWNER = __('Owner'); export const ACCESS_LEVEL_ADMIN = __('Admin'); +const SECURITY_MANAGER_ROLE = { + value: 'SECURITY_MANAGER', + text: ACCESS_LEVEL_SECURITY_MANAGER, + accessLevel: ACCESS_LEVEL_SECURITY_MANAGER_INTEGER, + occupiesSeat: true, + description: s__( + 'MemberRole|The Security Manager role provides comprehensive visibility and management over security aspects of the group or project.', + ), +}; + export const BASE_ROLES = [ { value: 'MINIMAL_ACCESS', @@ -91,6 +110,7 @@ export const BASE_ROLES = [ 'MemberRole|The Reporter role is suitable for team members who need to stay informed about a project or group but do not actively contribute code.', ), }, + ...(window.gon?.features?.securityManagerRoleEnabled ? [SECURITY_MANAGER_ROLE] : []), { value: 'DEVELOPER', text: ACCESS_LEVEL_DEVELOPER, @@ -134,6 +154,9 @@ export const ACCESS_LEVEL_LABELS = { [ACCESS_LEVEL_GUEST_INTEGER]: ACCESS_LEVEL_GUEST, [ACCESS_LEVEL_PLANNER_INTEGER]: ACCESS_LEVEL_PLANNER, [ACCESS_LEVEL_REPORTER_INTEGER]: ACCESS_LEVEL_REPORTER, + ...(window.gon?.features?.securityManagerRoleEnabled + ? { [ACCESS_LEVEL_SECURITY_MANAGER_INTEGER]: ACCESS_LEVEL_SECURITY_MANAGER } + : {}), [ACCESS_LEVEL_DEVELOPER_INTEGER]: ACCESS_LEVEL_DEVELOPER, [ACCESS_LEVEL_MAINTAINER_INTEGER]: ACCESS_LEVEL_MAINTAINER, [ACCESS_LEVEL_OWNER_INTEGER]: ACCESS_LEVEL_OWNER, diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index fb82a2d4501c5cd071255ded9769f017d3d0910a..cec36d433444ab5e9d683aa60a9071bbf323c7cb 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -803,10 +803,19 @@ def localized_access_names Gitlab::Access::GUEST => _('Guest'), Gitlab::Access::PLANNER => _('Planner'), Gitlab::Access::REPORTER => _('Reporter'), + **( + + if ::Gitlab::Security::SecurityManagerConfig.enabled? + { Gitlab::Access::SECURITY_MANAGER => _('Security Manager') } + else + {} + end + + ), Gitlab::Access::DEVELOPER => _('Developer'), Gitlab::Access::MAINTAINER => _('Maintainer'), Gitlab::Access::OWNER => _('Owner') - } + }.compact end def configure_oauth_import_message(provider, help_url) diff --git a/lib/gitlab/gon_helper.rb b/lib/gitlab/gon_helper.rb index ff4b60d2c0a13b0755e87ac082ae1f6d55885256..64ebdbed095ccd4e9b0b0c6aff60bb1b24e3616c 100644 --- a/lib/gitlab/gon_helper.rb +++ b/lib/gitlab/gon_helper.rb @@ -113,6 +113,8 @@ def add_gon_feature_flags # Expose the Project Studio user preference as if it were a feature flag push_force_frontend_feature_flag(:project_studio_enabled, Users::ProjectStudio.new(current_user).enabled?) + + push_force_frontend_feature_flag(:security_manager_role_enabled, Gitlab::Security::SecurityManagerConfig.enabled?) end # Exposes the state of a feature flag to the frontend code. diff --git a/locale/gitlab.pot b/locale/gitlab.pot index b96411c49d666203611447f4c1afbbfe7665f0ee..4de37933f1e2ea39e76d34b8af6a25bfb5759c3e 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -59898,6 +59898,9 @@ msgstr "" msgid "Security Finding not found" msgstr "" +msgid "Security Manager" +msgstr "" + msgid "Security Policy project already exists, but is not linked." msgstr "" diff --git a/spec/helpers/projects_helper_spec.rb b/spec/helpers/projects_helper_spec.rb index 90ac8f09f7db30cf57ea394a16fa1a1c18df4310..ffb2b4c923933be5eaf089cdf12ab27abbae97be 100644 --- a/spec/helpers/projects_helper_spec.rb +++ b/spec/helpers/projects_helper_spec.rb @@ -1622,6 +1622,7 @@ def license_name Gitlab::Access::MINIMAL_ACCESS | _("Minimal Access") Gitlab::Access::GUEST | _('Guest') Gitlab::Access::REPORTER | _('Reporter') + Gitlab::Access::SECURITY_MANAGER | _('Security Manager') Gitlab::Access::DEVELOPER | _('Developer') Gitlab::Access::MAINTAINER | _('Maintainer') Gitlab::Access::OWNER | _('Owner')