Skip to content

Commit

Permalink
[#3725] Added failed certificates to email digest
Browse files Browse the repository at this point in the history
  • Loading branch information
vaszig committed Apr 19, 2024
1 parent 6ad8167 commit 8962b7a
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 1 deletion.
30 changes: 29 additions & 1 deletion src/openforms/emails/digest.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
import uuid
from dataclasses import dataclass
from datetime import datetime
from datetime import datetime, timedelta
from itertools import groupby
from typing import Iterable

from django.contrib.contenttypes.models import ContentType
from django.urls import reverse
from django.utils import timezone
from django.utils.translation import gettext_lazy as _

from django_yubin.models import Message
from furl import furl
from simple_certmanager.models import Certificate

from openforms.contrib.brk.service import check_brk_config_for_addressNL
from openforms.logging.models import TimelineLogProxy
Expand Down Expand Up @@ -69,6 +71,13 @@ class BrokenConfiguration:
exception_message: str


@dataclass
class FailedCertificate:
label: str
expiry_date: datetime | None = None
is_valid_pair: bool | None = None


def collect_failed_emails(since: datetime) -> Iterable[FailedEmail]:
logs = TimelineLogProxy.objects.filter(
timestamp__gt=since,
Expand Down Expand Up @@ -179,3 +188,22 @@ def collect_broken_configurations() -> list[BrokenConfiguration]:
)

return broken_configurations


def collect_failed_certificates() -> list[FailedCertificate]:
now = timezone.now()
interval = now + timedelta(days=14)

failed_certs = []
for cert in Certificate.objects.all():
if cert.expiry_date <= interval:
failed_certs.append(

Check warning on line 200 in src/openforms/emails/digest.py

View check run for this annotation

Codecov / codecov/patch

src/openforms/emails/digest.py#L200

Added line #L200 was not covered by tests
FailedCertificate(label=cert.label, expiry_date=cert.expiry_date)
)

if not (is_valid := cert.is_valid_key_pair()):
failed_certs.append(

Check warning on line 205 in src/openforms/emails/digest.py

View check run for this annotation

Codecov / codecov/patch

src/openforms/emails/digest.py#L205

Added line #L205 was not covered by tests
FailedCertificate(label=cert.label, is_valid_pair=is_valid)
)

return failed_certs
3 changes: 3 additions & 0 deletions src/openforms/emails/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

from .digest import (
collect_broken_configurations,
collect_failed_certificates,
collect_failed_emails,
collect_failed_prefill_plugins,
collect_failed_registrations,
Expand All @@ -27,12 +28,14 @@ def get_context_data(self) -> dict[str, Any]:
failed_registrations = collect_failed_registrations(self.since)
failed_prefill_plugins = collect_failed_prefill_plugins(self.since)
broken_configurations = collect_broken_configurations()
failed_certificates = collect_failed_certificates()

return {
"failed_emails": failed_emails,
"failed_registrations": failed_registrations,
"failed_prefill_plugins": failed_prefill_plugins,
"broken_configurations": broken_configurations,
"failed_certificates": failed_certificates,
}

def render(self) -> str:
Expand Down
34 changes: 34 additions & 0 deletions src/openforms/emails/templates/emails/admin_digest.html
Original file line number Diff line number Diff line change
Expand Up @@ -77,3 +77,37 @@ <h5>{% trans "Configuration problems" %}</h5>
{% endfor %}
</ul>
{% endif %}

{% if failed_certificates %}
<h5>{% trans "Certificates with problems" %}</h5>
<ul>
{% for failed_certificate in failed_certificates %}
<li>

<p>
<!-- Expiring certificates -->
{% if failed_certificate.expiry_date %}
{% blocktranslate with certificate_label=failed_certificate.label expiry_date=failed_certificate.expiry_date trimmed %}
'{{ certificate_label }}' certificate is about to expire on {{ expiry_date }}
{% endblocktranslate %}
{% else %}
<!-- No private key provided -->
{% if failed_certificate.is_valid_pair == None %}
{% blocktranslate with certificate_label=failed_certificate.label trimmed %}
No private key for certificate '{{ certificate_label }}' was provided.
{% endblocktranslate %}
{% endif %}

<!-- Invalid key-pair -->
{% if failed_certificate.is_valid_pair == False %}
{% blocktranslate with certificate_label=failed_certificate.label trimmed %}
The combination of the public key of the certificate and the private key is not valid.
Please look into certificate '{{ certificate_label }}'.
{% endblocktranslate %}
{% endif %}
{% endif %}
</p>
</li>
{% endfor %}
</ul>
{% endif %}

0 comments on commit 8962b7a

Please sign in to comment.