1010# Author: Navonil Das (@NavonilDas)
1111
1212import json
13- import os
14- import tempfile
1513from pathlib import Path
1614from typing import Iterable
1715
1816import pytz
19- import requests
2017from dateutil .parser import parse
2118from fetchcode .vcs import fetch_via_vcs
2219from packageurl import PackageURL
2320from univers .version_range import NpmVersionRange
24- from univers .versions import SemverVersion
2521
2622from vulnerabilities .importer import AdvisoryData
2723from vulnerabilities .importer import AffectedPackage
@@ -47,16 +43,6 @@ class NpmImporterPipeline(VulnerableCodeBaseImporterPipelineV2):
4743 repo_url = "git+https://github.com/nodejs/security-wg"
4844 unfurl_version_ranges = True
4945
50- is_batch_run = True
51-
52- def __init__ (self , * args , purl = None , ** kwargs ):
53- super ().__init__ (* args , ** kwargs )
54- self .purl = purl
55- if self .purl :
56- NpmImporterPipeline .is_batch_run = False
57- if self .purl .type != "npm" :
58- print (f"Warning: This importer handles NPM packages. Current PURL: { self .purl !s} " )
59-
6046 @classmethod
6147 def steps (cls ):
6248 return (
@@ -75,32 +61,18 @@ def advisories_count(self):
7561
7662 def collect_advisories (self ) -> Iterable [AdvisoryData ]:
7763 vuln_directory = Path (self .vcs_response .dest_dir ) / "vuln" / "npm"
78- advisory_files = list (vuln_directory .glob ("*.json" ))
79-
80- if not self .is_batch_run :
81- package_name = self .purl .name
82- filtered_files = []
83- for advisory_file in advisory_files :
84- try :
85- data = load_json (advisory_file )
86- if data .get ("module_name" ) == package_name :
87- affected_package = self .get_affected_package (data , package_name )
88- if not self .purl .version or self ._version_is_affected (affected_package ):
89- filtered_files .append (advisory_file )
90- except Exception as e :
91- self .log (f"Error processing advisory file { advisory_file } : { str (e )} " )
92- advisory_files = filtered_files
93-
94- for advisory in list (advisory_files ):
95- result = self .to_advisory_data (advisory )
96- if result :
97- yield result
64+
65+ for advisory in vuln_directory .glob ("*.json" ):
66+ yield self .to_advisory_data (advisory )
9867
9968 def to_advisory_data (self , file : Path ) -> Iterable [AdvisoryData ]:
10069 if file .name == "index.json" :
10170 self .log (f"Skipping { file .name } file" )
10271 return
10372 data = load_json (file )
73+ advisory_text = None
74+ with open (file ) as f :
75+ advisory_text = f .read ()
10476 id = data .get ("id" )
10577 description = data .get ("overview" ) or ""
10678 summary = data .get ("title" ) or ""
@@ -153,11 +125,6 @@ def to_advisory_data(self, file: Path) -> Iterable[AdvisoryData]:
153125 affected_packages .append (self .get_affected_package (data , package_name ))
154126 advsisory_aliases = data .get ("cves" ) or []
155127
156- if self .purl and self .purl .version :
157- affected_package = affected_packages [0 ] if affected_packages else None
158- if affected_package and not self ._version_is_affected (affected_package ):
159- return
160-
161128 return AdvisoryData (
162129 advisory_id = f"npm-{ id } " ,
163130 aliases = advsisory_aliases ,
@@ -167,15 +134,9 @@ def to_advisory_data(self, file: Path) -> Iterable[AdvisoryData]:
167134 references_v2 = references ,
168135 severities = severities ,
169136 url = f"https://github.com/nodejs/security-wg/blob/main/vuln/npm/{ id } .json" ,
137+ original_advisory_text = advisory_text or json .dumps (data , indent = 2 , ensure_ascii = False ),
170138 )
171139
172- def _version_is_affected (self , affected_package ):
173- if not self .purl .version or not affected_package .affected_version_range :
174- return True
175-
176- purl_version = SemverVersion (self .purl .version )
177- return purl_version in affected_package .affected_version_range
178-
179140 def get_affected_package (self , data , package_name ):
180141 affected_version_range = None
181142 unaffected_version_range = None
@@ -218,11 +179,5 @@ def clean_downloads(self):
218179 self .log (f"Removing cloned repository" )
219180 self .vcs_response .delete ()
220181
221- if hasattr (self , "temp_dir" ) and os .path .exists (self .temp_dir ):
222- import shutil
223-
224- self .log (f"Removing temporary directory" )
225- shutil .rmtree (self .temp_dir )
226-
227182 def on_failure (self ):
228- self .clean_downloads ()
183+ self .clean_downloads ()
0 commit comments