@@ -26,6 +26,13 @@ if(NOT ITK_GENERATE_SBOM)
2626 return ()
2727endif ()
2828
29+ set (
30+ ITK_SBOM_SPDX_LICENSE_LIST_VERSION
31+ "3.25"
32+ CACHE STRING
33+ "SPDX license list version recorded in the generated SBOM"
34+ )
35+
2936#-----------------------------------------------------------------------------
3037# Allow remote modules to register SBOM package metadata.
3138#
@@ -90,24 +97,40 @@ function(itk_sbom_register_package)
9097 # Sanitize the name for use as SPDX ID (only alphanumeric and -)
9198 string (REGEX REPLACE "[^A-Za-z0-9-]" "-" _spdx_id "${_pkg_NAME} " )
9299
100+ # Escape all user-supplied fields for JSON safety
101+ _itk_sbom_json_escape ("${_pkg_NAME} " _pkg_NAME_escaped )
102+ _itk_sbom_json_escape ("${_pkg_VERSION} " _pkg_VERSION_escaped )
103+ _itk_sbom_json_escape ("${_pkg_DOWNLOAD_LOCATION} " _pkg_DOWNLOAD_escaped )
104+ _itk_sbom_json_escape ("${_pkg_SUPPLIER} " _pkg_SUPPLIER_escaped )
105+ _itk_sbom_json_escape ("${_pkg_SPDX_LICENSE} " _pkg_LICENSE_escaped )
106+ _itk_sbom_json_escape ("${_pkg_COPYRIGHT} " _pkg_COPYRIGHT_escaped )
107+
93108 set (_entry "" )
94109 string (APPEND _entry " {\n " )
95110 string (APPEND _entry " \" SPDXID\" : \" SPDXRef-${_spdx_id} \" ,\n " )
96- string (APPEND _entry " \" name\" : \" ${_pkg_NAME} \" ,\n " )
97- string (APPEND _entry " \" versionInfo\" : \" ${_pkg_VERSION} \" ,\n " )
111+ string (APPEND _entry " \" name\" : \" ${_pkg_NAME_escaped} \" ,\n " )
112+ string (APPEND _entry " \" versionInfo\" : \" ${_pkg_VERSION_escaped} \" ,\n " )
113+ string (
114+ APPEND
115+ _entry
116+ " \" downloadLocation\" : \" ${_pkg_DOWNLOAD_escaped} \" ,\n "
117+ )
118+ string (APPEND _entry " \" supplier\" : \" ${_pkg_SUPPLIER_escaped} \" ,\n " )
119+ string (
120+ APPEND
121+ _entry
122+ " \" licenseConcluded\" : \" ${_pkg_LICENSE_escaped} \" ,\n "
123+ )
98124 string (
99125 APPEND
100126 _entry
101- " \" downloadLocation \" : \" ${_pkg_DOWNLOAD_LOCATION } \" ,\n "
127+ " \" licenseDeclared \" : \" ${_pkg_LICENSE_escaped } \" ,\n "
102128 )
103- string (APPEND _entry " \" supplier\" : \" ${_pkg_SUPPLIER} \" ,\n " )
104129 string (
105130 APPEND
106131 _entry
107- " \" licenseConcluded \" : \" ${_pkg_SPDX_LICENSE } \" ,\n "
132+ " \" copyrightText \" : \" ${_pkg_COPYRIGHT_escaped } \" ,\n "
108133 )
109- string (APPEND _entry " \" licenseDeclared\" : \" ${_pkg_SPDX_LICENSE} \" ,\n " )
110- string (APPEND _entry " \" copyrightText\" : \" ${_pkg_COPYRIGHT} \" ,\n " )
111134 string (APPEND _entry " \" filesAnalyzed\" : false\n " )
112135 string (APPEND _entry " }" )
113136
@@ -174,7 +197,11 @@ function(itk_generate_sbom)
174197 string (APPEND _json " \" Tool: CMake-${CMAKE_VERSION} \" ,\n " )
175198 string (APPEND _json " \" Organization: NumFOCUS\"\n " )
176199 string (APPEND _json " ],\n " )
177- string (APPEND _json " \" licenseListVersion\" : \" 3.22\"\n " )
200+ string (
201+ APPEND
202+ _json
203+ " \" licenseListVersion\" : \" ${ITK_SBOM_SPDX_LICENSE_LIST_VERSION} \"\n "
204+ )
178205 string (APPEND _json " },\n " )
179206
180207 # --- packages array ---
@@ -238,7 +265,12 @@ function(itk_generate_sbom)
238265 set (_pkg_copyright "NOASSERTION" )
239266 endif ()
240267
241- # Get description from module declaration and escape for JSON
268+ # Escape all user-supplied fields for JSON safety
269+ _itk_sbom_json_escape ("${_pkg_version} " _pkg_version )
270+ _itk_sbom_json_escape ("${_pkg_download} " _pkg_download )
271+ _itk_sbom_json_escape ("${_pkg_license} " _pkg_license )
272+ _itk_sbom_json_escape ("${_pkg_copyright} " _pkg_copyright )
273+
242274 set (_pkg_description "${ITK_MODULE_${_mod} _DESCRIPTION}" )
243275 if (_pkg_description)
244276 _itk_sbom_json_escape ("${_pkg_description} " _pkg_description )
@@ -314,7 +346,7 @@ function(itk_generate_sbom)
314346
315347 # Append extra packages registered by remote modules
316348 get_property (_extra_packages GLOBAL PROPERTY ITK_SBOM_EXTRA_PACKAGES )
317- foreach (_extra_pkg ${ _extra_packages} )
349+ foreach (_extra_pkg IN LISTS _extra_packages)
318350 string (APPEND _json ",\n ${_extra_pkg} " )
319351 endforeach ()
320352
@@ -342,7 +374,7 @@ function(itk_generate_sbom)
342374
343375 # Extra packages registered by remote modules
344376 get_property (_extra_spdx_ids GLOBAL PROPERTY ITK_SBOM_EXTRA_SPDX_IDS )
345- foreach (_spdx_id ${ _extra_spdx_ids} )
377+ foreach (_spdx_id IN LISTS _extra_spdx_ids)
346378 string (APPEND _json ",\n " )
347379 string (APPEND _json " {\n " )
348380 string (APPEND _json " \" spdxElementId\" : \" SPDXRef-ITK\" ,\n " )
0 commit comments