Skip to content

Commit 008456a

Browse files
Fix risk acceptance API to link to engagement and add validations
Fixes #12644 This commit addresses several issues with the risk acceptance API: 1. Risk acceptances created via API now appear in engagement panel - Added engagement.risk_acceptance.add(instance) in create() method - Fixes the main bug where API-created risk acceptances were orphaned 2. Added validation for enable_full_risk_acceptance product setting - API now respects the product-level setting before creating instances - Validates in validate() method to fail early 3. Added protection against engagement switching - Prevents moving risk acceptances between engagements via PATCH/PUT - Validates even when risk acceptance has no findings (edge case) 4. Performance improvement - Use self.instance.accepted_findings.all() instead of filtering 5. Comprehensive API tests - Added test_risk_acceptance_api.py with 7 test cases - Covers all edge cases and validation scenarios - All tests passing Changes: - dojo/api_v2/serializers.py: Enhanced RiskAcceptanceSerializer - unittests/test_risk_acceptance_api.py: New comprehensive test suite
1 parent 179abcc commit 008456a

2 files changed

Lines changed: 383 additions & 1 deletion

File tree

dojo/api_v2/serializers.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1555,6 +1555,12 @@ def create(self, validated_data):
15551555
instance = super().create(validated_data)
15561556
user = getattr(self.context.get("request", None), "user", None)
15571557
ra_helper.add_findings_to_risk_acceptance(user, instance, instance.accepted_findings.all())
1558+
1559+
# Add risk acceptance to engagement
1560+
if instance.accepted_findings.exists():
1561+
engagement = instance.accepted_findings.first().test.engagement
1562+
engagement.risk_acceptance.add(instance)
1563+
15581564
return instance
15591565

15601566
def update(self, instance, validated_data):
@@ -1616,10 +1622,26 @@ def validate_findings_have_same_engagement(finding_objects: list[Finding]):
16161622
raise PermissionDenied(msg)
16171623
if self.context["request"].method == "POST":
16181624
validate_findings_have_same_engagement(finding_objects)
1625+
1626+
# Validate product allows full risk acceptance BEFORE creating instance
1627+
if finding_objects.exists():
1628+
engagement = finding_objects.first().test.engagement
1629+
if not engagement.product.enable_full_risk_acceptance:
1630+
msg = "Full risk acceptance is not enabled for this product"
1631+
raise PermissionDenied(msg)
16191632
elif self.context["request"].method in {"PATCH", "PUT"}:
1620-
existing_findings = Finding.objects.filter(risk_acceptance=self.instance.id)
1633+
# Use the reverse relation instead of filtering
1634+
existing_findings = self.instance.accepted_findings.all()
16211635
existing_and_new_findings = existing_findings | finding_objects
16221636
validate_findings_have_same_engagement(existing_and_new_findings)
1637+
1638+
# Explicit check to prevent engagement switching
1639+
risk_acceptance_engagement = self.instance.engagement
1640+
if risk_acceptance_engagement and finding_objects.exists():
1641+
new_findings_engagement = finding_objects.first().test.engagement
1642+
if risk_acceptance_engagement.id != new_findings_engagement.id:
1643+
msg = f"Risk Acceptance belongs to engagement {risk_acceptance_engagement.id}. Cannot add findings from engagement {new_findings_engagement.id}"
1644+
raise ValidationError(msg)
16231645
return data
16241646

16251647
class Meta:

0 commit comments

Comments
 (0)