|
| 1 | +//file:noinspection LineLength |
1 | 2 | package org.sdase.deleteTestProduct
|
2 | 3 |
|
| 4 | +import groovy.time.TimeDuration |
| 5 | +import groovy.transform.CompileDynamic |
| 6 | +import groovy.util.logging.Slf4j |
3 | 7 | import io.securecodebox.persistence.defectdojo.config.DefectDojoConfig
|
4 | 8 | import io.securecodebox.persistence.defectdojo.models.Finding
|
5 |
| -import io.securecodebox.persistence.defectdojo.service.EndpointService |
6 |
| -import io.securecodebox.persistence.defectdojo.service.EngagementService |
| 9 | +import io.securecodebox.persistence.defectdojo.models.Product |
7 | 10 | import io.securecodebox.persistence.defectdojo.service.FindingService
|
8 |
| -import io.securecodebox.persistence.defectdojo.service.ProductService; |
9 |
| -import io.securecodebox.persistence.defectdojo.service.ProductTypeService; |
10 |
| -import io.securecodebox.persistence.defectdojo.service.TestService |
11 |
| -import java.text.DateFormat |
12 |
| -import java.text.SimpleDateFormat |
| 11 | +import io.securecodebox.persistence.defectdojo.service.GenericDefectDojoService |
| 12 | +import io.securecodebox.persistence.defectdojo.service.ProductService |
| 13 | + |
13 | 14 | import java.time.LocalDateTime
|
14 | 15 | import java.time.format.DateTimeFormatter
|
15 | 16 | import java.time.temporal.ChronoUnit
|
16 |
| -import io.securecodebox.persistence.defectdojo.config.DefectDojoConfig |
17 |
| -import io.securecodebox.persistence.defectdojo.models.Engagement |
18 |
| -import io.securecodebox.persistence.defectdojo.models.Finding |
19 |
| -import io.securecodebox.persistence.defectdojo.models.Product |
20 |
| -import io.securecodebox.persistence.defectdojo.models.ProductType |
21 |
| -import io.securecodebox.persistence.defectdojo.models.ScanFile |
22 |
| -import io.securecodebox.persistence.defectdojo.models.Test |
23 |
| -import io.securecodebox.persistence.defectdojo.models.TestType |
24 |
| -import io.securecodebox.persistence.defectdojo.models.User |
25 |
| -import io.securecodebox.persistence.defectdojo.models.DojoGroup |
26 |
| -import io.securecodebox.persistence.defectdojo.models.ProductGroup |
27 |
| - |
28 |
| -import io.securecodebox.persistence.defectdojo.service.EngagementService |
29 |
| -import io.securecodebox.persistence.defectdojo.service.FindingService |
30 |
| -import io.securecodebox.persistence.defectdojo.service.ImportScanService |
31 |
| -import io.securecodebox.persistence.defectdojo.service.ProductService; |
32 |
| -import io.securecodebox.persistence.defectdojo.service.ProductTypeService; |
33 |
| -import io.securecodebox.persistence.defectdojo.service.TestService |
34 |
| -import io.securecodebox.persistence.defectdojo.service.TestTypeService |
35 |
| -import io.securecodebox.persistence.defectdojo.service.UserService |
36 |
| -import io.securecodebox.persistence.defectdojo.service.DojoGroupService |
37 |
| -import io.securecodebox.persistence.defectdojo.service.ProductGroupService |
38 |
| -import io.securecodebox.persistence.defectdojo.ScanType |
39 | 17 | import java.util.stream.Collectors
|
40 | 18 |
|
| 19 | +@Slf4j @CompileDynamic |
41 | 20 | class TestProductDeletor {
|
42 |
| - static void main(dojoUrl, dojoToken, dojoUser) { |
43 |
| - def conf = new DefectDojoConfig(dojoUrl, dojoToken, dojoUser, 200); |
44 |
| - def productTypeService = new ProductTypeService(conf); |
45 |
| - def productService = new ProductService(conf); |
46 |
| - def engagementService = new EngagementService(conf) |
47 |
| - def testService = new TestService(conf) |
48 |
| - def testTypeService = new TestTypeService(conf) |
49 |
| - def userService = new UserService(conf) |
50 |
| - def findingService = new FindingService(conf) |
51 |
| - def importScanService = new ImportScanService(conf) |
52 |
| - def dojoGroupService = new DojoGroupService(conf) |
53 |
| - def productGroupService = new ProductGroupService(conf) |
54 |
| - def endpointService = new EndpointService(conf) |
| 21 | + static void call() { |
| 22 | + log.info('DefectDojo Test Deletion Client') |
55 | 23 |
|
| 24 | + def dojoConf = createDojoConf() |
56 | 25 |
|
57 | 26 | URL resource = TestProductDeletor.getClassLoader().getResource("expectedFindings.json");
|
58 |
| - |
59 | 27 | File file = new File(resource.getPath())
|
60 | 28 | String fileContent = file.text
|
61 | 29 | def jsonSlurper = new groovy.json.JsonSlurper()
|
62 | 30 | def expectedFindings = jsonSlurper.parseText(fileContent)
|
63 | 31 |
|
64 |
| - for(expectedFinding in expectedFindings) { |
| 32 | + // set DEFECT_DOJO_OBJET_LIMIT to 3000 to save tons of unnecessary requests. |
| 33 | + // using Reflection, not inheritance because weird compile time classpath issues seem to prevent subclassing |
| 34 | + GenericDefectDojoService.getDeclaredField("DEFECT_DOJO_OBJET_LIMIT").setAccessible(true) |
| 35 | + def productService = new ProductService(dojoConf) |
| 36 | + //noinspection GroovyAccessibility -- see comment above |
| 37 | + productService.DEFECT_DOJO_OBJET_LIMIT = 3000 |
| 38 | + def findingService = new FindingService(dojoConf) |
| 39 | + //noinspection GroovyAccessibility -- see comment above |
| 40 | + findingService.DEFECT_DOJO_OBJET_LIMIT = 3000 |
| 41 | + |
| 42 | + def lastProductName = "" |
| 43 | + for (expectedFinding in expectedFindings) { |
| 44 | + if (lastProductName == expectedFinding.productName) { |
| 45 | + log.info "Skipping ${expectedFinding.productName} because product is deleted or doesn't exists" |
| 46 | + continue |
| 47 | + } |
| 48 | + lastProductName = expectedFinding.productName |
| 49 | + log.info "iterating over expectedFinding with query (${expectedFinding.productName})" |
| 50 | + Map<String, String> queryParameter = new HashMap<>(); |
| 51 | + queryParameter.put("name", expectedFinding.productName); |
65 | 52 | try {
|
66 | 53 | def product = productService.searchUnique(Product.builder().name(expectedFinding.productName).build()).orElseThrow{
|
67 | 54 | new Exception("Could not find product with name '" + expectedFinding.productName + "' in DefectDojo API. DefectDojo might be running in an unsupported version.")
|
68 | 55 | };
|
69 |
| - println "deleting product ${product.id}" |
| 56 | + log.info "deleting product ${product.id}" |
| 57 | + |
70 | 58 | productService.delete(product.id)
|
71 | 59 | } catch(Exception e) {
|
72 |
| - println "Product ${expectedFinding.productName} not found" |
| 60 | + log.warn("Product ${expectedFinding.productName} not found") |
73 | 61 | println e
|
74 | 62 | }
|
75 | 63 | }
|
76 | 64 | }
|
| 65 | + |
| 66 | + private static DefectDojoConfig createDojoConf() { |
| 67 | + def dojoUrl = System.getenv('DEFECTDOJO_URL') ?: System.getenv('DD_URL') |
| 68 | + if (isNullOrEmpty(dojoUrl)) { |
| 69 | + log.error 'DEFECTDOJO_URL not set' |
| 70 | + System.exit(1) |
| 71 | + } |
| 72 | + |
| 73 | + def dojoToken = System.getenv('DEFECTDOJO_APIKEY') ?: System.getenv('DD_TOKEN') |
| 74 | + if (isNullOrEmpty(dojoToken)) { |
| 75 | + log.error 'DEFECTDOJO_APIKEY not set' |
| 76 | + System.exit(1) |
| 77 | + } |
| 78 | + def dojoUser = System.getenv('DEFECTDOJO_USERNAME') |
| 79 | + if (dojoUser == null) { |
| 80 | + dojoUser = System.getenv('DD_USER') |
| 81 | + } |
| 82 | + return new DefectDojoConfig(dojoUrl, dojoToken, dojoUser, 200) |
| 83 | + } |
| 84 | + private static boolean isNullOrEmpty(String string) { |
| 85 | + return string == null || string.empty |
| 86 | + } |
77 | 87 | }
|
0 commit comments