88#
99
1010import asyncio
11- import datetime
1211import urllib
1312
14- import dateparser
1513import requests
1614from bs4 import BeautifulSoup
1715from packageurl import PackageURL
16+ from univers .version_constraint import VersionConstraint
1817from univers .version_range import GenericVersionRange
1918from univers .versions import SemverVersion
20- from univers .version_constraint import VersionConstraint
2119
2220from vulnerabilities .importer import AdvisoryData
2321from vulnerabilities .importer import AffectedPackage
2725from vulnerabilities .package_managers import GitHubTagsAPI
2826from vulnerabilities .severity_systems import APACHE_HTTPD
2927
30- # from vulnerabilities.utils import nearest_patched_package
31-
3228
3329class ApacheHTTPDImporter (Importer ):
3430
3531 base_url = "https://httpd.apache.org/security/json/"
3632 spdx_license_expression = "Apache-2.0"
33+ license_url = "https://www.apache.org/licenses/"
3734
3835 # For now, don't use the GH API
3936 # def set_api(self):
@@ -55,7 +52,6 @@ def advisory_data(self):
5552 yield self .to_advisory (data )
5653
5754 def to_advisory (self , data ):
58- # cve = data["CVE_data_meta"]["ID"]
5955 alias = data ["CVE_data_meta" ]["ID" ]
6056 descriptions = data ["description" ]["description_data" ]
6157 description = None
@@ -78,9 +74,7 @@ def to_advisory(self, data):
7874 )
7975 break
8076 reference = Reference (
81- # reference_id=cve,
8277 reference_id = alias ,
83- # url=urllib.parse.urljoin(self.base_url, f"{cve}.json"),
8478 url = urllib .parse .urljoin (self .base_url , f"{ alias } .json" ),
8579 severities = severities ,
8680 )
@@ -91,72 +85,11 @@ def to_advisory(self, data):
9185 for version_data in products ["version" ]["version_data" ]:
9286 versions_data .append (version_data )
9387
94- # print("\n\n==> versions_data = {}\n".format(versions_data))
95- for version in versions_data :
96- # print("\n\tversion = {}\n".format(version))
97- import json
98-
99- # print("\n\tversion = \n{}\n".format(json.dumps(version, indent=2)))
100-
10188 affected_version_range = self .to_version_ranges (versions_data )
10289
103- # fixed_version = []
104- # date_published = ""
105-
106- # for entry in data["timeline"]:
107- # value = entry["value"]
108- # # if "released" in entry["value"]:
109- # if "released" in value:
110- # # fixed_version.append(entry["value"])
111- # fixed_version.append(value.split(" ")[0])
112- # date_published = get_published_date(entry["time"])
113-
114- # affected_packages = []
115- # fixed_packages = []
116-
117- # for version in versions_data:
118- # affected_package = AffectedPackage(
119- # package=PackageURL(
120- # type="generic",
121- # name="apache_httpd",
122- # ),
123- # # affected_version_range=affected_version_range,
124- # affected_version_range=version.get("version_value", "ERROR!!"),
125- # fixed_version=fixed_version[0],
126- # # fixed_version="to come",
127- # )
128- # affected_packages.append(affected_package)
129-
130- # for version_range in fixed_version_ranges:
131- # fixed_packages.extend(
132- # [
133- # PackageURL(type="apache", name="httpd", version=version)
134- # for version in self.version_api.get("apache/httpd").valid_versions
135- # if SemverVersion(version) in version_range
136- # ]
137- # )
138-
139- # for version_range in affected_version_ranges:
140- # affected_packages.extend(
141- # [
142- # PackageURL(type="apache", name="httpd", version=version)
143- # for version in self.version_api.get("apache/httpd").valid_versions
144- # if SemverVersion(version) in version_range
145- # ]
146- # )
147-
14890 return AdvisoryData (
149- # vulnerability_id=cve,
15091 aliases = [alias ],
15192 summary = description ,
152- # affected_packages=nearest_patched_package(affected_packages, fixed_packages),
153- # affected_packages=AffectedPackage(
154- # package=PackageURL(
155- # type="apache",
156- # name="httpd",
157- # ),
158- # affected_version_range=affected_version_range
159- # )
16093 affected_packages = [
16194 AffectedPackage (
16295 package = PackageURL (
@@ -174,23 +107,30 @@ def to_version_ranges(self, versions_data):
174107 for version_data in versions_data :
175108 version_value = version_data ["version_value" ]
176109 range_expression = version_data ["version_affected" ]
110+
177111 if range_expression == ">=" or range_expression == "!<" :
178- constraints .append (VersionConstraint (
179- comparator = ">=" ,
180- version = SemverVersion (version_value ),
181- ))
112+ constraints .append (
113+ VersionConstraint (
114+ comparator = ">=" ,
115+ version = SemverVersion (version_value ),
116+ )
117+ )
182118
183119 if range_expression == "<=" :
184- constraints .append (VersionConstraint (
185- comparator = "<=" ,
186- version = SemverVersion (version_value ),
187- ))
120+ constraints .append (
121+ VersionConstraint (
122+ comparator = "<=" ,
123+ version = SemverVersion (version_value ),
124+ )
125+ )
188126
189127 if range_expression == "=" or range_expression == "?=" :
190- constraints .append (VersionConstraint (
191- comparator = "=" ,
192- version = SemverVersion (version_value ),
193- ))
128+ constraints .append (
129+ VersionConstraint (
130+ comparator = "=" ,
131+ version = SemverVersion (version_value ),
132+ )
133+ )
194134
195135 return GenericVersionRange (constraints = constraints )
196136
@@ -207,20 +147,6 @@ def fetch_links(url):
207147 return links
208148
209149
210- # From osv.py
211- # def get_published_date(raw_data):
212- # published = raw_data.get("published")
213- # return published and dateparser.parse(date_string=published)
214-
215-
216- def get_published_date (published ):
217- # return published and dateparser.parse(date_string=published)
218- # above gives result like this: "date_published": "2021-12-20T00:00:00"
219- # so does this:
220- published = datetime .datetime .strptime (published , "%Y-%m-%d" )
221- return published
222-
223-
224150ignore_tags = {
225151 "AGB_BEFORE_AAA_CHANGES" ,
226152 "APACHE_1_2b1" ,
0 commit comments