|
17 | 17 | from vulnerabilities.importer import Reference |
18 | 18 | from vulnerabilities.importers.ruby import RubyImporter |
19 | 19 | from vulnerabilities.importers.ruby import categorize_versions |
| 20 | +from vulnerabilities.package_managers import PackageVersion |
20 | 21 | from vulnerabilities.package_managers import VersionResponse |
21 | 22 | from vulnerabilities.utils import AffectedPackage |
22 | 23 | from vulnerabilities.utils import load_yaml |
|
31 | 32 |
|
32 | 33 |
|
33 | 34 | class RubyImporterTest(TestCase): |
34 | | - @classmethod |
35 | | - def setUpClass(cls): |
36 | | - cls.data_src = RubyImporter() |
37 | | - |
38 | | - @patch( |
39 | | - "vulnerabilities.package_managers.RubyVersionAPI.fetch", |
40 | | - return_value=VersionResponse( |
41 | | - valid_versions={"1.0.0", "1.8.0", "2.0.3"}, newer_versions=set() |
42 | | - ), |
43 | | - ) |
44 | | - def test_parse_ruby_advisory(self): |
45 | | - expected_advisories = [ |
46 | | - AdvisoryData( |
47 | | - summary="An issue was discovered in rack-protection/lib/rack/protection/path_traversal.rb\nin Sinatra 2.x before 2.0.1 on Windows. Path traversal is possible via backslash\ncharacters.\n", |
48 | | - aliases=["CVE-2018-7212"], |
49 | | - affected_packages=[ |
50 | | - AffectedPackage( |
51 | | - package=PackageURL( |
52 | | - type="gem", |
53 | | - namespace=None, |
54 | | - name="sinatra", |
55 | | - version="1.8.0", |
56 | | - ), |
57 | | - fixed_version=PackageURL( |
58 | | - type="gem", |
59 | | - namespace=None, |
60 | | - name="sinatra", |
61 | | - version="2.0.3", |
62 | | - ), |
63 | | - ) |
64 | | - ], |
65 | | - references=[ |
66 | | - Reference( |
67 | | - reference_id="", |
68 | | - url="https://github.com/sinatra/sinatra/pull/1379", |
69 | | - severities=[], |
70 | | - ) |
71 | | - ], |
72 | | - ), |
73 | | - AdvisoryData( |
74 | | - summary="Sinatra before 2.0.2 has XSS via the 400 Bad Request page that occurs upon a params parser exception.\n", |
75 | | - aliases=["CVE-2018-11627"], |
76 | | - affected_packages=[ |
77 | | - AffectedPackage( |
78 | | - package=PackageURL( |
79 | | - type="gem", |
80 | | - namespace=None, |
81 | | - name="sinatra", |
82 | | - version="1.0.0", |
83 | | - ), |
84 | | - fixed_version=PackageURL( |
85 | | - type="gem", |
86 | | - namespace=None, |
87 | | - name="sinatra", |
88 | | - version="2.0.3", |
89 | | - ), |
90 | | - ), |
91 | | - AffectedPackage( |
92 | | - package=PackageURL( |
93 | | - type="gem", |
94 | | - namespace=None, |
95 | | - name="sinatra", |
96 | | - version="1.8.0", |
97 | | - ), |
98 | | - fixed_version=PackageURL( |
99 | | - type="gem", |
100 | | - namespace=None, |
101 | | - name="sinatra", |
102 | | - version="2.0.3", |
103 | | - ), |
104 | | - ), |
105 | | - ], |
106 | | - references=[ |
107 | | - Reference( |
108 | | - reference_id="", |
109 | | - url="https://github.com/sinatra/sinatra/issues/1428", |
110 | | - severities=[], |
111 | | - ) |
112 | | - ], |
113 | | - ), |
114 | | - ] |
115 | | - found_advisories = [] |
116 | | - for p in MOCK_FILES: |
117 | | - raw_data = load_yaml(p) |
118 | | - advisory = self.data_src.parse_ruby_advisory(raw_data, schema_type="gem") |
119 | | - found_advisories.append(advisory) |
120 | | - |
121 | | - assert found_advisories == expected_advisories |
122 | | - |
123 | 35 | def test_categorize_versions(self): |
124 | | - all_versions = ["1.0.0", "1.2.0", "9.0.2", "0.2.3"] |
125 | | - safe_ver_ranges = ["==1.0.0", ">1.2.0"] |
| 36 | + all_versions = [ |
| 37 | + PackageVersion("1.0.0"), |
| 38 | + PackageVersion("1.2.0"), |
| 39 | + PackageVersion("9.0.2"), |
| 40 | + PackageVersion("0.2.3"), |
| 41 | + ] |
| 42 | + safe_ver_ranges = [">=1.0.0"] # "==1.0.0", not working with univers |
126 | 43 |
|
127 | | - exp_safe_vers = ["1.0.0", "9.0.2"] |
128 | | - exp_aff_vers = ["1.2.0", "0.2.3"] |
| 44 | + exp_aff_vers = ["0.2.3"] |
| 45 | + exp_safe_vers = ["1.0.0", "1.2.0", "9.0.2"] |
129 | 46 |
|
130 | 47 | safe_vers, aff_vers = categorize_versions(all_versions, safe_ver_ranges) |
131 | 48 | assert exp_aff_vers == aff_vers |
|
0 commit comments