Skip to content

Commit 3ffe4e2

Browse files
authored
Merge pull request #520 from aaronweaver/master
Tracking file on source code commits.
2 parents 27f0008 + 2df8556 commit 3ffe4e2

23 files changed

+873
-117
lines changed

docs/upgrading.rst

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ Upgrading to 1.2.2 requires:
134134

135135
2. If you have supervisor scripts change DJANGO_SETTINGS_MODULE=dojo.settings.settings
136136

137-
Upgrading to DefectDojo Version 1.2.2
137+
Upgrading to DefectDojo Version 1.2.3
138138
------------------------------------
139139

140140
Upgrading to 1.2.3 requires:
@@ -144,3 +144,13 @@ Upgrading to 1.2.3 requires:
144144
./manage.py loaddata dojo/fixtures/language_type.json
145145

146146
2. Currently languages and technologies can be updated via the API or in the admin section of Django.
147+
148+
Upgrading to DefectDojo Version 1.2.4
149+
------------------------------------
150+
151+
Upgrading to 1.2.4 requires:
152+
153+
1. ./manage.py makemigrations
154+
./manage.py migrate
155+
./manage.py loaddata dojo/fixtures/test_type.json
156+
./manage.py loaddata dojo/fixtures/objects_review.json

dojo/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# Django starts so that shared_task will use this app.
55
from .celery import app as celery_app # noqa
66

7-
__version__ = '1.2.3'
8-
__url__ = 'https://github.com/OWASP/django-DefectDojo'
7+
__version__ = '1.2.4'
8+
__url__ = 'https://github.com/DefectDojo/django-DefectDojo'
99
__docs__ = 'http://defectdojo.readthedocs.io/'
1010
__demo__ = 'http://defectdojo.pythonanywhere.com/'

dojo/api.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
from dojo.tools.factory import import_parser_factory
3333
from dojo.utils import get_system_setting
3434
from datetime import datetime
35+
from object.parser import import_object_eng
3536

