diff mbox series

meta/lib/oe/spdx30_tasks.py: fix alias in simplelicensing_customIdToUri not extracted

Message ID 20241212110932.2063844-1-hongxu.jia@windriver.com
State New
Headers show
Series meta/lib/oe/spdx30_tasks.py: fix alias in simplelicensing_customIdToUri not extracted | expand

Commit Message

Hongxu Jia Dec. 12, 2024, 11:09 a.m. UTC
After commit [spdx 3.0: Rework how SPDX aliases are linked] applied, it set
license_text_map with alias other than actual spdxId

The property of simplelicensing_customIdToUri is ListProp(ObjectProp(DictionaryEntry))),
and class DictionaryEntry has key and value, the property of value is StringProp other
than ObjectProp in which could not support to decode/extract alias with actual spdxId in
image jsonld file

$ bitbake core-image-minimal
$ vim tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.rootfs.spdx.json
...
      "simplelicensing_customIdToUri": [
        {
          "type": "DictionaryEntry",
          "key": "LicenseRef-PD",
          "value": "http://spdxdocs.org/openembedded-alias/by-doc-hash/d53e90e23b12c4ad640809a74a810e86f31c76cdbdf36487712d22a33d53362a/sqlite3-native/UNIHASH/license-text/PD"
        }
      ],
...

After applying this commit, revert [spdx 3.0: Rework how SPDX aliases are linked]
to set actual spdxId other than alias to dictionary license_text_map
...
      "simplelicensing_customIdToUri": [
        {
          "type": "DictionaryEntry",
          "key": "LicenseRef-PD",
          "value": "http://spdx.org/spdxdocs/sqlite3-native-e5cc0672-d8dd-57e8-a2df-fe4615831fda/162c62b5b011cd3f82f413b3dae4d6d1542201552c964d5ce69fe170e0720b85/license-text/PD"
        }
      ]
...

Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
---
 meta/lib/oe/spdx30_tasks.py | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

Comments

Joshua Watt Dec. 13, 2024, 11:44 p.m. UTC | #1
On Thu, Dec 12, 2024 at 4:09 AM Hongxu Jia <hongxu.jia@windriver.com> wrote:
>
> After commit [spdx 3.0: Rework how SPDX aliases are linked] applied, it set
> license_text_map with alias other than actual spdxId
>
> The property of simplelicensing_customIdToUri is ListProp(ObjectProp(DictionaryEntry))),
> and class DictionaryEntry has key and value, the property of value is StringProp other
> than ObjectProp in which could not support to decode/extract alias with actual spdxId in
> image jsonld file
>
> $ bitbake core-image-minimal
> $ vim tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.rootfs.spdx.json
> ...
>       "simplelicensing_customIdToUri": [
>         {
>           "type": "DictionaryEntry",
>           "key": "LicenseRef-PD",
>           "value": "http://spdxdocs.org/openembedded-alias/by-doc-hash/d53e90e23b12c4ad640809a74a810e86f31c76cdbdf36487712d22a33d53362a/sqlite3-native/UNIHASH/license-text/PD"
>         }
>       ],
> ...
>
> After applying this commit, revert [spdx 3.0: Rework how SPDX aliases are linked]
> to set actual spdxId other than alias to dictionary license_text_map
> ...
>       "simplelicensing_customIdToUri": [
>         {
>           "type": "DictionaryEntry",
>           "key": "LicenseRef-PD",
>           "value": "http://spdx.org/spdxdocs/sqlite3-native-e5cc0672-d8dd-57e8-a2df-fe4615831fda/162c62b5b011cd3f82f413b3dae4d6d1542201552c964d5ce69fe170e0720b85/license-text/PD"
>         }
>       ]
> ...
>
> Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
> ---
>  meta/lib/oe/spdx30_tasks.py | 4 +---
>  1 file changed, 1 insertion(+), 3 deletions(-)
>
> diff --git a/meta/lib/oe/spdx30_tasks.py b/meta/lib/oe/spdx30_tasks.py
> index 036c58bf4b..82fcfe7a63 100644
> --- a/meta/lib/oe/spdx30_tasks.py
> +++ b/meta/lib/oe/spdx30_tasks.py
> @@ -107,9 +107,7 @@ def add_license_expression(d, objset, license_expression, license_data):
>
>          spdx_license = "LicenseRef-" + l
>          if spdx_license not in license_text_map:
> -            license_text_map[spdx_license] = oe.sbom30.get_element_link_id(
> -                add_license_text(l)
> -            )
> +            license_text_map[spdx_license] = add_license_text(l)._id

Ah, sorry, this will not work because the SPDX IDs can be wrong
anytime that documents are referenced across sstate objects. This is
why we have aliases in the first place so that they can be "looked up"
independently of their actual SPDX ID, until they are all linked
together in the final SPDX document. This works for normal object
references just fine because the alias SPDX IDs are "missing" when the
document is merged, and our code knows how to pull in those SPDX IDs
by the "missing" alias to resolve them.

Unfortunately, since a DictionaryEntry holds a free form string for
the value, that doesn't work here. Instead, we will need to add
special code in the linking to manually go through all of the
simplelicensing_customIdToUri DictionaryEntry items and resolve any
aliases to actual objects. I think that needs to go in
expand_collection() in sbom30.py

