11from abc import ABC , abstractmethod
22from typing import NamedTuple
33
4+ from django .core .exceptions import PermissionDenied
45from django .db .models import QuerySet
56from django .utils import timezone
67from drf_spectacular .utils import extend_schema
78from rest_framework import serializers , status
89from rest_framework .decorators import action
9- from rest_framework .permissions import IsAdminUser
10+ from rest_framework .permissions import IsAuthenticated
1011from rest_framework .response import Response
1112
13+ from dojo .api_v2 .permissions import UserHasRiskAcceptancePermission
1214from dojo .api_v2 .serializers import RiskAcceptanceSerializer
1315from dojo .authorization .roles_permissions import Permissions
1416from dojo .engagement .queries import get_authorized_engagements
@@ -40,10 +42,14 @@ def risk_application_model_class(self):
4042 request = AcceptedRiskSerializer (many = True ),
4143 responses = {status .HTTP_201_CREATED : RiskAcceptanceSerializer (many = True )},
4244 )
43- @action (methods = ["post" ], detail = True , permission_classes = [ IsAdminUser ], serializer_class = AcceptedRiskSerializer ,
44- filter_backends = [], pagination_class = None )
45+ @action (methods = ["post" ], detail = True , permission_classes = ( IsAuthenticated , UserHasRiskAcceptancePermission ) ,
46+ serializer_class = AcceptedRiskSerializer , filter_backends = [], pagination_class = None )
4547 def accept_risks (self , request , pk = None ):
4648 model = self .get_object ()
49+ product = model .product if hasattr (model , "product" ) else model .engagement .product
50+ if not product .enable_full_risk_acceptance :
51+ msg = "Full risk acceptance is not enabled for this product"
52+ raise PermissionDenied (msg )
4753 serializer = AcceptedRiskSerializer (data = request .data , many = True )
4854 if serializer .is_valid ():
4955 accepted_risks = serializer .save ()
@@ -63,7 +69,7 @@ class AcceptedFindingsMixin(ABC):
6369 request = AcceptedRiskSerializer (many = True ),
6470 responses = {status .HTTP_201_CREATED : RiskAcceptanceSerializer (many = True )},
6571 )
66- @action (methods = ["post" ], detail = False , permission_classes = [IsAdminUser ], serializer_class = AcceptedRiskSerializer )
72+ @action (methods = ["post" ], detail = False , permission_classes = [IsAuthenticated ], serializer_class = AcceptedRiskSerializer )
6773 def accept_risks (self , request ):
6874 serializer = AcceptedRiskSerializer (data = request .data , many = True )
6975 if serializer .is_valid ():
@@ -72,7 +78,9 @@ def accept_risks(self, request):
7278 return Response (data = serializer .errors , status = status .HTTP_400_BAD_REQUEST )
7379 owner = request .user
7480 accepted_result = []
75- for engagement in get_authorized_engagements (Permissions .Engagement_View ):
81+ for engagement in get_authorized_engagements (Permissions .Risk_Acceptance ):
82+ if not engagement .product .enable_full_risk_acceptance :
83+ continue
7684 base_findings = engagement .unaccepted_open_findings
7785 accepted = _accept_risks (accepted_risks , base_findings , owner )
7886 engagement .accept_risks (accepted )
0 commit comments