|
18 | 18 | from pytz import timezone |
19 | 19 |
|
20 | 20 | from dojo.filters import ProductFilter, ProductFindingFilter |
21 | | -from dojo.forms import ProductForm, EngForm, DeleteProductForm, ProductMetaDataForm, JIRAPKeyForm, JIRAFindingForm |
| 21 | +from dojo.forms import ProductForm, EngForm, DeleteProductForm, ProductMetaDataForm, JIRAPKeyForm, JIRAFindingForm, AdHocFindingForm |
22 | 22 | from dojo.models import Product_Type, Finding, Product, Engagement, ScanSettings, Risk_Acceptance, Test, JIRA_PKey, \ |
23 | | - Tool_Product_Settings, Cred_User, Cred_Mapping |
| 23 | + Tool_Product_Settings, Cred_User, Cred_Mapping, Test_Type |
24 | 24 | from dojo.utils import get_page_items, add_breadcrumb, get_punchcard_data, get_system_setting |
25 | 25 | from custom_field.models import CustomFieldValue, CustomField |
26 | 26 | from dojo.tasks import add_epic_task |
@@ -383,7 +383,7 @@ def delete_product(request, pid): |
383 | 383 | product = get_object_or_404(Product, pk=pid) |
384 | 384 | form = DeleteProductForm(instance=product) |
385 | 385 |
|
386 | | - from django.contrib.admin.util import NestedObjects |
| 386 | + from django.contrib.admin.utils import NestedObjects |
387 | 387 | from django.db import DEFAULT_DB_ALIAS |
388 | 388 |
|
389 | 389 | collector = NestedObjects(using=DEFAULT_DB_ALIAS) |
@@ -564,3 +564,108 @@ def edit_meta_data(request, pid): |
564 | 564 | {'product': prod, |
565 | 565 | 'product_metadata': product_metadata, |
566 | 566 | }) |
| 567 | + |
| 568 | + |
| 569 | +@user_passes_test(lambda u: u.is_staff) |
| 570 | +def ad_hoc_finding(request, pid): |
| 571 | + prod = Product.objects.get(id=pid) |
| 572 | + test = None |
| 573 | + try: |
| 574 | + eng = Engagement.objects.get(product=prod, name="Ad Hoc Engagement") |
| 575 | + tests = Test.objects.filter(engagement=eng) |
| 576 | + |
| 577 | + if len(tests) != 0: |
| 578 | + test = tests[0] |
| 579 | + else: |
| 580 | + test = Test(engagement=eng, test_type=Test_Type.objects.get(name="Pen Test"), |
| 581 | + target_start=datetime.now(tz=localtz), target_end=datetime.now(tz=localtz)) |
| 582 | + test.save() |
| 583 | + except: |
| 584 | + eng = Engagement(name="Ad Hoc Engagement", target_start=datetime.now(tz=localtz), |
| 585 | + target_end=datetime.now(tz=localtz), active=False, product=prod) |
| 586 | + eng.save() |
| 587 | + test = Test(engagement=eng, test_type=Test_Type.objects.get(name="Pen Test"), |
| 588 | + target_start=datetime.now(tz=localtz), target_end=datetime.now(tz=localtz)) |
| 589 | + test.save() |
| 590 | + form_error = False |
| 591 | + enabled = False |
| 592 | + jform = None |
| 593 | + form = AdHocFindingForm(initial={'date': datetime.now(tz=localtz).date()}) |
| 594 | + if hasattr(settings, 'ENABLE_JIRA'): |
| 595 | + if settings.ENABLE_JIRA: |
| 596 | + if JIRA_PKey.objects.filter(product=test.engagement.product).count() != 0: |
| 597 | + enabled = JIRA_PKey.objects.get(product=test.engagement.product).push_all_issues |
| 598 | + jform = JIRAFindingForm(enabled=enabled, prefix='jiraform') |
| 599 | + else: |
| 600 | + jform = None |
| 601 | + if request.method == 'POST': |
| 602 | + form = AdHocFindingForm(request.POST) |
| 603 | + if form.is_valid(): |
| 604 | + new_finding = form.save(commit=False) |
| 605 | + new_finding.test = test |
| 606 | + new_finding.reporter = request.user |
| 607 | + new_finding.numerical_severity = Finding.get_numerical_severity( |
| 608 | + new_finding.severity) |
| 609 | + if new_finding.false_p or new_finding.active is False: |
| 610 | + new_finding.mitigated = datetime.now(tz=localtz) |
| 611 | + new_finding.mitigated_by = request.user |
| 612 | + create_template = new_finding.is_template |
| 613 | + # always false now since this will be deprecated soon in favor of new Finding_Template model |
| 614 | + new_finding.is_template = False |
| 615 | + new_finding.save() |
| 616 | + new_finding.endpoints = form.cleaned_data['endpoints'] |
| 617 | + new_finding.save() |
| 618 | + if 'jiraform-push_to_jira' in request.POST: |
| 619 | + jform = JIRAFindingForm(request.POST, prefix='jiraform', enabled=enabled) |
| 620 | + if jform.is_valid(): |
| 621 | + add_issue_task.delay(new_finding, jform.cleaned_data.get('push_to_jira')) |
| 622 | + messages.add_message(request, |
| 623 | + messages.SUCCESS, |
| 624 | + 'Finding added successfully.', |
| 625 | + extra_tags='alert-success') |
| 626 | + if create_template: |
| 627 | + templates = Finding_Template.objects.filter(title=new_finding.title) |
| 628 | + if len(templates) > 0: |
| 629 | + messages.add_message(request, |
| 630 | + messages.ERROR, |
| 631 | + 'A finding template was not created. A template with this title already ' |
| 632 | + 'exists.', |
| 633 | + extra_tags='alert-danger') |
| 634 | + else: |
| 635 | + template = Finding_Template(title=new_finding.title, |
| 636 | + cwe=new_finding.cwe, |
| 637 | + severity=new_finding.severity, |
| 638 | + description=new_finding.description, |
| 639 | + mitigation=new_finding.mitigation, |
| 640 | + impact=new_finding.impact, |
| 641 | + references=new_finding.references, |
| 642 | + numerical_severity=new_finding.numerical_severity) |
| 643 | + template.save() |
| 644 | + messages.add_message(request, |
| 645 | + messages.SUCCESS, |
| 646 | + 'A finding template was also created.', |
| 647 | + extra_tags='alert-success') |
| 648 | + if '_Finished' in request.POST: |
| 649 | + return HttpResponseRedirect(reverse('view_test', args=(test.id,))) |
| 650 | + else: |
| 651 | + return HttpResponseRedirect(reverse('add_findings', args=(test.id,))) |
| 652 | + else: |
| 653 | + if 'endpoints' in form.cleaned_data: |
| 654 | + form.fields['endpoints'].queryset = form.cleaned_data['endpoints'] |
| 655 | + else: |
| 656 | + form.fields['endpoints'].queryset = Endpoint.objects.none() |
| 657 | + form_error = True |
| 658 | + messages.add_message(request, |
| 659 | + messages.ERROR, |
| 660 | + 'The form has errors, please correct them below.', |
| 661 | + extra_tags='alert-danger') |
| 662 | + add_breadcrumb(parent=prod, title="Add Finding", top_level=False, request=request) |
| 663 | + return render(request, 'dojo/ad_hoc_findings.html', |
| 664 | + {'form': form, |
| 665 | + 'temp': False, |
| 666 | + 'tid' : test.id, |
| 667 | + 'pid': pid, |
| 668 | + 'form_error': form_error, |
| 669 | + 'jform': jform, |
| 670 | + }) |
| 671 | + |
0 commit comments