diff --git a/docker/Dockerfile.alpine b/docker/Dockerfile.alpine
index f85e78caa..a1a039efd 100644
--- a/docker/Dockerfile.alpine
+++ b/docker/Dockerfile.alpine
@@ -1,4 +1,4 @@
-FROM nginxinc/nginx-unprivileged:1.25.1-alpine@sha256:05696001775e33798fccab756b8a9441671aa961718019d7097fb7c75dae69b6
+FROM nginxinc/nginx-unprivileged:1.25.1-alpine@sha256:279824ecfd934ab8cf08b5e4debabdc711c5768371203263f2d5c5141423ed80
# Arguments that can be passed at build time
ARG COMMIT_SHA=unknown
diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json
index 3e54c0e9f..1d2208edb 100644
--- a/src/i18n/locales/en.json
+++ b/src/i18n/locales/en.json
@@ -244,6 +244,7 @@
"template": "Template",
"source_header": "Source Header",
"license_name": "License Name",
+ "license_expression": "SPDX Expression",
"license_url": "License URL",
"required_license_name": "The license name is required",
"license_name_desc": "The name of the license as provided by the supplier",
@@ -309,6 +310,7 @@
"component_swid_tagid_desc": "The ISO/IEC 19770-2:2015 (SWID) tag ID provided by the software vendor",
"component_classifier_desc": "Specifies the type of component: Assets (applications, operating systems, and hardware) and non-assets (libraries, frameworks, and files)",
"component_spdx_license_desc": "Specifies the SPDX license ID of the component",
+ "component_license_expression_desc": "Specifies license information for the component in the form of an SPDX expression",
"component_license_url_desc": "Specifies the URL to the license of the component",
"component_filename_desc": "Specifies the observed filename of the component",
"component_hash_desc": "Specifies the observed hash value of the component using the preceding algorithm",
diff --git a/src/views/portfolio/projects/ComponentDetailsModal.vue b/src/views/portfolio/projects/ComponentDetailsModal.vue
index 9649fed16..0f001160d 100644
--- a/src/views/portfolio/projects/ComponentDetailsModal.vue
+++ b/src/views/portfolio/projects/ComponentDetailsModal.vue
@@ -66,6 +66,9 @@
v-model="selectedLicense" :options="selectableLicenses"
:label="$t('message.license')" :tooltip="$t('message.component_spdx_license_desc')"
:disabled="this.isNotPermitted(PERMISSIONS.PORTFOLIO_MANAGEMENT)" />
+
@@ -221,6 +224,7 @@
author: this.component.author,
description: this.component.description,
license: this.selectedLicense,
+ licenseExpression: this.component.licenseExpression,
licenseUrl: this.component.licenseUrl,
filename: this.component.filename,
classifier: this.component.classifier,
@@ -255,6 +259,8 @@
retrieveLicenses: function() {
let url = `${this.$api.BASE_URL}/${this.$api.URL_LICENSE_CONCISE}`;
this.axios.get(url).then((response) => {
+ // Allow for license to be un-selected.
+ this.selectableLicenses.push({value: '', text: ''});
for (let i = 0; i < response.data.length; i++) {
let license = response.data[i];
this.selectableLicenses.push({value: license.licenseId, text: license.name, uuid: license.uuid});
diff --git a/src/views/portfolio/projects/ProjectAddComponentModal.vue b/src/views/portfolio/projects/ProjectAddComponentModal.vue
index b3a2146e0..974cc0671 100644
--- a/src/views/portfolio/projects/ProjectAddComponentModal.vue
+++ b/src/views/portfolio/projects/ProjectAddComponentModal.vue
@@ -48,6 +48,10 @@
+
+
{
+ // Allow for license to be un-selected.
+ this.selectableLicenses.push({value: '', text: ''});
for (let i = 0; i < response.data.length; i++) {
let license = response.data[i];
this.selectableLicenses.push({value: license.licenseId, text: license.name});
diff --git a/src/views/portfolio/projects/ProjectComponents.vue b/src/views/portfolio/projects/ProjectComponents.vue
index 01eaf72c3..dce0f4d12 100644
--- a/src/views/portfolio/projects/ProjectComponents.vue
+++ b/src/views/portfolio/projects/ProjectComponents.vue
@@ -153,8 +153,12 @@ import SeverityProgressBar from "../../components/SeverityProgressBar";
if (Object.prototype.hasOwnProperty.call(row, "resolvedLicense")) {
let licenseurl = "../../../licenses/" + row.resolvedLicense.licenseId;
return "" + xssFilters.inHTMLData(row.resolvedLicense.licenseId) + "";
- } else {
+ } else if (value) {
return xssFilters.inHTMLData(common.valueWithDefault(value, ""));
+ } else if (row.licenseExpression) {
+ return xssFilters.inHTMLData(common.valueWithDefault(row.licenseExpression, ""));
+ } else {
+ return "";
}
}
},