Skip to content

Commit d24d57e

Browse files
committed
Merge remote-tracking branch 'upstream/dev' into sso-clean-up
# Conflicts: # dojo/settings/settings.dist.py
2 parents fe5f3e3 + 7ea54d4 commit d24d57e

127 files changed

Lines changed: 2012 additions & 1382 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Dockerfile.django-debian

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
# Dockerfile.nginx to use the caching mechanism of Docker.
66

77
# Ref: https://devguide.python.org/#branchstatus
8-
FROM python:3.13.13-slim-trixie@sha256:9213d136547f0602c3337ff48291e937f9cc43060b3e123402cf2aaff1a08b75 AS base
8+
FROM python:3.13.13-slim-trixie@sha256:d2462a6bed37b4fc6cabecf5a2132ae70df772fe03c7393c4d98a0c2fb48aa2e AS base
99
FROM base AS build
1010
WORKDIR /app
1111
RUN \

Dockerfile.integration-tests-debian

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11

22
# code: language=Dockerfile
33

4-
FROM openapitools/openapi-generator-cli:v7.21.0@sha256:ce308310f3c1f8761e65338b8ab87b651bf4862c6acb80de510f381fffc4510b AS openapitools
4+
FROM openapitools/openapi-generator-cli:v7.22.0@sha256:1f459499a7c794aa0ea769c3c9b0eb54806c5ad2f68510a0ebb9338d0a626ced AS openapitools
55
# currently only supports x64, no arm yet due to chrome and selenium dependencies
6-
FROM python:3.13.13-slim-trixie@sha256:9213d136547f0602c3337ff48291e937f9cc43060b3e123402cf2aaff1a08b75 AS build
6+
FROM python:3.13.13-slim-trixie@sha256:d2462a6bed37b4fc6cabecf5a2132ae70df772fe03c7393c4d98a0c2fb48aa2e AS build
77
WORKDIR /app
88
RUN \
99
apt-get -y update && \

components/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
"chosen-bootstrap": "https://github.com/dbtek/chosen-bootstrap",
1313
"chosen-js": "^1.8.7",
1414
"clipboard": "^2.0.11",
15-
"datatables.net": "^2.3.7",
15+
"datatables.net": "^2.3.8",
1616
"datatables.net-buttons-bs": "^3.2.6",
1717
"datatables.net-colreorder": "^2.1.2",
1818
"drmonty-datatables-plugins": "^1.0.0",

components/yarn.lock

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -167,10 +167,10 @@ datatables.net@2.3.2:
167167
dependencies:
168168
jquery ">=1.7"
169169

