Skip to content

Commit

Permalink
🎉 introducing EPSS score (DefectDojo#9516)
Browse files Browse the repository at this point in the history
* WIP

* first draw

* fix migrations

* fix migrations

* add epss to findings UI

* added epss to finding list

* Delete unittests/scans/wazuh/one_endpoint_finding.json

* flake8

* add migration for ModelOptions

* Add null values for epss + validators

* updated findings detail page to display epss as percentage

* removed wazuh file

* update branch (#3)

* Update versions in application files

* Update jira-description.tpl (DefectDojo#9403)

* Update and rename whitesource.md to mend.md (DefectDojo#9348)

* Update and rename whitesource.md to mend.md

* Update docs/content/en/integrations/parsers/file/mend.md

Co-authored-by: Charles Neill <[email protected]>

---------

Co-authored-by: Charles Neill <[email protected]>

* API: Remote v2 OpenAPI2 Docs from menu (DefectDojo#9469)

* 🐛 fix migration (DefectDojo#9467)

* finding sla expiration date field (part one) (DefectDojo#9473)

* addition of sla expiration date field on the finding model

* add migration and fix indentation issue

* fix mitigated finding remaining sla days calculation

* fix sla violation filter to return only active, sla violating findings

* migration system settings fix

* fix mitigation date vs datetime discrepancy

* fix breaking unit test

* move product save check to signal

* fix unit test failure

* make signal operations async, fix sla config delete 500 error

* add unit tests to test sla expiration date functionality

* restarting without signals

* add async updating flags, redo migration

* move signal logic to overriden save

* fix errors for non-existing objects at creation

* clean up comments and a few logical expressions

* fix flake8 error

* addition of new unit tests

* fix unit test error

* add message to form fields when async updating flag is true

* fix save location, reword form messages, reword redirect messages

* remove commented lines from unit tests

* add a bit more description to API validation errors

* migration fix

* migration performance improvements

* fix datetime - str comparison issue

* clean up for part one of sla expiration date field

* fix flake8

* Update dojo/db_migrations/0200_finding_sla_expiration_date_product_async_updating_and_more.py

Co-authored-by: Charles Neill <[email protected]>

* Update dojo/models.py

Co-authored-by: Charles Neill <[email protected]>

---------

Co-authored-by: Charles Neill <[email protected]>

* Update versions in application files

* Update versions in application files

* Update release-drafter/release-drafter action from v5.25.0 to v6 (.github/workflows/release-drafter.yml) (DefectDojo#9460)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Bump pytz from 2023.4 to 2024.1 (DefectDojo#9465)

Bumps [pytz](https://github.com/stub42/pytz) from 2023.4 to 2024.1.
- [Release notes](https://github.com/stub42/pytz/releases)
- [Commits](stub42/pytz@release_2023.4...release_2024.1)

---
updated-dependencies:
- dependency-name: pytz
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump django-debug-toolbar from 4.2.0 to 4.3.0 (DefectDojo#9466)

Bumps [django-debug-toolbar](https://github.com/jazzband/django-debug-toolbar) from 4.2.0 to 4.3.0.
- [Release notes](https://github.com/jazzband/django-debug-toolbar/releases)
- [Changelog](https://github.com/jazzband/django-debug-toolbar/blob/main/docs/changes.rst)
- [Commits](django-commons/django-debug-toolbar@4.2...4.3)

---
updated-dependencies:
- dependency-name: django-debug-toolbar
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump nginx from `d12e6f7` to `f2802c2` (DefectDojo#9477)

Bumps nginx from `d12e6f7` to `f2802c2`.

---
updated-dependencies:
- dependency-name: nginx
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Update dependency postcss from 8.4.33 to v8.4.34 (docs/package.json) (DefectDojo#9481)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update rabbitmq:3.12.12-alpine Docker digest from 3.12.12 to 3.12.12-alpine (docker-compose.yml) (DefectDojo#9458)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* ⬆️ Bump boto3 from 1.34.32 to 1.34.35 (DefectDojo#9489)

Bumps [boto3](https://github.com/boto/boto3) from 1.34.32 to 1.34.35.
- [Release notes](https://github.com/boto/boto3/releases)
- [Changelog](https://github.com/boto/boto3/blob/develop/CHANGELOG.rst)
- [Commits](boto/boto3@1.34.32...1.34.35)

---
updated-dependencies:
- dependency-name: boto3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Update dependency ruff from 0.1.15 to v0.2.1 (requirements-lint.txt) (DefectDojo#9459)

* Update dependency ruff from 0.1.15 to v0.2.1 (requirements-lint.txt)

* Fix ruff warning (DefectDojo#9461)

* Update dependency ruff from 0.1.15 to v0.2.0 (requirements-lint.txt)

* fix ruff warning

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Charles Neill <[email protected]>

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: kiblik <[email protected]>
Co-authored-by: Charles Neill <[email protected]>

* 🐛 fix defaulting severity, see last comments in DefectDojo#8778 (DefectDojo#9370)

Co-authored-by: Cody Maffucci <[email protected]>

* Add ruff for *tests (DefectDojo#9406)

* Revert ":bug: fix dependencytrack deduplication (DefectDojo#9117)" (DefectDojo#9371)

This reverts commit 0f55a7f.

Co-authored-by: Cody Maffucci <[email protected]>

* dojo/importers/importer/importer.py - Change "None" string to "Info" from cvss module when a CVSS vector string should evaluate to "Info" (DefectDojo#9453)

* dojo/importers/importer/importer.py - Change "None" string to "Info" from cvss module when a CVSS vector string evaluates to "Info"

* dojo/importers/importer/importer.py - Change "None" string to "Info" from cvss module when a CVSS vector string evaluates to "Info" #flake8_fix

* Trivy Operator VulnerabilityReport Parser tweaks (DefectDojo#9452)

* API: Check missing endpoints (DefectDojo#7618)

* Rename unittest

* Define exceptions for now

* Announcement was implemented

* Fix unittests with assertRaises + replace  assertTrue/False with better checks (DefectDojo#9435)

* Fix unittests with assertRaises

* Replace assertTrue/False with better checks

* Fixes

* Optimize list of Maintenance in relase notes (DefectDojo#9492)

* fix typo in docs (DefectDojo#9487)

* 🐛 WFuzz: Add additional severity mappings (DefectDojo#9486)

* 🐛 fix wfuzz, issue DefectDojo#7863

* add 302

* update docs

* Be strict about Warnings during testing (DefectDojo#9490)

* Set PYTHONWARNINGS=error

* Add basic filterwarnings

* Mute some warnings

* Mute one more warning

* 🐛 fix trufflehog3, issue DefectDojo#6999 (DefectDojo#9470)

* 🐛 fix yarn_audit, DefectDojo#6495 (DefectDojo#9478)

* Bump vulners from 2.1.2 to 2.1.5 (DefectDojo#9391)

Bumps [vulners]() from 2.1.2 to 2.1.5.

---
updated-dependencies:
- dependency-name: vulners
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Add support for DD_APPEND_SLASH (DefectDojo#9385)

* Override default Django APPEND_SLASH

* Update dojo/settings/settings.dist.py

* 🎉 Improvements for wazuh importer (DefectDojo#9248)

* improvement for wazuh importer

* 🔧 change on dedupe for Wazuh

* 🔧 change on dedupe for Wazuh

* 📝

* ✏️

* 📝

* 📝

* flake8

* 🎉 recoded wazuh importer to support endpoints

* ✅ adjusted unittests

* 📝

* ✏️

* ✏️

---------

Co-authored-by: Cody Maffucci <[email protected]>

* Update rabbitmq:3.12.12-alpine Docker digest from 3.12.12 to 3.12.12-alpine (docker-compose.yml) (DefectDojo#9501)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update dependency postcss from 8.4.34 to v8.4.35 (docs/package.json) (DefectDojo#9502)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Improve API endpoints for Risk Acceptances (DefectDojo#9415)

* Modifying Bugcrowd API Parser to align to vendor documentation on wha… (DefectDojo#9517)

* Modifying Bugcrowd API Parser to align to vendor documentation on what the not_applicable state means.  It is now active == False and severity == 'Info'. [sc-4217]

* fixing Flake8 errors

* fixing Flake8 errors, part deux

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: DefectDojo release bot <[email protected]>
Co-authored-by: Cody Maffucci <[email protected]>
Co-authored-by: Paul Osinski <[email protected]>
Co-authored-by: Charles Neill <[email protected]>
Co-authored-by: kiblik <[email protected]>
Co-authored-by: manuelsommer <[email protected]>
Co-authored-by: Blake Owens <[email protected]>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Robert Kiss <[email protected]>
Co-authored-by: ninp0 <[email protected]>
Co-authored-by: Raouf HADDADA <[email protected]>
Co-authored-by: Felix Hernandez <[email protected]>
Co-authored-by: Jay Paz <[email protected]>

* updated migrations

* added percentage to findings_list

* ✏️ tightening column title in findings detail page

* flake8

* undo DT parser update

* fix migrations

* update migrations to changes in dev

* merge dev into epss score

* Update versions in application files

* Update versions

* Parse GitHub vulnerability version (DefectDojo#9462)

* Fix SARIF parser with CodeQL rules (DefectDojo#9440)

* fix for sarif parser with codeql rules

* add check for extensions property

* flake8 comparsion

* finding sla expiration date field (part two) (DefectDojo#9494)

* finding sla expiration date field (part two)

* sla violation check updates

* clean up of finding violates_sla property

* flake8 fix

* Update dojo/models.py

Co-authored-by: Charles Neill <[email protected]>

* Update 0201_populate_finding_sla_expiration_date.py

---------

Co-authored-by: Charles Neill <[email protected]>

* Jira Server/DataCenter: Update meta methods (DefectDojo#9512)

* Jira Webhook: Catch comments from other issue updates (DefectDojo#9513)

* Jira Webhook: Catch comments from other issue updates

* Accommodate redirect responses

* Update dojo/jira_link/views.py

Co-authored-by: Charles Neill <[email protected]>

* Fix syntax

---------

Co-authored-by: Charles Neill <[email protected]>

* add metrics page: "Product Tag Count" (fixes DefectDojo#9151) (DefectDojo#9152)

* add metrics page: "Product Tag Count"

It is fully based on "Product Type Count" metrics page.

* fixup! add metrics page: "Product Tag Count"

* Fix Flake8

* Update views.py

---------

Co-authored-by: Cody Maffucci <[email protected]>

* Release Drafter: Try validating inputs

* Disallow duplicate tool types (DefectDojo#9530)

* Disallow duplicate tool types

* Fix Flake8

* Only validate on new creations

* Force new name on tool type unit test

* Engagement Surveys: Add missing leading slash (DefectDojo#9531)

URL redirects were behaving strangely without this leading slash. it seems it was missed when all the others were added

* Update versions in application files

* Update versions in application files

* Dojo_Group: Support for "RemoteUser" in model (DefectDojo#9405)

* Use correct name references

* fix db_mig

* Update and rename 0201_alter_dojo_group_social_provider.py to 0202_alter_dojo_group_social_provider.py

---------

Co-authored-by: Cody Maffucci <[email protected]>

* Update rabbitmq:3.12.12-alpine Docker digest from 3.12.12 to 3.12.12-alpine (docker-compose.yml) (DefectDojo#9535)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* remove flot-axis library (DefectDojo#9540)

* use full url for helm-repos and alias in renovate.json (DefectDojo#9525)

With this change, renovate will create PRs to update
the helm-dependencies, just as with docker-compose.

Note that only setting the repository to the full URL did not work,
I also had to add the registryAlias.

* Update Helm release redis from 16.12.3 to ~16.13.0 (helm/defectdojo/Chart.yaml) (DefectDojo#9550)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update rabbitmq:3.12.12-alpine Docker digest from 3.12.12 to 3.12.12-alpine (docker-compose.yml) (DefectDojo#9541)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update postgres Docker tag from 16.1 to v16.2 (docker-compose.yml) (DefectDojo#9536)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update Helm release mysql from 9.1.8 to ~9.19.0 (helm/defectdojo/Chart.yaml) (DefectDojo#9545)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

---------

Co-authored-by: DefectDojo release bot <[email protected]>
Co-authored-by: Cody Maffucci <[email protected]>
Co-authored-by: Colm O hEigeartaigh <[email protected]>
Co-authored-by: Andrei Serebriakov <[email protected]>
Co-authored-by: Blake Owens <[email protected]>
Co-authored-by: Charles Neill <[email protected]>
Co-authored-by: tomaszn <[email protected]>
Co-authored-by: kiblik <[email protected]>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Felix Hernandez <[email protected]>
Co-authored-by: Sebastian Gumprich <[email protected]>

* update epss-score (#5)

solve conflicts

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: DefectDojo release bot <[email protected]>
Co-authored-by: Cody Maffucci <[email protected]>
Co-authored-by: Paul Osinski <[email protected]>
Co-authored-by: Charles Neill <[email protected]>
Co-authored-by: kiblik <[email protected]>
Co-authored-by: manuelsommer <[email protected]>
Co-authored-by: Blake Owens <[email protected]>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Robert Kiss <[email protected]>
Co-authored-by: ninp0 <[email protected]>
Co-authored-by: Raouf HADDADA <[email protected]>
Co-authored-by: Felix Hernandez <[email protected]>
Co-authored-by: Jay Paz <[email protected]>
Co-authored-by: Colm O hEigeartaigh <[email protected]>
Co-authored-by: Andrei Serebriakov <[email protected]>
Co-authored-by: tomaszn <[email protected]>
Co-authored-by: Sebastian Gumprich <[email protected]>
  • Loading branch information
19 people authored Feb 20, 2024
1 parent 7931b1b commit 2e87065
Show file tree
Hide file tree
Showing 6 changed files with 104 additions and 6 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Generated by Django 4.1.13 on 2024-02-11 15:32

import django.core.validators
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('dojo', '0202_alter_dojo_group_social_provider'),
]

operations = [
migrations.AlterModelOptions(
name='finding',
options={'ordering': ('numerical_severity', '-date', 'title', 'epss_score', 'epss_percentile')},
),
migrations.AddField(
model_name='finding',
name='epss_percentile',
field=models.FloatField(blank=True, default=None, help_text='EPSS percentile for the CVE. Describes how many CVEs are scored at or below this one.', null=True, validators=[django.core.validators.MinValueValidator(0.0), django.core.validators.MaxValueValidator(1.0)], verbose_name='EPSS percentile'),
),
migrations.AddField(
model_name='finding',
name='epss_score',
field=models.FloatField(blank=True, default=None, help_text='EPSS score for the CVE. Describes how likely it is the vulnerability will be exploited in the next 30 days.', null=True, validators=[django.core.validators.MinValueValidator(0.0), django.core.validators.MaxValueValidator(1.0)], verbose_name='EPSS Score'),
),
migrations.AddIndex(
model_name='finding',
index=models.Index(fields=['epss_score'], name='dojo_findin_epss_sc_e40540_idx'),
),
migrations.AddIndex(
model_name='finding',
index=models.Index(fields=['epss_percentile'], name='dojo_findin_epss_pe_567499_idx'),
),
]
9 changes: 8 additions & 1 deletion dojo/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,8 @@ def get_finding_filterset_fields(metrics=False, similar=False):
'unique_id_from_tool',
'vuln_id_from_tool',
'service',
'epss_score',
'epss_percentile'
])

if similar:
Expand Down Expand Up @@ -1443,6 +1445,8 @@ class FindingFilter(FindingFilterWithTags):
('test__engagement__product__name',
'test__engagement__product__name'),
('service', 'service'),
('epss_score', 'epss_score'),
('epss_percentile', 'epss_percentile'),
),
field_labels={
'numerical_severity': 'Severity',
Expand All @@ -1451,6 +1455,8 @@ class FindingFilter(FindingFilterWithTags):
'mitigated': 'Mitigated Date',
'title': 'Finding Name',
'test__engagement__product__name': 'Product Name',
'epss_score': 'EPSS Score',
'epss_percentile': 'EPSS Percentile',
}
)

Expand All @@ -1464,7 +1470,8 @@ class Meta:
'numerical_severity', 'line', 'duplicate_finding',
'hash_code', 'reviewers', 'created', 'files',
'sla_start_date', 'sla_expiration_date', 'cvssv3',
'severity_justification', 'steps_to_reproduce']
'severity_justification', 'steps_to_reproduce',
'epss_score', 'epss_percentile']

def __init__(self, *args, **kwargs):
self.user = None
Expand Down
14 changes: 12 additions & 2 deletions dojo/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from django.contrib.auth.models import Group
from django.db.models.expressions import Case, When
from django.urls import reverse
from django.core.validators import RegexValidator, validate_ipv46_address
from django.core.validators import RegexValidator, validate_ipv46_address, MinValueValidator, MaxValueValidator
from django.core.files.base import ContentFile
from django.core.exceptions import ValidationError
from django.db import models, connection
Expand Down Expand Up @@ -2207,6 +2207,14 @@ class Finding(models.Model):
blank=False,
verbose_name=_("Vulnerability Id"),
help_text=_("An id of a vulnerability in a security advisory associated with this finding. Can be a Common Vulnerabilities and Exposures (CVE) or from other sources."))
epss_score = models.FloatField(default=None, null=True, blank=True,
verbose_name=_("EPSS Score"),
help_text=_("EPSS score for the CVE. Describes how likely it is the vulnerability will be exploited in the next 30 days."),
validators=[MinValueValidator(0.0), MaxValueValidator(1.0)])
epss_percentile = models.FloatField(default=None, null=True, blank=True,
verbose_name=_("EPSS percentile"),
help_text=_("EPSS percentile for the CVE. Describes how many CVEs are scored at or below this one."),
validators=[MinValueValidator(0.0), MaxValueValidator(1.0)])
cvssv3_regex = RegexValidator(regex=r'^AV:[NALP]|AC:[LH]|PR:[UNLH]|UI:[NR]|S:[UC]|[CIA]:[NLH]', message="CVSS must be entered in format: 'AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H'")
cvssv3 = models.TextField(validators=[cvssv3_regex],
max_length=117,
Expand Down Expand Up @@ -2501,7 +2509,7 @@ class Finding(models.Model):
'High': 1, 'Critical': 0}

class Meta:
ordering = ('numerical_severity', '-date', 'title')
ordering = ('numerical_severity', '-date', 'title', 'epss_score', 'epss_percentile')
indexes = [
models.Index(fields=['test', 'active', 'verified']),

Expand All @@ -2516,6 +2524,8 @@ class Meta:
models.Index(fields=['test', 'component_name']),

models.Index(fields=['cve']),
models.Index(fields=['epss_score']),
models.Index(fields=['epss_percentile']),
models.Index(fields=['cwe']),
models.Index(fields=['out_of_scope']),
models.Index(fields=['false_p']),
Expand Down
18 changes: 18 additions & 0 deletions dojo/templates/dojo/findings_list_snippet.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
{% load display_tags %}
{% load authorization_tags %}
{% load get_endpoint_status %}
{% load multiply %}
{% load static %}
{% load i18n %}
{% block findings_list %}
Expand Down Expand Up @@ -322,6 +323,9 @@ <h3 class="has-filters">
<th>
{% trans "Vulnerability Id" %}
</th>
<th>
{% trans "EPSS Score" %} / {% trans "Percentile" %}
</th>
<th class="nowrap">
{% if filter_name == 'Closed' %}
{% comment %} The display field is translated in the function. No need to translate here as well{% endcomment %}
Expand Down Expand Up @@ -593,6 +597,19 @@ <h3 class="has-filters">
{% endif %}
{% endwith %}
</td>
<td class="nowrap">
{% if finding.epss_score is not None %}
{{ finding.epss_score|multiply:100|floatformat:"2" }}%
{% else %}
N.A.
{% endif %}
/
{% if finding.epss_percentile is not None %}
{{ finding.epss_percentile|multiply:100|floatformat:"2" }}%
{% else %}
N.A.
{% endif %}
</td>
<td class="nowrap">
{% if filter_name == 'Closed' %}
{{ finding.mitigated|date }}
Expand Down Expand Up @@ -721,6 +738,7 @@ <h3 class="has-filters">
}},
{ "data": "cwe" },
{ "data": "cve" },
{ "data": "epss"},
{ "data": "found_date" },
{ "data": "finding_age" },
{% if system_settings.enable_finding_sla %}
Expand Down
25 changes: 22 additions & 3 deletions dojo/templates/dojo/view_finding.html
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{% extends "base.html" %}
{% load display_tags %}
{% load multiply %}
{% load authorization_tags %}
{% load humanize %}
{% load static %}
Expand Down Expand Up @@ -268,8 +269,17 @@ <h3 class="pull-left finding-title">
<th>Date Mitigated</th>
<th>Mitigated By</th>
{% endif %}
<th>CWE</th>
<th>Vulnerability Id</th>
<th>CWE</th>
<th>Vulnerability Id</th>
{% if finding.epss_score != None or finding.epss_percentile != None %}
{% if finding.epss_score != None and finding.epss_percentile != None %}
<th>EPSS Score / Percentile</th>
{% elif finding.epss_score != None and finding.epss_percentile == None %}
<th>EPSS Score</th>
{% elif finding.epss_score == None and finding.epss_percentile != None %}
<th>EPSS Percentile</th>
{% endif %}
{% endif %}
<th>Found by</th>
{% if finding.vuln_id_from_tool %}
<th>Vuln ID from tool</th>
Expand Down Expand Up @@ -421,7 +431,16 @@ <h3 class="pull-left finding-title">
{% endif %}
{% endif %}
</td>
<td>
{% if finding.epss_score != None or finding.epss_percentile != None %}
{% if finding.epss_score != None and finding.epss_percentile != None %}
<td>{{ finding.epss_score|multiply:100|floatformat:"3" }}% / {{ finding.epss_percentile|multiply:100|floatformat:"3" }}%</td>
{% elif finding.epss_score != None and finding.epss_percentile == None %}
<td>{{ finding.epss_score|multiply:100|floatformat:"3" }}%</td>
{% elif finding.epss_score == None and finding.epss_percentile != None %}
<td>{{ finding.epss_percentile|multiply:100|floatformat:"3" }}%</td>
{% endif %}
{% endif %}
<td>
{% if found_by %}
{% for scanner in found_by %}
{{ scanner }}
Expand Down
8 changes: 8 additions & 0 deletions dojo/templatetags/multiply.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from django import template

register = template.Library()


@register.filter
def multiply(value, arg):
return value * arg

0 comments on commit 2e87065

Please sign in to comment.