3637
"""
3738
Setup logging for the api
@@ -1189,6 +1190,38 @@ def is_valid(self, bundle, request=None):
11891190

11901191
return errors
11911192

1193+
class BuildDetails(MultipartResource, Resource):
1194+
file = fields.FileField(attribute='file')
1195+
engagement = fields.CharField(attribute='engagement')
1196+
1197+
class Meta:
1198+
resource_name = 'build_details'
1199+
fields = ['engagement', 'file']
1200+
list_allowed_methods = ['post']
1201+
detail_allowed_methods = []
1202+
include_resource_uri = True
1203+
1204+
authentication = DojoApiKeyAuthentication()
1205+
authorization = DjangoAuthorization()
1206+
#validation = ImportScanValidation()
1207+
#object_class = ImportScanObject
1208+
1209+
def hydrate(self, bundle):
1210+
bundle.obj.__setattr__('engagement_obj',
1211+
Engagement.objects.get(id=get_pk_from_uri(bundle.data['engagement'])))
1212+
1213+
return bundle
1214+
1215+
def obj_create(self, bundle, **kwargs):
1216+
bundle.obj = ImportScanObject(initial=kwargs)
1217+
self.is_valid(bundle)
1218+
if bundle.errors:
1219+
raise ImmediateHttpResponse(response=self.error_response(bundle.request, bundle.errors))
1220+
1221+
bundle = self.full_hydrate(bundle)
1222+
1223+
import_object_eng(bundle.request, bundle.obj.__getattr__('engagement_obj'), bundle.data['file'])
1224+
11921225
class ImportScanResource(MultipartResource, Resource):
11931226
scan_date = fields.DateTimeField(attribute='scan_date')
11941227
minimum_severity = fields.CharField(attribute='minimum_severity')

dojo/celery.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,3 @@
1919
@app.task(bind=True)
2020
def debug_task(self):
2121
print('Request: {0!r}'.format(self.request))
22-

dojo/dojo.celery.beat.db.db

Whitespace-only changes.

dojo/fixtures/objects_review.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[{"model": "dojo.objects_review", "pk": 1, "fields": {"name": "Untracked", "created": "2018-03-16T15:21:36.057Z"}}, {"model": "dojo.objects_review", "pk": 2, "fields": {"name": "Manual Code Review Required", "created": "2018-03-17T14:21:58.541Z"}}, {"model": "dojo.objects_review", "pk": 3, "fields": {"name": "Manual Code Review and Create Test", "created": "2018-03-20T20:50:31.509Z"}}]

dojo/fixtures/test_type.json

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,5 +89,110 @@
8989
},
9090
"model": "dojo.test_type",
9191
"pk": 13
92+
},
93+
{
94+
"fields": {
95+
"name": "Bandit Scan"
96+
},
97+
"model": "dojo.test_type",
98+
"pk": 14
99+
},
100+
{
101+
"fields": {
102+
"name": "SSL Labs Scan"
103+
},
104+
"model": "dojo.test_type",
105+
"pk": 15
106+
},
107+
{
108+
"fields": {
109+
"name": "AppSpider Scan"
110+
},
111+
"model": "dojo.test_type",
112+
"pk": 16
113+
},
114+
{
115+
"fields": {
116+
"name": "Arachni Scan"
117+
},
118+
"model": "dojo.test_type",
119+
"pk": 17
120+
},
121+
{
122+
"fields": {
123+
"name": "Dependency Check Scan"
124+
},
125+
"model": "dojo.test_type",
126+
"pk": 17
127+
},
128+
{
129+
"fields": {
130+
"name": "Generic Findings Import"
131+
},
132+
"model": "dojo.test_type",
133+
"pk": 18
134+
},
135+
{
136+
"fields": {
137+
"name": "Nmap Scan"
138+
},
139+
"model": "dojo.test_type",
140+
"pk": 19
141+
},
142+
{
143+
"fields": {
144+
"name": "Node Security Platform Scan"
145+
},
146+
"model": "dojo.test_type",
147+
"pk": 20
148+
},
149+
{
150+
"fields": {
151+
"name": "Qualys Scan"
152+
},
153+
"model": "dojo.test_type",
154+
"pk": 21
155+
},
156+
{
157+
"fields": {
158+
"name": "Qualys Web App Scan"
159+
},
160+
"model": "dojo.test_type",
161+
"pk": 22
162+
},
163+
{
164+
"fields": {
165+
"name": "Retire.js Scan"
166+
},
167+
"model": "dojo.test_type",
168+
"pk": 23
169+
},
170+
{
171+
"fields": {
172+
"name": "SKF Scan"
173+
},
174+
"model": "dojo.test_type",
175+
"pk": 24
176+
},
177+
{
178+
"fields": {
179+
"name": "Snyk Scan"
180+
},
181+
"model": "dojo.test_type",
182+
"pk": 25
183+
},
184+
{
185+
"fields": {
186+
"name": "VCG Scan"
187+
},
188+
"model": "dojo.test_type",
189+
"pk": 26
190+
},
191+
{
192+
"fields": {
193+
"name": "Manual Code Review"
194+
},
195+
"model": "dojo.test_type",
196+
"pk": 27
92197
}
93198
]

dojo/forms.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
Check_List, User, Engagement, Test, Test_Type, Notes, Risk_Acceptance, \
2121
Development_Environment, Dojo_User, Scan, Endpoint, Stub_Finding, Finding_Template, Report, FindingImage, \
2222
JIRA_Issue, JIRA_PKey, JIRA_Conf, UserContactInfo, Tool_Type, Tool_Configuration, Tool_Product_Settings, \
23-
Cred_User, Cred_Mapping, System_Settings, Notifications, Languages, Language_Type, App_Analysis
23+
Cred_User, Cred_Mapping, System_Settings, Notifications, Languages, Language_Type, App_Analysis, Objects
2424
from dojo.utils import get_system_setting
2525

2626
RE_DATE = re.compile(r'(\d{4})-(\d\d?)-(\d\d?)$')
@@ -1345,6 +1345,13 @@ def clean(self):
13451345

13461346
return form_data
13471347

1348+
class DeleteObjectsSettingsForm(forms.ModelForm):
1349+
id = forms.IntegerField(required=True,
1350+
widget=forms.widgets.HiddenInput())
1351+
1352+
class Meta:
1353+
model = Objects
1354+
exclude = ['tool_type']
13481355

13491356
class DeleteToolProductSettingsForm(forms.ModelForm):
13501357
id = forms.IntegerField(required=True,
@@ -1378,6 +1385,28 @@ def clean(self):
13781385

13791386
return form_data
13801387

1388+
class ObjectSettingsForm(forms.ModelForm):
1389+
1390+
tags = forms.CharField(widget=forms.SelectMultiple(choices=[]),
1391+
required=False,
1392+
help_text="Add tags that help describe this object. "
1393+
"Choose from the list or add new tags. Press TAB key to add.")
1394+
1395+
class Meta:
1396+
model = Objects
1397+
fields = ['path', 'folder', 'artifact', 'name', 'review_status']
1398+
exclude = ['product']
1399+
1400+
def __init__(self, *args, **kwargs):
1401+
tags = Tag.objects.usage_for_model(Objects)
1402+
t = [(tag.name, tag.name) for tag in tags]
1403+
super(ObjectSettingsForm, self).__init__(*args, **kwargs)
1404+
self.fields['tags'].widget.choices = t
1405+
1406+
def clean(self):
1407+
form_data = self.cleaned_data
1408+
1409+
return form_data
13811410

13821411

13831412
class CredMappingForm(forms.ModelForm):

dojo/models.py

Lines changed: 48 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1195,22 +1195,15 @@ class JIRA_PKey(models.Model):
11951195

11961196

11971197
class Notifications(models.Model):
1198-
engagement_added = MultiSelectField(choices=NOTIFICATION_CHOICES,
1199-
default='alert', blank=True)
1200-
test_added = MultiSelectField(choices=NOTIFICATION_CHOICES,
1201-
default='alert', blank=True)
1202-
results_added = MultiSelectField(choices=NOTIFICATION_CHOICES,
1203-
default='alert', blank=True)
1204-
report_created = MultiSelectField(choices=NOTIFICATION_CHOICES,
1205-
default='alert', blank=True)
1206-
jira_update = MultiSelectField(choices=NOTIFICATION_CHOICES,
1207-
default='alert', blank=True)
1208-
upcoming_engagement = MultiSelectField(choices=NOTIFICATION_CHOICES,
1209-
default='alert', blank=True)
1210-
user_mentioned = MultiSelectField(choices=NOTIFICATION_CHOICES,
1211-
default='alert', blank=True)
1212-
other = MultiSelectField(choices=NOTIFICATION_CHOICES, default='alert',
1213-
blank=True)
1198+
engagement_added = MultiSelectField(choices=NOTIFICATION_CHOICES, default='alert', blank=True)
1199+
test_added = MultiSelectField(choices=NOTIFICATION_CHOICES, default='alert', blank=True)
1200+
results_added = MultiSelectField(choices=NOTIFICATION_CHOICES, default='alert', blank=True)
1201+
report_created = MultiSelectField(choices=NOTIFICATION_CHOICES, default='alert', blank=True)
1202+
jira_update = MultiSelectField(choices=NOTIFICATION_CHOICES, default='alert', blank=True)
1203+
upcoming_engagement = MultiSelectField(choices=NOTIFICATION_CHOICES, default='alert', blank=True)
1204+
user_mentioned = MultiSelectField(choices=NOTIFICATION_CHOICES, default='alert', blank=True)
1205+
code_review = MultiSelectField(choices=NOTIFICATION_CHOICES, default='alert', blank=True)
1206+
other = MultiSelectField(choices=NOTIFICATION_CHOICES, default='alert', blank=True)
12141207
user = models.ForeignKey(User, default=None, null=True, editable=False)
12151208

12161209

@@ -1359,7 +1352,7 @@ class App_Analysis(models.Model):
13591352
user = models.ForeignKey(User, editable=True)
13601353
confidence = models.IntegerField(blank=True, null=True, verbose_name='Confidence level')
13611354
version = models.CharField(max_length=200, null=True, blank=True, verbose_name='Version Number')
1362-
icon = models.CharField(max_length=200, null=True, blank=True,)
1355+
icon = models.CharField(max_length=200, null=True, blank=True)
13631356
website = models.URLField(max_length=400, null=True, blank=True)
13641357
website_found = models.URLField(max_length=400, null=True, blank=True)
13651358
created = models.DateTimeField(null=False, editable=False, default=now)
@@ -1368,17 +1361,51 @@ class Objects_Review(models.Model):
13681361
name = models.CharField(max_length=100, null=True)
13691362
created = models.DateTimeField(null=False, editable=False, default=now)
13701363

1364+
def __unicode__(self):
1365+
return self.name
1366+
13711367
class Objects(models.Model):
1372-
engagement = models.ForeignKey(Engagement)
1373-
name = models.CharField(max_length=100, null=True)
1374-
path = models.CharField(max_length=600, null=False)
1368+
product = models.ForeignKey(Product)
1369+
name = models.CharField(max_length=100, null=True, blank=True)
1370+
path = models.CharField(max_length=600, verbose_name='Full file path', null=True, blank=True)
1371+
folder = models.CharField(max_length=400, verbose_name='Folder', null=True, blank=True)
1372+
artifact = models.CharField(max_length=400, verbose_name='Artifact', null=True, blank=True)
13751373
review_status = models.ForeignKey(Objects_Review)
13761374
created = models.DateTimeField(null=False, editable=False, default=now)
13771375

1376+
def __unicode__(self):
1377+
name = None
1378+
if self.path != None:
1379+
name = self.path
1380+
elif self.folder != None:
1381+
name = self.folder
1382+
elif self.artifact != None:
1383+
name = self.artifact
1384+
1385+
return name
1386+
1387+
class Meta:
1388+
unique_together = [('product', 'path')]
1389+
13781390
class Objects_Engagement(models.Model):
13791391
engagement = models.ForeignKey(Engagement)
1380-
object = models.ForeignKey(Objects)
1392+
object_id = models.ForeignKey(Objects)
1393+
build_id = models.CharField(max_length=150, null=True)
13811394
created = models.DateTimeField(null=False, editable=False, default=now)
1395+
full_url = models.URLField(max_length=400, null=True, blank=True)
1396+
type = models.CharField(max_length=30, null=True)
1397+
percentUnchanged = models.CharField(max_length=10, null=True)
1398+
1399+
def __unicode__(self):
1400+
data = ""
1401+
if self.object_id.path:
1402+
data = self.object_id.path
1403+
elif self.object_id.folder:
1404+
data = self.object_id.folder
1405+
elif self.object_id.artifact:
1406+
data = self.object_id.artifact
1407+
1408+
return data + " | " + self.engagement.name + " | " + str(self.engagement.id)
13821409

13831410
# Register for automatic logging to database
13841411
auditlog.register(Dojo_User)

dojo/object/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)