Skip to content

Commit a5f65b7

Browse files
committed
Add tests for models
Signed-off-by: Tushar Goel <[email protected]>
1 parent 3fbe36d commit a5f65b7

20 files changed

+512
-150
lines changed

vulnerabilities/importers/__init__.py

Lines changed: 47 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,6 @@
3333
from vulnerabilities.importers import ubuntu_usn
3434
from vulnerabilities.importers import vulnrichment
3535
from vulnerabilities.importers import xen
36-
from vulnerabilities.pipelines import VulnerableCodeBaseImporterPipeline
37-
from vulnerabilities.pipelines import VulnerableCodeBaseImporterPipelineV2
3836
from vulnerabilities.pipelines import alpine_linux_importer
3937
from vulnerabilities.pipelines import github_importer
4038
from vulnerabilities.pipelines import gitlab_importer
@@ -51,56 +49,51 @@
5149
from vulnerabilities.pipelines.v2_importers import pypa_importer as pypa_importer_v2
5250
from vulnerabilities.pipelines.v2_importers import pysec_importer as pysec_importer_v2
5351
from vulnerabilities.pipelines.v2_importers import vulnrichment_importer as vulnrichment_importer_v2
52+
from vulnerabilities.utils import create_registry
5453

55-
IMPORTERS_REGISTRY = [
56-
nvd_importer_v2.NVDImporterPipeline,
57-
github_importer_v2.GitHubAPIImporterPipeline,
58-
npm_importer_v2.NpmImporterPipeline,
59-
vulnrichment_importer_v2.VulnrichImporterPipeline,
60-
apache_httpd_v2.ApacheHTTPDImporterPipeline,
61-
pypa_importer_v2.PyPaImporterPipeline,
62-
gitlab_importer_v2.GitLabImporterPipeline,
63-
pysec_importer_v2.PyPIImporterPipeline,
64-
nvd_importer.NVDImporterPipeline,
65-
github_importer.GitHubAPIImporterPipeline,
66-
gitlab_importer.GitLabImporterPipeline,
67-
github_osv.GithubOSVImporter,
68-
pypa_importer.PyPaImporterPipeline,
69-
npm_importer.NpmImporterPipeline,
70-
nginx_importer.NginxImporterPipeline,
71-
pysec_importer.PyPIImporterPipeline,
72-
apache_tomcat.ApacheTomcatImporter,
73-
postgresql.PostgreSQLImporter,
74-
debian.DebianImporter,
75-
curl.CurlImporter,
76-
epss.EPSSImporter,
77-
vulnrichment.VulnrichImporter,
78-
alpine_linux_importer.AlpineLinuxImporterPipeline,
79-
ruby.RubyImporter,
80-
apache_kafka.ApacheKafkaImporter,
81-
openssl.OpensslImporter,
82-
redhat.RedhatImporter,
83-
archlinux.ArchlinuxImporter,
84-
ubuntu.UbuntuImporter,
85-
debian_oval.DebianOvalImporter,
86-
retiredotnet.RetireDotnetImporter,
87-
apache_httpd.ApacheHTTPDImporter,
88-
mozilla.MozillaImporter,
89-
gentoo.GentooImporter,
90-
istio.IstioImporter,
91-
project_kb_msr2019.ProjectKBMSRImporter,
92-
suse_scores.SUSESeverityScoreImporter,
93-
elixir_security.ElixirSecurityImporter,
94-
xen.XenImporter,
95-
ubuntu_usn.UbuntuUSNImporter,
96-
fireeye.FireyeImporter,
97-
oss_fuzz.OSSFuzzImporter,
98-
]
99-
100-
IMPORTERS_REGISTRY = {
101-
x.pipeline_id
102-
if issubclass(x, VulnerableCodeBaseImporterPipeline)
103-
or issubclass(x, VulnerableCodeBaseImporterPipelineV2)
104-
else x.qualified_name: x
105-
for x in IMPORTERS_REGISTRY
106-
}
54+
IMPORTERS_REGISTRY = create_registry(
55+
[
56+
nvd_importer_v2.NVDImporterPipeline,
57+
github_importer_v2.GitHubAPIImporterPipeline,
58+
npm_importer_v2.NpmImporterPipeline,
59+
vulnrichment_importer_v2.VulnrichImporterPipeline,
60+
apache_httpd_v2.ApacheHTTPDImporterPipeline,
61+
pypa_importer_v2.PyPaImporterPipeline,
62+
gitlab_importer_v2.GitLabImporterPipeline,
63+
pysec_importer_v2.PyPIImporterPipeline,
64+
nvd_importer.NVDImporterPipeline,
65+
github_importer.GitHubAPIImporterPipeline,
66+
gitlab_importer.GitLabImporterPipeline,
67+
github_osv.GithubOSVImporter,
68+
pypa_importer.PyPaImporterPipeline,
69+
npm_importer.NpmImporterPipeline,
70+
nginx_importer.NginxImporterPipeline,
71+
pysec_importer.PyPIImporterPipeline,
72+
apache_tomcat.ApacheTomcatImporter,
73+
postgresql.PostgreSQLImporter,
74+
debian.DebianImporter,
75+
curl.CurlImporter,
76+
epss.EPSSImporter,
77+
vulnrichment.VulnrichImporter,
78+
alpine_linux_importer.AlpineLinuxImporterPipeline,
79+
ruby.RubyImporter,
80+
apache_kafka.ApacheKafkaImporter,
81+
openssl.OpensslImporter,
82+
redhat.RedhatImporter,
83+
archlinux.ArchlinuxImporter,
84+
ubuntu.UbuntuImporter,
85+
debian_oval.DebianOvalImporter,
86+
retiredotnet.RetireDotnetImporter,
87+
apache_httpd.ApacheHTTPDImporter,
88+
mozilla.MozillaImporter,
89+
gentoo.GentooImporter,
90+
istio.IstioImporter,
91+
project_kb_msr2019.ProjectKBMSRImporter,
92+
suse_scores.SUSESeverityScoreImporter,
93+
elixir_security.ElixirSecurityImporter,
94+
xen.XenImporter,
95+
ubuntu_usn.UbuntuUSNImporter,
96+
fireeye.FireyeImporter,
97+
oss_fuzz.OSSFuzzImporter,
98+
]
99+
)

