@@ -112,11 +112,8 @@ def test_edit_finding(self):
112112 driver .find_element (By .ID , "dropdownMenu1" ).click ()
113113 # Click on `Edit Finding`
114114 driver .find_element (By .LINK_TEXT , "Edit Finding" ).click ()
115- # Change: 'Severity' and 'cvssv3'
116115 # finding Severity
117116 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" )
120117 # finding Vulnerability Ids
121118 driver .find_element (By .ID , "id_vulnerability_ids" ).send_keys ("\n REF-3\n REF-4\n " )
122119 # "Click" the Done button to Edit the finding
@@ -131,6 +128,123 @@ def test_edit_finding(self):
131128 self .assertTrue (self .is_text_present_on_page (text = "REF-4" ))
132129 self .assertTrue (self .is_text_present_on_page (text = "Additional Vulnerability Ids" ))
133130
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+
134248 def test_add_image (self ):
135249 # The Name of the Finding created by test_add_product_finding => 'App Vulnerable to XSS'
136250 # Test To Add Finding To product
@@ -519,6 +633,13 @@ def add_finding_tests_to_suite(suite, *, jira=False, github=False, block_executi
519633 suite .addTest (FindingTest ("test_excel_export" ))
520634 suite .addTest (FindingTest ("test_list_components" ))
521635 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" ))
522643 suite .addTest (FindingTest ("test_add_note_to_finding" ))
523644 suite .addTest (FindingTest ("test_add_image" ))
524645 suite .addTest (FindingTest ("test_delete_image" ))
0 commit comments