1919package io .securecodebox .persistence ;
2020
2121import io .securecodebox .persistence .models .*;
22+
23+ import org .camunda .bpm .model .bpmn .instance .ReceiveTask ;
2224import org .slf4j .Logger ;
2325import org .slf4j .LoggerFactory ;
2426import org .springframework .beans .factory .annotation .Value ;
4547import java .util .LinkedList ;
4648import java .util .List ;
4749import java .util .Optional ;
50+ import java .util .Iterator ;
4851
4952@ Component
5053@ ConditionalOnProperty (name = "securecodebox.persistence.defectdojo.enabled" , havingValue = "true" )
@@ -68,6 +71,8 @@ private String currentDate() {
6871
6972 private static final Logger LOG = LoggerFactory .getLogger (DefectDojoService .class );
7073
74+ private LinkedMultiValueMap options ;
75+
7176 private HttpHeaders getHeaders (){
7277 HttpHeaders headers = new HttpHeaders ();
7378 headers .set ("Authorization" , "Token " + defectDojoApiKey );
@@ -256,6 +261,10 @@ public ImportScanResponse createFindingsForEngagementName(String engagementName,
256261 return createFindingsForEngagementName (engagementName , rawResults , defectDojoScanName , productId , lead , engagementPayload , testName );
257262 }
258263
264+ private Optional <Long > getEngagementIdByEngagementName (String engagementName , String productName ){
265+ long productId = retrieveProductId (productName );
266+ return getEngagementIdByEngagementName (engagementName , productId , 0L );
267+ }
259268 private Optional <Long > getEngagementIdByEngagementName (String engagementName , long productId ){
260269 return getEngagementIdByEngagementName (engagementName , productId , 0L );
261270 }
@@ -355,11 +364,64 @@ public void deleteEnageament(long engagementId){
355364 String uri = defectDojoUrl + "/api/v2/engagements/" + engagementId + "/?id=" + engagementId ;
356365 HttpEntity request = new HttpEntity (getHeaders ());
357366 try {
358- ResponseEntity <DefectDojoResponse > response = restTemplate .exchange (uri , HttpMethod .DELETE , request , DefectDojoResponse .class );
367+ ResponseEntity <DefectDojoResponse > response = restTemplate .exchange (uri , HttpMethod .GET , request , DefectDojoResponse .class );
359368 } catch (HttpClientErrorException e ) {
360369 LOG .warn ("Failed to delete engagment {}, engagementId: " + engagementId , e );
361370 LOG .warn ("Failure response body. {}" , e .getResponseBodyAsString ());
362371 throw new DefectDojoPersistenceException ("Failed to delete product" , e );
363372 }
373+ }
374+
375+ /* options is created as follows:
376+ MultiValueMap<String, String> mvn = new LinkedMultiValueMap<>();
377+ mvn.add("engagement", Long.toString(engagementId));
378+ */
379+ private List <Finding > getCurrentFindings (long engagementId , LinkedMultiValueMap <String , String > options ){
380+ RestTemplate restTemplate = new RestTemplate ();
381+
382+ UriComponentsBuilder builder = UriComponentsBuilder .fromHttpUrl (defectDojoUrl + "/api/v2/findings/" )
383+ .queryParam ("active" , "true" )
384+ .queryParam ("false_p" , "false" )
385+ .queryParam ("duplicate" , "false" )
386+ .queryParam ("test__engagement" , Long .toString (engagementId ));
387+
388+ if (options != null ) {
389+ builder = prepareParameters (options , builder );
390+ }
391+
392+ HttpEntity request = new HttpEntity (getHeaders ());
393+ try {
394+ ResponseEntity <DefectDojoResponse <Finding >> response = restTemplate .exchange (builder .toUriString (), HttpMethod .GET , request , new ParameterizedTypeReference <DefectDojoResponse <Finding >>(){});
395+ List <Finding > findings = new LinkedList <Finding >();
396+ for (Finding finding : response .getBody ().getResults ()){
397+ findings .add (finding );
398+ }
399+ return findings ;
400+ } catch (HttpClientErrorException e ) {
401+ LOG .warn ("Failed to get findings {}, engagementId: " + engagementId , e );
402+ LOG .warn ("Failure response body. {}" , e .getResponseBodyAsString ());
403+ throw new DefectDojoPersistenceException ("Failed to get findings" , e );
404+ }
405+ }
406+ private UriComponentsBuilder prepareParameters (LinkedMultiValueMap <String , String > queryParameters , UriComponentsBuilder builder ) {
407+ Iterator <String > it = queryParameters .keySet ().iterator ();
408+
409+ while (it .hasNext ()){
410+ String theKey = (String )it .next ();
411+ builder .replaceQueryParam (theKey , queryParameters .getFirst (theKey ));
412+ }
413+ return builder ;
364414 }
415+
416+ public List <Finding > receiveNonHandeldFindings (String productName , String engagementName , String minimumServerity , LinkedMultiValueMap <String , String > options ){
417+ Long engagementId = getEngagementIdByEngagementName (engagementName , productName ).orElse (0L );
418+ //getCurrentFindings
419+ List <Finding > findings = new LinkedList <Finding >();
420+ for (String serverity : Finding .getServeritiesAndHigherServerities (minimumServerity )) {
421+ LinkedMultiValueMap <String , String > optionTemp = options .clone ();
422+ optionTemp .add ("serverity" , serverity );
423+ findings .addAll (getCurrentFindings (engagementId , optionTemp ));
424+ }
425+ return findings ;
426+ }
365427}
0 commit comments