vulnerabilities/improvers/__init__.py

Lines changed: 39 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -31,45 +31,43 @@
3131
enhance_with_metasploit as enhance_with_metasploit_v2,
3232
)
3333
from vulnerabilities.pipelines.v2_improvers import flag_ghost_packages as flag_ghost_packages_v2
34+
from vulnerabilities.utils import create_registry
3435

35-
IMPROVERS_REGISTRY = [
36-
valid_versions.GitHubBasicImprover,
37-
valid_versions.GitLabBasicImprover,
38-
valid_versions.NginxBasicImprover,
39-
valid_versions.ApacheHTTPDImprover,
40-
valid_versions.DebianBasicImprover,
41-
valid_versions.NpmImprover,
42-
valid_versions.ElixirImprover,
43-
valid_versions.ApacheTomcatImprover,
44-
valid_versions.ApacheKafkaImprover,
45-
valid_versions.IstioImprover,
46-
valid_versions.DebianOvalImprover,
47-
valid_versions.UbuntuOvalImprover,
48-
valid_versions.OSSFuzzImprover,
49-
valid_versions.RubyImprover,
50-
valid_versions.GithubOSVImprover,
51-
vulnerability_status.VulnerabilityStatusImprover,
52-
valid_versions.CurlImprover,
53-
flag_ghost_packages.FlagGhostPackagePipeline,
54-
enhance_with_kev.VulnerabilityKevPipeline,
55-
enhance_with_metasploit.MetasploitImproverPipeline,
56-
enhance_with_exploitdb.ExploitDBImproverPipeline,
57-
compute_package_risk.ComputePackageRiskPipeline,
58-
compute_package_version_rank.ComputeVersionRankPipeline,
59-
collect_commits.CollectFixCommitsPipeline,
60-
add_cvss31_to_CVEs.CVEAdvisoryMappingPipeline,
61-
remove_duplicate_advisories.RemoveDuplicateAdvisoriesPipeline,
62-
populate_vulnerability_summary_pipeline.PopulateVulnerabilitySummariesPipeline,
63-
exploitdb_v2.ExploitDBImproverPipeline,
64-
enhance_with_kev_v2.VulnerabilityKevPipeline,
65-
flag_ghost_packages_v2.FlagGhostPackagePipeline,
66-
enhance_with_metasploit_v2.MetasploitImproverPipeline,
67-
compute_package_risk_v2.ComputePackageRiskPipeline,
68-
compute_version_rank_v2.ComputeVersionRankPipeline,
69-
collect_commits_v2.CollectFixCommitsPipeline,
70-
]
71-
72-
IMPROVERS_REGISTRY = {
73-
x.pipeline_id if issubclass(x, VulnerableCodePipeline) else x.qualified_name: x
74-
for x in IMPROVERS_REGISTRY
75-
}
36+
IMPROVERS_REGISTRY = create_registry(
37+
[
38+
valid_versions.GitHubBasicImprover,
39+
valid_versions.GitLabBasicImprover,
40+
valid_versions.NginxBasicImprover,
41+
valid_versions.ApacheHTTPDImprover,
42+
valid_versions.DebianBasicImprover,
43+
valid_versions.NpmImprover,
44+
valid_versions.ElixirImprover,
45+
valid_versions.ApacheTomcatImprover,
46+
valid_versions.ApacheKafkaImprover,
47+
valid_versions.IstioImprover,
48+
valid_versions.DebianOvalImprover,
49+
valid_versions.UbuntuOvalImprover,
50+
valid_versions.OSSFuzzImprover,
51+
valid_versions.RubyImprover,
52+
valid_versions.GithubOSVImprover,
53+
vulnerability_status.VulnerabilityStatusImprover,
54+
valid_versions.CurlImprover,
55+
flag_ghost_packages.FlagGhostPackagePipeline,
56+
enhance_with_kev.VulnerabilityKevPipeline,
57+
enhance_with_metasploit.MetasploitImproverPipeline,
58+
enhance_with_exploitdb.ExploitDBImproverPipeline,
59+
compute_package_risk.ComputePackageRiskPipeline,
60+
compute_package_version_rank.ComputeVersionRankPipeline,
61+
collect_commits.CollectFixCommitsPipeline,
62+
add_cvss31_to_CVEs.CVEAdvisoryMappingPipeline,
63+
remove_duplicate_advisories.RemoveDuplicateAdvisoriesPipeline,
64+
populate_vulnerability_summary_pipeline.PopulateVulnerabilitySummariesPipeline,
65+
exploitdb_v2.ExploitDBImproverPipeline,
66+
enhance_with_kev_v2.VulnerabilityKevPipeline,
67+
flag_ghost_packages_v2.FlagGhostPackagePipeline,
68+
enhance_with_metasploit_v2.MetasploitImproverPipeline,
69+
compute_package_risk_v2.ComputePackageRiskPipeline,
70+
compute_version_rank_v2.ComputeVersionRankPipeline,
71+
collect_commits_v2.CollectFixCommitsPipeline,
72+
]
73+
)

