Skip to content

Commit 198e656

Browse files
committed
refactor/rework text copy labels and urls
1 parent 77834f3 commit 198e656

Some content is hidden

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

45 files changed

+1699
-3999
lines changed

.github/workflows/integration-tests.yml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,6 @@ jobs:
4848
"tests/organization_group_test.py",
4949
"tests/organization_member_test.py",
5050
"tests/organization_test.py",
51-
# v2; can be removed after v3 migration complete
52-
"tests/report_builder_test_v2.py",
5351
]
5452
os: [alpine, debian]
5553
fail-fast: false
File renamed without changes.
File renamed without changes.

dojo/v3_migration/api_v2/filters.py renamed to dojo/asset/api/filters.py

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,6 @@
1717
Product_API_Scan_Configuration,
1818
Product_Group,
1919
Product_Member,
20-
Product_Type,
21-
Product_Type_Group,
22-
Product_Type_Member,
2320
)
2421

2522
labels = get_labels()
@@ -116,34 +113,9 @@ class Meta:
116113
fields = ("id", "user_id")
117114

118115

119-
class OrganizationFilterSet(FilterSet):
120-
critical_asset = BooleanFilter(field_name="critical_product")
121-
key_asset = BooleanFilter(field_name="key_product")
122-
123-
class Meta:
124-
model = Product_Type
125-
fields = ("id", "name", "created", "updated")
126-
127-
128116
class AssetGroupFilterSet(FilterSet):
129117
asset_id = NumberFilter(field_name="product_id")
130118

131119
class Meta:
132120
model = Product_Group
133121
fields = ("id", "group_id")
134-
135-
136-
class OrganizationMemberFilterSet(FilterSet):
137-
organization_id = NumberFilter(field_name="product_type_id")
138-
139-
class Meta:
140-
model = Product_Type_Member
141-
fields = ("id", "user_id")
142-
143-
144-
class OrganizationGroupFilterSet(FilterSet):
145-
asset_type_id = NumberFilter(field_name="product_type_id")
146-
147-
class Meta:
148-
model = Product_Type_Group
149-
fields = ("id", "group_id")

dojo/v3_migration/api_v2/serializers.py renamed to dojo/asset/api/serializers.py

Lines changed: 1 addition & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -10,24 +10,16 @@
1010
Product_API_Scan_Configuration,
1111
Product_Group,
1212
Product_Member,
13-
Product_Type,
14-
Product_Type_Group,
15-
Product_Type_Member,
1613
)
14+
from dojo.organization.api.serializers import RelatedOrganizationField
1715
from dojo.product.queries import get_authorized_products
18-
from dojo.product_type.queries import get_authorized_product_types
1916

2017

2118
class RelatedAssetField(serializers.PrimaryKeyRelatedField):
2219
def get_queryset(self):
2320
return get_authorized_products(Permissions.Product_View)
2421

2522

26-
class RelatedOrganizationField(serializers.PrimaryKeyRelatedField):
27-
def get_queryset(self):
28-
return get_authorized_product_types(Permissions.Product_Type_View)
29-
30-
3123
class AssetAPIScanConfigurationSerializer(serializers.ModelSerializer):
3224
asset = RelatedAssetField(source="product")
3325

@@ -166,110 +158,3 @@ def validate(self, data):
166158
raise PermissionDenied(msg)
167159

