2727import requests
2828from packageurl import PackageURL
2929from bs4 import BeautifulSoup
30- from dephell_specifier import RangeSpecifier
30+ from univers .version_specifier import VersionSpecifier
31+ from univers .versions import SemverVersion
3132
3233from vulnerabilities .data_source import Advisory
3334from vulnerabilities .data_source import DataSource
@@ -58,10 +59,10 @@ def set_api(self):
5859
5960 def updated_advisories (self ):
6061 advisories = []
61- if create_etag (data_src = self , url = self .url , etag_key = "ETag" ):
62- self .set_api ()
63- data = requests .get (self .url ).content
64- advisories .extend (self .to_advisories (data ))
62+ # if create_etag(data_src=self, url=self.url, etag_key="ETag"):
63+ self .set_api ()
64+ data = requests .get (self .url ).content
65+ advisories .extend (self .to_advisories (data ))
6566 return self .batch_advisories (advisories )
6667
6768 def to_advisories (self , data ):
@@ -126,13 +127,15 @@ def extract_fixed_pkgs(self, vuln_info):
126127 raw_ranges = version_info .split ("," )
127128 version_ranges = []
128129 for rng in raw_ranges :
129- # Eg. "1.7.3+" gets converted to RangeSpecifier( "^1.7.3")
130+ # Eg. "1.7.3+" gets converted to VersionSpecifier.from_scheme_version_spec_string("semver", "^1.7.3")
130131 # The advisory in this case uses `+` in the sense that any version
131132 # with greater or equal `minor` version satisfies the range.
132133 # "1.7.4" satisifes "1.7.3+", but "1.8.4" does not. "1.7.3+" has same
133134 # semantics as that of "^1.7.3"
134135
135- version_ranges .append (RangeSpecifier ("^" + rng [:- 1 ]))
136+ version_ranges .append (
137+ VersionSpecifier .from_scheme_version_spec_string ("semver" , "^" + rng [:- 1 ])
138+ )
136139
137140 valid_versions = find_valid_versions (self .version_api .get ("nginx/nginx" ), version_ranges )
138141
@@ -148,16 +151,26 @@ def extract_vuln_pkgs(self, vuln_info):
148151 version_ranges = []
149152 windows_only = False
150153 for version_info in version_infos .split (", " ):
154+ if version_info == "all" :
155+ # This is misleading since eventually some version get fixed.
156+ continue
157+
151158 if "-" not in version_info :
152159 # These are discrete versions
153- version_ranges .append (RangeSpecifier (version_info [0 ]))
160+ version_ranges .append (
161+ VersionSpecifier .from_scheme_version_spec_string ("semver" , version_info [0 ])
162+ )
154163 continue
155164
156165 windows_only = "nginx/Windows" in version_info
157166 version_info = version_info .replace ("nginx/Windows" , "" )
158167 lower_bound , upper_bound = version_info .split ("-" )
159168
160- version_ranges .append (RangeSpecifier (f">={ lower_bound } ,<={ upper_bound } " ))
169+ version_ranges .append (
170+ VersionSpecifier .from_scheme_version_spec_string (
171+ "semver" , f">={ lower_bound } ,<={ upper_bound } "
172+ )
173+ )
161174
162175 valid_versions = find_valid_versions (self .version_api .get ("nginx/nginx" ), version_ranges )
163176 qualifiers = {}
@@ -173,7 +186,8 @@ def extract_vuln_pkgs(self, vuln_info):
173186def find_valid_versions (versions , version_ranges ):
174187 valid_versions = set ()
175188 for version in versions :
176- if any ([version in ver_range for ver_range in version_ranges ]):
189+ version_obj = SemverVersion (version )
190+ if any ([version_obj in ver_range for ver_range in version_ranges ]):
177191 valid_versions .add (version )
178192
179193 return valid_versions
0 commit comments