vulnerabilities/models.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2556,6 +2556,15 @@ class AdvisoryV2(models.Model):
25562556
help_text="Unique ID for the datasource used for this advisory ." "e.g.: nginx_importer_v2",
25572557
)
25582558

2559+
advisory_id = models.CharField(
2560+
max_length=50,
2561+
blank=False,
2562+
null=False,
2563+
unique=False,
2564+
help_text="An advisory is a unique vulnerability identifier in some database, "
2565+
"such as PYSEC-2020-2233",
2566+
)
2567+
25592568
avid = models.CharField(
25602569
max_length=500,
25612570
blank=False,
@@ -2565,14 +2574,6 @@ class AdvisoryV2(models.Model):
25652574
)
25662575

25672576
# This is similar to a name
2568-
advisory_id = models.CharField(
2569-
max_length=50,
2570-
blank=False,
2571-
null=False,
2572-
unique=False,
2573-
help_text="An advisory is a unique vulnerability identifier in some database, "
2574-
"such as PYSEC-2020-2233",
2575-
)
25762577

25772578
# This is similar to a version
25782579
unique_content_id = models.CharField(

vulnerabilities/pipelines/__init__.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -159,14 +159,6 @@ def on_failure(self):
159159
"""
160160
pass
161161

162-
@classproperty
163-
def pipeline_id(cls):
164-
"""Return unique pipeline_id set in cls.pipeline_id"""
165-
166-
if cls.pipeline_id is None or cls.pipeline_id == "":
167-
raise NotImplementedError("pipeline_id is not defined or is empty")
168-
return cls.pipeline_id
169-
170162

171163
class VulnerableCodeBaseImporterPipeline(VulnerableCodePipeline):
172164
"""
@@ -273,10 +265,8 @@ class VulnerableCodeBaseImporterPipelineV2(VulnerableCodePipeline):
273265

274266
pipeline_id = None # Unique Pipeline ID, this should be the name of pipeline module.
275267
license_url = None
276-
label = None
277268
spdx_license_expression = None
278269
repo_url = None
279-
importer_name = None
280270
advisory_confidence = MAX_CONFIDENCE
281271
ignorable_versions = []
282272
unfurl_version_ranges = False

vulnerabilities/pipelines/v2_importers/apache_httpd_importer.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,11 +139,15 @@ def get_weaknesses(cve_data):
139139

140140

141141
class ApacheHTTPDImporterPipeline(VulnerableCodeBaseImporterPipelineV2):
142+
"""
143+
Apache HTTPD Importer Pipeline
144+
145+
This pipeline imports security advisories from the Apache HTTPD project.
146+
"""
147+
142148
pipeline_id = "apache_httpd_importer_v2"
143-
label = "Apache-Httpd"
144149
spdx_license_expression = "Apache-2.0"
145150
license_url = "https://www.apache.org/licenses/LICENSE-2.0"
146-
importer_name = "Apache HTTPD Importer"
147151
base_url = "https://httpd.apache.org/security/json/"
148152
unfurl_version_ranges = True
149153

vulnerabilities/pipelines/v2_importers/elixir_security_importer.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,17 @@
2525

2626

2727
class ElixirSecurityImporterPipeline(VulnerableCodeBaseImporterPipelineV2):
28+
"""
29+
Elixir Security Advisiories Importer Pipeline
30+
31+
This pipeline imports security advisories for elixir.
32+
"""
2833

2934
pipeline_id = "elixir_security_importer_v2"
30-
label = "Elixir Security"
31-
repo_url = "git+https://github.com/dependabot/elixir-security-advisories"
32-
license_url = "https://github.com/dependabot/elixir-security-advisories/blob/master/LICENSE.txt"
3335
spdx_license_expression = "CC0-1.0"
34-
importer_name = "Elixir Security Importer"
36+
license_url = "https://github.com/dependabot/elixir-security-advisories/blob/master/LICENSE.txt"
37+
repo_url = "git+https://github.com/dependabot/elixir-security-advisories"
38+
unfurl_version_ranges = True
3539

3640
@classmethod
3741
def steps(cls):

vulnerabilities/pipelines/v2_importers/github_importer.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,17 @@
3333

3434

3535
class GitHubAPIImporterPipeline(VulnerableCodeBaseImporterPipelineV2):
36-
"""Collect GitHub advisories."""
36+
"""
37+
GitHub Importer Pipeline
38+
39+
This pipeline imports security advisories from GitHub Security Advisories.
40+
"""
3741

3842
pipeline_id = "github_importer_v2"
39-
label = "GitHub"
4043
spdx_license_expression = "CC-BY-4.0"
4144
license_url = "https://github.com/github/advisory-database/blob/main/LICENSE.md"
42-
importer_name = "GHSA Importer"
43-
4445
unfurl_version_ranges = True
46+
4547
ignorable_versions = frozenset(
4648
[
4749
"0.1-bulbasaur",

vulnerabilities/pipelines/v2_importers/gitlab_importer.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,16 @@
3434

3535

3636
class GitLabImporterPipeline(VulnerableCodeBaseImporterPipelineV2):
37-
"""Collect advisory from GitLab Advisory Database (Open Source Edition)."""
37+
"""
38+
GitLab Importer Pipeline
39+
40+
Collect advisory from GitLab Advisory Database (Open Source Edition).
41+
"""
3842

3943
pipeline_id = "gitlab_importer_v2"
40-
label = "GitLab"
4144
spdx_license_expression = "MIT"
4245
license_url = "https://gitlab.com/gitlab-org/advisories-community/-/blob/main/LICENSE"
43-
importer_name = "GitLab Importer"
4446
repo_url = "git+https://gitlab.com/gitlab-org/advisories-community/"
45-
4647
unfurl_version_ranges = True
4748

4849
@classmethod

vulnerabilities/pipelines/v2_importers/npm_importer.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,16 @@
3030

3131

3232
class NpmImporterPipeline(VulnerableCodeBaseImporterPipelineV2):
33-
"""Collect advisories from nodejs GitHub repository."""
33+
"""
34+
Node.js Security Working Group importer pipeline
35+
36+
Import advisories from nodejs security working group including node proper advisories and npm advisories.
37+
"""
3438

3539
pipeline_id = "nodejs_security_wg"
3640
spdx_license_expression = "MIT"
3741
license_url = "https://github.com/nodejs/security-wg/blob/main/LICENSE.md"
3842
repo_url = "git+https://github.com/nodejs/security-wg"
39-
importer_name = "npm Importer"
40-
4143
unfurl_version_ranges = True
4244

4345
@classmethod
@@ -120,7 +122,7 @@ def to_advisory_data(self, file: Path) -> Iterable[AdvisoryData]:
120122
advsisory_aliases = data.get("cves") or []
121123

122124
return AdvisoryData(
123-
advisory_id=f"NODESEC-NPM-{id}",
125+
advisory_id=f"npm-{id}",
124126
aliases=advsisory_aliases,
125127
summary=build_description(summary=summary, description=description),
126128
date_published=date_published,

vulnerabilities/pipelines/v2_importers/nvd_importer.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,13 @@
2828

2929

3030
class NVDImporterPipeline(VulnerableCodeBaseImporterPipelineV2):
31-
"""Collect advisories from NVD."""
31+
"""
32+
NVD Importer Pipeline
33+
34+
Collect advisories from NVD.
35+
"""
3236

3337
pipeline_id = "nvd_importer_v2"
34-
label = "NVD"
3538
# See https://github.com/nexB/vulnerablecode/issues/665 for follow up
3639
spdx_license_expression = (
3740
"LicenseRef-scancode-us-govt-public-domain AND LicenseRef-scancode-cve-tou"
@@ -66,7 +69,6 @@ class NVDImporterPipeline(VulnerableCodeBaseImporterPipelineV2):
6669
INFORMATION THEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
6770
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
6871
"""
69-
importer_name = "NVD Importer"
7072

7173
@classmethod
7274
def steps(cls):

0 commit comments

Comments
 (0)