diff --git a/vulnerabilities/templates/vulnerability_details.html b/vulnerabilities/templates/vulnerability_details.html
index 7001c8f3b..65c8a4e99 100644
--- a/vulnerabilities/templates/vulnerability_details.html
+++ b/vulnerabilities/templates/vulnerability_details.html
@@ -197,64 +197,103 @@
-
-
-
-
-
-
-
- Reference id |
- Reference type |
- URL |
-
-
- {% for ref in references %}
-
- {% if ref.reference_id %}
- {{ ref.reference_id }} |
- {% else %}
- |
- {% endif %}
-
- {% if ref.reference_type %}
- {{ ref.get_reference_type_display }} |
- {% else %}
- |
- {% endif %}
-
- {{ ref.url }} |
-
- {% empty %}
-
-
- There are no known references.
- |
-
- {% endfor %}
-
+
Severity Scores by Source
+
+ {% regroup severities|dictsort:"url" by url as severities_by_url %}
+
+ {% for url_group in severities_by_url %}
+
+
+
+
+
+
CVSS Scores
+
+
+
+ Source |
+ CVSS Version |
+ Score |
+ Textual Severity |
+
+
+
+ {% for entry in cvss_entries %}
+
+
+
+ {{ entry.reference|truncatechars:40 }}
+
+ |
+ {{ entry.version }} |
+ {{ entry.score|default:"-" }} |
+ {{ entry.text|default:"-" }} |
+
+ {% endfor %}
+
+
+
+
+
+ {% if epss_entries %}
+
+ {% endif %}
+
+
+
+
Other Scores
+
+
+
+ Scoring System |
+ Score |
+
+
+
+ {% for severity in url_group.list %}
+ {% if "cvss" not in severity.scoring_system and severity.scoring_system != "epss" %}
+
+ {{ severity.scoring_system }} |
+ {{ severity.value }} |
+
+ {% endif %}
+ {% endfor %}
+
+
+
+
+ {% empty %}
+
+ There are no known severity scores.
+
+ {% endfor %}
diff --git a/vulnerabilities/views.py b/vulnerabilities/views.py
index a2df48634..506f7cef8 100644
--- a/vulnerabilities/views.py
+++ b/vulnerabilities/views.py
@@ -38,6 +38,49 @@
PAGE_SIZE = 20
+def vulnerability_details(request, vulnerability_id):
+ vulnerability = get_object_or_404(Vulnerability, pk=vulnerability_id)
+ severities = vulnerability.severities.all()
+
+ # Process CVSS entries
+ cvss_entries = {}
+ for sev in severities:
+ system_lower = sev.system.lower()
+ if system_lower.startswith("cvss"):
+ version = system_lower.replace("cvssv", "").upper()
+ key = (sev.reference, version)
+ if key not in cvss_entries:
+ cvss_entries[key] = {"score": None, "text": None}
+ # Check if value is numerical or textual
+ try:
+ float(sev.value)
+ cvss_entries[key]["score"] = sev.value
+ except ValueError:
+ cvss_entries[key]["text"] = sev.value
+
+ cvss_list = [
+ {"reference": key[0], "version": key[1], "score": entry["score"], "text": entry["text"]}
+ for key, entry in cvss_entries.items()
+ ]
+
+ # Process EPSS entries, deduplicate
+ epss_entries = {}
+ for sev in severities:
+ if sev.system.lower() == "epss":
+ key = (sev.reference, sev.value)
+ if key not in epss_entries:
+ epss_entries[key] = sev.value
+
+ epss_list = [{"reference": key[0], "score": key[1]} for key in epss_entries]
+
+ context = {
+ "vulnerability": vulnerability,
+ "cvss_entries": cvss_list,
+ "epss_entries": epss_list,
+ }
+ return render(request, "vulnerability_details.html", context)
+
+
class PackageSearch(ListView):
model = models.Package
template_name = "packages.html"