@@ -237,7 +237,8 @@ def to_internal_value(self, data):
237
237
tag_validator (sub , exception_class = RestFrameworkValidationError )
238
238
data_safe .extend (substrings )
239
239
240
- return tagulous .utils .render_tags (data_safe )
240
+ logger .debug (f"result after rendering tags: { data_safe } " )
241
+ return data_safe
241
242
242
243
def to_representation (self , value ):
243
244
if not isinstance (value , list ):
@@ -254,44 +255,6 @@ def to_representation(self, value):
254
255
return value
255
256
256
257
257
- class TaggitSerializer (serializers .Serializer ):
258
- def create (self , validated_data ):
259
- to_be_tagged , validated_data = self ._pop_tags (validated_data )
260
-
261
- tag_object = super ().create (validated_data )
262
-
263
- return self ._save_tags (tag_object , to_be_tagged )
264
-
265
- def update (self , instance , validated_data ):
266
- to_be_tagged , validated_data = self ._pop_tags (validated_data )
267
-
268
- tag_object = super ().update (
269
- instance , validated_data ,
270
- )
271
-
272
- return self ._save_tags (tag_object , to_be_tagged )
273
-
274
- def _save_tags (self , tag_object , tags ):
275
- for key in list (tags .keys ()):
276
- tag_values = tags .get (key )
277
- # tag_object.tags = ", ".join(tag_values)
278
- tag_object .tags = tag_values
279
- tag_object .save ()
280
-
281
- return tag_object
282
-
283
- def _pop_tags (self , validated_data ):
284
- to_be_tagged = {}
285
-
286
- for key in list (self .fields .keys ()):
287
- field = self .fields [key ]
288
- if isinstance (field , TagListSerializerField ):
289
- if key in validated_data :
290
- to_be_tagged [key ] = validated_data .pop (key )
291
-
292
- return (to_be_tagged , validated_data )
293
-
294
-
295
258
class RequestResponseDict (collections .UserList ):
296
259
def __init__ (self , * args , ** kwargs ):
297
260
pretty_print = kwargs .pop ("pretty_print" , True )
@@ -1094,7 +1057,7 @@ class Meta:
1094
1057
fields = "__all__"
1095
1058
1096
1059
1097
- class EngagementSerializer (TaggitSerializer , serializers .ModelSerializer ):
1060
+ class EngagementSerializer (serializers .ModelSerializer ):
1098
1061
tags = TagListSerializerField (required = False )
1099
1062
1100
1063
class Meta :
@@ -1151,7 +1114,7 @@ class Meta:
1151
1114
fields = "__all__"
1152
1115
1153
1116
1154
- class AppAnalysisSerializer (TaggitSerializer , serializers .ModelSerializer ):
1117
+ class AppAnalysisSerializer (serializers .ModelSerializer ):
1155
1118
tags = TagListSerializerField (required = False )
1156
1119
1157
1120
class Meta :
@@ -1246,7 +1209,7 @@ def update(self, instance, validated_data):
1246
1209
raise
1247
1210
1248
1211
1249
- class EndpointSerializer (TaggitSerializer , serializers .ModelSerializer ):
1212
+ class EndpointSerializer (serializers .ModelSerializer ):
1250
1213
tags = TagListSerializerField (required = False )
1251
1214
1252
1215
class Meta :
@@ -1440,7 +1403,7 @@ class Meta:
1440
1403
fields = ("id" , "name" , "test" , "jira_issue" )
1441
1404
1442
1405
1443
- class TestSerializer (TaggitSerializer , serializers .ModelSerializer ):
1406
+ class TestSerializer (serializers .ModelSerializer ):
1444
1407
tags = TagListSerializerField (required = False )
1445
1408
test_type_name = serializers .ReadOnlyField ()
1446
1409
finding_groups = FindingGroupSerializer (
@@ -1459,7 +1422,7 @@ def build_relational_field(self, field_name, relation_info):
1459
1422
return super ().build_relational_field (field_name , relation_info )
1460
1423
1461
1424
1462
- class TestCreateSerializer (TaggitSerializer , serializers .ModelSerializer ):
1425
+ class TestCreateSerializer (serializers .ModelSerializer ):
1463
1426
engagement = serializers .PrimaryKeyRelatedField (
1464
1427
queryset = Engagement .objects .all (),
1465
1428
)
@@ -1476,7 +1439,7 @@ class Meta:
1476
1439
exclude = ("inherited_tags" ,)
1477
1440
1478
1441
1479
- class TestTypeSerializer (TaggitSerializer , serializers .ModelSerializer ):
1442
+ class TestTypeSerializer (serializers .ModelSerializer ):
1480
1443
tags = TagListSerializerField (required = False )
1481
1444
1482
1445
class Meta :
@@ -1702,7 +1665,7 @@ class Meta:
1702
1665
fields = ["vulnerability_id" ]
1703
1666
1704
1667
1705
- class FindingSerializer (TaggitSerializer , serializers .ModelSerializer ):
1668
+ class FindingSerializer (serializers .ModelSerializer ):
1706
1669
tags = TagListSerializerField (required = False )
1707
1670
request_response = serializers .SerializerMethodField ()
1708
1671
accepted_risks = RiskAcceptanceSerializer (
@@ -1771,41 +1734,32 @@ def process_risk_acceptance(self, data):
1771
1734
1772
1735
# Overriding this to push add Push to JIRA functionality
1773
1736
def update (self , instance , validated_data ):
1774
- # remove tags from validated data and store them seperately
1775
- to_be_tagged , validated_data = self ._pop_tags (validated_data )
1776
-
1777
- # pop push_to_jira so it won't get send to the model as a field
1778
- # TODO: JIRA can we remove this is_push_all_issues, already checked in
1779
- # apiv2 viewset?
1780
- push_to_jira = validated_data .pop (
1781
- "push_to_jira" ,
1782
- ) or jira_helper .is_push_all_issues (instance )
1737
+ # push_all_issues already checked in api views.py
1738
+ push_to_jira = validated_data .pop ("push_to_jira" )
1783
1739
1784
1740
# Save vulnerability ids and pop them
1785
- if "vulnerability_id_set" in validated_data :
1786
- vulnerability_id_set = validated_data .pop ("vulnerability_id_set" )
1787
- vulnerability_ids = []
1788
- if vulnerability_id_set :
1789
- vulnerability_ids . extend ( vulnerability_id [ "vulnerability_id" ] for vulnerability_id in vulnerability_id_set )
1790
- save_vulnerability_ids ( instance , vulnerability_ids )
1741
+ parsed_vulnerability_ids = []
1742
+ if ( vulnerability_ids : = validated_data .pop ("vulnerability_id_set" , None )):
1743
+ logger . debug ( "VULNERABILITY_ID_SET: %s" , vulnerability_ids )
1744
+ parsed_vulnerability_ids . extend ( vulnerability_id [ "vulnerability_id" ] for vulnerability_id in vulnerability_ids )
1745
+ logger . debug ( "SETTING CVE FROM VULNERABILITY_ID_SET: %s" , parsed_vulnerability_ids [ 0 ] )
1746
+ validated_data [ "cve" ] = parsed_vulnerability_ids [ 0 ]
1791
1747
1792
- instance = super (TaggitSerializer , self ).update (
1793
- instance , validated_data ,
1794
- )
1795
1748
# Save the reporter on the finding
1796
1749
if reporter_id := validated_data .get ("reporter" ):
1797
1750
instance .reporter = reporter_id
1798
1751
1799
- # If we need to push to JIRA, an extra save call is needed.
1800
- # Also if we need to update the mitigation date of the finding.
1801
- # TODO: try to combine create and save, but for now I'm just fixing a
1802
- # bug and don't want to change to much
1752
+ instance = super ().update (
1753
+ instance , validated_data ,
1754
+ )
1755
+
1756
+ if parsed_vulnerability_ids :
1757
+ save_vulnerability_ids (instance , parsed_vulnerability_ids )
1758
+
1803
1759
if push_to_jira :
1804
- instance . save ( push_to_jira = push_to_jira )
1760
+ jira_helper . push_to_jira ( instance )
1805
1761
1806
- # not sure why we are returning a tag_object, but don't want to change
1807
- # too much now as we're just fixing a bug
1808
- return self ._save_tags (instance , to_be_tagged )
1762
+ return instance
1809
1763
1810
1764
def validate (self , data ):
1811
1765
if self .context ["request" ].method == "PATCH" :
@@ -1876,7 +1830,7 @@ def get_request_response(self, obj):
1876
1830
return serialized_burps .data
1877
1831
1878
1832
1879
- class FindingCreateSerializer (TaggitSerializer , serializers .ModelSerializer ):
1833
+ class FindingCreateSerializer (serializers .ModelSerializer ):
1880
1834
notes = serializers .PrimaryKeyRelatedField (
1881
1835
read_only = True , allow_null = True , required = False , many = True ,
1882
1836
)
@@ -1908,21 +1862,24 @@ class Meta:
1908
1862
1909
1863
# Overriding this to push add Push to JIRA functionality
1910
1864
def create (self , validated_data ):
1911
- # Pop off of some fields that should not be sent to the model at this time
1912
- to_be_tagged , validated_data = self ._pop_tags (validated_data )
1865
+ logger .debug (f"Creating finding with validated data: { validated_data } " )
1913
1866
push_to_jira = validated_data .pop ("push_to_jira" , False )
1914
1867
notes = validated_data .pop ("notes" , None )
1915
1868
found_by = validated_data .pop ("found_by" , None )
1916
1869
reviewers = validated_data .pop ("reviewers" , None )
1917
1870
# Process the vulnerability IDs specially
1918
1871
parsed_vulnerability_ids = []
1919
1872
if (vulnerability_ids := validated_data .pop ("vulnerability_id_set" , None )):
1873
+ logger .debug ("VULNERABILITY_ID_SET: %s" , vulnerability_ids )
1920
1874
parsed_vulnerability_ids .extend (vulnerability_id ["vulnerability_id" ] for vulnerability_id in vulnerability_ids )
1875
+ logger .debug ("SETTING CVE FROM VULNERABILITY_ID_SET: %s" , parsed_vulnerability_ids [0 ])
1921
1876
validated_data ["cve" ] = parsed_vulnerability_ids [0 ]
1922
- # Create a findings in memory so that we have access to unsaved_vulnerability_ids
1923
- new_finding = Finding (** validated_data )
1924
- new_finding .unsaved_vulnerability_ids = parsed_vulnerability_ids
1925
- new_finding .save ()
1877
+
1878
+ new_finding = super ().create (
1879
+ validated_data )
1880
+
1881
+ logger .debug (f"New finding CVE: { new_finding .cve } " )
1882
+
1926
1883
# Deal with all of the many to many things
1927
1884
if notes :
1928
1885
new_finding .notes .set (notes )
@@ -1932,18 +1889,14 @@ def create(self, validated_data):
1932
1889
new_finding .reviewers .set (reviewers )
1933
1890
if parsed_vulnerability_ids :
1934
1891
save_vulnerability_ids (new_finding , parsed_vulnerability_ids )
1935
- # TODO: JIRA can we remove this is_push_all_issues, already checked in
1936
- # apiv2 viewset?
1937
- push_to_jira = push_to_jira or jira_helper .is_push_all_issues (
1938
- new_finding ,
1939
- )
1940
- # If we need to push to JIRA, an extra save call is needed.
1941
- # TODO: try to combine create and save, but for now I'm just fixing a
1942
- # bug and don't want to change to much
1943
- if push_to_jira or new_finding :
1944
- new_finding .save (push_to_jira = push_to_jira )
1945
- # This final call will save the finding again and return it
1946
- return self ._save_tags (new_finding , to_be_tagged )
1892
+ # can we avoid this extra save? the cve has already been set above in validated_data. but there are no tests for this
1893
+ # on finding update nothing is done # with vulnerability_ids?
1894
+ # new_finding.save()
1895
+
1896
+ if push_to_jira :
1897
+ jira_helper .push_to_jira (new_finding )
1898
+
1899
+ return new_finding
1947
1900
1948
1901
def validate (self , data ):
1949
1902
if "reporter" not in data :
@@ -1989,7 +1942,7 @@ class Meta:
1989
1942
fields = ["vulnerability_id" ]
1990
1943
1991
1944
1992
- class FindingTemplateSerializer (TaggitSerializer , serializers .ModelSerializer ):
1945
+ class FindingTemplateSerializer (serializers .ModelSerializer ):
1993
1946
tags = TagListSerializerField (required = False )
1994
1947
vulnerability_ids = VulnerabilityIdTemplateSerializer (
1995
1948
source = "vulnerability_id_template_set" , many = True , required = False ,
@@ -2000,7 +1953,6 @@ class Meta:
2000
1953
exclude = ("cve" ,)
2001
1954
2002
1955
def create (self , validated_data ):
2003
- to_be_tagged , validated_data = self ._pop_tags (validated_data )
2004
1956
2005
1957
# Save vulnerability ids and pop them
2006
1958
if "vulnerability_id_template_set" in validated_data :
@@ -2010,7 +1962,7 @@ def create(self, validated_data):
2010
1962
else :
2011
1963
vulnerability_id_set = None
2012
1964
2013
- new_finding_template = super (TaggitSerializer , self ).create (
1965
+ new_finding_template = super ().create (
2014
1966
validated_data ,
2015
1967
)
2016
1968
@@ -2022,7 +1974,6 @@ def create(self, validated_data):
2022
1974
)
2023
1975
new_finding_template .save ()
2024
1976
2025
- self ._save_tags (new_finding_template , to_be_tagged )
2026
1977
return new_finding_template
2027
1978
2028
1979
def update (self , instance , validated_data ):
@@ -2036,7 +1987,7 @@ def update(self, instance, validated_data):
2036
1987
vulnerability_ids .extend (vulnerability_id ["vulnerability_id" ] for vulnerability_id in vulnerability_id_set )
2037
1988
save_vulnerability_ids_template (instance , vulnerability_ids )
2038
1989
2039
- return super (TaggitSerializer , self ).update (instance , validated_data )
1990
+ return super ().update (instance , validated_data )
2040
1991
2041
1992
2042
1993
class CredentialSerializer (serializers .ModelSerializer ):
@@ -2080,7 +2031,7 @@ def validate_severity(self, value: str) -> str:
2080
2031
return value
2081
2032
2082
2033
2083
- class ProductSerializer (TaggitSerializer , serializers .ModelSerializer ):
2034
+ class ProductSerializer (serializers .ModelSerializer ):
2084
2035
findings_count = serializers .SerializerMethodField ()
2085
2036
findings_list = serializers .SerializerMethodField ()
2086
2037
@@ -2411,7 +2362,7 @@ def save(self, *, push_to_jira=False):
2411
2362
self .process_scan (data , context )
2412
2363
2413
2364
2414
- class ReImportScanSerializer (TaggitSerializer , CommonImportScanSerializer ):
2365
+ class ReImportScanSerializer (CommonImportScanSerializer ):
2415
2366
2416
2367
help_do_not_reactivate = "Select if the import should ignore active findings from the report, useful for triage-less scanners. Will keep existing findings closed, without reactivating them. For more information check the docs."
2417
2368
do_not_reactivate = serializers .BooleanField (
@@ -2791,7 +2742,7 @@ class TagSerializer(serializers.Serializer):
2791
2742
tags = TagListSerializerField (required = True )
2792
2743
2793
2744
2794
- class SystemSettingsSerializer (TaggitSerializer , serializers .ModelSerializer ):
2745
+ class SystemSettingsSerializer (serializers .ModelSerializer ):
2795
2746
class Meta :
2796
2747
model = System_Settings
2797
2748
fields = "__all__"
0 commit comments