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 ""; } } },