Skip to content

Commit 3f13a5a

Browse files
Maffoochclaude
andcommitted
Fix test_apply_finding_template failures
Add inline permission checks to 4 view functions that are called directly by unit tests (bypassing middleware): mktemplate, apply_template_to_finding, choose_finding_template_options, and add_finding_from_template. Revert test changes to keep original test pattern using impersonate + direct view calls. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 0608331 commit 3f13a5a

3 files changed

Lines changed: 32 additions & 36 deletions

File tree

dojo/finding/views.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1721,6 +1721,7 @@ def clear_finding_review(request, fid):
17211721

17221722

17231723
def mktemplate(request, fid):
1724+
user_has_global_permission_or_403(request.user, Permissions.Finding_Add)
17241725
finding = get_object_or_404(Finding, id=fid)
17251726
templates = Finding_Template.objects.filter(title=finding.title)
17261727
if len(templates) > 0:
@@ -1851,6 +1852,7 @@ def find_template_to_apply(request, fid):
18511852

18521853
def choose_finding_template_options(request, tid, fid):
18531854
finding = get_object_or_404(Finding, id=fid)
1855+
user_has_permission_or_403(request.user, finding, Permissions.Finding_Edit)
18541856
template = get_object_or_404(Finding_Template, id=tid)
18551857
data = finding.__dict__.copy()
18561858
# Remove tags and other non-serializable fields
@@ -1938,6 +1940,7 @@ def choose_finding_template_options(request, tid, fid):
19381940

19391941
def apply_template_to_finding(request, fid, tid):
19401942
finding = get_object_or_404(Finding, id=fid)
1943+
user_has_permission_or_403(request.user, finding, Permissions.Finding_Edit)
19411944
template = get_object_or_404(Finding_Template, id=tid)
19421945

19431946
if request.method == "POST":

dojo/test/views.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -658,6 +658,7 @@ def post(self, request: HttpRequest, test_id: int):
658658
def add_finding_from_template(request, tid, fid):
659659
jform = None
660660
test = get_object_or_404(Test, id=tid)
661+
user_has_permission_or_403(request.user, test, Permissions.Finding_Add)
661662
template = get_object_or_404(Finding_Template, id=fid)
662663
findings = Finding_Template.objects.all()
663664
push_all_jira_issues = jira_helper.is_push_all_issues(template)

unittests/test_apply_finding_template.py

Lines changed: 28 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -209,35 +209,32 @@ def test_apply_template_to_finding_with_data_saves_success(self):
209209

210210
def test_unauthorized_apply_template_to_finding_fails(self):
211211
"""Test that a non-superuser without permissions cannot apply template"""
212-
user = FindingTemplateTestUtil.create_user(is_staff=False)
213-
self.client.force_login(user)
214-
url = f"/finding/{self.finding.id}/{self.template.id}/apply_template_to_finding"
215-
response = self.client.post(url, data={
216-
"title": "Finding for Testing Apply Template functionality",
217-
"cwe": "89",
218-
"severity": "High",
219-
"description": "Finding for Testing Apply Template Functionality",
220-
"mitigation": "template mitigation",
221-
"impact": "template impact",
222-
})
223-
self.assertEqual(response.status_code, 403)
212+
with self.assertRaises(PermissionDenied):
213+
self.make_request(user_is_staff=False, finding_id=self.finding.id, template_id=self.template.id,
214+
data={"title": "Finding for Testing Apply Template functionality",
215+
"cwe": "89",
216+
"severity": "High",
217+
"description": "Finding for Testing Apply Template Functionality",
218+
"mitigation": "template mitigation",
219+
"impact": "template impact"},
220+
)
224221

225222
def test_reader_role_cannot_apply_template(self):
226223
"""Test that a Reader role user (read-only) cannot apply template"""
227224
reader_user = FindingTemplateTestUtil.create_user_with_role(
228225
self.finding.test.engagement.product, "Reader", is_staff=False,
229226
)
230-
self.client.force_login(reader_user)
231-
url = f"/finding/{self.finding.id}/{self.template.id}/apply_template_to_finding"
232-
response = self.client.post(url, data={
233-
"title": "Finding for Testing Apply Template functionality",
234-
"cwe": "89",
235-
"severity": "High",
236-
"description": "Finding for Testing Apply Template Functionality",
237-
"mitigation": "template mitigation",
238-
"impact": "template impact",
239-
})
240-
self.assertEqual(response.status_code, 403)
227+
request = FindingTemplateTestUtil.create_post_request(
228+
reader_user, self.apply_template_url,
229+
data={"title": "Finding for Testing Apply Template functionality",
230+
"cwe": "89",
231+
"severity": "High",
232+
"description": "Finding for Testing Apply Template Functionality",
233+
"mitigation": "template mitigation",
234+
"impact": "template impact"},
235+
)
236+
with impersonate(reader_user), self.assertRaises(PermissionDenied):
237+
views.apply_template_to_finding(request, fid=self.finding.id, tid=self.template.id)
241238

242239
def test_writer_role_can_apply_template(self):
243240
"""Test that a Writer role user (non-staff) can apply template"""
@@ -351,11 +348,8 @@ def make_request(self, user_is_staff, finding_id, template_id, data=None):
351348
return views.choose_finding_template_options(request, tid=template_id, fid=finding_id)
352349

353350
def test_unauthorized_choose_finding_template_options_fails(self):
354-
user = FindingTemplateTestUtil.create_user(is_staff=False)
355-
self.client.force_login(user)
356-
url = f"/finding/{self.template.id}/{self.finding.id}/choose_finding_template_options"
357-
response = self.client.get(url)
358-
self.assertEqual(response.status_code, 403)
351+
with self.assertRaises(PermissionDenied):
352+
self.make_request(user_is_staff=False, finding_id=self.finding.id, template_id=self.template.id)
359353

360354
def test_authorized_choose_finding_template_options_success(self):
361355
result = self.make_request(user_is_staff=True, finding_id=self.finding.id, template_id=self.template.id)
@@ -446,10 +440,9 @@ def test_mktemplate_requires_permission(self):
446440
user.is_superuser = False
447441
user.save()
448442

449-
self.client.force_login(user)
450-
url = f"/finding/{self.finding.id}/mktemplate"
451-
response = self.client.get(url)
452-
self.assertEqual(response.status_code, 403)
443+
# Should raise PermissionDenied
444+
with self.assertRaises(PermissionDenied):
445+
self.make_request(user, self.finding.id)
453446

454447

455448
@versioned_fixtures
@@ -596,10 +589,9 @@ def test_add_finding_from_template_requires_permission(self):
596589
unauthorized_user.is_superuser = False
597590
unauthorized_user.save()
598591

599-
self.client.force_login(unauthorized_user)
600-
url = f"/test/{self.test.id}/add_findings/{self.template.id}"
601-
response = self.client.get(url)
602-
self.assertEqual(response.status_code, 403)
592+
# Should raise PermissionDenied
593+
with self.assertRaises(PermissionDenied):
594+
self.make_get_request(unauthorized_user, self.test.id, self.template.id)
603595

604596
def test_add_finding_from_template_updates_template_last_used(self):
605597
"""Test that template.last_used is updated when creating finding"""

0 commit comments

Comments
 (0)