Skip to content

Commit afa58cf

Browse files
authored
Merge pull request #10648 from DefectDojo/master-into-dev/2.36.6-2.37.0-dev
Release: Merge back 2.36.6 into dev from: master-into-dev/2.36.6-2.37.0-dev
2 parents 4b60cef + 11171d8 commit afa58cf

Some content is hidden

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

53 files changed

+4886
-662
lines changed

.github/workflows/refresh_helm_lock_file.yaml

Lines changed: 0 additions & 40 deletions
This file was deleted.

dojo/api_v2/views.py

Lines changed: 4 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@
164164
from dojo.user.utils import get_configuration_permissions_codenames
165165
from dojo.utils import (
166166
async_delete,
167+
generate_file_response,
167168
get_setting,
168169
get_system_setting,
169170
)
@@ -646,21 +647,8 @@ def download_file(self, request, file_id, pk=None):
646647
{"error": "File ID not associated with Engagement"},
647648
status=status.HTTP_404_NOT_FOUND,
648649
)
649-
# Get the path of the file in media root
650-
file_path = f"{settings.MEDIA_ROOT}/{file_object.file.url.lstrip(settings.MEDIA_URL)}"
651-
file_handle = open(file_path, "rb")
652650
# send file
653-
response = FileResponse(
654-
file_handle,
655-
content_type=f"{mimetypes.guess_type(file_path)}",
656-
status=status.HTTP_200_OK,
657-
)
658-
response["Content-Length"] = file_object.file.size
659-
response[
660-
"Content-Disposition"
661-
] = f'attachment; filename="{file_object.file.name}"'
662-
663-
return response
651+
return generate_file_response(file_object)
664652

665653

666654
class RiskAcceptanceViewSet(
@@ -1156,21 +1144,8 @@ def download_file(self, request, file_id, pk=None):
11561144
{"error": "File ID not associated with Finding"},
11571145
status=status.HTTP_404_NOT_FOUND,
11581146
)
1159-
# Get the path of the file in media root
1160-
file_path = f"{settings.MEDIA_ROOT}/{file_object.file.url.lstrip(settings.MEDIA_URL)}"
1161-
file_handle = open(file_path, "rb")
11621147
# send file
1163-
response = FileResponse(
1164-
file_handle,
1165-
content_type=f"{mimetypes.guess_type(file_path)}",
1166-
status=status.HTTP_200_OK,
1167-
)
1168-
response["Content-Length"] = file_object.file.size
1169-
response[
1170-
"Content-Disposition"
1171-
] = f'attachment; filename="{file_object.file.name}"'
1172-
1173-
return response
1148+
return generate_file_response(file_object)
11741149

11751150
@extend_schema(
11761151
request=serializers.FindingNoteSerializer,
@@ -2319,21 +2294,8 @@ def download_file(self, request, file_id, pk=None):
23192294
{"error": "File ID not associated with Test"},
23202295
status=status.HTTP_404_NOT_FOUND,
23212296
)
2322-
# Get the path of the file in media root
2323-
file_path = f"{settings.MEDIA_ROOT}/{file_object.file.url.lstrip(settings.MEDIA_URL)}"
2324-
file_handle = open(file_path, "rb")
23252297
# send file
2326-
response = FileResponse(
2327-
file_handle,
2328-
content_type=f"{mimetypes.guess_type(file_path)}",
2329-
status=status.HTTP_200_OK,
2330-
)
2331-
response["Content-Length"] = file_object.file.size
2332-
response[
2333-
"Content-Disposition"
2334-
] = f'attachment; filename="{file_object.file.name}"'
2335-
2336-
return response
2298+
return generate_file_response(file_object)
23372299

23382300

23392301
# Authorization: authenticated, configuration

dojo/apps.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,14 +72,19 @@ def ready(self):
7272
# Load any signals here that will be ready for runtime
7373
# Importing the signals file is good enough if using the reciever decorator
7474
import dojo.announcement.signals # noqa: F401
75+
import dojo.benchmark.signals # noqa: F401
76+
import dojo.cred.signals # noqa: F401
7577
import dojo.endpoint.signals # noqa: F401
7678
import dojo.engagement.signals # noqa: F401
7779
import dojo.finding_group.signals # noqa: F401
80+
import dojo.notes.signals # noqa: F401
7881
import dojo.product.signals # noqa: F401
7982
import dojo.product_type.signals # noqa: F401
83+
import dojo.risk_acceptance.signals # noqa: F401
8084
import dojo.sla_config.helpers # noqa: F401
8185
import dojo.tags_signals # noqa: F401
8286
import dojo.test.signals # noqa: F401
87+
import dojo.tool_product.signals # noqa: F401
8388

