@@ -112,11 +112,8 @@ def test_edit_finding(self):
112
112
driver .find_element (By .ID , "dropdownMenu1" ).click ()
113
113
# Click on `Edit Finding`
114
114
driver .find_element (By .LINK_TEXT , "Edit Finding" ).click ()
115
- # Change: 'Severity' and 'cvssv3'
116
115
# finding Severity
117
116
Select (driver .find_element (By .ID , "id_severity" )).select_by_visible_text ("Critical" )
118
- # cvssv3
119
- driver .find_element (By .ID , "id_cvssv3" ).send_keys ("CVSS:3.0/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H" )
120
117
# finding Vulnerability Ids
121
118
driver .find_element (By .ID , "id_vulnerability_ids" ).send_keys ("\n REF-3\n REF-4\n " )
122
119
# "Click" the Done button to Edit the finding
@@ -131,6 +128,123 @@ def test_edit_finding(self):
131
128
self .assertTrue (self .is_text_present_on_page (text = "REF-4" ))
132
129
self .assertTrue (self .is_text_present_on_page (text = "Additional Vulnerability Ids" ))
133
130
131
+ def _edit_finding_cvssv3_and_assert (
132
+ self ,
133
+ cvssv3_value ,
134
+ cvssv3_score ,
135
+ expected_cvssv3_value ,
136
+ expected_cvssv3_score ,
137
+ expect_success = True , # noqa: FBT002
138
+ success_message = "Finding saved successfully" ,
139
+ error_message = None ,
140
+ ):
141
+ driver = self .driver
142
+ # Navigate to All Finding page
143
+ self .goto_all_findings_list (driver )
144
+ # Select and click on the particular finding to edit
145
+ driver .find_element (By .LINK_TEXT , "App Vulnerable to XSS" ).click ()
146
+ # Click on the 'dropdownMenu1 button'
147
+ driver .find_element (By .ID , "dropdownMenu1" ).click ()
148
+ # Click on `Edit Finding`
149
+ driver .find_element (By .LINK_TEXT , "Edit Finding" ).click ()
150
+ # Set cvssv3 value and score
151
+ driver .find_element (By .ID , "id_cvssv3" ).clear ()
152
+ driver .find_element (By .ID , "id_cvssv3" ).send_keys (cvssv3_value )
153
+ driver .find_element (By .ID , "id_cvssv3_score" ).clear ()
154
+ driver .find_element (By .ID , "id_cvssv3_score" ).send_keys (str (cvssv3_score ))
155
+ # Submit the form
156
+ driver .find_element (By .XPATH , "//input[@name='_Finished']" ).click ()
157
+
158
+ if expect_success :
159
+ self .assertTrue (self .is_success_message_present (text = success_message ))
160
+ # Go into edit mode again to check stored values
161
+ driver .find_element (By .ID , "dropdownMenu1" ).click ()
162
+ driver .find_element (By .LINK_TEXT , "Edit Finding" ).click ()
163
+ self .assertEqual (expected_cvssv3_value , driver .find_element (By .ID , "id_cvssv3" ).get_attribute ("value" ))
164
+ self .assertEqual (str (expected_cvssv3_score ), driver .find_element (By .ID , "id_cvssv3_score" ).get_attribute ("value" ))
165
+ else :
166
+ self .assertTrue (self .is_error_message_present (text = error_message ))
167
+ self .assertEqual (expected_cvssv3_value , driver .find_element (By .ID , "id_cvssv3" ).get_attribute ("value" ))
168
+ self .assertEqual (str (expected_cvssv3_score ), driver .find_element (By .ID , "id_cvssv3_score" ).get_attribute ("value" ))
169
+
170
+ # See https://github.com/DefectDojo/django-DefectDojo/issues/8264
171
+ # Capturing current behavior which might not be the desired one yet
172
+ @on_exception_html_source_logger
173
+ def test_edit_finding_cvssv3_valid_vector (self ):
174
+ self ._edit_finding_cvssv3_and_assert (
175
+ cvssv3_value = "CVSS:3.0/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H" ,
176
+ cvssv3_score = "1" ,
177
+ expected_cvssv3_value = "CVSS:3.0/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H" ,
178
+ expected_cvssv3_score = "8.8" ,
179
+ expect_success = True ,
180
+ )
181
+
182
+ @on_exception_html_source_logger
183
+ def test_edit_finding_cvssv3_valid_vector_no_prefix (self ):
184
+ self ._edit_finding_cvssv3_and_assert (
185
+ cvssv3_value = "AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H" ,
186
+ cvssv3_score = "2" ,
187
+ expected_cvssv3_value = "AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H" ,
188
+ expected_cvssv3_score = "2" ,
189
+ expect_success = False ,
190
+ error_message = "No valid CVSS vectors found by cvss.parse_cvss_from_text()" ,
191
+ )
192
+
193
+ @on_exception_html_source_logger
194
+ def test_edit_finding_cvssv3_valid_vector_with_trailing_slash (self ):
195
+ self ._edit_finding_cvssv3_and_assert (
196
+ cvssv3_value = "CVSS:3.0/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H/" ,
197
+ cvssv3_score = "3" ,
198
+ expected_cvssv3_value = "CVSS:3.0/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H/" ,
199
+ expected_cvssv3_score = "3" ,
200
+ expect_success = False ,
201
+ error_message = "No valid CVSS vectors found by cvss.parse_cvss_from_text()" ,
202
+ )
203
+
204
+ @on_exception_html_source_logger
205
+ def test_edit_finding_cvssv3_with_v2_vector_invalid_due_to_prefix (self ):
206
+ self ._edit_finding_cvssv3_and_assert (
207
+ cvssv3_value = "CVSS:2.0/AV:N/AC:L/Au:N/C:P/I:P/A:P" ,
208
+ cvssv3_score = "4" ,
209
+ expected_cvssv3_value = "CVSS:2.0/AV:N/AC:L/Au:N/C:P/I:P/A:P" ,
210
+ expected_cvssv3_score = "4" ,
211
+ expect_success = False ,
212
+ error_message = "No valid CVSS vectors found by cvss.parse_cvss_from_text()" ,
213
+ )
214
+
215
+ @on_exception_html_source_logger
216
+ def test_edit_finding_cvssv3_with_v2_vector (self ):
217
+ self ._edit_finding_cvssv3_and_assert (
218
+ cvssv3_value = "AV:N/AC:L/Au:N/C:P/I:P/A:P" ,
219
+ cvssv3_score = "4" ,
220
+ expected_cvssv3_value = "AV:N/AC:L/Au:N/C:P/I:P/A:P" ,
221
+ expected_cvssv3_score = "4" ,
222
+ expect_success = False ,
223
+ error_message = "Unsupported CVSS(2) version detected." ,
224
+ )
225
+
226
+ @on_exception_html_source_logger
227
+ def test_edit_finding_cvssv3_with_v4_vector (self ):
228
+ self ._edit_finding_cvssv3_and_assert (
229
+ cvssv3_value = "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/S:U/C:H/I:H/A:H" ,
230
+ cvssv3_score = "5" ,
231
+ expected_cvssv3_value = "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/S:U/C:H/I:H/A:H" ,
232
+ expected_cvssv3_score = "5" ,
233
+ expect_success = False ,
234
+ error_message = "No valid CVSS vectors found by cvss.parse_cvss_from_text()" ,
235
+ )
236
+
237
+ @on_exception_html_source_logger
238
+ def test_edit_finding_cvssv3_with_rubbish (self ):
239
+ self ._edit_finding_cvssv3_and_assert (
240
+ cvssv3_value = "happy little vector" ,
241
+ cvssv3_score = "5" ,
242
+ expected_cvssv3_value = "happy little vector" ,
243
+ expected_cvssv3_score = "5" ,
244
+ expect_success = False ,
245
+ error_message = "No valid CVSS vectors found by cvss.parse_cvss_from_text()" ,
246
+ )
247
+
134
248
def test_add_image (self ):
135
249
# The Name of the Finding created by test_add_product_finding => 'App Vulnerable to XSS'
136
250
# Test To Add Finding To product
@@ -519,6 +633,13 @@ def add_finding_tests_to_suite(suite, *, jira=False, github=False, block_executi
519
633
suite .addTest (FindingTest ("test_excel_export" ))
520
634
suite .addTest (FindingTest ("test_list_components" ))
521
635
suite .addTest (FindingTest ("test_edit_finding" ))
636
+ suite .addTest (FindingTest ("test_edit_finding_cvssv3_valid_vector" ))
637
+ suite .addTest (FindingTest ("test_edit_finding_cvssv3_valid_vector_no_prefix" ))
638
+ suite .addTest (FindingTest ("test_edit_finding_cvssv3_valid_vector_with_trailing_slash" ))
639
+ suite .addTest (FindingTest ("test_edit_finding_cvssv3_with_v2_vector" ))
640
+ suite .addTest (FindingTest ("test_edit_finding_cvssv3_with_v2_vector_invalid_due_to_prefix" ))
641
+ suite .addTest (FindingTest ("test_edit_finding_cvssv3_with_v4_vector" ))
642
+ suite .addTest (FindingTest ("test_edit_finding_cvssv3_with_rubbish" ))
522
643
suite .addTest (FindingTest ("test_add_note_to_finding" ))
523
644
suite .addTest (FindingTest ("test_add_image" ))
524
645
suite .addTest (FindingTest ("test_delete_image" ))
0 commit comments