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