8489

8590
def get_model_fields_with_extra(model, extra_fields=()):

dojo/benchmark/signals.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import logging
2+
3+
from django.db.models.signals import pre_delete
4+
from django.dispatch import receiver
5+
6+
from dojo.models import Benchmark_Product
7+
from dojo.notes.helper import delete_related_notes
8+
9+
logger = logging.getLogger(__name__)
10+
11+
12+
@receiver(pre_delete, sender=Benchmark_Product)
13+
def benchmark_product_pre_delete(sender, instance, **kwargs):
14+
delete_related_notes(instance)

dojo/benchmark/views.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ def add_benchmark(queryset, product):
4343
pass
4444

4545

46+
@user_is_authorized(Product, Permissions.Benchmark_Edit, "pid")
4647
def update_benchmark(request, pid, _type):
4748
if request.method == "POST":
4849
bench_id = request.POST.get("bench_id")
@@ -90,6 +91,7 @@ def update_benchmark(request, pid, _type):
9091
)
9192

9293

94+
@user_is_authorized(Product, Permissions.Benchmark_Edit, "pid")
9395
def update_benchmark_summary(request, pid, _type, summary):
9496
if request.method == "POST":
9597
field = request.POST.get("field")

dojo/components/views.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,5 +70,6 @@ def components(request):
7070
"filter": comp_filter,
7171
"result": result,
7272
"component_words": sorted(set(component_words)),
73+
"enable_table_filtering": get_system_setting("enable_ui_table_based_searching"),
7374
},
7475
)

dojo/cred/signals.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import logging
2+
3+
from django.db.models.signals import pre_delete
4+
from django.dispatch import receiver
5+
6+
from dojo.models import Cred_User
7+
from dojo.notes.helper import delete_related_notes
8+
9+
logger = logging.getLogger(__name__)
10+
11+
12+
@receiver(pre_delete, sender=Cred_User)
13+
def cred_user_pre_delete(sender, instance, **kwargs):
14+
delete_related_notes(instance)

dojo/cred/views.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ def view_cred_details(request, ttid):
113113
"form": form,
114114
"notes": notes,
115115
"cred_products": cred_products,
116+
"person": request.user.username,
116117
})
117118

118119

@@ -650,7 +651,7 @@ def delete_cred_controller(request, destination_url, id, ttid):
650651
if id:
651652
product = None
652653
if destination_url == "all_cred_product":
653-
product = get_object_or_404(Product, id)
654+
product = get_object_or_404(Product, id=id)
654655
elif destination_url == "view_engagement":
655656
engagement = get_object_or_404(Engagement, id=id)
656657
product = engagement.product
@@ -669,7 +670,7 @@ def delete_cred_controller(request, destination_url, id, ttid):
669670

670671
@user_is_authorized(Cred_User, Permissions.Credential_Delete, "ttid")
671672
def delete_cred(request, ttid):
672-
return delete_cred_controller(request, "cred", 0, ttid)
673+
return delete_cred_controller(request, "cred", 0, ttid=ttid)
673674

674675

675676
@user_is_authorized(Product, Permissions.Product_Edit, "pid")
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 4.2.13 on 2024-07-23 19:53
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('dojo', '0212_sla_configuration_enforce_critical_and_more'),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name='system_settings',
15+
name='enable_ui_table_based_searching',
16+
field=models.BooleanField(default=True, help_text='With this setting enabled, table headings will contain sort buttons for the current page of data in addition to sorting buttons that consider data from all pages.', verbose_name='Enable UI Table Based Filtering/Sorting'),
17+
),
18+
]

dojo/engagement/signals.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
from auditlog.models import LogEntry
22
from django.conf import settings
33
from django.contrib.contenttypes.models import ContentType
4-
from django.db.models.signals import post_delete, post_save, pre_save
4+
from django.db.models.signals import post_delete, post_save, pre_delete, pre_save
55
from django.dispatch import receiver
66
from django.urls import reverse
77
from django.utils.translation import gettext as _
88

99
from dojo.models import Engagement
10+
from dojo.notes.helper import delete_related_notes
1011
from dojo.notifications.helper import create_notification
1112

1213

@@ -55,3 +56,8 @@ def engagement_post_delete(sender, instance, using, origin, **kwargs):
5556
url=reverse("view_product", args=(instance.product.id, )),
5657
recipients=[instance.lead],
5758
icon="exclamation-triangle")
59+
60+
61+
@receiver(pre_delete, sender=Engagement)
62+
def engagement_pre_delete(sender, instance, **kwargs):
63+
delete_related_notes(instance)

0 commit comments

Comments
 (0)