1
- use crate :: license:: SbomLicense ;
1
+ use crate :: license:: { ExtractedLicensingInfos , SbomLicense } ;
2
2
use crate :: utils:: get_sanitize_filename;
3
3
use actix_web:: body:: BoxBody ;
4
4
use actix_web:: http:: header:: ContentType ;
@@ -7,14 +7,14 @@ use csv::WriterBuilder;
7
7
use flate2:: write:: GzEncoder ;
8
8
use flate2:: Compression ;
9
9
use http:: StatusCode ;
10
- use std:: collections:: HashSet ;
11
10
use tar:: Builder ;
12
11
use trustification_common:: error:: ErrorInformation ;
13
12
14
13
extern crate sanitize_filename;
15
14
16
15
pub struct LicenseExporter {
17
16
sbom_license : SbomLicense ,
17
+ extracted_licensing_infos : Vec < ExtractedLicensingInfos > ,
18
18
}
19
19
20
20
#[ derive( Debug , thiserror:: Error ) ]
@@ -63,8 +63,11 @@ impl ResponseError for LicenseExporterError {
63
63
}
64
64
65
65
impl LicenseExporter {
66
- pub fn new ( sbom_license : SbomLicense ) -> Self {
67
- LicenseExporter { sbom_license }
66
+ pub fn new ( sbom_license : SbomLicense , extracted_licensing_infos : Vec < ExtractedLicensingInfos > ) -> Self {
67
+ LicenseExporter {
68
+ sbom_license,
69
+ extracted_licensing_infos,
70
+ }
68
71
}
69
72
70
73
pub fn generate ( & self ) -> Result < Vec < u8 > , LicenseExporterError > {
@@ -86,12 +89,21 @@ impl LicenseExporter {
86
89
"group" ,
87
90
"version" ,
88
91
"package reference" ,
89
- "license" ,
92
+ "license id " ,
90
93
"license name" ,
94
+ "license expression" ,
91
95
"alternate package reference" ,
92
96
] ) ?;
93
97
94
- let mut license_ref_key: HashSet < String > = HashSet :: new ( ) ;
98
+ for extracted_licensing_info in & self . extracted_licensing_infos {
99
+ wtr_license_ref. write_record ( [
100
+ extracted_licensing_info. license_id . as_str ( ) ,
101
+ extracted_licensing_info. name . as_str ( ) ,
102
+ extracted_licensing_info. extracted_text . as_str ( ) ,
103
+ extracted_licensing_info. comment . as_str ( ) ,
104
+ ] ) ?;
105
+ }
106
+
95
107
for pl in & self . sbom_license . packages {
96
108
let alternate_package_reference = pl
97
109
. other_reference
@@ -100,28 +112,24 @@ impl LicenseExporter {
100
112
. collect :: < Vec < _ > > ( )
101
113
. join ( "\n " ) ;
102
114
103
- for l in & pl. licenses {
104
- wtr_sbom. write_record ( [
105
- & pl. name ,
106
- & self . sbom_license . sbom_namespace ,
107
- & self . sbom_license . component_group ,
108
- & self . sbom_license . component_version ,
109
- & pl. purl ,
110
- l. license_id . as_str ( ) ,
111
- l. name . as_str ( ) ,
112
- alternate_package_reference. as_str ( ) ,
113
- ] ) ?;
114
-
115
- if l. is_license_ref && !license_ref_key. contains ( & l. license_id ) {
116
- wtr_license_ref. write_record ( [
117
- l. license_id . as_str ( ) ,
118
- l. name . as_str ( ) ,
119
- l. license_text . as_str ( ) ,
120
- l. license_comment . as_str ( ) ,
121
- ] ) ?;
122
- license_ref_key. insert ( String :: from ( & l. license_id ) ) ;
123
- }
124
- }
115
+ let spdx_licenses = pl
116
+ . spdx_licenses
117
+ . iter ( )
118
+ . map ( |reference| reference. as_str ( ) )
119
+ . collect :: < Vec < _ > > ( )
120
+ . join ( "\n " ) ;
121
+
122
+ wtr_sbom. write_record ( [
123
+ & pl. name ,
124
+ & self . sbom_license . sbom_namespace ,
125
+ & self . sbom_license . component_group ,
126
+ & self . sbom_license . component_version ,
127
+ & pl. purl ,
128
+ & spdx_licenses,
129
+ & pl. license_name ,
130
+ & pl. license_text ,
131
+ alternate_package_reference. as_str ( ) ,
132
+ ] ) ?;
125
133
}
126
134
127
135
let sbom_csv = wtr_sbom
@@ -199,29 +207,47 @@ mod tests {
199
207
200
208
let license_scanner = LicenseScanner :: new ( sbom) ;
201
209
202
- let sbom_licenses = license_scanner
210
+ let ( sbom_licenses, extracted_licensing_info ) = license_scanner
203
211
. scanner ( )
204
212
. unwrap_or_else ( |_| panic ! ( "failed to parse test data" ) ) ;
205
213
206
- let export = LicenseExporter :: new ( sbom_licenses) ;
214
+ let export = LicenseExporter :: new ( sbom_licenses, extracted_licensing_info ) ;
207
215
let mut file =
208
216
File :: create ( "/tmp/application.cdx_licenses.tar.gz" ) . unwrap_or_else ( |_| panic ! ( "create file failed" ) ) ;
209
217
file. write_all ( & export. generate ( ) . unwrap_or_else ( |_| panic ! ( "generate failed" ) ) )
210
218
. unwrap_or_else ( |_| panic ! ( "write file failed" ) ) ;
211
219
}
212
220
221
+ #[ tokio:: test]
222
+ async fn is_works_cydx_with_cpe ( ) {
223
+ let sbom = load_sbom_file ( "../test-data/tc_1730_license_escape.json" )
224
+ . unwrap_or_else ( |_| panic ! ( "failed to parse test data" ) ) ;
225
+
226
+ let license_scanner = LicenseScanner :: new ( sbom) ;
227
+
228
+ let ( sbom_licenses, extracted_licensing_info) = license_scanner
229
+ . scanner ( )
230
+ . unwrap_or_else ( |_| panic ! ( "failed to parse test data" ) ) ;
231
+
232
+ let export = LicenseExporter :: new ( sbom_licenses, extracted_licensing_info) ;
233
+ let mut file =
234
+ File :: create ( "/tmp/tc_1730_license_escape.tar.gz" ) . unwrap_or_else ( |_| panic ! ( "create file failed" ) ) ;
235
+ file. write_all ( & export. generate ( ) . unwrap_or_else ( |_| panic ! ( "generate failed" ) ) )
236
+ . unwrap_or_else ( |_| panic ! ( "write file failed" ) ) ;
237
+ }
238
+
213
239
#[ tokio:: test]
214
240
async fn is_works_spdx ( ) {
215
241
let sbom = load_sbom_file ( "../test-data/mtv-2.6.json" ) . unwrap_or_else ( |_| panic ! ( "failed to parse test data" ) ) ;
216
242
217
243
let license_scanner = LicenseScanner :: new ( sbom) ;
218
244
219
- let sbom_licenses = license_scanner
245
+ let ( sbom_licenses, extracted_licensing_info ) = license_scanner
220
246
. scanner ( )
221
247
. unwrap_or_else ( |_| panic ! ( "failed to parse test data" ) ) ;
222
248
223
- let export = LicenseExporter :: new ( sbom_licenses) ;
224
- let mut file = File :: create ( "/tmp/mtv-2.6_licenses .tar.gz" ) . unwrap_or_else ( |_| panic ! ( "create file failed" ) ) ;
249
+ let export = LicenseExporter :: new ( sbom_licenses, extracted_licensing_info ) ;
250
+ let mut file = File :: create ( "/tmp/mtv-2.6 .tar.gz" ) . unwrap_or_else ( |_| panic ! ( "create file failed" ) ) ;
225
251
file. write_all ( & export. generate ( ) . unwrap_or_else ( |_| panic ! ( "generate failed" ) ) )
226
252
. unwrap_or_else ( |_| panic ! ( "write file failed" ) ) ;
227
253
}
0 commit comments