Skip to content

Commit f22b403

Browse files
committed
checkmarx api
1 parent f733b07 commit f22b403

File tree

6 files changed

+107
-0
lines changed

6 files changed

+107
-0
lines changed

src/main/java/io/mixeway/api/cicd/controller/CICDController.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,4 +153,15 @@ public ResponseEntity<?> loadKicsReport(@RequestBody KicsReport kicsReport,
153153
Principal principal) throws UnknownHostException {
154154
return cicdService.loadKicsReport(kicsReport, codeProjectid, principal);
155155
}
156+
/**
157+
* Validate State of security for given CodeProject and Branch
158+
*/
159+
@CrossOrigin(origins="*")
160+
@PreAuthorize("hasAuthority('ROLE_API')")
161+
@PostMapping(value = "/asset/{id}/checkmarx/start",produces = "application/json")
162+
public ResponseEntity<?> startCheckmarxScan(@RequestBody ProjectMetadata projectMetadat,
163+
@PathVariable("id") long codeProjectid,
164+
Principal principal) throws UnknownHostException {
165+
return cicdService.startCheckmarxScan(projectMetadat, codeProjectid, principal);
166+
}
156167
}

src/main/java/io/mixeway/api/cicd/service/CICDService.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,4 +256,16 @@ public ResponseEntity<?> loadKicsReport(KicsReport kicsReport, long codeProjecti
256256
}
257257
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
258258
}
259+
260+
public ResponseEntity<?> startCheckmarxScan(ProjectMetadata projectMetadat, long codeProjectid, Principal principal) {
261+
Optional<CodeProject> codeProject = findCodeProjectService.findById(codeProjectid);
262+
if (codeProject.isPresent() && permissionFactory.canUserAccessProject(principal, codeProject.get().getProject())){
263+
CodeProjectBranch codeProjectBranch = getOrCreateCodeProjectBranchService.getOrCreateCodeProjectBranch(codeProject.get(), projectMetadat.getBranch());
264+
log.info("[CICD] Starting SAST scan for {} [{}]", codeProject.get().getName(), codeProject.get().getRepoUrl());
265+
codeScanService.runScan(codeProject.get(),codeProjectBranch, projectMetadat, principal);
266+
} else {
267+
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
268+
}
269+
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
270+
}
259271
}

src/main/java/io/mixeway/scanmanager/integrations/checkmarx/apiclient/CheckmarxApiClient.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,23 @@ public Boolean runScan(CodeProject codeProject) throws CertificateException, Unr
9797
}
9898
}
9999

100+
@Override
101+
public Boolean runScan(CodeProject codeProject, CodeProjectBranch codeProjectBranch) throws CertificateException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyManagementException, KeyStoreException, IOException, JSONException, ParseException {
102+
Optional<Scanner> cxSast = scannerRepository.findByScannerType(scannerTypeRepository.findByNameIgnoreCase(Constants.SCANNER_TYPE_CHECKMARX)).stream().findFirst();
103+
boolean hasToCreateProject = codeProject.getVersionIdAll() == 0 && codeProject.getRemoteid() ==0;
104+
if (cxSast.isPresent()){
105+
if (hasToCreateProject){
106+
createProject(cxSast.get(),codeProject);
107+
}
108+
setGitRepositoryForProject(cxSast.get(),codeProject, codeProjectBranch);
109+
110+
return createScan(cxSast.get(),codeProject);
111+
} else {
112+
log.error("[Checkmarx] Checkmarx detected but no scanener found");
113+
return false;
114+
}
115+
}
116+
100117
/**
101118
* condition has to be fixed
102119
*/
@@ -226,6 +243,28 @@ private void setGitRepositoryForProject(Scanner scanner, CodeProject codeProject
226243
log.error("[Checkmarx] Error setting GIT repo for project {} - {}",codeProject.getName(), e.getLocalizedMessage());
227244
}
228245
}
246+
/**
247+
* configure granch and git URL for
248+
* @param scanner
249+
* @param codeProject
250+
*/
251+
private void setGitRepositoryForProject(Scanner scanner, CodeProject codeProject, CodeProjectBranch codeProjectBranch) throws CertificateException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyManagementException, JSONException, KeyStoreException, ParseException, IOException {
252+
CodeRequestHelper codeRequestHelper = prepareRestTemplate(scanner);
253+
String passwordString = getPasswordStringForCodeProejct(codeProject);
254+
HttpEntity<CxSetGitRepo> cxSetGitRepoHttpEntity = new HttpEntity<>(new CxSetGitRepo(codeProject, passwordString, codeProjectBranch), codeRequestHelper.getHttpEntity().getHeaders());
255+
ObjectMapper mapper = new ObjectMapper();
256+
log.debug("[Checkmarx] Setting git repo {}", mapper.writeValueAsString(cxSetGitRepoHttpEntity));
257+
codeRequestHelper.setHttpEntity(cxSetGitRepoHttpEntity);
258+
try {
259+
int remoteId = (codeProject.getRemoteid() == 0) ? codeProject.getVersionIdAll() : (codeProject.getVersionIdAll() == 0) ? codeProject.getRemoteid() : codeProject.getVersionIdAll();
260+
ResponseEntity<String> response = codeRequestHelper
261+
.getRestTemplate()
262+
.exchange(scanner.getApiUrl() + Constants.CX_GET_PROJECTS_API + "/" + remoteId + "/sourceCode/remoteSettings/git", HttpMethod.POST, codeRequestHelper.getHttpEntity(), String.class);
263+
log.info("[Checkmarx] Setting GIT repo for {} result {}", codeProject.getName(), response.getStatusCode());
264+
} catch (Exception e){
265+
log.error("[Checkmarx] Error setting GIT repo for project {} - {}",codeProject.getName(), e.getLocalizedMessage());
266+
}
267+
}
229268