170-
datatables.net@^2, datatables.net@^2.3.7:
171-
version "2.3.7"
172-
resolved "https://registry.yarnpkg.com/datatables.net/-/datatables.net-2.3.7.tgz#3cd34f6f5d1f40a46b5a20a4ba32604bdbcd6738"
173-
integrity sha512-AvsjG/Nkp6OxeyBKYZauemuzQCPogE1kOtKwG4sYjvdqGCSLiGaJagQwXv4YxG+ts5vaJr6qKGG9ec3g6vTo3w==
170+
datatables.net@^2, datatables.net@^2.3.8:
171+
version "2.3.8"
172+
resolved "https://registry.yarnpkg.com/datatables.net/-/datatables.net-2.3.8.tgz#55a8dbe3bd2196951c498ab79bf44602a2bf3229"
173+
integrity sha512-uhViowhlDlheAuo5a8TrkQqADsjrtGeOyvrigvr4t0+K3MyAWqClORXWAYIcN9VLX6iIX0C8O9gwJNd01hITRg==
174174
dependencies:
175175
jquery ">=1.7"
176176

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
---
2+
title: 'Upgrading to DefectDojo Version 2.58.x'
3+
toc_hide: true
4+
weight: -20260504
5+
description: Notification .tpl templates relocated under dojo/notifications/
6+
---
7+
8+
## Notification `.tpl` templates relocated
9+
10+
The notification domain has been consolidated under a new `dojo/notifications/` package, and the 62 channel `.tpl` templates that drive alert, mail, MS Teams, Slack, and webhook notifications have moved on disk. The Django template lookup name (e.g. `notifications/mail/scan_added.tpl`) is unchanged, so most customizations keep working without any edits — but operators who override `.tpl` files by mounting them into the source tree need to update their paths.
11+
12+
### What moved
13+
14+
The channel templates under `alert/`, `mail/`, `msteams/`, `slack/`, `webhooks/`, and `webhooks_summary/` have been relocated:
15+
16+
| Old on-disk location | New on-disk location |
17+
| --- | --- |
18+
| `dojo/templates/notifications/{channel}/{event}.tpl` | `dojo/notifications/templates/notifications/{channel}/{event}.tpl` |
19+
20+
For example, `dojo/templates/notifications/mail/scan_added.tpl` now lives at `dojo/notifications/templates/notifications/mail/scan_added.tpl`. A new `TEMPLATES["DIRS"]` entry pointing at `dojo/notifications/templates/` is registered automatically, so the lookup path used by `render_to_string()` (e.g. `notifications/slack/sla_breach.tpl`) resolves exactly as before.
21+
22+
### Required actions
23+
24+
- **Customizing `.tpl` files via your own templates directory (recommended pattern):** No action required. Overrides resolved by lookup name continue to take precedence.
25+
- **Customizing `.tpl` files via a Docker volume mount or in-tree patch at the old `dojo/templates/notifications/...` path:** Update the mount/patch target to the new `dojo/notifications/templates/notifications/...` path, or move your override into a project-level templates directory keyed by the lookup name.
26+
- **No customizations:** No action required.
27+
28+
For more information, check the [Release Notes](https://github.com/DefectDojo/django-DefectDojo/releases/tag/2.58.0).

docs/package-lock.json

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dojo/api_v2/serializers.py

Lines changed: 3 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
from rest_framework import serializers
2222
from rest_framework.exceptions import NotFound
2323
from rest_framework.exceptions import ValidationError as RestFrameworkValidationError
24-
from rest_framework.fields import DictField, MultipleChoiceField
24+
from rest_framework.fields import DictField
2525

2626
import dojo.finding.helper as finding_helper
2727
import dojo.risk_acceptance.helper as ra_helper
@@ -43,9 +43,7 @@
4343
from dojo.jira import services as jira_services
4444
from dojo.location.models import Location, LocationFindingReference
4545
from dojo.models import (
46-
DEFAULT_NOTIFICATION,
4746
IMPORT_ACTIONS,
48-
NOTIFICATION_CHOICES,
4947
SEVERITIES,
5048
SEVERITY_CHOICES,
5149
STATS_FIELDS,
@@ -82,8 +80,6 @@
8280
Note_Type,
8381
NoteHistory,
8482
Notes,
85-
Notification_Webhooks,
86-
Notifications,
8783
Product,
8884
Product_API_Scan_Configuration,
8985
Product_Group,
@@ -3069,110 +3065,7 @@ class FindingNoteSerializer(serializers.Serializer):
30693065
note_id = serializers.IntegerField()
30703066

30713067

3072-
class NotificationsSerializer(serializers.ModelSerializer):
3073-
product = serializers.PrimaryKeyRelatedField(
3074-
queryset=Product.objects.all(),
3075-
required=False,
3076-
default=None,
3077-
allow_null=True,
3078-
)
3079-
user = serializers.PrimaryKeyRelatedField(
3080-
queryset=Dojo_User.objects.all(),
3081-
required=False,
3082-
default=None,
3083-
allow_null=True,
3084-
)
3085-
product_type_added = MultipleChoiceField(
3086-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3087-
)
3088-
product_added = MultipleChoiceField(
3089-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3090-
)
3091-
engagement_added = MultipleChoiceField(
3092-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3093-
)
3094-
test_added = MultipleChoiceField(
3095-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3096-
)
3097-
scan_added = MultipleChoiceField(
3098-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3099-
)
3100-
jira_update = MultipleChoiceField(
3101-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3102-
)
3103-
upcoming_engagement = MultipleChoiceField(
3104-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3105-
)
3106-
stale_engagement = MultipleChoiceField(
3107-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3108-
)
3109-
auto_close_engagement = MultipleChoiceField(
3110-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3111-
)
3112-
close_engagement = MultipleChoiceField(
3113-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3114-
)
3115-
user_mentioned = MultipleChoiceField(
3116-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3117-
)
3118-
code_review = MultipleChoiceField(
3119-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3120-
)
3121-
review_requested = MultipleChoiceField(
3122-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3123-
)
3124-
other = MultipleChoiceField(
3125-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3126-
)
3127-
sla_breach = MultipleChoiceField(
3128-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3129-
)
3130-
sla_breach_combined = MultipleChoiceField(
3131-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3132-
)
3133-
risk_acceptance_expiration = MultipleChoiceField(
3134-
choices=NOTIFICATION_CHOICES, default=DEFAULT_NOTIFICATION,
3135-
)
3136-
template = serializers.BooleanField(default=False)
3137-
3138-
class Meta:
3139-
model = Notifications
3140-
fields = "__all__"
3141-
3142-
def validate(self, data):
3143-
user = None
3144-
product = None
3145-
template = False
3146-
3147-
if self.instance is not None:
3148-
user = self.instance.user
3149-
product = self.instance.product
3150-
3151-
if "user" in data:
3152-
user = data.get("user")
3153-
if "product" in data:
3154-
product = data.get("product")
3155-
if "template" in data:
3156-
template = data.get("template")
3157-
3158-
if (
3159-
template
3160-
and Notifications.objects.filter(template=True).count() > 0
3161-
):
3162-
msg = "Notification template already exists"
3163-
raise ValidationError(msg)
3164-
if (
3165-
self.instance is None
3166-
or user != self.instance.user
3167-
or product != self.instance.product
3168-
):
3169-
notifications = Notifications.objects.filter(
3170-
user=user, product=product, template=template,
3171-
).count()
3172-
if notifications > 0:
3173-
msg = "Notification for user and product already exists"
3174-
raise ValidationError(msg)
3175-
return data
3068+
from dojo.notifications.api.serializer import NotificationsSerializer # noqa: E402, F401 -- backward compat
31763069

31773070

31783071
class EngagementPresetsSerializer(serializers.ModelSerializer):
@@ -3349,7 +3242,4 @@ def create(self, validated_data):
33493242
raise
33503243

33513244

3352-
class NotificationWebhooksSerializer(serializers.ModelSerializer):
3353-
class Meta:
3354-
model = Notification_Webhooks
3355-
fields = "__all__"
3245+
from dojo.notifications.api.serializer import NotificationWebhooksSerializer # noqa: E402, F401 -- backward compat

dojo/api_v2/views.py

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,6 @@
119119
Note_Type,
120120
NoteHistory,
121121
Notes,
122-
Notification_Webhooks,
123-
Notifications,
124122
Product,
125123
Product_API_Scan_Configuration,
126124
Product_Group,
@@ -3406,21 +3404,6 @@ def queue_task_purge(self, request):
34063404
return Response({"purged": purged})
34073405

34083406

3409-
# Authorization: superuser
3410-
@extend_schema_view(**schema_with_prefetch())
3411-
class NotificationsViewSet(
3412-
PrefetchDojoModelViewSet,
3413-
):
3414-
serializer_class = serializers.NotificationsSerializer
3415-
queryset = Notifications.objects.none()
3416-
filter_backends = (DjangoFilterBackend,)
3417-
filterset_fields = ["id", "user", "product", "template"]
3418-
permission_classes = (permissions.IsSuperUser, DjangoModelPermissions)
3419-
3420-
def get_queryset(self):
3421-
return Notifications.objects.all().order_by("id")
3422-
3423-
34243407
@extend_schema_view(**schema_with_prefetch())
34253408
class EngagementPresetsViewset(
34263409
PrefetchDojoModelViewSet,
@@ -3683,13 +3666,3 @@ class AnnouncementViewSet(
36833666

36843667
def get_queryset(self):
36853668
return Announcement.objects.all().order_by("id")
3686-
3687-
3688-
class NotificationWebhooksViewSet(
3689-
PrefetchDojoModelViewSet,
3690-
):
3691-
serializer_class = serializers.NotificationWebhooksSerializer
3692-
queryset = Notification_Webhooks.objects.all()
3693-
filter_backends = (DjangoFilterBackend,)
3694-
filterset_fields = "__all__"
3695-
permission_classes = (permissions.IsSuperUser, DjangoModelPermissions) # TODO: add permission also for other users

dojo/apps.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ def ready(self):
8484
import dojo.file_uploads.signals # noqa: PLC0415, F401 raised: AppRegistryNotReady
8585
import dojo.finding_group.signals # noqa: PLC0415, F401 raised: AppRegistryNotReady
8686
import dojo.notes.signals # noqa: PLC0415, F401 raised: AppRegistryNotReady
87+
import dojo.notifications.admin # noqa: PLC0415, F401 raised: AppRegistryNotReady
88+
import dojo.notifications.signals # noqa: PLC0415, F401 raised: AppRegistryNotReady
8789
import dojo.product.signals # noqa: PLC0415, F401 raised: AppRegistryNotReady
8890
import dojo.product_type.signals # noqa: PLC0415, F401 raised: AppRegistryNotReady
8991
import dojo.risk_acceptance.signals # noqa: PLC0415, F401 raised: AppRegistryNotReady

dojo/context_processors.py

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
import contextlib
2-
import time
32

43
# import the settings file
54
from django.conf import settings
65
from django.contrib import messages
76

87
from dojo.announcement.os_message import get_os_banner
98
from dojo.labels import get_labels
10-
from dojo.models import Alerts, System_Settings, UserAnnouncement
9+
from dojo.models import System_Settings, UserAnnouncement
1110

1211

1312
def globalize_vars(request):
@@ -70,14 +69,6 @@ def bind_system_settings(request):
7069
return {"system_settings": system_settings}
7170

7271

73-
def bind_alert_count(request):
74-
if not settings.DISABLE_ALERT_COUNTER:
75-
76-
if hasattr(request, "user") and request.user.is_authenticated:
77-
return {"alert_count": Alerts.objects.filter(user_id=request.user).count()}
78-
return {}
79-
80-
8172
def bind_announcement(request):
8273
with contextlib.suppress(Exception): # TODO: this should be replaced with more meaningful exception
8374
if request.user.is_authenticated:
@@ -88,21 +79,10 @@ def bind_announcement(request):
8879
return {}
8980

9081

91-
def session_expiry_notification(request):
92-
try:
93-
if request.user.is_authenticated:
94-
last_activity = request.session.get("_last_activity", time.time())
95-
expiry_time = last_activity + settings.SESSION_COOKIE_AGE # When the session will expire
96-
warning_time = settings.SESSION_EXPIRE_WARNING # Show warning X seconds before expiry
97-
notify_time = expiry_time - warning_time
98-
else:
99-
notify_time = None
100-
except Exception:
101-
return {}
102-
else:
103-
return {
104-
"session_notify_time": notify_time,
105-
}
82+
from dojo.notifications.context_processors import ( # noqa: E402, F401 -- backward compat
83+
bind_alert_count,
84+
session_expiry_notification,
85+
)
10686

10787

10888
def labels(request):

0 commit comments

Comments
 (0)