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 UserHasRiskAcceptanceRelatedObjectPermission
1214from dojo .api_v2 .serializers import RiskAcceptanceSerializer
1315from dojo .authorization .roles_permissions import Permissions
1416from dojo .engagement .queries import get_authorized_engagements
15- from dojo .models import Risk_Acceptance , User , Vulnerability_Id
17+ from dojo .models import Engagement , Risk_Acceptance , User , Vulnerability_Id
1618
1719AcceptedRisk = NamedTuple ("AcceptedRisk" , (("vulnerability_id" , str ), ("justification" , str ), ("accepted_by" , str )))
1820
@@ -40,10 +42,13 @@ 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 , UserHasRiskAcceptanceRelatedObjectPermission ] ,
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 isinstance (model , Engagement ) else model .engagement .product
50+ if not product .enable_full_risk_acceptance :
51+ raise PermissionDenied
4752 serializer = AcceptedRiskSerializer (data = request .data , many = True )
4853 if serializer .is_valid ():
4954 accepted_risks = serializer .save ()
@@ -63,7 +68,7 @@ class AcceptedFindingsMixin(ABC):
6368 request = AcceptedRiskSerializer (many = True ),
6469 responses = {status .HTTP_201_CREATED : RiskAcceptanceSerializer (many = True )},
6570 )
66- @action (methods = ["post" ], detail = False , permission_classes = [IsAdminUser ], serializer_class = AcceptedRiskSerializer )
71+ @action (methods = ["post" ], detail = False , permission_classes = [IsAuthenticated ], serializer_class = AcceptedRiskSerializer )
6772 def accept_risks (self , request ):
6873 serializer = AcceptedRiskSerializer (data = request .data , many = True )
6974 if serializer .is_valid ():
@@ -72,7 +77,9 @@ def accept_risks(self, request):
7277 return Response (data = serializer .errors , status = status .HTTP_400_BAD_REQUEST )
7378 owner = request .user
7479 accepted_result = []
75- for engagement in get_authorized_engagements (Permissions .Engagement_View ):
80+ for engagement in get_authorized_engagements (Permissions .Risk_Acceptance ):
81+ if not engagement .product .enable_full_risk_acceptance :
82+ continue
7683 base_findings = engagement .unaccepted_open_findings
7784 accepted = _accept_risks (accepted_risks , base_findings , owner )
7885 engagement .accept_risks (accepted )
0 commit comments