diff --git a/app/assets/javascripts/security_configuration/components/app.vue b/app/assets/javascripts/security_configuration/components/app.vue index 66b8db1f764a597c8d5b097ac26161c36a120a31..d57b3fda342b54d613e33a4de484c5b85c4c3d25 100644 --- a/app/assets/javascripts/security_configuration/components/app.vue +++ b/app/assets/javascripts/security_configuration/components/app.vue @@ -12,7 +12,6 @@ import FeatureCard from './feature_card.vue'; import TrainingProviderList from './training_provider_list.vue'; export const i18n = { - compliance: s__('SecurityConfiguration|Compliance'), configurationHistory: s__('SecurityConfiguration|Configuration history'), securityTesting: s__('SecurityConfiguration|Security testing'), latestPipelineDescription: s__( @@ -59,10 +58,6 @@ export default { type: Array, required: true, }, - augmentedComplianceFeatures: { - type: Array, - required: true, - }, gitlabCiPresent: { type: Boolean, required: false, @@ -101,9 +96,7 @@ export default { }, computed: { canUpgrade() { - return [...this.augmentedSecurityFeatures, ...this.augmentedComplianceFeatures].some( - ({ available }) => !available, - ); + return [...this.augmentedSecurityFeatures].some(({ available }) => !available); }, canViewCiHistory() { return Boolean(this.gitlabCiPresent && this.gitlabCiHistoryPath); @@ -225,44 +218,6 @@ export default { </template> </section-layout> </gl-tab> - <gl-tab - data-testid="compliance-testing-tab" - :title="$options.i18n.compliance" - query-param-value="compliance-testing" - > - <section-layout :heading="$options.i18n.compliance"> - <template #description> - <p> - <span data-testid="latest-pipeline-info-compliance"> - <gl-sprintf - v-if="latestPipelinePath" - :message="$options.i18n.latestPipelineDescription" - > - <template #link="{ content }"> - <gl-link :href="latestPipelinePath">{{ content }}</gl-link> - </template> - </gl-sprintf> - </span> - - {{ $options.i18n.description }} - </p> - <p v-if="canViewCiHistory"> - <gl-link data-testid="compliance-view-history-link" :href="gitlabCiHistoryPath">{{ - $options.i18n.configurationHistory - }}</gl-link> - </p> - </template> - <template #features> - <feature-card - v-for="feature in augmentedComplianceFeatures" - :key="feature.type" - :feature="feature" - class="gl-mb-6" - @error="onError" - /> - </template> - </section-layout> - </gl-tab> <gl-tab data-testid="vulnerability-management-tab" :title="$options.i18n.vulnerabilityManagement" diff --git a/app/assets/javascripts/security_configuration/components/constants.js b/app/assets/javascripts/security_configuration/components/constants.js index d46e9983a44ac60b3bc1429864b22cd0c55090bd..3bf0401ef5e4170416473cbee91b35e0048dede6 100644 --- a/app/assets/javascripts/security_configuration/components/constants.js +++ b/app/assets/javascripts/security_configuration/components/constants.js @@ -13,7 +13,6 @@ import { REPORT_TYPE_COVERAGE_FUZZING, REPORT_TYPE_CORPUS_MANAGEMENT, REPORT_TYPE_API_FUZZING, - REPORT_TYPE_LICENSE_COMPLIANCE, } from '~/vue_shared/security_reports/constants'; import kontraLogo from 'images/vulnerability/kontra-logo.svg'; @@ -150,14 +149,6 @@ export const API_FUZZING_NAME = __('API Fuzzing'); export const API_FUZZING_DESCRIPTION = __('Find bugs in your code with API fuzzing.'); export const API_FUZZING_HELP_PATH = helpPagePath('user/application_security/api_fuzzing/index'); -export const LICENSE_COMPLIANCE_NAME = __('License Compliance'); -export const LICENSE_COMPLIANCE_DESCRIPTION = __( - 'Search your project dependencies for their licenses and apply policies.', -); -export const LICENSE_COMPLIANCE_HELP_PATH = helpPagePath( - 'user/compliance/license_compliance/index', -); - export const CLUSTER_IMAGE_SCANNING_NAME = s__('ciReport|Cluster Image Scanning'); export const SCANNER_NAMES_MAP = { @@ -273,15 +264,6 @@ export const securityFeatures = [ }, ]; -export const complianceFeatures = [ - { - name: LICENSE_COMPLIANCE_NAME, - description: LICENSE_COMPLIANCE_DESCRIPTION, - helpPath: LICENSE_COMPLIANCE_HELP_PATH, - type: REPORT_TYPE_LICENSE_COMPLIANCE, - }, -]; - export const featureToMutationMap = { [REPORT_TYPE_SAST]: { mutationId: 'configureSast', diff --git a/app/assets/javascripts/security_configuration/index.js b/app/assets/javascripts/security_configuration/index.js index 637d510e6843a13318d36bdb2a8cdafe9e661b23..aa3c9c876221d46d0253ad46378c2716428fdac6 100644 --- a/app/assets/javascripts/security_configuration/index.js +++ b/app/assets/javascripts/security_configuration/index.js @@ -3,7 +3,7 @@ import VueApollo from 'vue-apollo'; import createDefaultClient from '~/lib/graphql'; import { parseBooleanDataAttributes } from '~/lib/utils/dom_utils'; import SecurityConfigurationApp from './components/app.vue'; -import { securityFeatures, complianceFeatures } from './components/constants'; +import { securityFeatures } from './components/constants'; import { augmentFeatures } from './utils'; export const initSecurityConfiguration = (el) => { @@ -28,9 +28,8 @@ export const initSecurityConfiguration = (el) => { vulnerabilityTrainingDocsPath, } = el.dataset; - const { augmentedSecurityFeatures, augmentedComplianceFeatures } = augmentFeatures( + const { augmentedSecurityFeatures } = augmentFeatures( securityFeatures, - complianceFeatures, features ? JSON.parse(features) : [], ); @@ -48,7 +47,6 @@ export const initSecurityConfiguration = (el) => { render(createElement) { return createElement(SecurityConfigurationApp, { props: { - augmentedComplianceFeatures, augmentedSecurityFeatures, latestPipelinePath, gitlabCiHistoryPath, diff --git a/app/assets/javascripts/security_configuration/utils.js b/app/assets/javascripts/security_configuration/utils.js index df23698ba7e2fa26be26b8db63f6977724166116..72e6d870e131ad8d51e77a5a387a89731cb69974 100644 --- a/app/assets/javascripts/security_configuration/utils.js +++ b/app/assets/javascripts/security_configuration/utils.js @@ -2,19 +2,18 @@ import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils'; import { SCANNER_NAMES_MAP } from '~/security_configuration/components/constants'; /** - * This function takes in 3 arrays of objects, securityFeatures, complianceFeatures and features. - * securityFeatures and complianceFeatures are static arrays living in the constants. + * This function takes in 3 arrays of objects, securityFeatures and features. + * securityFeatures are static arrays living in the constants. * features is dynamic and coming from the backend. * This function builds a superset of those arrays. * It looks for matching keys within the dynamic and the static arrays * and will enrich the objects with the available static data. * @param [{}] securityFeatures - * @param [{}] complianceFeatures * @param [{}] features * @returns {Object} Object with enriched features from constants divided into Security and Compliance Features */ -export const augmentFeatures = (securityFeatures, complianceFeatures, features = []) => { +export const augmentFeatures = (securityFeatures, features = []) => { const featuresByType = features.reduce((acc, feature) => { acc[feature.type] = convertObjectPropsToCamelCase(feature, { deep: true }); return acc; @@ -39,7 +38,6 @@ export const augmentFeatures = (securityFeatures, complianceFeatures, features = return { augmentedSecurityFeatures: securityFeatures.map((feature) => augmentFeature(feature)), - augmentedComplianceFeatures: complianceFeatures.map((feature) => augmentFeature(feature)), }; }; diff --git a/app/assets/javascripts/vue_shared/security_reports/constants.js b/app/assets/javascripts/vue_shared/security_reports/constants.js index 8b52364597348200ed25ac84c56eba48ce510d0c..a1d75e08be9622ef6b4596aed81703a0e3ff3cb1 100644 --- a/app/assets/javascripts/vue_shared/security_reports/constants.js +++ b/app/assets/javascripts/vue_shared/security_reports/constants.js @@ -27,7 +27,6 @@ export const REPORT_TYPE_CONTAINER_SCANNING = 'container_scanning'; export const REPORT_TYPE_CLUSTER_IMAGE_SCANNING = 'cluster_image_scanning'; export const REPORT_TYPE_COVERAGE_FUZZING = 'coverage_fuzzing'; export const REPORT_TYPE_CORPUS_MANAGEMENT = 'corpus_management'; -export const REPORT_TYPE_LICENSE_COMPLIANCE = 'license_scanning'; export const REPORT_TYPE_API_FUZZING = 'api_fuzzing'; export const REPORT_TYPE_MANUALLY_ADDED = 'generic'; diff --git a/ee/app/assets/javascripts/security_configuration/components/upgrade_banner.vue b/ee/app/assets/javascripts/security_configuration/components/upgrade_banner.vue index eaff1ce6055e9b952a1f4241aa8f0e877ad46aae..9385a5484d636ddad5bd2639fbb3c1427d5f2431 100644 --- a/ee/app/assets/javascripts/security_configuration/components/upgrade_banner.vue +++ b/ee/app/assets/javascripts/security_configuration/components/upgrade_banner.vue @@ -21,9 +21,7 @@ export default { s__('SecurityConfiguration|Vulnerability details and statistics in the merge request'), s__('SecurityConfiguration|High-level vulnerability statistics across projects and groups'), s__('SecurityConfiguration|Runtime security metrics for application environments'), - s__( - 'SecurityConfiguration|More scan types, including DAST, Dependency Scanning, Fuzzing, and Licence Compliance', - ), + s__('SecurityConfiguration|More scan types, including DAST, Dependency Scanning, Fuzzing'), ], buttonText: s__('SecurityConfiguration|Upgrade or start a free trial'), }, diff --git a/ee/spec/frontend/security_configuration/components/app_spec.js b/ee/spec/frontend/security_configuration/components/app_spec.js index 4394ab1a20629ee10333fefa11de2aae9f2cb333..05ffecb9ad3768fdeeb5677bd22ddacd00d7216c 100644 --- a/ee/spec/frontend/security_configuration/components/app_spec.js +++ b/ee/spec/frontend/security_configuration/components/app_spec.js @@ -3,11 +3,7 @@ import stubChildren from 'helpers/stub_children'; import { mountExtended } from 'helpers/vue_test_utils_helper'; import SecurityConfigurationApp from '~/security_configuration/components/app.vue'; import UpgradeBanner from 'ee/security_configuration/components/upgrade_banner.vue'; -import { - complianceFeaturesMock, - securityFeaturesMock, - provideMock, -} from 'jest/security_configuration/mock_data'; +import { securityFeaturesMock, provideMock } from 'jest/security_configuration/mock_data'; describe('~/security_configuration/components/app', () => { let wrapper; @@ -19,7 +15,6 @@ describe('~/security_configuration/components/app', () => { wrapper = mountExtended(SecurityConfigurationApp, { propsData: { augmentedSecurityFeatures: securityFeaturesMock, - augmentedComplianceFeatures: complianceFeaturesMock, securityTrainingEnabled: true, ...propsData, }, @@ -43,7 +38,12 @@ describe('~/security_configuration/components/app', () => { describe('given at least one unavailable feature', () => { beforeEach(() => { createComponent({ - augmentedComplianceFeatures: complianceFeaturesMock.map(makeAvailable(false)), + augmentedSecurityFeatures: [ + { + ...securityFeaturesMock[0], + available: false, + }, + ], }); }); @@ -63,7 +63,6 @@ describe('~/security_configuration/components/app', () => { describe('given at least one unavailable feature, but banner is already dismissed', () => { beforeEach(() => { createComponent({ - augmentedComplianceFeatures: complianceFeaturesMock.map(makeAvailable(false)), shouldShowCallout: false, }); }); @@ -77,7 +76,6 @@ describe('~/security_configuration/components/app', () => { beforeEach(() => { createComponent({ augmentedSecurityFeatures: securityFeaturesMock.map(makeAvailable(true)), - augmentedComplianceFeatures: complianceFeaturesMock.map(makeAvailable(true)), }); }); diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 286f3aa4f7fcc16f25b1690e7720c043394358ef..11b1057c1e327e62c4e19b04ef49e77e451c19af 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -39766,9 +39766,6 @@ msgstr "" msgid "Search users or groups" msgstr "" -msgid "Search your project dependencies for their licenses and apply policies." -msgstr "" - msgid "Search your projects" msgstr "" @@ -40007,9 +40004,6 @@ msgstr "" msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the merge request." msgstr "" -msgid "SecurityConfiguration|Compliance" -msgstr "" - msgid "SecurityConfiguration|Configuration guide" msgstr "" @@ -40076,7 +40070,7 @@ msgstr "" msgid "SecurityConfiguration|Manage profiles for use by DAST scans." msgstr "" -msgid "SecurityConfiguration|More scan types, including DAST, Dependency Scanning, Fuzzing, and Licence Compliance" +msgid "SecurityConfiguration|More scan types, including DAST, Dependency Scanning, Fuzzing" msgstr "" msgid "SecurityConfiguration|Not enabled" diff --git a/spec/frontend/security_configuration/components/app_spec.js b/spec/frontend/security_configuration/components/app_spec.js index c4e6bef71ebe020b78b78ff086c50d04b70f54bf..364fe733a41644ae5c5bbfd11d47d4299ce342a7 100644 --- a/spec/frontend/security_configuration/components/app_spec.js +++ b/spec/frontend/security_configuration/components/app_spec.js @@ -11,7 +11,7 @@ import AutoDevopsEnabledAlert from '~/security_configuration/components/auto_dev import { AUTO_DEVOPS_ENABLED_ALERT_DISMISSED_STORAGE_KEY } from '~/security_configuration/components/constants'; import FeatureCard from '~/security_configuration/components/feature_card.vue'; import TrainingProviderList from '~/security_configuration/components/training_provider_list.vue'; -import { complianceFeaturesMock, securityFeaturesMock, provideMock } from '../mock_data'; +import { securityFeaturesMock, provideMock } from '../mock_data'; const gitlabCiHistoryPath = 'test/historyPath'; const { vulnerabilityTrainingDocsPath, projectFullPath } = provideMock; @@ -29,7 +29,6 @@ describe('~/security_configuration/components/app', () => { wrapper = mountExtended(SecurityConfigurationApp, { propsData: { augmentedSecurityFeatures: securityFeaturesMock, - augmentedComplianceFeatures: complianceFeaturesMock, securityTrainingEnabled: true, ...propsData, }, @@ -72,12 +71,7 @@ describe('~/security_configuration/components/app', () => { text: i18n.configurationHistory, container: findByTestId('security-testing-tab'), }); - const findComplianceViewHistoryLink = () => - findLink({ - href: gitlabCiHistoryPath, - text: i18n.configurationHistory, - container: findByTestId('compliance-testing-tab'), - }); + const findAutoDevopsAlert = () => wrapper.findComponent(AutoDevopsAlert); const findAutoDevopsEnabledAlert = () => wrapper.findComponent(AutoDevopsEnabledAlert); const findVulnerabilityManagementTab = () => wrapper.findByTestId('vulnerability-management-tab'); @@ -94,7 +88,7 @@ describe('~/security_configuration/components/app', () => { }); describe('tabs', () => { - const expectedTabs = ['security-testing', 'compliance-testing', 'vulnerability-management']; + const expectedTabs = ['security-testing', 'vulnerability-management']; it('renders GlTab Component', () => { expect(findTab().exists()).toBe(true); @@ -123,9 +117,8 @@ describe('~/security_configuration/components/app', () => { it('renders right amount of feature cards for given props with correct props', () => { const cards = findFeatureCards(); - expect(cards).toHaveLength(2); + expect(cards).toHaveLength(1); expect(cards.at(0).props()).toEqual({ feature: securityFeaturesMock[0] }); - expect(cards.at(1).props()).toEqual({ feature: complianceFeaturesMock[0] }); }); it('renders a basic description', () => { @@ -137,7 +130,6 @@ describe('~/security_configuration/components/app', () => { }); it('should not show configuration History Link when gitlabCiPresent & gitlabCiHistoryPath are not defined', () => { - expect(findComplianceViewHistoryLink().exists()).toBe(false); expect(findSecurityViewHistoryLink().exists()).toBe(false); }); }); @@ -158,7 +150,7 @@ describe('~/security_configuration/components/app', () => { it('should show Alert with error Message', async () => { expect(findManageViaMRErrorAlert().exists()).toBe(false); - findFeatureCards().at(1).vm.$emit('error', errorMessage); + findFeatureCards().at(0).vm.$emit('error', errorMessage); await nextTick(); expect(findManageViaMRErrorAlert().exists()).toBe(true); @@ -166,7 +158,7 @@ describe('~/security_configuration/components/app', () => { }); it('should hide Alert when it is dismissed', async () => { - findFeatureCards().at(1).vm.$emit('error', errorMessage); + findFeatureCards().at(0).vm.$emit('error', errorMessage); await nextTick(); expect(findManageViaMRErrorAlert().exists()).toBe(true); @@ -257,7 +249,6 @@ describe('~/security_configuration/components/app', () => { createComponent({ augmentedSecurityFeatures: securityFeaturesMock, - augmentedComplianceFeatures: complianceFeaturesMock, autoDevopsEnabled: true, }); @@ -285,24 +276,6 @@ describe('~/security_configuration/components/app', () => { latestPipelinePath: 'test/path', }); }); - - it('should show latest pipeline info on the security tab with correct link when latestPipelinePath is defined', () => { - const latestPipelineInfoSecurity = findByTestId('latest-pipeline-info-security'); - - expect(latestPipelineInfoSecurity.text()).toMatchInterpolatedText( - i18n.latestPipelineDescription, - ); - expect(latestPipelineInfoSecurity.find('a').attributes('href')).toBe('test/path'); - }); - - it('should show latest pipeline info on the compliance tab with correct link when latestPipelinePath is defined', () => { - const latestPipelineInfoCompliance = findByTestId('latest-pipeline-info-compliance'); - - expect(latestPipelineInfoCompliance.text()).toMatchInterpolatedText( - i18n.latestPipelineDescription, - ); - expect(latestPipelineInfoCompliance.find('a').attributes('href')).toBe('test/path'); - }); }); describe('given gitlabCiPresent & gitlabCiHistoryPath props', () => { @@ -314,10 +287,8 @@ describe('~/security_configuration/components/app', () => { }); it('should show configuration History Link', () => { - expect(findComplianceViewHistoryLink().exists()).toBe(true); expect(findSecurityViewHistoryLink().exists()).toBe(true); - expect(findComplianceViewHistoryLink().attributes('href')).toBe('test/historyPath'); expect(findSecurityViewHistoryLink().attributes('href')).toBe('test/historyPath'); }); }); diff --git a/spec/frontend/security_configuration/mock_data.js b/spec/frontend/security_configuration/mock_data.js index 24ad8024b0152c137efc8b8cc6e26f103eb3231f..3d4f01d0da1cf14803f281fa174775c78c41fd49 100644 --- a/spec/frontend/security_configuration/mock_data.js +++ b/spec/frontend/security_configuration/mock_data.js @@ -4,14 +4,8 @@ import { SAST_DESCRIPTION, SAST_HELP_PATH, SAST_CONFIG_HELP_PATH, - LICENSE_COMPLIANCE_NAME, - LICENSE_COMPLIANCE_DESCRIPTION, - LICENSE_COMPLIANCE_HELP_PATH, } from '~/security_configuration/components/constants'; -import { - REPORT_TYPE_LICENSE_COMPLIANCE, - REPORT_TYPE_SAST, -} from '~/vue_shared/security_reports/constants'; +import { REPORT_TYPE_SAST } from '~/vue_shared/security_reports/constants'; export const testProjectPath = 'foo/bar'; export const testProviderIds = [101, 102, 103]; @@ -128,16 +122,6 @@ export const securityFeaturesMock = [ }, ]; -export const complianceFeaturesMock = [ - { - name: LICENSE_COMPLIANCE_NAME, - description: LICENSE_COMPLIANCE_DESCRIPTION, - helpPath: LICENSE_COMPLIANCE_HELP_PATH, - type: REPORT_TYPE_LICENSE_COMPLIANCE, - configurationHelpPath: LICENSE_COMPLIANCE_HELP_PATH, - }, -]; - export const provideMock = { upgradePath: '/upgrade', autoDevopsHelpPagePath: '/autoDevopsHelpPagePath', diff --git a/spec/frontend/security_configuration/utils_spec.js b/spec/frontend/security_configuration/utils_spec.js index 241e69204d20ba2b4ac5765f82f4472756eb6ca8..6e731e45da24672799856042831f805760da1e8d 100644 --- a/spec/frontend/security_configuration/utils_spec.js +++ b/spec/frontend/security_configuration/utils_spec.js @@ -9,13 +9,6 @@ describe('augmentFeatures', () => { }, ]; - const mockComplianceFeatures = [ - { - name: 'LICENSE_COMPLIANCE', - type: 'LICENSE_COMPLIANCE', - }, - ]; - const mockFeaturesWithSecondary = [ { name: 'DAST', @@ -51,30 +44,25 @@ describe('augmentFeatures', () => { const expectedOutputDefault = { augmentedSecurityFeatures: mockSecurityFeatures, - augmentedComplianceFeatures: mockComplianceFeatures, }; const expectedOutputSecondary = { augmentedSecurityFeatures: mockSecurityFeatures, - augmentedComplianceFeatures: mockFeaturesWithSecondary, }; const expectedOutputCustomFeature = { augmentedSecurityFeatures: mockValidCustomFeature, - augmentedComplianceFeatures: mockComplianceFeatures, }; - describe('returns an object with augmentedSecurityFeatures and augmentedComplianceFeatures when', () => { + describe('returns an object with augmentedSecurityFeatures when', () => { it('given an empty array', () => { - expect(augmentFeatures(mockSecurityFeatures, mockComplianceFeatures, [])).toEqual( - expectedOutputDefault, - ); + expect(augmentFeatures(mockSecurityFeatures, [])).toEqual(expectedOutputDefault); }); it('given an invalid populated array', () => { - expect( - augmentFeatures(mockSecurityFeatures, mockComplianceFeatures, mockInvalidCustomFeature), - ).toEqual(expectedOutputDefault); + expect(augmentFeatures(mockSecurityFeatures, mockInvalidCustomFeature)).toEqual( + expectedOutputDefault, + ); }); it('features have secondary key', () => { @@ -84,21 +72,17 @@ describe('augmentFeatures', () => { }); it('given a valid populated array', () => { - expect( - augmentFeatures(mockSecurityFeatures, mockComplianceFeatures, mockValidCustomFeature), - ).toEqual(expectedOutputCustomFeature); + expect(augmentFeatures(mockSecurityFeatures, mockValidCustomFeature)).toEqual( + expectedOutputCustomFeature, + ); }); }); describe('returns an object with camelcased keys', () => { it('given a customfeature in snakecase', () => { - expect( - augmentFeatures( - mockSecurityFeatures, - mockComplianceFeatures, - mockValidCustomFeatureSnakeCase, - ), - ).toEqual(expectedOutputCustomFeature); + expect(augmentFeatures(mockSecurityFeatures, mockValidCustomFeatureSnakeCase)).toEqual( + expectedOutputCustomFeature, + ); }); }); });