Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Show who initiated scan #1102

Merged
merged 4 commits into from
Dec 18, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion web/api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -712,6 +712,7 @@ def post(self, request):
task_ids = scan.celery_ids
scan.scan_status = ABORTED_TASK
scan.stop_scan_date = timezone.now()
scan.aborted_by = request.user
scan.save()
create_scan_activity(
scan.id,
Expand Down Expand Up @@ -958,7 +959,7 @@ def get(self, request):
return Response({'status': False, 'message': 'Not Found'})
elif not response:
return Response({'status': False, 'message': 'Not Found'})

# only send latest release
response = response[0]

Expand Down
26 changes: 26 additions & 0 deletions web/startScan/migrations/0056_auto_20231201_2354.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Generated by Django 3.2.4 on 2023-12-01 23:54

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('startScan', '0055_remove_dork_description'),
]

operations = [
migrations.AddField(
model_name='scanhistory',
name='aborted_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='aborted_scans', to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='scanhistory',
name='initiated_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='initiated_scans', to=settings.AUTH_USER_MODEL),
),
]
4 changes: 4 additions & 0 deletions web/startScan/models.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from urllib.parse import urlparse
from django.apps import apps
from django.contrib.auth.models import User
from django.contrib.postgres.fields import ArrayField
from django.db import models
from django.utils import timezone
Expand Down Expand Up @@ -45,6 +46,9 @@ class ScanHistory(models.Model):
employees = models.ManyToManyField('Employee', related_name='employees', blank=True)
buckets = models.ManyToManyField('S3Bucket', related_name='buckets', blank=True)
dorks = models.ManyToManyField('Dork', related_name='dorks', blank=True)
initiated_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name='initiated_scans', blank=True, null=True)
aborted_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, related_name='aborted_scans')


def __str__(self):
return self.domain.name
Expand Down
6 changes: 6 additions & 0 deletions web/startScan/templates/startScan/history.html
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ <h4 class="headline-title">Filters</h4>
<th>Summary</th>
<th class="">Scan Engine Used</th>
<th>Last Scan</th>
<th>Initiated By</th>
<th class="text-center">Status</th>
<th class="text-center">Progress</th>
<th class="text-center no-sorting">Action</th>
Expand Down Expand Up @@ -108,6 +109,9 @@ <h4 class="headline-title">Filters</h4>
<td>
<span data-toggle="tooltip" data-placement="top" title="{{scan_history.start_scan_date}}">{{scan_history.start_scan_date|naturaltime}}</span>
</td>
<td>
<span class="badge badge-soft-secondary">{{scan_history.initiated_by.username}}</span>
</td>
<td class="text-center">
{% if scan_history.scan_status == -1 %}
<span class="badge badge-soft-warning" data-placement="top" data-toggle="tooltip" data-placement="top" title="Waiting for other scans to complete"><span class="spinner-border spinner-border-sm"></span> Pending</span>
Expand All @@ -120,6 +124,8 @@ <h4 class="headline-title">Filters</h4>
<span class="badge badge-soft-success">Successful</span>
{% elif scan_history.scan_status == 3 %}
<span class="badge badge-soft-danger">Aborted</span>
<br>
<small class="text-muted">Aborted by: {{scan_history.aborted_by}}</small>
{% else %}
<span class="badge badge-soft-danger">Unknown</span>
{% endif %}
Expand Down
21 changes: 17 additions & 4 deletions web/startScan/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,11 @@ def start_scan_ui(request, slug, domain_id):
engine_id = request.POST['scan_mode']

# Create ScanHistory object
scan_history_id = create_scan_object(domain_id, engine_id)
scan_history_id = create_scan_object(
domain_id,
engine_id,
request.user
)
scan = ScanHistory.objects.get(pk=scan_history_id)

# Start the celery task
Expand Down Expand Up @@ -323,7 +327,11 @@ def start_multiple_scan(request, slug):

for domain_id in list_of_domains.split(","):
# Start the celery task
scan_history_id = create_scan_object(domain_id, engine_id)
scan_history_id = create_scan_object(
domain_id,
engine_id,
request.user
)
# domain = get_object_or_404(Domain, id=domain_id)

kwargs = {
Expand Down Expand Up @@ -621,7 +629,7 @@ def change_vuln_status(request, id):
return HttpResponse('')


def create_scan_object(host_id, engine_id):
def create_scan_object(host_id, engine_id, initiated_by):
'''
create task with pending status so that celery task will execute when
threads are free
Expand All @@ -636,6 +644,7 @@ def create_scan_object(host_id, engine_id):
scan.domain = domain
scan.scan_type = engine
scan.start_scan_date = current_scan_time
scan.initiated_by = initiated_by
scan.save()
# save last scan date for domain model
domain.start_scan_date = current_scan_time
Expand Down Expand Up @@ -684,7 +693,11 @@ def start_organization_scan(request, id, slug):

# Start Celery task for each organization's domains
for domain in organization.get_domains():
scan_history_id = create_scan_object(domain.id, engine_id)
scan_history_id = create_scan_object(
domain.id,
engine_id,
request.user
)
scan = ScanHistory.objects.get(pk=scan_history_id)

kwargs = {
Expand Down