168160
return data
169-
170-
171-
class OrganizationMemberSerializer(serializers.ModelSerializer):
172-
organization = RelatedOrganizationField(source="product_type")
173-
174-
class Meta:
175-
model = Product_Type_Member
176-
exclude = ("product_type",)
177-
178-
def validate(self, data):
179-
if (
180-
self.instance is not None
181-
and data.get("organization") != self.instance.product_type
182-
and not user_has_permission(
183-
self.context["request"].user,
184-
data.get("organization"),
185-
Permissions.Product_Type_Manage_Members,
186-
)
187-
):
188-
msg = "You are not permitted to add a member to this Organization"
189-
raise PermissionDenied(msg)
190-
191-
if (
192-
self.instance is None
193-
or data.get("organization") != self.instance.product_type
194-
or data.get("user") != self.instance.user
195-
):
196-
members = Product_Type_Member.objects.filter(
197-
product_type=data.get("organization"), user=data.get("user"),
198-
)
199-
if members.count() > 0:
200-
msg = "Organization Member already exists"
201-
raise ValidationError(msg)
202-
203-
if self.instance is not None and not data.get("role").is_owner:
204-
owners = (
205-
Product_Type_Member.objects.filter(
206-
product_type=data.get("organization"), role__is_owner=True,
207-
)
208-
.exclude(id=self.instance.id)
209-
.count()
210-
)
211-
if owners < 1:
212-
msg = "There must be at least one owner"
213-
raise ValidationError(msg)
214-
215-
if data.get("role").is_owner and not user_has_permission(
216-
self.context["request"].user,
217-
data.get("organization"),
218-
Permissions.Product_Type_Member_Add_Owner,
219-
):
220-
msg = "You are not permitted to add a member as Owner to this Organization"
221-
raise PermissionDenied(msg)
222-
223-
return data
224-
225-
226-
class OrganizationGroupSerializer(serializers.ModelSerializer):
227-
organization = RelatedOrganizationField(source="product_type")
228-
229-
class Meta:
230-
model = Product_Type_Group
231-
exclude = ("product_type",)
232-
233-
def validate(self, data):
234-
if (
235-
self.instance is not None
236-
and data.get("organization") != self.instance.product_type
237-
and not user_has_permission(
238-
self.context["request"].user,
239-
data.get("organization"),
240-
Permissions.Product_Type_Group_Add,
241-
)
242-
):
243-
msg = "You are not permitted to add a group to this Organization"
244-
raise PermissionDenied(msg)
245-
246-
if (
247-
self.instance is None
248-
or data.get("organization") != self.instance.product_type
249-
or data.get("group") != self.instance.group
250-
):
251-
members = Product_Type_Group.objects.filter(
252-
product_type=data.get("organization"), group=data.get("group"),
253-
)
254-
if members.count() > 0:
255-
msg = "Organization Group already exists"
256-
raise ValidationError(msg)
257-
258-
if data.get("role").is_owner and not user_has_permission(
259-
self.context["request"].user,
260-
data.get("organization"),
261-
Permissions.Product_Type_Group_Add_Owner,
262-
):
263-
msg = "You are not permitted to add a group as Owner to this Organization"
264-
raise PermissionDenied(msg)
265-
266-
return data
267-
268-
269-
class OrganizationSerializer(serializers.ModelSerializer):
270-
critical_asset = serializers.BooleanField(source="critical_product")
271-
key_asset = serializers.BooleanField(source="key_product")
272-
273-
class Meta:
274-
model = Product_Type
275-
exclude = ("critical_product", "key_product")

dojo/asset/api/urls.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from dojo.asset.api.views import (
2+
AssetAPIScanConfigurationViewSet,
3+
AssetGroupViewSet,
4+
AssetMemberViewSet,
5+
AssetViewSet,
6+
)
7+
8+
9+
def add_asset_urls(router):
10+
router.register(r"assets", AssetViewSet, basename="asset")
11+
router.register(r"asset_api_scan_configurations", AssetAPIScanConfigurationViewSet,
12+
basename="asset_api_scan_configuration")
13+
router.register(r"asset_groups", AssetGroupViewSet, basename="asset_group")
14+
router.register(r"asset_members", AssetMemberViewSet, basename="asset_member")
15+
return router

