diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 000000000..a56a7ef43
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1,2 @@
+node_modules
+
diff --git a/.eslintrc.js b/.eslintrc.js
index 20034fd22..b1b87779f 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -1,17 +1,18 @@
module.exports = {
root: true,
env: {
- node: true
+ node: true,
},
- 'extends': [
+ parserOptions: {
+ parser: '@babel/eslint-parser',
+ },
+ extends: [
+ 'eslint:recommended',
'plugin:vue/essential',
- 'eslint:recommended'
+ 'plugin:prettier/recommended',
],
rules: {
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
- 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
+ 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
},
- parserOptions: {
- parser: 'babel-eslint'
- }
-}
\ No newline at end of file
+};
diff --git a/.github/workflows/_meta-build.yaml b/.github/workflows/_meta-build.yaml
index 9636d12b4..c31f295d9 100644
--- a/.github/workflows/_meta-build.yaml
+++ b/.github/workflows/_meta-build.yaml
@@ -14,13 +14,13 @@ on:
app-version:
type: string
required: false
- default: "snapshot"
- description: "Set the version that should be set/used as tag for the container image"
+ default: 'snapshot'
+ description: 'Set the version that should be set/used as tag for the container image'
publish-container:
type: boolean
required: false
default: false
- description: "Set if the container image gets publish and scan once its build"
+ description: 'Set if the container image gets publish and scan once its build'
secrets:
registry-0-usr:
required: true
diff --git a/.github/workflows/ci-release.yaml b/.github/workflows/ci-release.yaml
index 6b1a71740..740ea2e58 100644
--- a/.github/workflows/ci-release.yaml
+++ b/.github/workflows/ci-release.yaml
@@ -6,7 +6,7 @@ on:
version-to-bump:
type: choice
required: true
- description: "Select which part of the version to bump and release"
+ description: 'Select which part of the version to bump and release'
options:
- patch
- minor
@@ -41,7 +41,7 @@ jobs:
- name: Create GitHub Release
env:
GITHUB_TOKEN: ${{ secrets.BOT_RELEASE_TOKEN }}
- GH_OPTS: ""
+ GH_OPTS: ''
run: |-
VERSION=`jq -r '.version' package.json`
diff --git a/.github/workflows/codeql-analysis.yaml b/.github/workflows/codeql-analysis.yaml
index 1433cf3af..dd1279d6c 100644
--- a/.github/workflows/codeql-analysis.yaml
+++ b/.github/workflows/codeql-analysis.yaml
@@ -1,4 +1,4 @@
-name: "CodeQL"
+name: 'CodeQL'
on:
push:
@@ -25,34 +25,34 @@ jobs:
# https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection
steps:
- - name: Checkout repository
- uses: actions/checkout@v4.1.1
-
- # Initializes the CodeQL tools for scanning.
- - name: Initialize CodeQL
- uses: github/codeql-action/init@v3
- with:
- languages: ${{ matrix.language }}
- # If you wish to specify custom queries, you can do so here or in a config file.
- # By default, queries listed here will override any specified in a config file.
- # Prefix the list here with "+" to use these queries and those in the config file.
- # queries: ./path/to/local/query, your-org/your-repo/queries@main
-
- # Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
- # If this step fails, then you should remove it and run the build manually (see below)
- - name: Autobuild
- uses: github/codeql-action/autobuild@v3
-
- # âšī¸ Command-line programs to run using the OS shell.
- # đ https://git.io/JvXDl
-
- # âī¸ If the Autobuild fails above, remove it and uncomment the following three lines
- # and modify them (or add more) to build your code if your project
- # uses a compiled language
-
- #- run: |
- # make bootstrap
- # make release
-
- - name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@v3
+ - name: Checkout repository
+ uses: actions/checkout@v4.1.1
+
+ # Initializes the CodeQL tools for scanning.
+ - name: Initialize CodeQL
+ uses: github/codeql-action/init@v3
+ with:
+ languages: ${{ matrix.language }}
+ # If you wish to specify custom queries, you can do so here or in a config file.
+ # By default, queries listed here will override any specified in a config file.
+ # Prefix the list here with "+" to use these queries and those in the config file.
+ # queries: ./path/to/local/query, your-org/your-repo/queries@main
+
+ # Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
+ # If this step fails, then you should remove it and run the build manually (see below)
+ - name: Autobuild
+ uses: github/codeql-action/autobuild@v3
+
+ # âšī¸ Command-line programs to run using the OS shell.
+ # đ https://git.io/JvXDl
+
+ # âī¸ If the Autobuild fails above, remove it and uncomment the following three lines
+ # and modify them (or add more) to build your code if your project
+ # uses a compiled language
+
+ #- run: |
+ # make bootstrap
+ # make release
+
+ - name: Perform CodeQL Analysis
+ uses: github/codeql-action/analyze@v3
diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml
new file mode 100644
index 000000000..6dc538f3d
--- /dev/null
+++ b/.github/workflows/lint.yaml
@@ -0,0 +1,34 @@
+name: Lint
+on:
+ pull_request:
+
+permissions:
+ contents: read
+
+env:
+ NODE_VERSION: 18
+
+jobs:
+ lint:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout Repository
+ uses: actions/checkout@v4.1.1
+
+ - name: Set up NodeJs
+ uses: actions/setup-node@v4.0.2
+ with:
+ node-version: ${{ env.NODE_VERSION }}
+ cache: 'npm'
+
+ - name: Install Dependencies
+ run: npm install
+
+ - name: Lint Prettier
+ run: npm run prettier
+ continue-on-error: false
+
+ - name: Lint ESLint
+ run: npm run eslint
+ continue-on-error: true
diff --git a/.postcssrc.js b/.postcssrc.js
index 100cc0124..a47ef4f95 100644
--- a/.postcssrc.js
+++ b/.postcssrc.js
@@ -1,5 +1,5 @@
module.exports = {
plugins: {
- autoprefixer: {}
- }
-}
\ No newline at end of file
+ autoprefixer: {},
+ },
+};
diff --git a/.prettierrc.json b/.prettierrc.json
new file mode 100644
index 000000000..baae6d102
--- /dev/null
+++ b/.prettierrc.json
@@ -0,0 +1,6 @@
+{
+ "singleQuote": true,
+ "tabWidth": 2,
+ "semi": true,
+ "trailingComma": "all"
+}
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 000000000..64ca62244
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,8 @@
+{
+ "recommendations": [
+ "dbaeumer.vscode-eslint",
+ "esbenp.prettier-vscode",
+ "editorconfig.editorconfig",
+ "github.vscode-github-actions"
+ ]
+}
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 000000000..dd8484ba0
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,11 @@
+{
+ "[javascript]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
+ },
+ "[vue]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
+ },
+ "editor.codeActionsOnSave": {
+ "source.fixAll.eslint": "explicit"
+ }
+}
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
index 2a97dd0df..1147e63ed 100644
--- a/CODE_OF_CONDUCT.md
+++ b/CODE_OF_CONDUCT.md
@@ -8,19 +8,19 @@ In the interest of fostering an open and welcoming environment, we as contributo
Examples of behavior that contributes to creating a positive environment include:
-* Using welcoming and inclusive language
-* Being respectful of differing viewpoints and experiences
-* Gracefully accepting constructive criticism
-* Focusing on what is best for the community
-* Showing empathy towards other community members
+- Using welcoming and inclusive language
+- Being respectful of differing viewpoints and experiences
+- Gracefully accepting constructive criticism
+- Focusing on what is best for the community
+- Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
-* The use of sexualized language or imagery and unwelcome sexual attention or advances
-* Trolling, insulting/derogatory comments, and personal or political attacks
-* Public or private harassment
-* Publishing others' private information, such as a physical or electronic address, without explicit permission
-* Other conduct which could reasonably be considered inappropriate in a professional setting
+- The use of sexualized language or imagery and unwelcome sexual attention or advances
+- Trolling, insulting/derogatory comments, and personal or political attacks
+- Public or private harassment
+- Publishing others' private information, such as a physical or electronic address, without explicit permission
+- Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities
diff --git a/README.md b/README.md
index 01e716f14..70e2ef73e 100644
--- a/README.md
+++ b/README.md
@@ -1,19 +1,18 @@
[![Build Status](https://github.com/DependencyTrack/frontend/actions/workflows/ci-build.yaml/badge.svg)](https://github.com/DependencyTrack/frontend/actions?workflow=Build+CI)
-[![Codacy Badge](https://app.codacy.com/project/badge/Grade/364443f9f30c4b70b56e5be76c9e079c)](https://www.codacy.com/gh/DependencyTrack/frontend/dashboard?utm_source=github.com&utm_medium=referral&utm_content=DependencyTrack/frontend&utm_campaign=Badge_Grade)
+[![Codacy Badge](https://app.codacy.com/project/badge/Grade/364443f9f30c4b70b56e5be76c9e079c)](https://www.codacy.com/gh/DependencyTrack/frontend/dashboard?utm_source=github.com&utm_medium=referral&utm_content=DependencyTrack/frontend&utm_campaign=Badge_Grade)
[![License](https://img.shields.io/badge/license-Apache%202.0-brightgreen.svg)][License]
[![Latest (including pre-releases)](https://img.shields.io/github/v/release/dependencytrack/frontend?include_prereleases)](https://github.com/DependencyTrack/frontend/releases)
-Dependency-Track Front-End
-=========
+# Dependency-Track Front-End
The Front-End is a Single Page Application (SPA) used in Dependency-Track, an open source Component Analysis platform
that allows organizations to identify and reduce risk in the software supply chain.
The project is built with:
-* Vue.js
-* Bootstrap Vue
-* CoreUI
+- Vue.js
+- Bootstrap Vue
+- CoreUI
@@ -78,70 +80,93 @@ $common.formatSeverityLabel = function formatSeverityLabel(severity) {
/**
* Formats and returns a specialized label for the state of policy violations.
*/
-$common.formatViolationStateLabel = function formatViolationStateLabel(violationState) {
- if (! violationState) {
+$common.formatViolationStateLabel = function formatViolationStateLabel(
+ violationState,
+) {
+ if (!violationState) {
return null;
}
- let sourceClass = "label-notification-" + violationState.toLowerCase();
+ let sourceClass = 'label-notification-' + violationState.toLowerCase();
return `
${violationState} `;
};
$common.formatCweLabel = function formatCweLabel(cweId, cweName) {
if (cweId && cweName) {
- return "
CWE-" + cweId + " " + cweName + "
"
+ return (
+ "
CWE-" +
+ cweId +
+ ' ' +
+ cweName +
+ '
'
+ );
} else {
- return "";
+ return '';
}
};
$common.formatCweShortLabel = function formatCweShortLabel(cweId, cweName) {
if (cweId && cweName) {
- return "
CWE-" + cweId + " ";
+ return (
+ "
CWE-" +
+ cweId +
+ ' '
+ );
} else {
- return "";
+ return '';
}
};
/**
* Formats and returns a specialized label for a vulnerability analyzer (OSSINDEX_ANALYZER, INTERNAL_ANALYZER, etc).
*/
-$common.formatAnalyzerLabel = function formatAnalyzerLabel(analyzer, vulnSource, vulnId, alternateIdentifier, referenceUrl) {
- if (! analyzer) {
+$common.formatAnalyzerLabel = function formatAnalyzerLabel(
+ analyzer,
+ vulnSource,
+ vulnId,
+ alternateIdentifier,
+ referenceUrl,
+) {
+ if (!analyzer) {
return null;
}
- let analyzerLabel = "";
+ let analyzerLabel = '';
let analyzerUrl = null;
switch (analyzer) {
case 'INTERNAL_ANALYZER':
analyzerLabel = vulnSource;
- if(vulnSource === "GITHUB") {
- analyzerUrl = "https://github.com/advisories/" + vulnId;
- } else if(vulnSource === "OSV") {
- analyzerUrl = "https://osv.dev/vulnerability/" + vulnId;
- } else if(vulnSource === "SNYK") {
- analyzerUrl = "https://security.snyk.io/vuln/" + vulnId;
+ if (vulnSource === 'GITHUB') {
+ analyzerUrl = 'https://github.com/advisories/' + vulnId;
+ } else if (vulnSource === 'OSV') {
+ analyzerUrl = 'https://osv.dev/vulnerability/' + vulnId;
+ } else if (vulnSource === 'SNYK') {
+ analyzerUrl = 'https://security.snyk.io/vuln/' + vulnId;
}
break;
case 'OSSINDEX_ANALYZER':
- analyzerLabel = "OSS Index";
- analyzerUrl = (referenceUrl) ? referenceUrl : "https://ossindex.sonatype.org/vuln/" + vulnId;
+ analyzerLabel = 'OSS Index';
+ analyzerUrl = referenceUrl
+ ? referenceUrl
+ : 'https://ossindex.sonatype.org/vuln/' + vulnId;
break;
case 'VULNDB_ANALYZER':
- analyzerLabel = "VulnDB";
- analyzerUrl = "https://vulndb.cyberriskanalytics.com/vulnerabilities/" + vulnId;
+ analyzerLabel = 'VulnDB';
+ analyzerUrl =
+ 'https://vulndb.cyberriskanalytics.com/vulnerabilities/' + vulnId;
break;
case 'SNYK_ANALYZER':
- analyzerLabel = "Snyk";
- analyzerUrl = "https://security.snyk.io/vuln/" + vulnId;
+ analyzerLabel = 'Snyk';
+ analyzerUrl = 'https://security.snyk.io/vuln/' + vulnId;
break;
case 'TRIVY_ANALYZER':
- analyzerLabel = "Trivy";
+ analyzerLabel = 'Trivy';
- analyzerUrl = "https://nvd.nist.gov/vuln/detail/" + vulnId;
- if(vulnSource === "GITHUB") {
- analyzerUrl = "https://github.com/advisories/" + vulnId;
- }
- break;
+ analyzerUrl = 'https://nvd.nist.gov/vuln/detail/' + vulnId;
+ if (vulnSource === 'GITHUB') {
+ analyzerUrl = 'https://github.com/advisories/' + vulnId;
+ }
+ break;
}
if (analyzerUrl) {
analyzerLabel = `
${analyzerLabel} `;
@@ -159,96 +184,110 @@ $common.formatAnalyzerLabel = function formatAnalyzerLabel(analyzer, vulnSource,
* @param vulnId the unique identifier
* @returns a SourceInfo object
*/
-$common.resolveSourceVulnInfo = function resolveSourceVulnInfo(vulnSource, vulnId) {
+$common.resolveSourceVulnInfo = function resolveSourceVulnInfo(
+ vulnSource,
+ vulnId,
+) {
let sourceInfo = {};
sourceInfo.source = vulnSource;
sourceInfo.vulnId = vulnId;
switch (vulnSource) {
- case "INTERNAL":
+ case 'INTERNAL':
// TODO
break;
- case "NVD":
- sourceInfo.name = "National Vulnerability Database";
- sourceInfo.url = "https://nvd.nist.gov/vuln/detail/" + vulnId;
+ case 'NVD':
+ sourceInfo.name = 'National Vulnerability Database';
+ sourceInfo.url = 'https://nvd.nist.gov/vuln/detail/' + vulnId;
break;
- case "GITHUB":
- sourceInfo.name = "GitHub Advisories";
- sourceInfo.url = "https://github.com/advisories/" + vulnId;
+ case 'GITHUB':
+ sourceInfo.name = 'GitHub Advisories';
+ sourceInfo.url = 'https://github.com/advisories/' + vulnId;
break;
- case "OSSINDEX":
- sourceInfo.name = "OSS Index";
- sourceInfo.url = "https://ossindex.sonatype.org/vuln/" + vulnId;
+ case 'OSSINDEX':
+ sourceInfo.name = 'OSS Index';
+ sourceInfo.url = 'https://ossindex.sonatype.org/vuln/' + vulnId;
break;
- case "SNYK":
- sourceInfo.name = "Snyk";
- sourceInfo.url = "https://security.snyk.io/vuln/" + vulnId;
+ case 'SNYK':
+ sourceInfo.name = 'Snyk';
+ sourceInfo.url = 'https://security.snyk.io/vuln/' + vulnId;
break;
- case "OSV":
- sourceInfo.name = "Open Source Vulnerability Database";
- sourceInfo.url = "https://osv.dev/vulnerability/" + vulnId;
+ case 'OSV':
+ sourceInfo.name = 'Open Source Vulnerability Database';
+ sourceInfo.url = 'https://osv.dev/vulnerability/' + vulnId;
break;
- case "GSD":
- sourceInfo.name = "Global Security Database";
- sourceInfo.url = "https://github.com/cloudsecurityalliance/gsd-database";
+ case 'GSD':
+ sourceInfo.name = 'Global Security Database';
+ sourceInfo.url = 'https://github.com/cloudsecurityalliance/gsd-database';
break;
- case "VULNDB":
- sourceInfo.name = "VulnDB";
- sourceInfo.url = "https://vulndb.cyberriskanalytics.com/vulnerabilities/" + vulnId;
+ case 'VULNDB':
+ sourceInfo.name = 'VulnDB';
+ sourceInfo.url =
+ 'https://vulndb.cyberriskanalytics.com/vulnerabilities/' + vulnId;
break;
}
return sourceInfo;
-}
+};
$common.resolveVulnAliases = function resolveVulnAliases(vulnSource, aliases) {
if (!vulnSource || !aliases) {
return [];
}
- let resolvedAliases = aliases
- .flatMap((alias) => {
- const _resolvedAliases = [];
- if (vulnSource !== "INTERNAL" && alias.internalId) {
- _resolvedAliases.push($common.resolveSourceVulnInfo("INTERNAL", alias.internalId));
- }
- if (vulnSource !== "NVD" && alias.cveId) {
- _resolvedAliases.push($common.resolveSourceVulnInfo("NVD", alias.cveId));
- }
- if (vulnSource !== "GITHUB" && alias.ghsaId) {
- _resolvedAliases.push($common.resolveSourceVulnInfo("GITHUB", alias.ghsaId));
- }
- if (vulnSource !== "OSSINDEX" && alias.sonatypeId) {
- _resolvedAliases.push($common.resolveSourceVulnInfo("OSSINDEX", alias.sonatypeId));
- }
- if (vulnSource !== "SNYK" && alias.snykId) {
- _resolvedAliases.push($common.resolveSourceVulnInfo("SNYK", alias.snykId));
- }
- if (vulnSource !== "OSV" && alias.osvId) {
- _resolvedAliases.push($common.resolveSourceVulnInfo("OSV", alias.osvId));
- }
- if (vulnSource !== "GSD" && alias.gsdId) {
- _resolvedAliases.push($common.resolveSourceVulnInfo("GSD", alias.gsdId));
- }
- if (vulnSource !== "VULNDB" && alias.vulnDbId) {
- _resolvedAliases.push($common.resolveSourceVulnInfo("VULNDB", alias.vulnDbId));
- }
- return _resolvedAliases;
- });
+ let resolvedAliases = aliases.flatMap((alias) => {
+ const _resolvedAliases = [];
+ if (vulnSource !== 'INTERNAL' && alias.internalId) {
+ _resolvedAliases.push(
+ $common.resolveSourceVulnInfo('INTERNAL', alias.internalId),
+ );
+ }
+ if (vulnSource !== 'NVD' && alias.cveId) {
+ _resolvedAliases.push($common.resolveSourceVulnInfo('NVD', alias.cveId));
+ }
+ if (vulnSource !== 'GITHUB' && alias.ghsaId) {
+ _resolvedAliases.push(
+ $common.resolveSourceVulnInfo('GITHUB', alias.ghsaId),
+ );
+ }
+ if (vulnSource !== 'OSSINDEX' && alias.sonatypeId) {
+ _resolvedAliases.push(
+ $common.resolveSourceVulnInfo('OSSINDEX', alias.sonatypeId),
+ );
+ }
+ if (vulnSource !== 'SNYK' && alias.snykId) {
+ _resolvedAliases.push(
+ $common.resolveSourceVulnInfo('SNYK', alias.snykId),
+ );
+ }
+ if (vulnSource !== 'OSV' && alias.osvId) {
+ _resolvedAliases.push($common.resolveSourceVulnInfo('OSV', alias.osvId));
+ }
+ if (vulnSource !== 'GSD' && alias.gsdId) {
+ _resolvedAliases.push($common.resolveSourceVulnInfo('GSD', alias.gsdId));
+ }
+ if (vulnSource !== 'VULNDB' && alias.vulnDbId) {
+ _resolvedAliases.push(
+ $common.resolveSourceVulnInfo('VULNDB', alias.vulnDbId),
+ );
+ }
+ return _resolvedAliases;
+ });
// Deduplicate by vulnerability ID, so we're not showing the same ID more than once.
- resolvedAliases = [...new Map(resolvedAliases.map(alias => [alias.vulnId, alias])).values()];
+ resolvedAliases = [
+ ...new Map(resolvedAliases.map((alias) => [alias.vulnId, alias])).values(),
+ ];
// Sort aliases by vulnerability ID to achieve consistent output.
- return resolvedAliases
- .sort((a, b) => {
- if (a.vulnId < b.vulnId) {
- return -1;
- }
- if (a.vulnId > b.vulnId) {
- return 1;
- }
- return 0;
- });
-}
+ return resolvedAliases.sort((a, b) => {
+ if (a.vulnId < b.vulnId) {
+ return -1;
+ }
+ if (a.vulnId > b.vulnId) {
+ return 1;
+ }
+ return 0;
+ });
+};
/**
*
@@ -268,11 +307,11 @@ $common.makeAnalysisStateLabelFormatter = (i18n) => {
case 'FALSE_POSITIVE':
case 'NOT_AFFECTED':
case 'RESOLVED':
- return i18n.$t(`message.${value.toLowerCase()}`)
+ return i18n.$t(`message.${value.toLowerCase()}`);
default:
return null;
}
- }
+ };
};
/**
@@ -295,11 +334,11 @@ $common.makeAnalysisJustificationLabelFormatter = (i18n) => {
case 'PROTECTED_AT_RUNTIME':
case 'PROTECTED_AT_PERIMETER':
case 'PROTECTED_BY_MITIGATING_CONTROL':
- return i18n.$t(`message.${value.toLowerCase()}`)
+ return i18n.$t(`message.${value.toLowerCase()}`);
default:
return null;
}
- }
+ };
};
/**
@@ -318,11 +357,11 @@ $common.makeAnalysisResponseLabelFormatter = (i18n) => {
case 'UPDATE':
case 'ROLLBACK':
case 'WORKAROUND_AVAILABLE':
- return i18n.$t(`message.${value.toLowerCase()}`)
+ return i18n.$t(`message.${value.toLowerCase()}`);
default:
return null;
}
- }
+ };
};
/**
@@ -343,11 +382,11 @@ $common.componentClassifierLabelFormatter = (i18n) => {
case 'DEVICE':
case 'FIRMWARE':
case 'FILE':
- return i18n.$t(`message.component_${value.toLowerCase()}`)
+ return i18n.$t(`message.component_${value.toLowerCase()}`);
default:
return null;
}
- }
+ };
};
/**
@@ -359,7 +398,7 @@ $common.componentClassifierLabelFormatter = (i18n) => {
*/
$common.componentClassifierLabelProjectUrlFormatter = (i18n) => {
return function (value) {
- let url = "../projects/?classifier=" + value;
+ let url = '../projects/?classifier=' + value;
switch (value) {
case 'APPLICATION':
case 'FRAMEWORK':
@@ -369,11 +408,11 @@ $common.componentClassifierLabelProjectUrlFormatter = (i18n) => {
case 'DEVICE':
case 'FIRMWARE':
case 'FILE':
- return `
${i18n.$t(`message.component_${value.toLowerCase()}`)} `
+ return `
${i18n.$t(`message.component_${value.toLowerCase()}`)} `;
default:
return null;
}
- }
+ };
};
/**
@@ -382,24 +421,61 @@ $common.componentClassifierLabelProjectUrlFormatter = (i18n) => {
*/
$common.formatTimestamp = function formatTimestamp(timestamp, includeTime) {
let date = new Date(timestamp);
- let months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
- function pad(num) { return num < 10 ? "0" + num : num; }
+ let months = [
+ 'Jan',
+ 'Feb',
+ 'Mar',
+ 'Apr',
+ 'May',
+ 'Jun',
+ 'Jul',
+ 'Aug',
+ 'Sep',
+ 'Oct',
+ 'Nov',
+ 'Dec',
+ ];
+ function pad(num) {
+ return num < 10 ? '0' + num : num;
+ }
if (includeTime) {
- return date.getDate() + " " + months[date.getMonth()] + " " + date.getFullYear() + " at " + pad(date.getHours()) + ":" + pad(date.getMinutes()) + ":" + pad(date.getSeconds());
+ return (
+ date.getDate() +
+ ' ' +
+ months[date.getMonth()] +
+ ' ' +
+ date.getFullYear() +
+ ' at ' +
+ pad(date.getHours()) +
+ ':' +
+ pad(date.getMinutes()) +
+ ':' +
+ pad(date.getSeconds())
+ );
} else {
- return date.getDate() + " " + months[date.getMonth()] + " " + date.getFullYear();
+ return (
+ date.getDate() + ' ' + months[date.getMonth()] + ' ' + date.getFullYear()
+ );
}
};
/*
* Concatenates the group, name, and version of a component.
*/
-$common.concatenateComponentName = function concatenateComponentName(group, name, version) {
+$common.concatenateComponentName = function concatenateComponentName(
+ group,
+ name,
+ version,
+) {
let g = $common.trimToNull(group);
let n = $common.trimToNull(name);
let v = $common.trimToNull(version);
- return (g != null? g + " " : "") + (n != null? n : "") + (v != null? " " + v: "");
-}
+ return (
+ (g != null ? g + ' ' : '') +
+ (n != null ? n : '') +
+ (v != null ? ' ' + v : '')
+ );
+};
/**
* Helper function that returns the variable if it is not null, undefined, NaN,
@@ -445,51 +521,59 @@ $common.sleep = function sleep(milliseconds) {
/**
* Converts a string representation of common boolean values and returns a boolean value.
*/
-$common.toBoolean = function(string) {
+$common.toBoolean = function (string) {
if (!string) {
return false;
}
- if (typeof string == "boolean") {
+ if (typeof string == 'boolean') {
return string;
}
- switch(string.toLowerCase().trim()) {
- case "true": case "yes": case "1": return true;
- case "false": case "no": case "0": case null: return false;
- default: return Boolean(string);
+ switch (string.toLowerCase().trim()) {
+ case 'true':
+ case 'yes':
+ case '1':
+ return true;
+ case 'false':
+ case 'no':
+ case '0':
+ case null:
+ return false;
+ default:
+ return Boolean(string);
}
};
-$common.trimToNull = function(value) {
+$common.trimToNull = function (value) {
if (typeof value === 'undefined') {
return null;
- } else if (typeof value === 'string' && value.trim() === "") {
+ } else if (typeof value === 'string' && value.trim() === '') {
return null;
}
return value;
};
$common.OWASP_RR_LIKELIHOOD_TO_IMPACT_SEVERITY_MATRIX = {
- "LOW" : {
- "LOW": "INFO",
- "MEDIUM": "LOW",
- "HIGH": "MEDIUM"
+ LOW: {
+ LOW: 'INFO',
+ MEDIUM: 'LOW',
+ HIGH: 'MEDIUM',
},
- "MEDIUM" : {
- "LOW": "LOW",
- "MEDIUM": "MEDIUM",
- "HIGH": "HIGH"
+ MEDIUM: {
+ LOW: 'LOW',
+ MEDIUM: 'MEDIUM',
+ HIGH: 'HIGH',
},
- "HIGH" : {
- "LOW": "MEDIUM",
- "MEDIUM": "HIGH",
- "HIGH": "CRITICAL"
+ HIGH: {
+ LOW: 'MEDIUM',
+ MEDIUM: 'HIGH',
+ HIGH: 'CRITICAL',
},
- "UNASSIGNED": {
- "LOW": "UNASSIGNED",
- "MEDIUM": "UNASSIGNED",
- "HIGH": "UNASSIGNED"
- }
-}
+ UNASSIGNED: {
+ LOW: 'UNASSIGNED',
+ MEDIUM: 'UNASSIGNED',
+ HIGH: 'UNASSIGNED',
+ },
+};
export default {
formatSourceLabel: $common.formatSourceLabel,
@@ -504,9 +588,11 @@ export default {
resolveSourceVulnInfo: $common.resolveSourceVulnInfo,
resolveVulnAliases: $common.resolveVulnAliases,
makeAnalysisStateLabelFormatter: $common.makeAnalysisStateLabelFormatter,
- makeAnalysisJustificationLabelFormatter: $common.makeAnalysisJustificationLabelFormatter,
+ makeAnalysisJustificationLabelFormatter:
+ $common.makeAnalysisJustificationLabelFormatter,
componentClassifierLabelFormatter: $common.componentClassifierLabelFormatter,
- componentClassifierLabelProjectUrlFormatter: $common.componentClassifierLabelProjectUrlFormatter,
+ componentClassifierLabelProjectUrlFormatter:
+ $common.componentClassifierLabelProjectUrlFormatter,
formatTimestamp: $common.formatTimestamp,
concatenateComponentName: $common.concatenateComponentName,
valueWithDefault: $common.valueWithDefault,
@@ -514,5 +600,6 @@ export default {
sleep: $common.sleep,
toBoolean: $common.toBoolean,
trimToNull: $common.trimToNull,
- OWASP_RR_LIKELIHOOD_TO_IMPACT_SEVERITY_MATRIX: $common.OWASP_RR_LIKELIHOOD_TO_IMPACT_SEVERITY_MATRIX
+ OWASP_RR_LIKELIHOOD_TO_IMPACT_SEVERITY_MATRIX:
+ $common.OWASP_RR_LIKELIHOOD_TO_IMPACT_SEVERITY_MATRIX,
};
diff --git a/src/shared/oidc.json b/src/shared/oidc.json
index 90bfd8930..16d6f4c04 100644
--- a/src/shared/oidc.json
+++ b/src/shared/oidc.json
@@ -1,7 +1,7 @@
{
- "ISSUER": "",
- "CLIENT_ID": "",
- "SCOPE": "",
- "FLOW": "",
- "LOGIN_BUTTON_TEXT": ""
+ "ISSUER": "",
+ "CLIENT_ID": "",
+ "SCOPE": "",
+ "FLOW": "",
+ "LOGIN_BUTTON_TEXT": ""
}
diff --git a/src/shared/permissions.js b/src/shared/permissions.js
index 54aeeccd4..14016e65f 100644
--- a/src/shared/permissions.js
+++ b/src/shared/permissions.js
@@ -1,15 +1,15 @@
// API Permissions
-export const BOM_UPLOAD = "BOM_UPLOAD";
-export const VIEW_PORTFOLIO = "VIEW_PORTFOLIO";
-export const PORTFOLIO_MANAGEMENT = "PORTFOLIO_MANAGEMENT";
-export const ACCESS_MANAGEMENT = "ACCESS_MANAGEMENT";
-export const VIEW_VULNERABILITY = "VIEW_VULNERABILITY";
-export const VULNERABILITY_ANALYSIS = "VULNERABILITY_ANALYSIS";
-export const VIEW_POLICY_VIOLATION = "VIEW_POLICY_VIOLATION";
-export const VULNERABILITY_MANAGEMENT = "VULNERABILITY_MANAGEMENT";
-export const POLICY_VIOLATION_ANALYSIS = "POLICY_VIOLATION_ANALYSIS";
-export const SYSTEM_CONFIGURATION = "SYSTEM_CONFIGURATION";
-export const POLICY_MANAGEMENT = "POLICY_MANAGEMENT";
+export const BOM_UPLOAD = 'BOM_UPLOAD';
+export const VIEW_PORTFOLIO = 'VIEW_PORTFOLIO';
+export const PORTFOLIO_MANAGEMENT = 'PORTFOLIO_MANAGEMENT';
+export const ACCESS_MANAGEMENT = 'ACCESS_MANAGEMENT';
+export const VIEW_VULNERABILITY = 'VIEW_VULNERABILITY';
+export const VULNERABILITY_ANALYSIS = 'VULNERABILITY_ANALYSIS';
+export const VIEW_POLICY_VIOLATION = 'VIEW_POLICY_VIOLATION';
+export const VULNERABILITY_MANAGEMENT = 'VULNERABILITY_MANAGEMENT';
+export const POLICY_VIOLATION_ANALYSIS = 'POLICY_VIOLATION_ANALYSIS';
+export const SYSTEM_CONFIGURATION = 'SYSTEM_CONFIGURATION';
+export const POLICY_MANAGEMENT = 'POLICY_MANAGEMENT';
/**
* Determines if the current logged in user has a specific permission.
@@ -35,5 +35,5 @@ export const decodeToken = function decodeToken(token) {
* Retrieves the token from session storage.
*/
export const getToken = function getToken() {
- return sessionStorage.getItem("token");
+ return sessionStorage.getItem('token');
};
diff --git a/src/shared/toggle-classes.js b/src/shared/toggle-classes.js
index 7ee250dd4..51d3caa66 100644
--- a/src/shared/toggle-classes.js
+++ b/src/shared/toggle-classes.js
@@ -1,4 +1,4 @@
-export default function toggleClasses (toggleClass, classList, force) {
+export default function toggleClasses(toggleClass, classList, force) {
const level = classList.indexOf(toggleClass);
const removeClassList = classList.slice(0, level);
removeClassList.map((className) => document.body.classList.remove(className));
diff --git a/src/shared/utils.js b/src/shared/utils.js
index e87e0472d..f5c30de06 100644
--- a/src/shared/utils.js
+++ b/src/shared/utils.js
@@ -1,7 +1,7 @@
-import common from "@/shared/common";
-import flexVerCompare from "flexver/dist/module";
+import common from '@/shared/common';
+import flexVerCompare from 'flexver/dist/module';
-export function random (min, max) {
+export function random(min, max) {
return Math.floor(Math.random() * (max - min + 1) + min);
}
@@ -23,7 +23,7 @@ export const shuffleArray = (array) => {
* Provides a function to extract a param from the querystring.
*/
export function getUrlVar(name) {
- return (new URLSearchParams(window.location.search)).get(name);
+ return new URLSearchParams(window.location.search).get(name);
}
/**
@@ -32,13 +32,29 @@ export function getUrlVar(name) {
* @returns {string} redirect to url if it save for redirection
*/
export function getRedirectUrl(router) {
- return router.currentRoute.query.redirect && isUrlSaveForRedirect(router.currentRoute.query.redirect) ? router.currentRoute.query.redirect : undefined;
+ return router.currentRoute.query.redirect &&
+ isUrlSaveForRedirect(router.currentRoute.query.redirect)
+ ? router.currentRoute.query.redirect
+ : undefined;
}
// 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', '/vulnerabilityAudit', '/login', '/change-password'
+ '/dashboard',
+ '/projects',
+ '/components',
+ '/services',
+ '/vulnerabilities',
+ '/licenses',
+ '/policy',
+ '/admin',
+ '/project',
+ '/component',
+ '/vulnerability',
+ '/license',
+ '/vulnerabilityAudit',
+ '/login',
+ '/change-password',
];
/**
@@ -50,10 +66,14 @@ export function isUrlSaveForRedirect(redirectUrl) {
const contextRoot = getContextPath();
try {
const resultingUrl = new URL(redirectUrl, window.location.origin);
- return resultingUrl.origin === window.location.origin // catches redirectUrls like //foo.bar
- && /^https?:$/.test(resultingUrl.protocol) // catches file and blob protocol because for "blob:https://mozilla.org" origin will be returned as "https://mozilla.org".
- && acceptableRootContextPaths.map(r => contextRoot + r).some(p => redirectUrl.startsWith(p));
- } catch(invalidUrl) {
+ return (
+ resultingUrl.origin === window.location.origin && // catches redirectUrls like //foo.bar
+ /^https?:$/.test(resultingUrl.protocol) && // catches file and blob protocol because for "blob:https://mozilla.org" origin will be returned as "https://mozilla.org".
+ acceptableRootContextPaths
+ .map((r) => contextRoot + r)
+ .some((p) => redirectUrl.startsWith(p))
+ );
+ } catch (invalidUrl) {
return false;
}
}
@@ -62,27 +82,41 @@ export function isUrlSaveForRedirect(redirectUrl) {
* Returns the context from which the webapp is running.
*/
export function getContextPath() {
- if (acceptableRootContextPaths.some(p => window.location.pathname.startsWith(p))) {
+ if (
+ acceptableRootContextPaths.some((p) =>
+ window.location.pathname.startsWith(p),
+ )
+ ) {
// App is deployed in the root context. Return an empty string.
- return "";
+ return '';
} else {
// App is deployed in a non-root context. Return the context.
- return window.location.pathname.substring(0, window.location.pathname.indexOf("/",2));
+ return window.location.pathname.substring(
+ 0,
+ window.location.pathname.indexOf('/', 2),
+ );
}
}
export function loadUserPreferencesForBootstrapTable(_this, id, columns) {
const table = _this.$refs.table;
if (!table) {
- console.error("No table defined in the calling component; Can't apply user preferences");
+ console.error(
+ "No table defined in the calling component; Can't apply user preferences",
+ );
return;
}
columns.forEach((column) => {
const isVisible = column.visible;
- const shouldShow = (localStorage && localStorage.getItem(id + "Show" + common.capitalize(column.field)) !== null)
- ? (localStorage.getItem(id + "Show" + common.capitalize(column.field)) === "true")
- : isVisible;
+ const shouldShow =
+ localStorage &&
+ localStorage.getItem(id + 'Show' + common.capitalize(column.field)) !==
+ null
+ ? localStorage.getItem(
+ id + 'Show' + common.capitalize(column.field),
+ ) === 'true'
+ : isVisible;
if (isVisible !== shouldShow) {
if (shouldShow) {
table.showColumn(column.field);
@@ -90,7 +124,7 @@ export function loadUserPreferencesForBootstrapTable(_this, id, columns) {
table.hideColumn(column.field);
}
}
- })
+ });
}
export function compareVersions(v1, v2) {
@@ -108,22 +142,22 @@ export function compareVersions(v1, v2) {
}
let v1parts = v1.split(':');
let v2parts = v2.split(':');
- if ((v1parts.length > 1) || (v2parts.length > 1)) {
+ if (v1parts.length > 1 || v2parts.length > 1) {
return compareEpochVersions(v1parts, v2parts);
}
return flexVerCompare(v1, v2);
}
function compareEpochVersions(v1parts, v2parts) {
- // compare epoch
- let v1epoch = v1parts.length > 1 ? v1parts[0] : "0";
- let v1version = v1parts.length > 1 ? v1parts[1] : v1parts[0];
- let v2epoch = v2parts.length > 1 ? v2parts[0] : "0";
- let v2version = v2parts.length > 1 ? v2parts[1] : v2parts[0];
- let epochCompare=flexVerCompare(v1epoch, v2epoch);
- if (epochCompare == 0) {
- return flexVerCompare(v1version, v2version);
- } else {
- return epochCompare;
- }
+ // compare epoch
+ let v1epoch = v1parts.length > 1 ? v1parts[0] : '0';
+ let v1version = v1parts.length > 1 ? v1parts[1] : v1parts[0];
+ let v2epoch = v2parts.length > 1 ? v2parts[0] : '0';
+ let v2version = v2parts.length > 1 ? v2parts[1] : v2parts[0];
+ let epochCompare = flexVerCompare(v1epoch, v2epoch);
+ if (epochCompare == 0) {
+ return flexVerCompare(v1version, v2version);
+ } else {
+ return epochCompare;
+ }
}
diff --git a/src/validation/index.js b/src/validation/index.js
index e389636e2..b4387faa1 100644
--- a/src/validation/index.js
+++ b/src/validation/index.js
@@ -1,11 +1,16 @@
-import { extend, configure } from 'vee-validate'
-import { required, confirmed, min_value, max_value } from 'vee-validate/dist/rules'
+import { extend, configure } from 'vee-validate';
+import {
+ required,
+ confirmed,
+ min_value,
+ max_value,
+} from 'vee-validate/dist/rules';
-import i18n from '../i18n'
+import i18n from '../i18n';
// Get rule localization based on the rule name
configure({
- defaultMessage: (_, values) => i18n.t(`validation.${values._rule_}`, values)
+ defaultMessage: (_, values) => i18n.t(`validation.${values._rule_}`, values),
});
extend('required', required);
diff --git a/src/views/Dashboard.vue b/src/views/Dashboard.vue
index b1bec51e0..c0f3bedcb 100644
--- a/src/views/Dashboard.vue
+++ b/src/views/Dashboard.vue
@@ -4,41 +4,80 @@
- {{ $t('message.portfolio_vulnerabilities') }}
+
+ {{ $t('message.portfolio_vulnerabilities') }}
+
- {{$t('message.last_measurement')}}: {{lastMeasurement}}
+ {{ $t('message.last_measurement') }}: {{ lastMeasurement
+ }}
-
-
+
-
+
{{ $t('severity.critical') }}
- {{critical}} ({{criticalPercent}}%)
-
+ {{ critical }} ({{ criticalPercent }}%)
+
{{ $t('severity.high') }}
- {{high}} ({{highPercent}}%)
-
+ {{ high }} ({{ highPercent }}%)
+
{{ $t('severity.medium') }}
- {{medium}} ({{mediumPercent}}%)
-
+ {{ medium }} ({{ mediumPercent }}%)
+
{{ $t('severity.low') }}
- {{low}} ({{lowPercent}}%)
-
+ {{ low }} ({{ lowPercent }}%)
+
{{ $t('severity.unassigned') }}
- {{unassigned}} ({{unassignedPercent}}%)
-
+ {{ unassigned }} ({{ unassignedPercent }}%)
+
@@ -49,28 +88,59 @@
- {{ $t('message.policy_violations') }}
- {{$t('message.policy_violations_by_state')}}
-
-
+
+ {{ $t('message.policy_violations') }}
+
+
+ {{ $t('message.policy_violations_by_state') }}
+
+
-
+
+
- {{ $t("policy_violation.fails") }}
- {{ failViolations }} ({{ failViolationsPercent }}%)
-
+ {{ $t('policy_violation.fails') }}
+ {{ failViolations }} ({{ failViolationsPercent }}%)
+
- {{ $t("policy_violation.warns") }}
- {{ warnViolations }} ({{ warnViolationsPercent }}%)
-
+ {{ $t('policy_violation.warns') }}
+ {{ warnViolations }} ({{ warnViolationsPercent }}%)
+
- {{ $t("policy_violation.infos") }}
- {{ infoViolations }} ({{ infoViolationsPercent }}%)
-
+ {{ $t('policy_violation.infos') }}
+ {{ infoViolations }} ({{ infoViolationsPercent }}%)
+
@@ -80,28 +150,74 @@
- {{ $t('message.policy_violations') }}
- {{$t('message.policy_violations_by_classification')}}
-
+
+ {{ $t('message.policy_violations') }}
+
+
+ {{ $t('message.policy_violations_by_classification') }}
+
+
-
+
- {{ $t("policy_violation.security") }}
- {{ securityViolations }} ({{ securityViolationsPercent }}%)
-
+
+ {{ $t('policy_violation.security') }}
+
+ {{ securityViolations }} ({{
+ securityViolationsPercent
+ }}%)
+
- {{ $t("policy_violation.operational") }}
- {{ operationalViolations }} ({{ operationalViolationsPercent }}%)
-
+
+ {{ $t('policy_violation.operational') }}
+
+ {{ operationalViolations }} ({{
+ operationalViolationsPercent
+ }}%)
+
- {{ $t("policy_violation.license") }}
- {{ licenseViolations }} ({{ licenseViolationsPercent }}%)
-
+
+ {{ $t('policy_violation.license') }}
+
+ {{ licenseViolations }} ({{
+ licenseViolationsPercent
+ }}%)
+
@@ -114,24 +230,51 @@
- {{ $t('message.auditing_progress') }}
- {{ $t('message.findings') }}
-
-
+
+ {{ $t('message.auditing_progress') }}
+
+ {{ $t('message.findings') }}
+
-
+
- {{ $t("message.findings_unaudited") }}
- {{ unauditedFindings }} ({{ unauditedFindingsPercent }}%)
-
+
+ {{ $t('message.findings_unaudited') }}
+
+ {{ unauditedFindings }} ({{
+ unauditedFindingsPercent
+ }}%)
+
- {{ $t("message.findings_audited") }}
- {{ auditedFindings }} ({{ auditedFindingsPercent }}%)
-
+
+ {{ $t('message.findings_audited') }}
+
+ {{ auditedFindings }} ({{ auditedFindingsPercent }}%)
+
@@ -141,24 +284,58 @@
- {{ $t('message.auditing_progress') }}
- {{$t('message.policy_violations')}}
-
-
+
+ {{ $t('message.auditing_progress') }}
+
+
+ {{ $t('message.policy_violations') }}
+
+
-
+
- {{ $t('message.violations_unaudited') }}
- {{unauditedViolations}} ({{unauditedViolationsPercent}}%)
-
+
+ {{ $t('message.violations_unaudited') }}
+
+ {{ unauditedViolations }} ({{
+ unauditedViolationsPercent
+ }}%)
+
- {{ $t('message.violations_audited') }}
- {{auditedViolations}} ({{auditedViolationsPercent}}%)
-
+
+ {{ $t('message.violations_audited') }}
+
+ {{ auditedViolations }} ({{
+ auditedViolationsPercent
+ }}%)
+
@@ -171,23 +348,48 @@
- {{ $t('message.projects') }}
-
-
+
+ {{ $t('message.projects') }}
+
+
-
+
- {{ $t("message.non_vulnerable") }}
- {{ nonVulnerableProjects }} ({{ nonVulnerableProjectsPercent }}%)
-
+ {{ $t('message.non_vulnerable') }}
+ {{ nonVulnerableProjects }} ({{
+ nonVulnerableProjectsPercent
+ }}%)
+
- {{ $t("message.vulnerable") }}
- {{ vulnerableProjects }} ({{ vulnerableProjectsPercent }}%)
-
+ {{ $t('message.vulnerable') }}
+ {{ vulnerableProjects }} ({{
+ vulnerableProjectsPercent
+ }}%)
+
@@ -197,23 +399,48 @@
- {{ $t('message.components') }}
-
-
+
+ {{ $t('message.components') }}
+
+
-
+
- {{ $t("message.non_vulnerable") }}
- {{ nonVulnerableComponents }} ({{ nonVulnerableComponentsPercent }}%)
-
+ {{ $t('message.non_vulnerable') }}
+ {{ nonVulnerableComponents }} ({{
+ nonVulnerableComponentsPercent
+ }}%)
+
- {{ $t("message.vulnerable") }}
- {{ vulnerableComponents }} ({{ vulnerableComponentsPercent }}%)
-
+ {{ $t('message.vulnerable') }}
+ {{ vulnerableComponents }} ({{
+ vulnerableComponentsPercent
+ }}%)
+
@@ -229,14 +456,20 @@
- {{ $t('message.projects') }}
- {{totalProjects}}
+ {{
+ $t('message.projects')
+ }}
+ {{ totalProjects }}
- {{ $t('message.vulnerable_projects') }}
- {{vulnerableProjects}}
+ {{
+ $t('message.vulnerable_projects')
+ }}
+ {{ vulnerableProjects }}
@@ -245,14 +478,20 @@
- {{ $t('message.components') }}
- {{totalComponents}}
+ {{
+ $t('message.components')
+ }}
+ {{ totalComponents }}
- {{ $t('message.vulnerable_components') }}
- {{vulnerableComponents}}
+ {{
+ $t('message.vulnerable_components')
+ }}
+ {{ vulnerableComponents }}
@@ -261,14 +500,20 @@
- {{ $t('message.portfolio_vulnerabilities') }}
- {{vulnerabilities}}
+ {{
+ $t('message.portfolio_vulnerabilities')
+ }}
+ {{ vulnerabilities }}
- {{ $t('message.suppressed') }}
- {{suppressed}}
+ {{
+ $t('message.suppressed')
+ }}
+ {{ suppressed }}
@@ -279,14 +524,20 @@
- {{ $t('message.policy_violations') }}
- {{totalViolations}}
+ {{
+ $t('message.policy_violations')
+ }}
+ {{ totalViolations }}
- {{ $t('policy_violation.license') }}
- {{licenseViolations}}
+ {{
+ $t('policy_violation.license')
+ }}
+ {{ licenseViolations }}
@@ -295,14 +546,20 @@
- {{ $t('policy_violation.operational') }}
- {{operationalViolations}}
+ {{
+ $t('policy_violation.operational')
+ }}
+ {{ operationalViolations }}
- {{ $t('policy_violation.security') }}
- {{securityViolations}}
+ {{
+ $t('policy_violation.security')
+ }}
+ {{ securityViolations }}
@@ -311,176 +568,276 @@
-
diff --git a/src/views/administration/AdminMenu.vue b/src/views/administration/AdminMenu.vue
index 6984c03b6..3afaca14b 100644
--- a/src/views/administration/AdminMenu.vue
+++ b/src/views/administration/AdminMenu.vue
@@ -1,307 +1,334 @@
-
-
- {{$t('admin.repository_authentication')}}
+ {{ $t('admin.repository_authentication') }}
-
+
-
+
- {{$t('admin.enabled')}}
+ {{
+ $t('admin.enabled')
+ }}
- {{ $t('message.close') }}
- {{ $t('message.create') }}
+ {{
+ $t('message.close')
+ }}
+ {{
+ $t('message.create')
+ }}
diff --git a/src/views/administration/vuln-sources/EcosystemModal.vue b/src/views/administration/vuln-sources/EcosystemModal.vue
index 33abc4a81..4d514e928 100644
--- a/src/views/administration/vuln-sources/EcosystemModal.vue
+++ b/src/views/administration/vuln-sources/EcosystemModal.vue
@@ -1,68 +1,82 @@
-
+
+ :options="options"
+ >
- {{ $t('message.cancel') }}
- {{ $t('message.select') }}
+ {{
+ $t('message.cancel')
+ }}
+ {{ $t('message.select') }}
\ No newline at end of file
+ },
+ ],
+ data: [],
+ options: {
+ search: true,
+ showColumns: true,
+ showRefresh: true,
+ pagination: true,
+ silentSort: false,
+ sidePagination: 'client',
+ queryParamsType: 'pageSize',
+ pageList: '[10, 25, 50, 100]',
+ pageSize: 10,
+ icons: {
+ refresh: 'fa-refresh',
+ },
+ responseHandler: function (res, xhr) {
+ res.total = xhr.getResponseHeader('X-Total-Count');
+ return res.map((ecosystem) => ({
+ name: ecosystem,
+ }));
+ },
+ url: `${this.$api.BASE_URL}/${this.$api.URL_OSV_ECOSYSTEM}/inactive`,
+ },
+ };
+ },
+};
+
diff --git a/src/views/administration/vuln-sources/VulnSourceGitHubAdvisories.vue b/src/views/administration/vuln-sources/VulnSourceGitHubAdvisories.vue
index 3c3fa2cb7..852307b68 100644
--- a/src/views/administration/vuln-sources/VulnSourceGitHubAdvisories.vue
+++ b/src/views/administration/vuln-sources/VulnSourceGitHubAdvisories.vue
@@ -1,8 +1,8 @@
-
-
+
+
- {{$t('admin.vulnsource_github_advisories_enable')}}
-
+ {{ $t('admin.vulnsource_github_advisories_enable') }}
+
- {{$t('admin.vulnsource_alias_sync_enable')}}
+ {{ $t('admin.vulnsource_alias_sync_enable') }}
-
+
{{ $t('admin.vulnsource_github_advisories_desc') }}
@@ -40,8 +40,9 @@
:disabled="this.vulnsourceEnabled && !this.apitoken"
@click="saveChanges"
class="px-4"
- variant="outline-primary">
- {{ $t('message.update') }}
+ variant="outline-primary"
+ >
+ {{ $t('message.update') }}
@@ -50,17 +51,17 @@
diff --git a/src/views/administration/vuln-sources/VulnSourceNvd.vue b/src/views/administration/vuln-sources/VulnSourceNvd.vue
index 2fd65287d..dfea3a7f3 100644
--- a/src/views/administration/vuln-sources/VulnSourceNvd.vue
+++ b/src/views/administration/vuln-sources/VulnSourceNvd.vue
@@ -9,12 +9,12 @@
label
v-bind="labelIcon"
/>
- {{$t('admin.vulnsource_nvd_enable')}}
-
+ {{ $t('admin.vulnsource_nvd_enable') }}
+
{{ $t('admin.vulnsource_nvd_desc') }}
-
+
{{ $t('admin.vulnsource_nvd_notice') }}
-
+
-
+
- {{ $t('admin.nvd_why_enable_api_help') }}
+ {{
+ $t('admin.nvd_why_enable_api_help')
+ }}
- {{ $t('admin.nvd_additionally_download_feeds_help') }} /mirror/nvd
+ {{ $t('admin.nvd_additionally_download_feeds_help') }}
+ /mirror/nvd
- {{ $t('admin.nvd_request_api_key_help') }}
+ {{
+ $t('admin.nvd_request_api_key_help')
+ }}
- {{ $t('message.update') }}
+ @click="saveChanges"
+ >
+ {{ $t('message.update') }}
@@ -113,19 +123,19 @@
diff --git a/src/views/administration/vuln-sources/VulnSourceOSVAdvisories.vue b/src/views/administration/vuln-sources/VulnSourceOSVAdvisories.vue
index f851e1a10..a3d0a9c93 100644
--- a/src/views/administration/vuln-sources/VulnSourceOSVAdvisories.vue
+++ b/src/views/administration/vuln-sources/VulnSourceOSVAdvisories.vue
@@ -1,8 +1,8 @@
-
-
+
+
- {{$t('admin.vulnsource_osv_advisories_enable')}}
-
+ {{ $t('admin.vulnsource_osv_advisories_enable') }}
+
- {{$t('admin.vulnsource_alias_sync_enable')}}
+ {{ $t('admin.vulnsource_alias_sync_enable') }}
- {{ $t('admin.vulnsource_osv_alias_sync_warning') }}
+ {{
+ $t('admin.vulnsource_osv_alias_sync_warning')
+ }}
-
+
{{ $t('admin.vulnsource_osv_advisories_desc') }}
-
+
-
+
@@ -54,98 +63,120 @@
:disabled="this.vulnsourceEnabled && !this.osvBaseUrl"
variant="outline-primary"
class="px-4"
- @click="saveUrl">
- {{ $t('message.update') }}
+ @click="saveUrl"
+ >
+ {{ $t('message.update') }}
-
+
diff --git a/src/views/components/AboutModal.vue b/src/views/components/AboutModal.vue
index d2c934a07..33aa6a589 100644
--- a/src/views/components/AboutModal.vue
+++ b/src/views/components/AboutModal.vue
@@ -1,76 +1,132 @@
-
+
-
+
-
+
-
+
- OWASP Dependency-Track is an intelligent Component Analysis platform that allows organizations to identify and reduce risk in the software supply chain.
+ OWASP Dependency-Track is an intelligent Component Analysis platform that
+ allows organizations to identify and reduce risk in the software supply
+ chain.
- {{ this.dtrack.application }} v{{ this.dtrack.version }}
- Build ID: {{ this.dtrack.uuid }}
+ {{ this.dtrack.application }} v{{ this.dtrack.version }}
+ Build ID: {{ this.dtrack.uuid }}
Built On: {{ serverTimestamp }}
- Frontend v{{ this.$version.version }}
- Build ID: {{ this.$version.uuid }}
+ Frontend v{{ this.$version.version }}
+ Build ID: {{ this.$version.uuid }}
Built On: {{ frontendTimestamp }}
-
+
Community Resources
Datasource Providers
- Copyright © Steve Springett. All Rights Reserved.
- {{ $t('message.close') }}
+
+ Copyright © Steve Springett. All Rights Reserved.
+
+ {{
+ $t('message.close')
+ }}
diff --git a/src/views/components/ActionableListGroupItem.vue b/src/views/components/ActionableListGroupItem.vue
index fc7b7be4a..620e056d9 100644
--- a/src/views/components/ActionableListGroupItem.vue
+++ b/src/views/components/ActionableListGroupItem.vue
@@ -1,50 +1,60 @@
-
+
- {{ value }} {{ value }}
+ {{ value }} {{ value }}
diff --git a/src/views/components/BToggleableDisplayButton.vue b/src/views/components/BToggleableDisplayButton.vue
index 54fc9399d..009ad89bc 100644
--- a/src/views/components/BToggleableDisplayButton.vue
+++ b/src/views/components/BToggleableDisplayButton.vue
@@ -1,26 +1,31 @@
- {{ label }}
+ {{ label }}
diff --git a/src/views/components/ExternalReferencesDropdown.vue b/src/views/components/ExternalReferencesDropdown.vue
index cc93b82f5..b37930eec 100644
--- a/src/views/components/ExternalReferencesDropdown.vue
+++ b/src/views/components/ExternalReferencesDropdown.vue
@@ -2,14 +2,24 @@
-
+
- {{ r.type }}
+ {{
+ r.type
+ }}
{{ r.type }}
@@ -17,15 +27,15 @@
diff --git a/src/views/components/PolicyViolationProgressBar.vue b/src/views/components/PolicyViolationProgressBar.vue
index be13a8916..a766fd6e3 100644
--- a/src/views/components/PolicyViolationProgressBar.vue
+++ b/src/views/components/PolicyViolationProgressBar.vue
@@ -6,29 +6,52 @@
-
-
-
-
+
+
+
+
-
-
-
{{$t('message.type')}}
-
- {{$t('policy_violation.license')}}: {{ metrics.policyViolationsLicenseTotal }}
- {{$t('policy_violation.operational')}}: {{ metrics.policyViolationsOperationalTotal }}
- {{$t('policy_violation.security')}}: {{ metrics.policyViolationsSecurityTotal }}
-
-
{{ $t('message.violation_state') }}
-
- {{$t('policy_violation.infos')}}: {{ metrics.policyViolationsInfo }}
- {{$t('policy_violation.warns')}}: {{ metrics.policyViolationsWarn }}
- {{$t('policy_violation.fails')}}: {{ metrics.policyViolationsFail }}
-
- {{$t('message.total')}}: {{ metrics.policyViolationsTotal }}
-
-
+
+
+
{{ $t('message.type') }}
+
+ {{ $t('policy_violation.license') }}:
+ {{ metrics.policyViolationsLicenseTotal }}
+ {{ $t('policy_violation.operational') }}:
+ {{ metrics.policyViolationsOperationalTotal }}
+ {{ $t('policy_violation.security') }}:
+ {{ metrics.policyViolationsSecurityTotal }}
+
+
{{ $t('message.violation_state') }}
+
+ {{ $t('policy_violation.infos') }}: {{ metrics.policyViolationsInfo
+ }}
+ {{ $t('policy_violation.warns') }}: {{ metrics.policyViolationsWarn
+ }}
+ {{ $t('policy_violation.fails') }}: {{ metrics.policyViolationsFail
+ }}
+
+ {{ $t('message.total') }}: {{ metrics.policyViolationsTotal }}
+
+
@@ -44,5 +67,5 @@ export default {
hoverId: Math.random().toString(36),
};
},
-}
+};
diff --git a/src/views/components/ProfileEditModal.vue b/src/views/components/ProfileEditModal.vue
index 95f63d1a6..088922b0c 100644
--- a/src/views/components/ProfileEditModal.vue
+++ b/src/views/components/ProfileEditModal.vue
@@ -1,66 +1,96 @@
-
-
-
-
+
+
+
- {{ $t('message.close') }}
- {{ $t('message.update') }}
+ {{
+ $t('message.close')
+ }}
+ {{
+ $t('message.update')
+ }}
diff --git a/src/views/components/SeverityProgressBar.vue b/src/views/components/SeverityProgressBar.vue
index a2b9af7d3..a991131a5 100644
--- a/src/views/components/SeverityProgressBar.vue
+++ b/src/views/components/SeverityProgressBar.vue
@@ -7,45 +7,58 @@
-
+
-
+
-
+
-
-
-
{{$t('message.severity')}}
+
+
+
{{ $t('message.severity') }}
- {{$t('severity.critical')}}: {{ critical }}
- {{$t('severity.high')}}: {{ high }}
- {{$t('severity.medium')}}: {{ medium }}
- {{$t('severity.low')}}: {{ low }}
- {{$t('severity.unassigned')}}: {{ unassigned }}
+ {{ $t('severity.critical') }}: {{ critical }}
+ {{ $t('severity.high') }}: {{ high }}
+ {{ $t('severity.medium') }}: {{ medium }}
+ {{ $t('severity.low') }}: {{ low }}
+ {{ $t('severity.unassigned') }}: {{ unassigned }}
- {{$t('message.total')}}: {{ vulnerabilities }}
+ {{ $t('message.total') }}: {{ vulnerabilities }}
diff --git a/src/views/components/Showdown.vue b/src/views/components/Showdown.vue
index 7e3ab3cea..7bbf8abb9 100644
--- a/src/views/components/Showdown.vue
+++ b/src/views/components/Showdown.vue
@@ -3,22 +3,22 @@
diff --git a/src/views/components/SnapshotModal.vue b/src/views/components/SnapshotModal.vue
index 02003cc89..3d9c757d2 100644
--- a/src/views/components/SnapshotModal.vue
+++ b/src/views/components/SnapshotModal.vue
@@ -1,16 +1,22 @@
-
+
-
+
-
+
This version of Dependency-Track is a snapshot release that is dynamically
- generated from continuous integration or from manually compiling from a branch.
- It is likely beta-quality software and has not undergone extensive testing.
- It may contain defects and incomplete features and functionality.
+ generated from continuous integration or from manually compiling from a
+ branch. It is likely beta-quality software and has not undergone extensive
+ testing. It may contain defects and incomplete features and functionality.
Links to production-quality releases can be found at
@@ -19,17 +25,22 @@
Please consider contributing feedback and pull requests to help improve
the project. All contributions are appreciated. Visit Dependency-Track on
- GitHub
+ GitHub
Do not use snapshot releases on production data.
- {{ $t('message.close') }}
+ {{
+ $t('message.close')
+ }}
diff --git a/src/views/dashboard/ChartAuditingFindingsProgress.vue b/src/views/dashboard/ChartAuditingFindingsProgress.vue
index d0e17a2cd..969a71dc4 100644
--- a/src/views/dashboard/ChartAuditingFindingsProgress.vue
+++ b/src/views/dashboard/ChartAuditingFindingsProgress.vue
@@ -1,36 +1,37 @@
diff --git a/src/views/dashboard/ChartAuditingViolationsProgress.vue b/src/views/dashboard/ChartAuditingViolationsProgress.vue
index 3f9a1eaf0..b66169ae2 100644
--- a/src/views/dashboard/ChartAuditingViolationsProgress.vue
+++ b/src/views/dashboard/ChartAuditingViolationsProgress.vue
@@ -1,36 +1,37 @@
diff --git a/src/views/dashboard/ChartComponentVulnerabilities.vue b/src/views/dashboard/ChartComponentVulnerabilities.vue
index fbe6a4b99..932b9849c 100644
--- a/src/views/dashboard/ChartComponentVulnerabilities.vue
+++ b/src/views/dashboard/ChartComponentVulnerabilities.vue
@@ -1,40 +1,45 @@
diff --git a/src/views/dashboard/ChartEpssVsCvss.vue b/src/views/dashboard/ChartEpssVsCvss.vue
index 69316cfe8..30e22553c 100644
--- a/src/views/dashboard/ChartEpssVsCvss.vue
+++ b/src/views/dashboard/ChartEpssVsCvss.vue
@@ -1,108 +1,122 @@
diff --git a/src/views/dashboard/ChartPolicyViolationBreakdown.vue b/src/views/dashboard/ChartPolicyViolationBreakdown.vue
index 56579fa9a..0364d28be 100644
--- a/src/views/dashboard/ChartPolicyViolationBreakdown.vue
+++ b/src/views/dashboard/ChartPolicyViolationBreakdown.vue
@@ -4,40 +4,65 @@
-
+
diff --git a/src/views/dashboard/ChartPolicyViolationsClassification.vue b/src/views/dashboard/ChartPolicyViolationsClassification.vue
index 3ccc0f4a2..e56931f99 100644
--- a/src/views/dashboard/ChartPolicyViolationsClassification.vue
+++ b/src/views/dashboard/ChartPolicyViolationsClassification.vue
@@ -1,15 +1,15 @@
diff --git a/src/views/dashboard/ChartPolicyViolationsState.vue b/src/views/dashboard/ChartPolicyViolationsState.vue
index 27c3641e1..20e187028 100644
--- a/src/views/dashboard/ChartPolicyViolationsState.vue
+++ b/src/views/dashboard/ChartPolicyViolationsState.vue
@@ -1,16 +1,16 @@
diff --git a/src/views/dashboard/ChartPortfolioVulnerabilities.vue b/src/views/dashboard/ChartPortfolioVulnerabilities.vue
index c0c9f1e66..1da1ebea0 100644
--- a/src/views/dashboard/ChartPortfolioVulnerabilities.vue
+++ b/src/views/dashboard/ChartPortfolioVulnerabilities.vue
@@ -1,48 +1,49 @@
diff --git a/src/views/dashboard/ChartProjectVulnerabilities.vue b/src/views/dashboard/ChartProjectVulnerabilities.vue
index dffc4d938..ceb4dc118 100644
--- a/src/views/dashboard/ChartProjectVulnerabilities.vue
+++ b/src/views/dashboard/ChartProjectVulnerabilities.vue
@@ -1,40 +1,45 @@
diff --git a/src/views/dashboard/PortfolioWidgetRow.vue b/src/views/dashboard/PortfolioWidgetRow.vue
index cea73e117..96444e4cc 100644
--- a/src/views/dashboard/PortfolioWidgetRow.vue
+++ b/src/views/dashboard/PortfolioWidgetRow.vue
@@ -6,7 +6,13 @@
{{ portfolioVulnerabilities }}
{{ $t('message.portfolio_vulnerabilities') }}
-
+
@@ -15,7 +21,13 @@
{{ vulnerableProjects }}
{{ $t('message.projects_at_risk') }}
-
+
@@ -24,7 +36,13 @@
{{ vulnerableComponents }}
{{ $t('message.vulnerable_components') }}
-
+
@@ -33,60 +51,68 @@
{{ inheritedRiskScore }}
{{ $t('message.inherited_risk_score') }}
-
+
diff --git a/src/views/dashboard/SeverityBarChart.vue b/src/views/dashboard/SeverityBarChart.vue
index 1fd105814..b7d8e4fe9 100644
--- a/src/views/dashboard/SeverityBarChart.vue
+++ b/src/views/dashboard/SeverityBarChart.vue
@@ -1,63 +1,73 @@
diff --git a/src/views/dashboard/WidgetInheritedRiskScore.vue b/src/views/dashboard/WidgetInheritedRiskScore.vue
index 43ffedba2..1ec938bb3 100644
--- a/src/views/dashboard/WidgetInheritedRiskScore.vue
+++ b/src/views/dashboard/WidgetInheritedRiskScore.vue
@@ -1,14 +1,14 @@
diff --git a/src/views/dashboard/WidgetPortfolioVulnerabilities.vue b/src/views/dashboard/WidgetPortfolioVulnerabilities.vue
index 8ef1a31a9..fb6041369 100644
--- a/src/views/dashboard/WidgetPortfolioVulnerabilities.vue
+++ b/src/views/dashboard/WidgetPortfolioVulnerabilities.vue
@@ -1,17 +1,17 @@
diff --git a/src/views/dashboard/WidgetProjectsAtRisk.vue b/src/views/dashboard/WidgetProjectsAtRisk.vue
index 5bf4f218c..463556a3b 100644
--- a/src/views/dashboard/WidgetProjectsAtRisk.vue
+++ b/src/views/dashboard/WidgetProjectsAtRisk.vue
@@ -1,14 +1,14 @@
diff --git a/src/views/dashboard/WidgetVulnerableComponents.vue b/src/views/dashboard/WidgetVulnerableComponents.vue
index 2fb75c7f8..24a79f6e5 100644
--- a/src/views/dashboard/WidgetVulnerableComponents.vue
+++ b/src/views/dashboard/WidgetVulnerableComponents.vue
@@ -1,14 +1,14 @@
diff --git a/src/views/globalAudit/VulnerabilityAudit.vue b/src/views/globalAudit/VulnerabilityAudit.vue
index e34c2e1d4..8de10af22 100644
--- a/src/views/globalAudit/VulnerabilityAudit.vue
+++ b/src/views/globalAudit/VulnerabilityAudit.vue
@@ -1,12 +1,37 @@
-
-
-
- {{ $t('message.vulnerabilities_by_occurrence') }}
+
+
+
+
+ {{ $t('message.vulnerabilities_by_occurrence') }}
-
- {{ $t('message.grouped_vulnerabilities') }}
+
+
+ {{ $t('message.grouped_vulnerabilities') }}
@@ -14,9 +39,9 @@
diff --git a/src/views/globalAudit/VulnerabilityAuditByOccurrence.vue b/src/views/globalAudit/VulnerabilityAuditByOccurrence.vue
index e30cb3c45..806e1f351 100644
--- a/src/views/globalAudit/VulnerabilityAuditByOccurrence.vue
+++ b/src/views/globalAudit/VulnerabilityAuditByOccurrence.vue
@@ -3,79 +3,195 @@
-
{{ this.$t('message.filters') }}
- {{ this.$t('message.clear_all') }}
-
-
+ {{ this.$t('message.filters') }}
+
+ {{ this.$t('message.clear_all') }}
+
+
+ unchecked-value="false"
+ >
{{ this.$t('message.show_inactive_projects') }}
-
+
+ unchecked-value="false"
+ >
{{ this.$t('message.show_suppressed_findings') }}
-
+
+ stacked
+ >
-
+
+ stacked
+ >
-
+
+ stacked
+ >
-
-
-
+
+
+
-
-
-
+
+
+
-
-
+
+
Search in:
+ stacked
+ >
-
+
-
-
+
+
-
+
-
-
+
+
@@ -86,7 +202,8 @@
:columns="columns"
:data="data"
:options="options"
- @on-load-success="onLoadSuccess">
+ @on-load-success="onLoadSuccess"
+ >
@@ -94,404 +211,534 @@
diff --git a/src/views/globalAudit/VulnerabilityAuditGroupedByVulnerability.vue b/src/views/globalAudit/VulnerabilityAuditGroupedByVulnerability.vue
index 26edf5897..893045c8e 100644
--- a/src/views/globalAudit/VulnerabilityAuditGroupedByVulnerability.vue
+++ b/src/views/globalAudit/VulnerabilityAuditGroupedByVulnerability.vue
@@ -2,56 +2,173 @@
- {{ this.$t('message.filters') }}
- {{ this.$t('message.clear_all') }}
-
-
+ {{ this.$t('message.filters') }}
+
+ {{ this.$t('message.clear_all') }}
+
+
+ unchecked-value="false"
+ >
{{ this.$t('message.show_inactive_projects') }}
-
+
+ stacked
+ >
-
-
-
+
+
+
-
-
+
+
Search in:
+ stacked
+ >
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
@@ -61,7 +178,8 @@
:columns="columns"
:data="data"
:options="options"
- @on-load-success="onLoadSuccess">
+ @on-load-success="onLoadSuccess"
+ >
@@ -69,340 +187,449 @@
diff --git a/src/views/modals/InformationalModal.vue b/src/views/modals/InformationalModal.vue
index ea59a7758..a91936428 100644
--- a/src/views/modals/InformationalModal.vue
+++ b/src/views/modals/InformationalModal.vue
@@ -3,7 +3,10 @@
Information
-
- Close
+ Close
diff --git a/src/views/pages/Login.vue b/src/views/pages/Login.vue
index 7d013eb1c..4ed9cb25c 100644
--- a/src/views/pages/Login.vue
+++ b/src/views/pages/Login.vue
@@ -37,33 +37,52 @@
lazy="true"
v-show="showLoginForm"
/>
-
+
{{ $t('message.login') }}
+ >{{ $t('message.login') }}
-
- {{ oidcLoginButtonText() }}
-
+
+ {{
+ oidcLoginButtonText()
+ }}
+
{{ $t('message.login_more_options') }}
+ v-show="oidcAvailable && !showLoginForm"
+ v-on:click="showLoginForm = true"
+ >{{ $t('message.login_more_options') }}
-
+
-
+
@@ -76,125 +95,133 @@
diff --git a/src/views/pages/Page404.vue b/src/views/pages/Page404.vue
index fee9c2a73..5d8e9005f 100644
--- a/src/views/pages/Page404.vue
+++ b/src/views/pages/Page404.vue
@@ -8,7 +8,9 @@
{{ $t('404.heading') }}
{{ $t('404.message') }}
-
{{ $t('404.action') }}
+
{{
+ $t('404.action')
+ }}
@@ -16,7 +18,7 @@
diff --git a/src/views/pages/PasswordForceChange.vue b/src/views/pages/PasswordForceChange.vue
index 3b6118fa6..f4d987cb5 100644
--- a/src/views/pages/PasswordForceChange.vue
+++ b/src/views/pages/PasswordForceChange.vue
@@ -9,7 +9,9 @@
{{ $t('message.password_force_change') }}
- {{ $t('message.password_force_change_desc') }}
+
+ {{ $t('message.password_force_change_desc') }}
+
- {{ $t('message.password_change') }}
+ {{ $t('message.password_change') }}
-
+
-
+
@@ -70,70 +85,76 @@
-
+
diff --git a/src/views/policy/CreateLicenseGroupModal.vue b/src/views/policy/CreateLicenseGroupModal.vue
index e6e82936d..c4544c1be 100644
--- a/src/views/policy/CreateLicenseGroupModal.vue
+++ b/src/views/policy/CreateLicenseGroupModal.vue
@@ -1,51 +1,66 @@
-
-
-
+
+
- {{ $t('message.close') }}
- {{ $t('message.create') }}
+ {{
+ $t('message.close')
+ }}
+ {{
+ $t('message.create')
+ }}
diff --git a/src/views/policy/CreatePolicyModal.vue b/src/views/policy/CreatePolicyModal.vue
index 21bc099f2..fbc25778d 100644
--- a/src/views/policy/CreatePolicyModal.vue
+++ b/src/views/policy/CreatePolicyModal.vue
@@ -1,52 +1,68 @@
-
-
-
+
+
- {{ $t('message.close') }}
- {{ $t('message.create') }}
+ {{
+ $t('message.close')
+ }}
+ {{
+ $t('message.create')
+ }}
diff --git a/src/views/policy/LicenseGroupList.vue b/src/views/policy/LicenseGroupList.vue
index 9f16b7ea0..2a26ca2c2 100644
--- a/src/views/policy/LicenseGroupList.vue
+++ b/src/views/policy/LicenseGroupList.vue
@@ -1,8 +1,14 @@
-
- {{ $t('message.create_license_group') }}
+
+
+ {{ $t('message.create_license_group') }}
+ @on-load-success="tableLoaded"
+ />
diff --git a/src/views/policy/PolicyCondition.vue b/src/views/policy/PolicyCondition.vue
index e40f377ed..205999aae 100644
--- a/src/views/policy/PolicyCondition.vue
+++ b/src/views/policy/PolicyCondition.vue
@@ -1,402 +1,541 @@
-
+
-
+
-
+
-
+
-
+
-
-
-
- {{ $t('message.coordinates_version_tooltip') }}
+
+
+
+ {{ $t('message.coordinates_version_tooltip') }}
-
-
-
-
- {{ $t('message.version_distance_tooltip') }}
- {{ $t('message.version_distance_tooltip') }}
- {{ $t('message.version_distance_tooltip') }}
- {{ $t('message.version_distance_tooltip') }}
+
+
+
+
+ {{ $t('message.version_distance_tooltip') }}
+ {{ $t('message.version_distance_tooltip') }}
+ {{ $t('message.version_distance_tooltip') }}
+ {{ $t('message.version_distance_tooltip') }}
-
-
-
+
diff --git a/src/views/policy/PolicyList.vue b/src/views/policy/PolicyList.vue
index 2710b31c2..9b430c7b7 100644
--- a/src/views/policy/PolicyList.vue
+++ b/src/views/policy/PolicyList.vue
@@ -1,7 +1,12 @@
-
+
{{ $t('message.create_policy') }}
@@ -10,97 +15,106 @@
:columns="columns"
:data="data"
:options="options"
- @on-load-success="tableLoaded"/>
+ @on-load-success="tableLoaded"
+ />
diff --git a/src/views/policy/PolicyManagement.vue b/src/views/policy/PolicyManagement.vue
index bfd7c66f1..3cc1cd92b 100644
--- a/src/views/policy/PolicyManagement.vue
+++ b/src/views/policy/PolicyManagement.vue
@@ -1,12 +1,30 @@
-
-
- {{ $t('message.policies') }} {{ totalPolicies }}
+
+
+ {{ $t('message.policies') }}
+ {{ totalPolicies }}
- {{ $t('message.license_groups') }} {{ totalLicenseGroups }}
+
+ {{ $t('message.license_groups') }}
+ {{
+ totalLicenseGroups
+ }}
@@ -14,45 +32,50 @@
diff --git a/src/views/policy/SelectLicenseModal.vue b/src/views/policy/SelectLicenseModal.vue
index 12f787057..a61d9fcf7 100644
--- a/src/views/policy/SelectLicenseModal.vue
+++ b/src/views/policy/SelectLicenseModal.vue
@@ -1,76 +1,92 @@
-
+
+ :options="options"
+ >
- {{ $t('message.cancel') }}
- {{ $t('message.select') }}
+ {{
+ $t('message.cancel')
+ }}
+ {{ $t('message.select') }}
diff --git a/src/views/portfolio/components/ComponentSearch.vue b/src/views/portfolio/components/ComponentSearch.vue
index ef9ab9e85..984e2f946 100644
--- a/src/views/portfolio/components/ComponentSearch.vue
+++ b/src/views/portfolio/components/ComponentSearch.vue
@@ -3,20 +3,53 @@
-
-
-
-
-
-
-
-
-
-
-
-
- {{ $t('message.search') }}
-
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ $t('message.search')
+ }}
+
+ @on-pre-body="onPreBody"
+ >
diff --git a/src/views/portfolio/licenses/License.vue b/src/views/portfolio/licenses/License.vue
index 77e8a77d3..854720594 100644
--- a/src/views/portfolio/licenses/License.vue
+++ b/src/views/portfolio/licenses/License.vue
@@ -1,7 +1,16 @@
-
-
+
+
{{ $t('message.overview') }}
@@ -15,28 +24,36 @@
{{ $t('message.osi_approved') }}:
-
+
{{ $t('message.fsf_libre') }}:
-
+
{{ $t('message.deprecated') }}:
-
+
{{ $t('message.custom_license') }}:
-
+
@@ -46,118 +63,150 @@
-
+
+
+
{{ $t('message.license_text') }}
- {{ license.licenseText }}
+
+ {{ license.licenseText }}
+
{{ $t('message.template') }}
- {{ license.standardLicenseTemplate }}
+
+ {{ license.standardLicenseTemplate }}
+
{{ $t('message.source_header') }}
-
+
- {{ $t('message.delete') }}
+ {{ $t('message.delete') }}
diff --git a/src/views/portfolio/licenses/LicenseAddLicenseModal.vue b/src/views/portfolio/licenses/LicenseAddLicenseModal.vue
index a1a35866f..4dc4862d5 100644
--- a/src/views/portfolio/licenses/LicenseAddLicenseModal.vue
+++ b/src/views/portfolio/licenses/LicenseAddLicenseModal.vue
@@ -1,88 +1,172 @@
-
-
-
- {{ $t('message.general') }}
+
+
+
+ {{ $t('message.general') }}
-
-
+
+
-
+ label-for="license-text-input"
+ >
+
- {{$t('message.osi_approved')}}
- {{$t('message.fsf_libre')}}
- {{$t('message.deprecated')}}
+
+ {{ $t('message.osi_approved') }}
+
+ {{ $t('message.fsf_libre') }}
+
+ {{ $t('message.deprecated') }}
- {{ $t('message.extended') }}
+
+ {{ $t('message.extended') }}
-
+ label-for="license-template-input"
+ >
+
-
+ label-for="license-see-also-input"
+ >
+
- {{ $t('message.close') }}
- {{ $t('message.create') }}
+ {{
+ $t('message.close')
+ }}
+ {{
+ $t('message.create')
+ }}
diff --git a/src/views/portfolio/licenses/LicenseList.vue b/src/views/portfolio/licenses/LicenseList.vue
index 50cc949a6..4f2cac108 100644
--- a/src/views/portfolio/licenses/LicenseList.vue
+++ b/src/views/portfolio/licenses/LicenseList.vue
@@ -2,7 +2,12 @@
-
+
{{ $t('message.add_license') }}
@@ -11,134 +16,155 @@
:columns="columns"
:data="data"
:options="options"
- @on-load-success="onLoadSuccess">
+ @on-load-success="onLoadSuccess"
+ >
-
+
diff --git a/src/views/portfolio/projects/Component.vue b/src/views/portfolio/projects/Component.vue
index 32c7ecfb5..201f247cd 100644
--- a/src/views/portfolio/projects/Component.vue
+++ b/src/views/portfolio/projects/Component.vue
@@ -6,70 +6,92 @@
{{ componentLabel }}
-
+
- {{ currentCritical }}
- {{ currentHigh }}
- {{ currentMedium }}
- {{ currentLow }}
- {{ currentUnassigned }}
+ {{ currentCritical }}
+ {{ currentHigh }}
+ {{ currentMedium }}
+ {{ currentLow }}
+ {{ currentUnassigned }}
@@ -77,163 +99,224 @@
-
-
- {{ $t('message.overview') }}
-
+
+
+
+ {{ $t('message.overview') }}
+
- {{ $t('message.vulnerabilities') }} {{ totalVulnerabilities }}
-
+ {{ $t('message.vulnerabilities') }}
+ {{
+ totalVulnerabilities
+ }}
+
-
+
diff --git a/src/views/portfolio/projects/ComponentDashboard.vue b/src/views/portfolio/projects/ComponentDashboard.vue
index d279cfc76..f59da26df 100644
--- a/src/views/portfolio/projects/ComponentDashboard.vue
+++ b/src/views/portfolio/projects/ComponentDashboard.vue
@@ -1,31 +1,47 @@
-
+
- {{ $t('message.component_vulnerabilities') }}
+
+ {{ $t('message.component_vulnerabilities') }}
+
- {{$t('message.last_measurement')}}: {{lastMeasurement}}
+ {{ $t('message.last_measurement') }}: {{ lastMeasurement
+ }}
-
-
+
-
+
- {{ $t('severity.critical') }}
- {{currentCritical}}
+ {{ $t('severity.critical') }}
+ {{ currentCritical }}
- {{ $t('severity.high') }}
- {{currentHigh}}
+ {{ $t('severity.high') }}
+ {{ currentHigh }}
@@ -34,14 +50,16 @@
- {{ $t('severity.medium') }}
- {{currentMedium}}
+ {{ $t('severity.medium') }}
+ {{ currentMedium }}
- {{ $t('severity.low') }}
- {{currentLow}}
+ {{ $t('severity.low') }}
+ {{ currentLow }}
@@ -50,14 +68,20 @@
- {{ $t('severity.unassigned') }}
- {{currentUnassigned}}
+ {{
+ $t('severity.unassigned')
+ }}
+ {{ currentUnassigned }}
- {{ $t('message.risk_score') }}
- {{currentRiskScore}}
+ {{
+ $t('message.risk_score')
+ }}
+ {{ currentRiskScore }}
@@ -70,30 +94,44 @@
- {{ $t('message.policy_violations') }}
+
+ {{ $t('message.policy_violations') }}
+
- {{$t('message.policy_violations_by_state')}}
+ {{ $t('message.policy_violations_by_state') }}
-
-
+
-
+
- {{ $t('message.policy_violations') }}
+
+ {{ $t('message.policy_violations') }}
+
- {{$t('message.policy_violations_by_classification')}}
+ {{ $t('message.policy_violations_by_classification') }}
-
-
+
-
+
@@ -101,80 +139,94 @@
diff --git a/src/views/portfolio/projects/ComponentDetailsModal.vue b/src/views/portfolio/projects/ComponentDetailsModal.vue
index bad34887b..c6906db25 100644
--- a/src/views/portfolio/projects/ComponentDetailsModal.vue
+++ b/src/views/portfolio/projects/ComponentDetailsModal.vue
@@ -1,320 +1,542 @@
-
-
-
- {{ $t('message.identity') }}
+
+
+
+ {{ $t('message.identity') }}
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
- {{ $t('message.extended') }}
+
+ {{ $t('message.extended') }}
-
-
+
+
-
+ label-for="component-description-input"
+ >
+
- {{ $t('message.legal') }}
+
+ {{ $t('message.legal') }}
-
-
-
+
+
+
-
+ label-for="component-copyright-input"
+ >
+
- {{ $t('message.hashes') }}
+ {{ $t('message.hashes') }}
-
-
-
-
-
-
+
+
+
+
+
+
-
- {{ $t('message.supplier') }}
+
+
+ {{ $t('message.supplier') }}
-
-
+
+
+ :options="supplierUrlsTableOptions"
+ >
-
+
+ :options="supplierContactsTableOptions"
+ >
- {{ $t('message.external_references') }}
+
+ {{ $t('message.external_references') }}
+ :options="referencesTableOptions"
+ >
- {{ $t('message.notes') }}
+ {{ $t('message.notes') }}
-
+ label-for="component-notes-input"
+ >
+
- {{ $t('message.delete') }}
- {{ $t('message.close') }}
- {{ $t('message.update') }}
+ {{ $t('message.delete') }}
+ {{
+ $t('message.close')
+ }}
+ {{ $t('message.update') }}
diff --git a/src/views/portfolio/projects/ComponentVulnerabilities.vue b/src/views/portfolio/projects/ComponentVulnerabilities.vue
index a38a85e97..f983b5ac0 100644
--- a/src/views/portfolio/projects/ComponentVulnerabilities.vue
+++ b/src/views/portfolio/projects/ComponentVulnerabilities.vue
@@ -5,189 +5,221 @@
:columns="columns"
:data="data"
:options="options"
- @on-load-success="tableLoaded">
+ @on-load-success="tableLoaded"
+ >
diff --git a/src/views/portfolio/projects/FindingAudit.vue b/src/views/portfolio/projects/FindingAudit.vue
index b271d8d4d..2668c0780 100644
--- a/src/views/portfolio/projects/FindingAudit.vue
+++ b/src/views/portfolio/projects/FindingAudit.vue
@@ -1,247 +1,472 @@
-
+
+
+
+ Aliases
+
+
+
+ {{ alias.vulnId }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ this.$t('message.add_comment') }}
+
+
+
+
+
+
+
+
+
-
- Aliases
-
-
-
- {{ alias.vulnId }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
-
- {{ this.$t('message.add_comment') }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ this.$t('message.update_details') }}
-
-
+
+
+
+
+
-
+
+
+
+
+
+ {{ this.$t('message.update_details') }}
+
+
+
+
\ No newline at end of file
+ addComment: function () {
+ if (this.comment != null) {
+ this.callRestEndpoint(
+ this.analysisState,
+ this.analysisJustification,
+ this.analysisResponse,
+ this.analysisDetails,
+ this.comment,
+ null,
+ );
+ }
+ this.comment = null;
+ },
+ callRestEndpoint: function (
+ analysisState,
+ analysisJustification,
+ analysisResponse,
+ analysisDetails,
+ comment,
+ isSuppressed,
+ ) {
+ let url = `${this.$api.BASE_URL}/${this.$api.URL_ANALYSIS}`;
+ this.axios
+ .put(url, {
+ project: this.projectUuid,
+ component: this.finding.component.uuid,
+ vulnerability: this.finding.vulnerability.uuid,
+ analysisState: analysisState,
+ analysisJustification: analysisJustification,
+ analysisResponse: analysisResponse,
+ analysisDetails: analysisDetails,
+ comment: comment,
+ isSuppressed: isSuppressed,
+ })
+ .then((response) => {
+ this.$toastr.s(this.$t('message.updated'));
+ this.updateAnalysisData(response.data);
+ })
+ .catch(() => {
+ this.$toastr.w(this.$t('condition.unsuccessful_action'));
+ });
+ },
+ },
+ beforeMount() {
+ this.finding && this.getAnalysis();
+ },
+ components: {
+ BootstrapToggle,
+ },
+};
+
diff --git a/src/views/portfolio/projects/Project.vue b/src/views/portfolio/projects/Project.vue
index 1511e72d7..7bceb52d5 100644
--- a/src/views/portfolio/projects/Project.vue
+++ b/src/views/portfolio/projects/Project.vue
@@ -4,17 +4,49 @@
-
+
{{ project.name }}
-
+
-
+
@@ -22,80 +54,104 @@
{{ project.version }}
- {{ project.description }}
+ {{ project.description }}
- {{ tag.name }}
+ {{ tag.name }}
- {{ currentCritical }}
- {{ currentHigh }}
- {{ currentMedium }}
- {{ currentLow }}
- {{ currentUnassigned }}
+ {{ currentCritical }}
+ {{ currentHigh }}
+ {{ currentMedium }}
+ {{ currentLow }}
+ {{ currentUnassigned }}
@@ -103,56 +159,167 @@
-
-
- {{ $t('message.overview') }}
-
+
+
+
+ {{ $t('message.overview') }}
+
- {{ $t('message.components') }} {{ totalComponents }}
-
+ {{ $t('message.components') }}
+ {{ totalComponents }}
+
- {{ $t('message.services') }} {{ totalServices }}
-
+ {{ $t('message.services') }}
+ {{ totalServices }}
+
- {{ $t('message.dependency_graph') }} {{ totalDependencyGraphs }}
-
+ {{ $t('message.dependency_graph') }}
+ {{
+ totalDependencyGraphs
+ }}
+
-
+
{{ $t('message.audit_vulnerabilities') }}
- {{ totalFindings }}
- {{ totalFindingsIncludingAliases }}
+ {{ totalFindings }}
+ {{ totalFindingsIncludingAliases }}
-
+
-
- {{ $t('message.exploit_predictions') }} {{ totalEpss }}
-
+
+ {{ $t('message.exploit_predictions') }}
+ {{ totalEpss }}
+
-
- {{ $t('message.policy_violations') }}
- {{ totalViolations }}
- {{ infoViolations }}
- {{ warnViolations }}
- {{ failViolations }}
-
-
+
+ {{ $t('message.policy_violations') }}
+ {{ totalViolations }}
+ {{ infoViolations }}
+ {{ warnViolations }}
+ {{ failViolations }}
+
+
-
+
@@ -160,178 +327,219 @@
diff --git a/src/views/portfolio/projects/ProjectAddComponentModal.vue b/src/views/portfolio/projects/ProjectAddComponentModal.vue
index 974cc0671..1faf4fb0d 100644
--- a/src/views/portfolio/projects/ProjectAddComponentModal.vue
+++ b/src/views/portfolio/projects/ProjectAddComponentModal.vue
@@ -1,142 +1,311 @@
-
-
-
- {{ $t('message.identity') }}
+
+
+
+ {{ $t('message.identity') }}
-
-
-
-
-
-
+
+
+
+
+
+
- {{ $t('message.extended') }}
+
+ {{ $t('message.extended') }}
-
-
+
+
-
+ label-for="component-description-input"
+ >
+
- {{ $t('message.legal') }}
+
+ {{ $t('message.legal') }}
-
-
-
+
+
+
-
+ label-for="component-copyright-input"
+ >
+
- {{ $t('message.hashes') }}
+ {{ $t('message.hashes') }}
-
-
-
-
-
-
+
+
+
+
+
+
- {{ $t('message.notes') }}
+ {{ $t('message.notes') }}
-
+ label-for="component-notes-input"
+ >
+
- {{ $t('message.close') }}
- {{ $t('message.create') }}
+ {{
+ $t('message.close')
+ }}
+ {{ $t('message.create') }}
diff --git a/src/views/portfolio/projects/ProjectAddVersionModal.vue b/src/views/portfolio/projects/ProjectAddVersionModal.vue
index f12d0bd71..b332e1151 100644
--- a/src/views/portfolio/projects/ProjectAddVersionModal.vue
+++ b/src/views/portfolio/projects/ProjectAddVersionModal.vue
@@ -1,63 +1,132 @@
-
+
+ label-class="required"
+ >
- {{ $t('message.include_tags') }}
+
+ {{ $t('message.include_tags') }}
- {{ $t('message.include_properties') }}
+
+ {{ $t('message.include_properties') }}
- {{ $t('message.include_components') }}
+
+ {{ $t('message.include_components') }}
- {{ $t('message.include_services') }}
+
+ {{ $t('message.include_services') }}
- {{ $t('message.include_audit_history') }}
+
+ {{ $t('message.include_audit_history') }}
- {{ $t('message.include_acl') }}
+
+ {{ $t('message.include_acl') }}
- {{ $t('message.include_policy_violations') }}
+
+ {{ $t('message.include_policy_violations') }}
- {{ $t('message.cancel') }}
- {{ $t('message.create') }}
+ {{
+ $t('message.cancel')
+ }}
+ {{
+ $t('message.create')
+ }}
diff --git a/src/views/portfolio/projects/ProjectComponents.vue b/src/views/portfolio/projects/ProjectComponents.vue
index cfc64dcfd..8f14c3f3a 100644
--- a/src/views/portfolio/projects/ProjectComponents.vue
+++ b/src/views/portfolio/projects/ProjectComponents.vue
@@ -2,37 +2,92 @@
+ @on-load-success="tableLoaded"
+ >
-
+
diff --git a/src/views/portfolio/projects/ProjectCreateProjectModal.vue b/src/views/portfolio/projects/ProjectCreateProjectModal.vue
index 9a073e7c6..bc9062ac3 100644
--- a/src/views/portfolio/projects/ProjectCreateProjectModal.vue
+++ b/src/views/portfolio/projects/ProjectCreateProjectModal.vue
@@ -1,64 +1,168 @@
-
-
-
- {{ $t('message.general') }}
+
+
+
+ {{ $t('message.general') }}
-
-
-
+
+
+
- Parent
-
+ Parent
+
-
+ label-for="project-description-input"
+ >
+
- this.tags = newTags"
- class="mw-100 bg-transparent text-lowercase"/>
+ label-for="input-4"
+ >
+ (this.tags = newTags)"
+ class="mw-100 bg-transparent text-lowercase"
+ />
-
- {{ $t('message.identity') }}
+
+ {{ $t('message.identity') }}
-
-
-
-
-
-
+
+
+
+
+
+
- {{ $t('message.close') }}
- {{ $t('message.create') }}
+ {{
+ $t('message.close')
+ }}
+ {{
+ $t('message.create')
+ }}
diff --git a/src/views/portfolio/projects/ProjectCreatePropertyModal.vue b/src/views/portfolio/projects/ProjectCreatePropertyModal.vue
index dbcbc6488..71780fd4b 100644
--- a/src/views/portfolio/projects/ProjectCreatePropertyModal.vue
+++ b/src/views/portfolio/projects/ProjectCreatePropertyModal.vue
@@ -1,100 +1,128 @@
-
+
+ label-class="required"
+ >
+ label-class="required"
+ >
-
+ label-class="required"
+ >
+
-
+ label-class="required"
+ >
+
+ label-for="input-5"
+ >
- {{ $t('message.close') }}
- {{ $t('message.create') }}
+ {{
+ $t('message.close')
+ }}
+ {{
+ $t('message.create')
+ }}
diff --git a/src/views/portfolio/projects/ProjectDashboard.vue b/src/views/portfolio/projects/ProjectDashboard.vue
index e2d4125cf..f3b25aad1 100644
--- a/src/views/portfolio/projects/ProjectDashboard.vue
+++ b/src/views/portfolio/projects/ProjectDashboard.vue
@@ -1,43 +1,57 @@
-
+
- {{ $t('message.project_vulnerabilities') }}
+
+ {{ $t('message.project_vulnerabilities') }}
+
- {{$t('message.last_bom_import')}}:
- {{lastBomImport}}
+ {{ $t('message.last_bom_import') }}:
+ {{ lastBomImport }}
- {{$t('message.last_measurement')}}:
+ {{ $t('message.last_measurement') }}:
- {{lastMeasurement}}
-
+ {{ lastMeasurement }}
+
-
-
+
-
+
- {{ $t('severity.critical') }}
- {{currentCritical}}
+ {{ $t('severity.critical') }}
+ {{ currentCritical }}
- {{ $t('severity.high') }}
- {{currentHigh}}
+ {{ $t('severity.high') }}
+ {{ currentHigh }}
@@ -46,14 +60,16 @@
- {{ $t('severity.medium') }}
- {{currentMedium}}
+ {{ $t('severity.medium') }}
+ {{ currentMedium }}
- {{ $t('severity.low') }}
- {{currentLow}}
+ {{ $t('severity.low') }}
+ {{ currentLow }}
@@ -62,14 +78,20 @@
- {{ $t('severity.unassigned') }}
- {{currentUnassigned}}
+ {{
+ $t('severity.unassigned')
+ }}
+ {{ currentUnassigned }}
- {{ $t('message.risk_score') }}
- {{currentRiskScore}}
+ {{
+ $t('message.risk_score')
+ }}
+ {{ currentRiskScore }}
@@ -82,30 +104,44 @@
- {{ $t('message.policy_violations') }}
+
+ {{ $t('message.policy_violations') }}
+
- {{$t('message.policy_violations_by_state')}}
+ {{ $t('message.policy_violations_by_state') }}
-
-
+
-
+
- {{ $t('message.policy_violations') }}
+
+ {{ $t('message.policy_violations') }}
+
- {{$t('message.policy_violations_by_classification')}}
+ {{ $t('message.policy_violations_by_classification') }}
-
-
+
-
+
@@ -114,24 +150,38 @@
- {{ $t('message.components') }}
-
-
+
+ {{ $t('message.components') }}
+
+
-
+
- {{ $t('message.auditing_progress') }}
-
-
+
+ {{ $t('message.auditing_progress') }}
+
+
-
+
@@ -139,97 +189,115 @@
diff --git a/src/views/portfolio/projects/ProjectDependencyGraph.vue b/src/views/portfolio/projects/ProjectDependencyGraph.vue
index 38bd87326..73553a16e 100644
--- a/src/views/portfolio/projects/ProjectDependencyGraph.vue
+++ b/src/views/portfolio/projects/ProjectDependencyGraph.vue
@@ -2,50 +2,93 @@
Loading, please wait...
-
-
-
+
+
+
{{ $t('message.show_complete_graph') }}
-
- {{$t('message.show_update_information')}}
+
+ {{ $t('message.show_update_information') }}
- {{ $t('message.not_found_in_dependency_graph') }}
+ {{
+ $t('message.not_found_in_dependency_graph')
+ }}
diff --git a/src/views/portfolio/projects/ProjectEpss.vue b/src/views/portfolio/projects/ProjectEpss.vue
index c037a1507..6c8a6a4d2 100644
--- a/src/views/portfolio/projects/ProjectEpss.vue
+++ b/src/views/portfolio/projects/ProjectEpss.vue
@@ -1,13 +1,28 @@
-
+
- {{ $t('message.show_suppressed_findings') }}
+ {{
+ $t('message.show_suppressed_findings')
+ }}
+ @on-load-success="tableLoaded"
+ >
diff --git a/src/views/portfolio/projects/ProjectFindings.vue b/src/views/portfolio/projects/ProjectFindings.vue
index 3b0165d99..7cabc660a 100644
--- a/src/views/portfolio/projects/ProjectFindings.vue
+++ b/src/views/portfolio/projects/ProjectFindings.vue
@@ -5,34 +5,67 @@
dropdown for version is changes, the table will not update. For whatever reason, adding the toolbar fixes it.
-->
-
+
{{ $t('message.apply_vex') }}
- {{ $t('message.apply_vex_tooltip') }}
+ {{
+ $t('message.apply_vex_tooltip')
+ }}
-
+
{{ $t('message.export_vex') }}
- {{ $t('message.export_vex_tooltip') }}
+ {{
+ $t('message.export_vex_tooltip')
+ }}
-
+
{{ $t('message.export_vdr') }}
- {{ $t('message.export_vdr_tooltip') }}
+ {{
+ $t('message.export_vdr_tooltip')
+ }}
-
- {{ $t('message.project_reanalyze') }}
+
+
+ {{ $t('message.project_reanalyze') }}
- {{ $t('message.project_reanalyze_tooltip') }}
-
+ {{
+ $t('message.project_reanalyze_tooltip')
+ }}
- {{ $t('message.show_suppressed_findings') }}
+ {{
+ $t('message.show_suppressed_findings')
+ }}
+ @on-load-success="tableLoaded"
+ >
@@ -60,263 +103,355 @@
diff --git a/src/views/portfolio/projects/ProjectList.vue b/src/views/portfolio/projects/ProjectList.vue
index 255ff29a3..9e8229fdd 100644
--- a/src/views/portfolio/projects/ProjectList.vue
+++ b/src/views/portfolio/projects/ProjectList.vue
@@ -2,11 +2,36 @@
-
+
{{ $t('message.create_project') }}
- {{ $t('message.show_inactive_projects') }}
- {{ $t('message.show_flat_view') }}
+ {{
+ $t('message.show_inactive_projects')
+ }}
+ {{ $t('message.show_flat_view') }}
+ @on-post-body="onPostBody"
+ >
-
+
diff --git a/src/views/portfolio/projects/ProjectPolicyViolations.vue b/src/views/portfolio/projects/ProjectPolicyViolations.vue
index 2f187385f..75295f363 100644
--- a/src/views/portfolio/projects/ProjectPolicyViolations.vue
+++ b/src/views/portfolio/projects/ProjectPolicyViolations.vue
@@ -5,7 +5,16 @@
dropdown for version is changes, the table will not update. For whatever reason, adding the toolbar fixes it.
-->
- {{ $t('message.show_suppressed_violations') }}
+ {{
+ $t('message.show_suppressed_violations')
+ }}
+ @on-load-success="tableLoaded"
+ >
diff --git a/src/views/portfolio/projects/ProjectPropertiesModal.vue b/src/views/portfolio/projects/ProjectPropertiesModal.vue
index 5d17ee2f9..f5dbeae08 100644
--- a/src/views/portfolio/projects/ProjectPropertiesModal.vue
+++ b/src/views/portfolio/projects/ProjectPropertiesModal.vue
@@ -1,124 +1,144 @@
-
+
+ :options="options"
+ >
- {{ $t('message.delete') }}
- {{ $t('message.close') }}
- {{ $t('message.create_property') }}
+ {{
+ $t('message.delete')
+ }}
+ {{
+ $t('message.close')
+ }}
+ {{ $t('message.create_property') }}
diff --git a/src/views/portfolio/projects/ProjectServices.vue b/src/views/portfolio/projects/ProjectServices.vue
index 00367939b..7b9d9838f 100644
--- a/src/views/portfolio/projects/ProjectServices.vue
+++ b/src/views/portfolio/projects/ProjectServices.vue
@@ -5,83 +5,86 @@
:columns="columns"
:data="data"
:options="options"
- @on-load-success="tableLoaded">
+ @on-load-success="tableLoaded"
+ >
diff --git a/src/views/portfolio/projects/ProjectUploadBomModal.vue b/src/views/portfolio/projects/ProjectUploadBomModal.vue
index c1a7b8f4c..abdb1675c 100644
--- a/src/views/portfolio/projects/ProjectUploadBomModal.vue
+++ b/src/views/portfolio/projects/ProjectUploadBomModal.vue
@@ -1,50 +1,72 @@
-
-
-
+
+
- {{ $t('message.cancel') }}
- {{ $t('message.reset') }}
- {{ $t('message.upload') }}
+ {{
+ $t('message.cancel')
+ }}
+ {{
+ $t('message.reset')
+ }}
+ {{ $t('message.upload') }}
diff --git a/src/views/portfolio/projects/ProjectUploadVexModal.vue b/src/views/portfolio/projects/ProjectUploadVexModal.vue
index 9aa224ddd..8066d9e26 100644
--- a/src/views/portfolio/projects/ProjectUploadVexModal.vue
+++ b/src/views/portfolio/projects/ProjectUploadVexModal.vue
@@ -1,27 +1,47 @@
-
-
-
+
+
- {{ $t('message.cancel') }}
- {{ $t('message.reset') }}
- {{ $t('message.upload') }}
+ {{
+ $t('message.cancel')
+ }}
+ {{
+ $t('message.reset')
+ }}
+ {{ $t('message.upload') }}
diff --git a/src/views/portfolio/projects/SelectProjectModal.vue b/src/views/portfolio/projects/SelectProjectModal.vue
index 88178a8da..5aa8ae143 100644
--- a/src/views/portfolio/projects/SelectProjectModal.vue
+++ b/src/views/portfolio/projects/SelectProjectModal.vue
@@ -1,111 +1,125 @@
-
+
+ :options="options"
+ >
- {{ $t('message.cancel') }}
- {{ $t('message.select') }}
+ {{
+ $t('message.cancel')
+ }}
+ {{ $t('message.select') }}
diff --git a/src/views/portfolio/projects/Service.vue b/src/views/portfolio/projects/Service.vue
index 2231b0627..fe536a187 100644
--- a/src/views/portfolio/projects/Service.vue
+++ b/src/views/portfolio/projects/Service.vue
@@ -4,100 +4,137 @@
-
+
{{ serviceLabel }}
- {{ currentCritical }}
- {{ currentHigh }}
- {{ currentMedium }}
- {{ currentLow }}
- {{ currentUnassigned }}
+ {{ currentCritical }}
+ {{ currentHigh }}
+ {{ currentMedium }}
+ {{ currentLow }}
+ {{ currentUnassigned }}
-
-
- {{ $t('message.overview') }}
-
+
+
+
+ {{ $t('message.overview') }}
+
-
+
@@ -193,6 +238,6 @@ export default {
padding: 0;
}
.badge {
- margin-right: .4rem;
+ margin-right: 0.4rem;
}
diff --git a/src/views/portfolio/projects/ServiceDashboard.vue b/src/views/portfolio/projects/ServiceDashboard.vue
index a71065fef..892df1e82 100644
--- a/src/views/portfolio/projects/ServiceDashboard.vue
+++ b/src/views/portfolio/projects/ServiceDashboard.vue
@@ -1,31 +1,47 @@
-
+
- {{ $t('message.service_vulnerabilities') }}
+
+ {{ $t('message.service_vulnerabilities') }}
+
- {{$t('message.last_measurement')}}: {{lastMeasurement}}
+ {{ $t('message.last_measurement') }}: {{ lastMeasurement
+ }}
-
-
+
-
+
- {{ $t('severity.critical') }}
- {{currentCritical}}
+ {{ $t('severity.critical') }}
+ {{ currentCritical }}
- {{ $t('severity.high') }}
- {{currentHigh}}
+ {{ $t('severity.high') }}
+ {{ currentHigh }}
@@ -34,14 +50,16 @@
- {{ $t('severity.medium') }}
- {{currentMedium}}
+ {{ $t('severity.medium') }}
+ {{ currentMedium }}
- {{ $t('severity.low') }}
- {{currentLow}}
+ {{ $t('severity.low') }}
+ {{ currentLow }}
@@ -50,14 +68,20 @@
- {{ $t('severity.unassigned') }}
- {{currentUnassigned}}
+ {{
+ $t('severity.unassigned')
+ }}
+ {{ currentUnassigned }}
- {{ $t('message.risk_score') }}
- {{currentRiskScore}}
+ {{
+ $t('message.risk_score')
+ }}
+ {{ currentRiskScore }}
@@ -70,30 +94,44 @@
- {{ $t('message.policy_violations') }}
+
+ {{ $t('message.policy_violations') }}
+
- {{$t('message.policy_violations_by_state')}}
+ {{ $t('message.policy_violations_by_state') }}
-
-
+
-
+
- {{ $t('message.policy_violations') }}
+
+ {{ $t('message.policy_violations') }}
+
- {{$t('message.policy_violations_by_classification')}}
+ {{ $t('message.policy_violations_by_classification') }}
-
-
+
-
+
@@ -101,11 +139,11 @@
diff --git a/src/views/portfolio/projects/ServiceDetailsModal.vue b/src/views/portfolio/projects/ServiceDetailsModal.vue
index 52ac30de4..48c6b538f 100644
--- a/src/views/portfolio/projects/ServiceDetailsModal.vue
+++ b/src/views/portfolio/projects/ServiceDetailsModal.vue
@@ -1,147 +1,234 @@
-
-
-
- {{ $t('message.identity') }}
+
+
+
+ {{ $t('message.identity') }}
-
-
-
+
+
+
-
+ label-for="service-notes-input"
+ >
+
-
+
- {{ $t('message.provider') }}
+
+ {{ $t('message.provider') }}
-
-
+
+
+ :options="providerUrlsTableOptions"
+ >
-
+
+ :options="contactsTableOptions"
+ >
- {{ $t('message.endpoints') }}
+ {{ $t('message.endpoints') }}
+ :options="endpointTableOptions"
+ >
- {{ $t('message.data') }}
+ {{ $t('message.data') }}
+ :options="dataTableOptions"
+ >
- {{ $t('message.external_references') }}
+
+ {{ $t('message.external_references') }}
+ :options="referencesTableOptions"
+ >
- {{ $t('message.delete') }}
- {{ $t('message.close') }}
- {{ $t('message.update') }}
+ {{ $t('message.delete') }}
+ {{
+ $t('message.close')
+ }}
+ {{ $t('message.update') }}
diff --git a/src/views/portfolio/tags/SelectTagModal.vue b/src/views/portfolio/tags/SelectTagModal.vue
index 24409646d..586098d37 100644
--- a/src/views/portfolio/tags/SelectTagModal.vue
+++ b/src/views/portfolio/tags/SelectTagModal.vue
@@ -1,91 +1,105 @@
-
+
+ :options="options"
+ >
- {{ $t('message.cancel') }}
- {{ $t('message.select') }}
+ {{
+ $t('message.cancel')
+ }}
+ {{ $t('message.select') }}
diff --git a/src/views/portfolio/vulnerabilities/AddAffectedComponentModal.vue b/src/views/portfolio/vulnerabilities/AddAffectedComponentModal.vue
index 23b9823f7..e053f4900 100644
--- a/src/views/portfolio/vulnerabilities/AddAffectedComponentModal.vue
+++ b/src/views/portfolio/vulnerabilities/AddAffectedComponentModal.vue
@@ -1,57 +1,105 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- {{ $t('message.cancel') }}
- {{ $t('message.add') }}
+ {{
+ $t('message.cancel')
+ }}
+ {{
+ $t('message.add')
+ }}
diff --git a/src/views/portfolio/vulnerabilities/AffectedProjects.vue b/src/views/portfolio/vulnerabilities/AffectedProjects.vue
index bc003f738..09b248226 100644
--- a/src/views/portfolio/vulnerabilities/AffectedProjects.vue
+++ b/src/views/portfolio/vulnerabilities/AffectedProjects.vue
@@ -1,7 +1,16 @@
- {{ $t('message.show_inactive_projects') }}
+ {{
+ $t('message.show_inactive_projects')
+ }}
+ @on-post-body="onPostBody"
+ >
diff --git a/src/views/portfolio/vulnerabilities/SelectCweModal.vue b/src/views/portfolio/vulnerabilities/SelectCweModal.vue
index 2029df51d..e2cbfcaa2 100644
--- a/src/views/portfolio/vulnerabilities/SelectCweModal.vue
+++ b/src/views/portfolio/vulnerabilities/SelectCweModal.vue
@@ -1,22 +1,35 @@
-
+
+ :options="options"
+ >
- {{ $t('message.cancel') }}
- {{ $t('message.select') }}
+ {{
+ $t('message.cancel')
+ }}
+ {{ $t('message.select') }}
diff --git a/src/views/portfolio/vulnerabilities/Vulnerability.vue b/src/views/portfolio/vulnerabilities/Vulnerability.vue
index 2fa914b0b..c660415fc 100644
--- a/src/views/portfolio/vulnerabilities/Vulnerability.vue
+++ b/src/views/portfolio/vulnerabilities/Vulnerability.vue
@@ -13,14 +13,23 @@
{{ vulnerability.title }}
-
+
-
-
-
+
+
+
-
{{ severityLabel }}
+
+ {{ severityLabel }}
+
@@ -28,69 +37,148 @@
- Published:
- {{prettyTimestamp}}
-
+ Published:
+
+ {{ prettyTimestamp }}
+
Aliases:
- {{ alias.vulnId }}
+ {{ alias.vulnId }}
-
-
- {{ $t('message.overview') }}
+
+
+
+ {{ $t('message.overview') }}
-
+
- {{ $t('message.cvss_base_score') }}
- {{cvssBaseScore}}
-
+
+ {{ $t('message.cvss_base_score') }}
+
+ {{ cvssBaseScore }}
+
- {{ $t('message.cvss_impact_subscore') }}
- {{cvssImpactScore}}
-
+
+ {{ $t('message.cvss_impact_subscore') }}
+
+ {{ cvssImpactScore }}
+
- {{ $t('message.cvss_exploitability_subscore') }}
- {{cvssExploitScore}}
-
+
+ {{ $t('message.cvss_exploitability_subscore') }}
+
+ {{ cvssExploitScore }}
+
- {{ $t('message.owasp_rr_likelihood_score') }}
- {{owaspRRLikelihoodScore}}
-
+
+ {{ $t('message.owasp_rr_likelihood_score') }}
+
+ {{ owaspRRLikelihoodScore }}
+
- {{ $t('message.owasp_rr_technical_impact_score') }}
- {{owaspRRTechnicalImpactScore}}
-
+
+ {{ $t('message.owasp_rr_technical_impact_score') }}
+
+ {{ owaspRRTechnicalImpactScore }}
+
- {{ $t('message.owasp_rr_business_impact_score') }}
- {{owaspRRBusinessImpactScore}}
-
+
+ {{ $t('message.owasp_rr_business_impact_score') }}
+
+ {{ owaspRRBusinessImpactScore }}
+
@@ -136,222 +224,290 @@
-
-
- {{ $t('message.affected_projects') }} {{ totalAffectedProjects }}
-
+
+ {{ $t('message.affected_projects') }}
+ {{
+ totalAffectedProjects
+ }}
+
-
+
diff --git a/src/views/portfolio/vulnerabilities/VulnerabilityCreateVulnerabilityModal.vue b/src/views/portfolio/vulnerabilities/VulnerabilityCreateVulnerabilityModal.vue
index 6ec04de25..fd6411350 100644
--- a/src/views/portfolio/vulnerabilities/VulnerabilityCreateVulnerabilityModal.vue
+++ b/src/views/portfolio/vulnerabilities/VulnerabilityCreateVulnerabilityModal.vue
@@ -1,471 +1,922 @@
-
-
-
- {{ $t('message.general') }}
+
+
+
+ {{ $t('message.general') }}
-
-
+
+
-
+
-
+
-
+
-
+ label-for="vulnerability-description-input"
+ >
+
-
- {{ $t('message.extended') }}
+
+
+ {{ $t('message.extended') }}
-
+ label-for="vulnerability-detail-input"
+ >
+
-
+ label-for="vulnerability-recommendation-input"
+ >
+
-
+ label-for="vulnerability-references-input"
+ >
+
-
- {{ $t('message.cvss_v2') }}
+
+
+ {{ $t('message.cvss_v2') }}
- {{ cvssV2Score.baseScore.toFixed(1) }}
+ {{ cvssV2Score.baseScore.toFixed(1) }}
{{ $t('message.cvss_base_score_short') }}
- {{ cvssV2Score.impactSubScore.toFixed(1) }}
+ {{ cvssV2Score.impactSubScore.toFixed(1) }}
{{ $t('message.cvss_impact') }}
- {{ cvssV2Score.exploitabilitySubScore.toFixed(1) }}
+ {{
+ cvssV2Score.exploitabilitySubScore.toFixed(1)
+ }}
{{ $t('message.cvss_exploitability') }}
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
- {{ $t('message.cvss_v3') }}
+
+
+ {{ $t('message.cvss_v3') }}
- {{ cvssV3Score.baseScore.toFixed(1) }}
+ {{ cvssV3Score.baseScore.toFixed(1) }}
{{ $t('message.cvss_base_score_short') }}
- {{ cvssV3Score.impactSubScore.toFixed(1) }}
+ {{ cvssV3Score.impactSubScore.toFixed(1) }}
{{ $t('message.cvss_impact') }}
- {{ cvssV3Score.exploitabilitySubScore.toFixed(1) }}
+ {{
+ cvssV3Score.exploitabilitySubScore.toFixed(1)
+ }}
{{ $t('message.cvss_exploitability') }}
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
- {{ $t('message.owasp_rr') }}
+
+
+ {{ $t('message.owasp_rr') }}
- {{ owaspRRScore.likelihoodScore.toFixed(1) }}
+ {{
+ owaspRRScore.likelihoodScore.toFixed(1)
+ }}
{{ $t('message.owasp_rr_likelihood_score_short') }}
- {{ owaspRRScore.technicalImpactScore.toFixed(1) }}
+ {{
+ owaspRRScore.technicalImpactScore.toFixed(1)
+ }}
{{ $t('message.owasp_rr_technical_impact_score_short') }}
- {{ owaspRRScore.businessImpactScore.toFixed(1) }}
+ {{
+ owaspRRScore.businessImpactScore.toFixed(1)
+ }}
{{ $t('message.owasp_rr_business_impact_score_short') }}
-
+
{{ $t('message.owasp_rr_threat_agent_factor') }}
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
{{ $t('message.owasp_rr_vulnerability_factor') }}
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
{{ $t('message.owasp_rr_technical_impact_factor') }}
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
{{ $t('message.owasp_rr_business_impact_factor') }}
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
- {{ $t('message.affected_components') }}
+
+
+ {{ $t('message.affected_components') }}
-
-
-
-
-
+
-
- {{ $t('message.dates') }}
+
+ {{ $t('message.dates') }}
-
-
-
-
+
+
+
- {{ $t('message.close') }}
- {{ $t('message.create') }}
+ {{
+ $t('message.close')
+ }}
+ {{
+ $t('message.create')
+ }}
-
+