230269
/**
231270
* get auth string for particular project:

src/main/java/io/mixeway/scanmanager/integrations/checkmarx/model/CxSetGitRepo.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package io.mixeway.scanmanager.integrations.checkmarx.model;
77

88
import io.mixeway.db.entity.CodeProject;
9+
import io.mixeway.db.entity.CodeProjectBranch;
910
import lombok.AllArgsConstructor;
1011
import lombok.Getter;
1112
import lombok.NoArgsConstructor;
@@ -33,5 +34,13 @@ public CxSetGitRepo(CodeProject codeProject, String pass){
3334
this.branch = "refs/heads/" + codeProject.getBranch();
3435
}
3536
}
37+
public CxSetGitRepo(CodeProject codeProject, String pass, CodeProjectBranch codeProjectBranch){
38+
if (pass != null){
39+
this.url ="https://"+pass+"@"+codeProject.getRepoUrl().split("://")[1];
40+
} else {
41+
this.url = codeProject.getRepoUrl();
42+
}
43+
this.branch = "refs/heads/" + codeProjectBranch.getName();
44+
}
3645

3746
}

src/main/java/io/mixeway/scanmanager/service/code/CodeScanClient.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
public interface CodeScanClient {
2121
void loadVulnerabilities(Scanner scanner, String urlToGetNext, Boolean single, CodeProject codeProject, List<ProjectVulnerability> codeVulns, CodeProjectBranch codeProjectBranch) throws ParseException, JSONException, CertificateException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyManagementException, KeyStoreException, IOException, URISyntaxException;
2222
Boolean runScan(CodeProject codeProject) throws CertificateException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyManagementException, KeyStoreException, IOException, JSONException, ParseException;
23+
Boolean runScan(CodeProject codeProject, CodeProjectBranch codeProjectBranch) throws CertificateException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyManagementException, KeyStoreException, IOException, JSONException, ParseException;
2324
boolean isScanDone(CodeProject cp) throws CertificateException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyManagementException, KeyStoreException, IOException, ParseException, JSONException;
2425
boolean canProcessRequest(CodeProject cp);
2526
boolean canProcessRequest(Scanner scanner);

src/main/java/io/mixeway/scanmanager/service/code/CodeScanService.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,41 @@ public void runFromQueue() {
261261
}
262262
}
263263

264+
/**
265+
* Get the CodeProjects and CodeGroups with inQueue=true
266+
* Verify if scan can be run and then runs it.
267+
*/
268+
@Transactional
269+
public void runScan(CodeProject codeProject, CodeProjectBranch codeProjectBranch, ProjectMetadata projectMetadata, Principal principal) {
270+
Optional<Scanner> codeScanner = getScannerService.getCodeScanners();
271+
if (codeScanner.isPresent() && codeScanner.get().getStatus()) {
272+
try {
273+
if (operateOnCodeProject.canScanCodeProject(codeProject)) {
274+
for (CodeScanClient codeScanClient : codeScanClients) {
275+
if (codeScanClient.canProcessRequest(codeProject)) {
276+
log.info("[CodeScan] Starting scan form CICD [scope {}] {}", codeProject.getName(), codeProject.getName());
277+
codeProject = updateCodeProjectService.removeFromQueueAndStart(codeProject);
278+
codeScanClient.runScan( codeProject, codeProjectBranch);
279+
Scan scan = createScanService.createCodeScan(codeProject, projectMetadata.getBranch(),
280+
projectMetadata.getCommitId(),Constants.SAST_LABEL,principal );
281+
CiOperations operations = createCiOperationsService.create(projectMetadata, codeProject);
282+
updateCiOperations.putScanOnAPipeline(operations, scan, securityQualityGateway.buildGatewayResponse(new ArrayList<>()));
283+
284+
// TODO: create codescan
285+
}
286+
}
287+
}
288+
} catch (IndexOutOfBoundsException ex) {
289+
log.debug("Fortify configuration missing");
290+
} catch (HttpClientErrorException ex) {
291+
log.warn("HttpClientErrorException with code [{}] during cloud scan job synchro ", ex.getStatusCode().toString());
292+
} catch (ParseException | JSONException | CertificateException | UnrecoverableKeyException | NoSuchAlgorithmException | KeyManagementException | KeyStoreException | IOException e) {
293+
log.warn("Exception came up during running scan {}", e.getLocalizedMessage());
294+
e.printStackTrace();
295+
}
296+
}
297+
}
298+
264299

265300
/**
266301
* Method which run scan for given parameters

0 commit comments

Comments
 (0)