dojo/asset/api/views.py

Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
from django_filters.rest_framework import DjangoFilterBackend
2+
from drf_spectacular.utils import extend_schema, extend_schema_view
3+
from rest_framework import mixins, status, viewsets
4+
from rest_framework.decorators import action
5+
from rest_framework.permissions import IsAuthenticated
6+
from rest_framework.response import Response
7+
8+
import dojo.api_v2.mixins as dojo_mixins
9+
from dojo.api_v2 import permissions, prefetch
10+
from dojo.api_v2.serializers import ReportGenerateOptionSerializer, ReportGenerateSerializer
11+
from dojo.api_v2.views import PrefetchDojoModelViewSet, report_generate, schema_with_prefetch
12+
from dojo.asset.api import serializers
13+
from dojo.asset.api.filters import (
14+
ApiAssetFilter,
15+
AssetAPIScanConfigurationFilterSet,
16+
AssetGroupFilterSet,
17+
AssetMemberFilterSet,
18+
)
19+
from dojo.authorization.roles_permissions import Permissions
20+
from dojo.models import (
21+
Product,
22+
Product_API_Scan_Configuration,
23+
Product_Group,
24+
Product_Member,
25+
)
26+
from dojo.product.queries import (
27+
get_authorized_product_api_scan_configurations,
28+
get_authorized_product_groups,
29+
get_authorized_product_members,
30+
get_authorized_products,
31+
)
32+
from dojo.utils import async_delete, get_setting
33+
34+
35+
# Authorization: object-based
36+
@extend_schema_view(**schema_with_prefetch())
37+
class AssetAPIScanConfigurationViewSet(
38+
PrefetchDojoModelViewSet,
39+
):
40+
serializer_class = serializers.AssetAPIScanConfigurationSerializer
41+
queryset = Product_API_Scan_Configuration.objects.none()
42+
filter_backends = (DjangoFilterBackend,)
43+
filterset_class = AssetAPIScanConfigurationFilterSet
44+
permission_classes = (
45+
IsAuthenticated,
46+
permissions.UserHasProductAPIScanConfigurationPermission,
47+
)
48+
49+
def get_queryset(self):
50+
return get_authorized_product_api_scan_configurations(
51+
Permissions.Product_API_Scan_Configuration_View,
52+
)
53+
54+
55+
@extend_schema_view(**schema_with_prefetch())
56+
class AssetViewSet(
57+
prefetch.PrefetchListMixin,
58+
prefetch.PrefetchRetrieveMixin,
59+
mixins.CreateModelMixin,
60+
mixins.DestroyModelMixin,
61+
mixins.UpdateModelMixin,
62+
viewsets.GenericViewSet,
63+
dojo_mixins.DeletePreviewModelMixin,
64+
):
65+
serializer_class = serializers.AssetSerializer
66+
queryset = Product.objects.none()
67+
filter_backends = (DjangoFilterBackend,)
68+
filterset_class = ApiAssetFilter
69+
permission_classes = (
70+
IsAuthenticated,
71+
permissions.UserHasProductPermission,
72+
)
73+
74+
def get_queryset(self):
75+
return get_authorized_products(Permissions.Product_View).distinct()
76+
77+
def destroy(self, request, *args, **kwargs):
78+
instance = self.get_object()
79+
if get_setting("ASYNC_OBJECT_DELETE"):
80+
async_del = async_delete()
81+
async_del.delete(instance)
82+
else:
83+
instance.delete()
84+
return Response(status=status.HTTP_204_NO_CONTENT)
85+
86+
# def list(self, request):
87+
# # Note the use of `get_queryset()` instead of `self.queryset`
88+
# queryset = self.get_queryset()
89+
# serializer = self.serializer_class(queryset, many=True)
90+
# return Response(serializer.data)
91+
92+
@extend_schema(
93+
request=ReportGenerateOptionSerializer,
94+
responses={status.HTTP_200_OK: ReportGenerateSerializer},
95+
)
96+
@action(
97+
detail=True, methods=["post"], permission_classes=[IsAuthenticated],
98+
)
99+
def generate_report(self, request, pk=None):
100+
product = self.get_object()
101+
102+
options = {}
103+
# prepare post data
104+
report_options = ReportGenerateOptionSerializer(
105+
data=request.data,
106+
)
107+
if report_options.is_valid():
108+
options["include_finding_notes"] = report_options.validated_data[
109+
"include_finding_notes"
110+
]
111+
options["include_finding_images"] = report_options.validated_data[
112+
"include_finding_images"
113+
]
114+
options[
115+
"include_executive_summary"
116+
] = report_options.validated_data["include_executive_summary"]
117+
options[
118+
"include_table_of_contents"
119+
] = report_options.validated_data["include_table_of_contents"]
120+
else:
121+
return Response(
122+
report_options.errors, status=status.HTTP_400_BAD_REQUEST,
123+
)
124+
125+
data = report_generate(request, product, options)
126+
report = ReportGenerateSerializer(data)
127+
return Response(report.data)
128+
129+
130+
# Authorization: object-based
131+
@extend_schema_view(**schema_with_prefetch())
132+
class AssetMemberViewSet(
133+
PrefetchDojoModelViewSet,
134+
):
135+
serializer_class = serializers.AssetMemberSerializer
136+
queryset = Product_Member.objects.none()
137+
filter_backends = (DjangoFilterBackend,)
138+
filterset_class = AssetMemberFilterSet
139+
permission_classes = (
140+
IsAuthenticated,
141+
permissions.UserHasProductMemberPermission,
142+
)
143+
144+
def get_queryset(self):
145+
return get_authorized_product_members(
146+
Permissions.Product_View,
147+
).distinct()
148+
149+
@extend_schema(
150+
exclude=True,
151+
)
152+
def partial_update(self, request, pk=None):
153+
# Object authorization won't work if not all data is provided
154+
response = {"message": "Patch function is not offered in this path."}
155+
return Response(response, status=status.HTTP_405_METHOD_NOT_ALLOWED)
156+
157+
158+
# Authorization: object-based
159+
@extend_schema_view(**schema_with_prefetch())
160+
class AssetGroupViewSet(
161+
PrefetchDojoModelViewSet,
162+
):
163+
serializer_class = serializers.AssetGroupSerializer
164+
queryset = Product_Group.objects.none()
165+
filter_backends = (DjangoFilterBackend,)
166+
filterset_class = AssetGroupFilterSet
167+
permission_classes = (
168+
IsAuthenticated,
169+
permissions.UserHasProductGroupPermission,
170+
)
171+
172+
def get_queryset(self):
173+
return get_authorized_product_groups(
174+
Permissions.Product_Group_View,
175+
).distinct()
176+
177+
@extend_schema(
178+
exclude=True,
179+
)
180+
def partial_update(self, request, pk=None):
181+
# Object authorization won't work if not all data is provided
182+
response = {"message": "Patch function is not offered in this path."}
183+
return Response(response, status=status.HTTP_405_METHOD_NOT_ALLOWED)

0 commit comments

Comments
 (0)