33# Copyright (c) 2020 LG Electronics Inc.
44# SPDX-License-Identifier: Apache-2.0
55from fosslight_util .oss_item import FileItem
6+ import Levenshtein
67
78EXCLUDE_TRUE_VALUE = "Exclude"
89TLSH_CHECKSUM_NULL = "0"
910
1011
12+ def find_most_similar_word (input_string , oss_name_list ):
13+ most_similar_word = None
14+ min_distance = float ('inf' )
15+
16+ for oss in oss_name_list :
17+ distance = Levenshtein .distance (input_string , oss .name )
18+ if distance < min_distance :
19+ min_distance = distance
20+ most_similar_word = oss .name
21+ return most_similar_word
22+
23+
1124class VulnerabilityItem :
1225 file_path = ""
1326 vul_id = ""
1427 nvd_url = ""
28+ oss_items = []
1529
16- def __init__ (self , file_path , id , url ):
30+ def __init__ (self , file_path , id , url , oss_items ):
1731 self .file_path = file_path
1832 self .vul_id = id
1933 self .nvd_url = url
34+ self .oss_items = oss_items
2035
2136
2237class BinaryItem (FileItem ):
@@ -42,9 +57,29 @@ def set_oss_items(self, new_oss_list, exclude=False, exclude_msg=""):
4257 # Append New input OSS
4358 self .oss_items .extend (new_oss_list )
4459
45- def get_vulnerability_items (self ):
46- nvd_url = [vul_item .nvd_url for vul_item in self .vulnerability_items ]
47- return ", " .join (nvd_url )
60+ def get_vulnerability_items (self , oss_name ):
61+ nvd_url = []
62+ nvd_urls = ""
63+ nvd_url_dict = {}
64+
65+ for vul_item in self .vulnerability_items :
66+ found_oss_name = ""
67+
68+ if vul_item .file_path == self .source_name_or_path :
69+ if len (self .oss_items ) > 1 :
70+ if vul_item .nvd_url :
71+ found_oss_name = find_most_similar_word (vul_item .nvd_url , vul_item .oss_items )
72+ if oss_name == found_oss_name :
73+ nvd_urls = f"{ nvd_urls } \n { vul_item .nvd_url } "
74+ else :
75+ nvd_url = nvd_url_dict .get (vul_item .file_path )
76+ if nvd_url :
77+ nvd_url .append (vul_item .nvd_url )
78+ nvd_urls = "\n " .join (nvd_url )
79+ else :
80+ nvd_url_dict [vul_item .file_path ] = [vul_item .nvd_url ]
81+ nvd_urls = "\n " .join (nvd_url_dict [vul_item .file_path ])
82+ return nvd_urls .strip ()
4883
4984 def get_print_binary_only (self ):
5085 return (self .source_name_or_path + "\t " + self .checksum + "\t " + self .tlsh )
@@ -55,7 +90,7 @@ def get_print_array(self):
5590 for oss in self .oss_items :
5691 lic = "," .join (oss .license )
5792 exclude = EXCLUDE_TRUE_VALUE if (self .exclude or oss .exclude ) else ""
58- nvd_url = self .get_vulnerability_items ()
93+ nvd_url = self .get_vulnerability_items (oss . name )
5994 items .append ([self .source_name_or_path , oss .name , oss .version ,
6095 lic , oss .download_location , oss .homepage ,
6196 oss .copyright , exclude , oss .comment ,
0 commit comments