2222# Visit https://github.com/nexB/vulnerablecode/ for support and download.
2323
2424import json
25+ import xxhash
2526from dephell_specifier import RangeSpecifier
2627from urllib .request import urlopen
2728from urllib .error import HTTPError
2829
30+ from vulnerabilities .models import AdvisoryHashes
31+
2932
3033NPM_URL = 'https://registry.npmjs.org{}'
3134PAGE = '/-/npm/v1/security/advisories?page=0'
@@ -93,15 +96,26 @@ def extract_data(JSON):
9396 continue
9497 # NPM registry has no data regarding this package finally we skip these
9598
96- package_vulnerabilities . append ( {
99+ package_vulnerability = {
97100 'package_name' : package_name ,
98101 'summary' : obj .get ('overview' , '' ),
99102 'cve_ids' : obj .get ('cves' , []),
100103 'fixed_versions' : fixed_versions ,
101104 'affected_versions' : affected_versions ,
102105 'severity' : obj .get ('severity' , '' ),
103106 'advisory' : obj .get ('url' , '' ),
104- })
107+ }
108+
109+ pkg_vuln_hash = xxhash .xxh32 (json .dumps (
110+ package_vulnerability , sort_keys = True )).intdigest ()
111+ hash_query = AdvisoryHashes .objects .filter (hash = pkg_vuln_hash )
112+ if hash_query :
113+ # In the past we already had this same data, so much work
114+ # for nothing
115+ continue
116+ package_vulnerabilities .append (package_vulnerability )
117+ AdvisoryHashes .objects .create (hash = pkg_vuln_hash )
118+
105119 return package_vulnerabilities
106120
107121
@@ -115,7 +129,15 @@ def scrape_vulnerabilities():
115129 try :
116130 cururl = NPM_URL .format (nextpage )
117131 response = json .load (urlopen (cururl ))
118- package_vulnerabilities .extend (extract_data (response ))
132+ resp_hash = xxhash .xxh32 (json .dumps (
133+ response , sort_keys = True )).intdigest ()
134+ hash_query = AdvisoryHashes .objects .filter (hash = resp_hash )
135+
136+ if not hash_query :
137+
138+ package_vulnerabilities .extend (extract_data (response ))
139+ AdvisoryHashes .objects .create (hash = resp_hash )
140+
119141 nextpage = response .get ('urls' , {}).get ('next' )
120142
121143 except HTTPError as error :
0 commit comments