@@ -50,6 +50,7 @@ def advisory_data(self) -> Iterable[AdvisoryData]:
5050
5151 def to_advisory_data (self , file : Path ) -> AdvisoryData :
5252 data = load_json (file )
53+ id = data .get ("id" )
5354 description = data .get ("overview" ) or ""
5455 summary = data .get ("title" ) or ""
5556 date_published = parse (data .get ("created_at" )).replace (tzinfo = pytz .UTC )
@@ -71,39 +72,76 @@ def to_advisory_data(self, file: Path) -> AdvisoryData:
7172 value = cvss_score ,
7273 )
7374 )
75+
76+ advisory_reference = Reference (
77+ url = f"https://github.com/nodejs/security-wg/blob/main/vuln/npm/{ id } .json" ,
78+ reference_id = id ,
79+ severities = severities ,
80+ )
81+
7482 for ref in data .get ("references" ) or []:
7583 references .append (
7684 Reference (
7785 url = ref ,
7886 severities = severities ,
7987 )
8088 )
89+
90+ if advisory_reference not in references :
91+ references .append (advisory_reference )
92+
8193 package_name = data .get ("module_name" )
8294 affected_packages = []
8395 if package_name :
84- vulnerable_range = data .get ("vulnerable_versions" )
85- affected_packages .append (
86- AffectedPackage (
87- package = PackageURL (
88- type = "npm" ,
89- name = package_name ,
90- ),
91- affected_version_range = NpmVersionRange .from_native (vulnerable_range ),
92- # fixed_version= ??
93- )
94- )
95- for alias in data .get ("cves" , []):
96- print (AdvisoryData (
97- summary = build_description (summary = summary , description = description ),
98- references = references ,
99- date_published = date_published ,
100- affected_packages = affected_packages ,
101- aliases = [alias ],
102- ))
96+ affected_packages .append (self .get_affected_package (data , package_name ))
97+ advsisory_aliases = data .get ("cves" ) or []
98+ advsisory_aliases .append (f"NPM-{ id } " )
99+ for alias in advsisory_aliases :
103100 yield AdvisoryData (
104101 summary = build_description (summary = summary , description = description ),
105102 references = references ,
106103 date_published = date_published ,
107104 affected_packages = affected_packages ,
108105 aliases = [alias ],
109106 )
107+
108+ def get_affected_package (self , data , package_name ):
109+ vulnerable_range = data .get ("vulnerable_versions" ) or ""
110+
111+ # https://github.com/nodejs/security-wg/blob/main/vuln/npm/213.json#L14
112+ if vulnerable_range == "<=99.999.99999" :
113+ vulnerable_range = "*"
114+
115+ affected_version_range = (
116+ NpmVersionRange .from_native (vulnerable_range ) if vulnerable_range else None
117+ )
118+
119+ if vulnerable_range == "*" :
120+ return AffectedPackage (
121+ package = PackageURL (
122+ type = "npm" ,
123+ name = package_name ,
124+ ),
125+ affected_version_range = affected_version_range ,
126+ )
127+
128+ patched_range = data .get ("patched_versions" ) or ""
129+
130+ unaffected_version_range = (
131+ NpmVersionRange .from_native (patched_range ) if patched_range else None
132+ )
133+ fixed_version = None
134+
135+ if unaffected_version_range and len (unaffected_version_range .constraints ) == 1 :
136+ constraint = unaffected_version_range .constraints [0 ]
137+ if constraint .comparator == ">=" :
138+ fixed_version = constraint .version
139+
140+ return AffectedPackage (
141+ package = PackageURL (
142+ type = "npm" ,
143+ name = package_name ,
144+ ),
145+ affected_version_range = affected_version_range ,
146+ fixed_version = fixed_version ,
147+ )
0 commit comments