diff --git a/src/containers/DefaultContainer.vue b/src/containers/DefaultContainer.vue index d89bacd8a..dd7feda0b 100644 --- a/src/containers/DefaultContainer.vue +++ b/src/containers/DefaultContainer.vue @@ -93,6 +93,22 @@ icon: 'fa fa-balance-scale', permission: permissions.VIEW_PORTFOLIO }, + { + title: true, + name: this.$t('message.global_audit'), + class: '', + wrapper: { + element: '', + attributes: {} + }, + permission: permissions.VIEW_VULNERABILITY + }, + { + name: this.$t('message.vulnerability_audit'), + url: '/vulnerabilityAudit', + icon: 'fa fa-tasks', + permission: permissions.VIEW_VULNERABILITY + }, { title: true, name: this.$t('message.administration'), @@ -114,7 +130,7 @@ url: '/admin', icon: 'fa fa-cogs', permission: permissions.SYSTEM_CONFIGURATION - } + }, ] } }, diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index 0c23b7c12..94baacbe0 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -82,6 +82,8 @@ "last_bom_import": "Last BOM Import", "overview": "Overview", "audit": "Audit", + "global_audit": "Global Audit", + "vulnerability_audit": "Vulnerability Audit", "audit_vulnerabilities": "Audit Vulnerabilities", "policy_violations": "Policy Violations", "policy_violations_by_classification": "Policy Violations by Classification", @@ -136,6 +138,8 @@ "project_cloning_in_progress": "The project is being created with the cloning options specified", "vulnerability": "Vulnerability", "analysis": "Analysis", + "analysis_status": "Analysis Status", + "analysis_state": "Analysis State", "analysis_tooltip": "The current state of an occurrence of a vulnerability", "justification": "Justification", "justification_tooltip": "The rationale of why the impact analysis state was asserted to be \"Not Affected\"", @@ -218,6 +222,7 @@ "rollback": "Rollback", "workaround_available": "Workaround available", "response": "Vendor Response (project)", + "vendor_response": "Vendor Response", "response_tooltip": "A response to the vulnerability by the manufacturer, supplier, or project responsible for the affected component or service", "analysis_details_tooltip": "Details (explanation, workaround details, and other impact information)", "updated": "Updated", @@ -541,6 +546,14 @@ "version_distance_minor": "minor", "version_distance_patch": "patch", "version_distance_tooltip": "Specify the difference between version numbers, or empty to ignore", + "filters": "Filters", + "clear_all": "Clear all", + "text_search": "Text Search", + "from": "From", + "to": "To", + "vulnerabilities_by_occurrence": "Vulnerabilities By Occurrence", + "grouped_vulnerabilities": "Grouped Vulnerabilities", + "occurrences_in_projects": "Occurrences in projects", "matrix": "Matrix" }, "admin": { diff --git a/src/router/index.js b/src/router/index.js index 91e3c35c1..30e363d07 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -13,6 +13,7 @@ const Dashboard = () => import('@/views/Dashboard'); const ProjectList = () => import('@/views/portfolio/projects/ProjectList'); const ComponentSearch = () => import('@/views/portfolio/components/ComponentSearch'); const VulnerabilityList = () => import('@/views/portfolio/vulnerabilities/VulnerabilityList'); +const VulnerabilityAudit = () => import('@/views/globalAudit/VulnerabilityAudit'); const LicenseList = () => import('@/views/portfolio/licenses/LicenseList'); const PolicyManagement = () => import('@/views/policy/PolicyManagement'); const Project = () => import('@/views/portfolio/projects/Project'); @@ -655,6 +656,18 @@ function configRoutes() { } ] }, + { + path: 'vulnerabilityAudit', + name: 'Vulnerability Audit', + alias: ['vulnerabilityAudit/occurrences', 'vulnerabilityAudit/grouped'], + component: VulnerabilityAudit, + meta: { + title: i18n.t('message.vulnerability_audit'), + i18n: 'message.vulnerability_audit', + sectionPath: '/globalAudit', + permission: 'VIEW_VULNERABILITY' + } + }, // The following route redirects URLs from legacy Dependency-Track UI to new URL format. { // Old: http://host/project/?uuid=3a38aedf-e9e9-4e0a-8913-2d99951aa76d diff --git a/src/shared/utils.js b/src/shared/utils.js index a5b2c7cfa..e87e0472d 100644 --- a/src/shared/utils.js +++ b/src/shared/utils.js @@ -38,7 +38,7 @@ export function getRedirectUrl(router) { // An array of acceptable root context paths defined in the UI. const acceptableRootContextPaths = [ '/dashboard', '/projects', '/components', '/services', '/vulnerabilities', '/licenses', '/policy', '/admin', - '/project', '/component', '/vulnerability', '/license', '/login', '/change-password' + '/project', '/component', '/vulnerability', '/license', '/vulnerabilityAudit', '/login', '/change-password' ]; /** diff --git a/src/views/globalAudit/VulnerabilityAudit.vue b/src/views/globalAudit/VulnerabilityAudit.vue new file mode 100644 index 000000000..e34c2e1d4 --- /dev/null +++ b/src/views/globalAudit/VulnerabilityAudit.vue @@ -0,0 +1,62 @@ + + + diff --git a/src/views/globalAudit/VulnerabilityAuditByOccurrence.vue b/src/views/globalAudit/VulnerabilityAuditByOccurrence.vue new file mode 100644 index 000000000..e30cb3c45 --- /dev/null +++ b/src/views/globalAudit/VulnerabilityAuditByOccurrence.vue @@ -0,0 +1,497 @@ + + + diff --git a/src/views/globalAudit/VulnerabilityAuditGroupedByVulnerability.vue b/src/views/globalAudit/VulnerabilityAuditGroupedByVulnerability.vue new file mode 100644 index 000000000..26edf5897 --- /dev/null +++ b/src/views/globalAudit/VulnerabilityAuditGroupedByVulnerability.vue @@ -0,0 +1,408 @@ + + +