Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions manage.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
#!/usr/bin/env python

if __name__ == "__main__":
import site
site.addsitedir(r"C:\Users\Mohammed Anas\AppData\Roaming\Python\Python314\site-packages")

from vulnerablecode import command_line

command_line()
4 changes: 3 additions & 1 deletion vulnerabilities/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,9 @@ def get_severity_range_score(self, instance):
if s.scoring_system == EPSS.identifier:
continue

if s.scoring_elements and s.scoring_system in SCORING_SYSTEMS:
if s.scoring_elements_data:
severity_vectors.append(s.scoring_elements_data)
elif s.scoring_elements and s.scoring_system in SCORING_SYSTEMS:
try:
vector_values = SCORING_SYSTEMS[s.scoring_system].get(s.scoring_elements)
severity_vectors.append(vector_values)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ class Migration(migrations.Migration):
migrations.AddConstraint(
model_name="patch",
constraint=models.CheckConstraint(
check=models.Q(
condition=models.Q(
models.Q(
("patch_url__isnull", False), models.Q(("patch_url", ""), _negated=True)
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ class Migration(migrations.Migration):
migrations.AddConstraint(
model_name="advisoryseverity",
constraint=models.CheckConstraint(
check=models.Q(
condition=models.Q(
models.Q(("value__isnull", False), models.Q(("value", ""), _negated=True)),
models.Q(
("scoring_elements__isnull", False),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# Generated by Django 6.0.1 on 2026-01-27 10:41

from django.db import migrations, models


from vulnerabilities.severity_systems import SCORING_SYSTEMS
from cvss.exceptions import CVSS2MalformedError
from cvss.exceptions import CVSS3MalformedError
from cvss.exceptions import CVSS4MalformedError

def backfill_scoring_data(apps, schema_editor):
VulnerabilitySeverity = apps.get_model('vulnerabilities', 'VulnerabilitySeverity')
for vs in VulnerabilitySeverity.objects.all():
if vs.scoring_elements and vs.scoring_system in SCORING_SYSTEMS:
try:
vs.scoring_elements_data = SCORING_SYSTEMS[vs.scoring_system].get(
vs.scoring_elements
)
except (
CVSS2MalformedError,
CVSS3MalformedError,
CVSS4MalformedError,
NotImplementedError,
Exception,
):
vs.scoring_elements_data = {}
vs.save()

class Migration(migrations.Migration):

dependencies = [
('vulnerabilities', '0111_alter_advisoryseverity_scoring_system_and_more'),
]

operations = [
migrations.AddField(
model_name='vulnerabilityseverity',
name='scoring_elements_data',
field=models.JSONField(blank=True, default=dict, help_text='The parsed data from the scoring elements.'),
),
migrations.RunPython(backfill_scoring_data, migrations.RunPython.noop),
]
26 changes: 24 additions & 2 deletions vulnerabilities/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -208,13 +208,35 @@ class VulnerabilitySeverity(models.Model):
help_text="Supporting scoring elements used to compute the score values. "
"For example a CVSS vector string as used to compute a CVSS score.",
)

scoring_elements_data = models.JSONField(
default=dict,
blank=True,
help_text="The parsed data from the scoring elements."
)

published_at = models.DateTimeField(
blank=True, null=True, help_text="UTC Date of publication of the vulnerability severity"
)

objects = BaseQuerySet.as_manager()

def save(self, *args, **kwargs):
if self.scoring_elements and self.scoring_system in SCORING_SYSTEMS:
try:
self.scoring_elements_data = SCORING_SYSTEMS[self.scoring_system].get(
self.scoring_elements
)
except (
CVSS2MalformedError,
CVSS3MalformedError,
CVSS4MalformedError,
NotImplementedError,
Exception,
):
self.scoring_elements_data = {}
super().save(*args, **kwargs)

class Meta:
verbose_name_plural = "Vulnerability severities"
ordering = ["url", "scoring_system", "value"]
Expand Down Expand Up @@ -2590,7 +2612,7 @@ class Meta:
unique_together = ("url", "scoring_system", "value", "scoring_elements", "published_at")
constraints = [
models.CheckConstraint(
check=(
condition=(
Q(value__isnull=False) & ~Q(value="")
| Q(scoring_elements__isnull=False) & ~Q(scoring_elements="")
),
Expand Down Expand Up @@ -2788,7 +2810,7 @@ class Meta:
unique_together = ["patch_checksum", "patch_url"]
constraints = [
models.CheckConstraint(
check=(
condition=(
Q(patch_url__isnull=False) & ~Q(patch_url="")
| Q(patch_text__isnull=False) & ~Q(patch_text="")
),
Expand Down