>
>          return spdx_license
>
> --
> 2.25.1
>
Hongxu Jia Dec. 16, 2024, 8:13 a.m. UTC | #2
Hi Joshua,

I've submitted two solutions to fix the issue,

One is make StringProp to decode SPDX alias with actual ID, which refers 
class ObjectProp's decode [1]

Another is add special code in expand_collection as you suggested

Would you please have a selection on them, or other better 
ideas/suggestions?

[1] 
https://github.com/openembedded/openembedded-core/blob/master/meta/lib/oe/spdx30.py#L293

//Hongxu

On 12/14/24 07:44, Joshua Watt wrote:
> CAUTION: This email comes from a non Wind River email account!
> Do not click links or open attachments unless you recognize the sender and know the content is safe.
>
> On Thu, Dec 12, 2024 at 4:09 AM Hongxu Jia<hongxu.jia@windriver.com>  wrote:
>> After commit [spdx 3.0: Rework how SPDX aliases are linked] applied, it set
>> license_text_map with alias other than actual spdxId
>>
>> The property of simplelicensing_customIdToUri is ListProp(ObjectProp(DictionaryEntry))),
>> and class DictionaryEntry has key and value, the property of value is StringProp other
>> than ObjectProp in which could not support to decode/extract alias with actual spdxId in
>> image jsonld file
>>
>> $ bitbake core-image-minimal
>> $ vim tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.rootfs.spdx.json
>> ...
>>        "simplelicensing_customIdToUri": [
>>          {
>>            "type": "DictionaryEntry",
>>            "key": "LicenseRef-PD",
>>            "value":"http://spdxdocs.org/openembedded-alias/by-doc-hash/d53e90e23b12c4ad640809a74a810e86f31c76cdbdf36487712d22a33d53362a/sqlite3-native/UNIHASH/license-text/PD"
>>          }
>>        ],
>> ...
>>
>> After applying this commit, revert [spdx 3.0: Rework how SPDX aliases are linked]
>> to set actual spdxId other than alias to dictionary license_text_map
>> ...
>>        "simplelicensing_customIdToUri": [
>>          {
>>            "type": "DictionaryEntry",
>>            "key": "LicenseRef-PD",
>>            "value":"http://spdx.org/spdxdocs/sqlite3-native-e5cc0672-d8dd-57e8-a2df-fe4615831fda/162c62b5b011cd3f82f413b3dae4d6d1542201552c964d5ce69fe170e0720b85/license-text/PD"
>>          }
>>        ]
>> ...
>>
>> Signed-off-by: Hongxu Jia<hongxu.jia@windriver.com>
>> ---
>>   meta/lib/oe/spdx30_tasks.py | 4 +---
>>   1 file changed, 1 insertion(+), 3 deletions(-)
>>
>> diff --git a/meta/lib/oe/spdx30_tasks.py b/meta/lib/oe/spdx30_tasks.py
>> index 036c58bf4b..82fcfe7a63 100644
>> --- a/meta/lib/oe/spdx30_tasks.py
>> +++ b/meta/lib/oe/spdx30_tasks.py
>> @@ -107,9 +107,7 @@ def add_license_expression(d, objset, license_expression, license_data):
>>
>>           spdx_license = "LicenseRef-" + l
>>           if spdx_license not in license_text_map:
>> -            license_text_map[spdx_license] = oe.sbom30.get_element_link_id(
>> -                add_license_text(l)
>> -            )
>> +            license_text_map[spdx_license] = add_license_text(l)._id
> Ah, sorry, this will not work because the SPDX IDs can be wrong
> anytime that documents are referenced across sstate objects. This is
> why we have aliases in the first place so that they can be "looked up"
> independently of their actual SPDX ID, until they are all linked
> together in the final SPDX document. This works for normal object
> references just fine because the alias SPDX IDs are "missing" when the
> document is merged, and our code knows how to pull in those SPDX IDs
> by the "missing" alias to resolve them.
>
> Unfortunately, since a DictionaryEntry holds a free form string for
> the value, that doesn't work here. Instead, we will need to add
> special code in the linking to manually go through all of the
> simplelicensing_customIdToUri DictionaryEntry items and resolve any
> aliases to actual objects. I think that needs to go in
> expand_collection() in sbom30.py
>
>>           return spdx_license
>>
>> --
>> 2.25.1
>>
diff mbox series

Patch

diff --git a/meta/lib/oe/spdx30_tasks.py b/meta/lib/oe/spdx30_tasks.py
index 036c58bf4b..82fcfe7a63 100644
--- a/meta/lib/oe/spdx30_tasks.py
+++ b/meta/lib/oe/spdx30_tasks.py
@@ -107,9 +107,7 @@  def add_license_expression(d, objset, license_expression, license_data):
 
         spdx_license = "LicenseRef-" + l
         if spdx_license not in license_text_map:
-            license_text_map[spdx_license] = oe.sbom30.get_element_link_id(
-                add_license_text(l)
-            )
+            license_text_map[spdx_license] = add_license_text(l)._id
 
         return spdx_license