diff --git a/fcli-core/fcli-fod/src/main/java/com/fortify/cli/fod/_common/scan/helper/sast/FoDScanSastHelper.java b/fcli-core/fcli-fod/src/main/java/com/fortify/cli/fod/_common/scan/helper/sast/FoDScanSastHelper.java index 3094ffb3180..a3531083fe6 100644 --- a/fcli-core/fcli-fod/src/main/java/com/fortify/cli/fod/_common/scan/helper/sast/FoDScanSastHelper.java +++ b/fcli-core/fcli-fod/src/main/java/com/fortify/cli/fod/_common/scan/helper/sast/FoDScanSastHelper.java @@ -67,7 +67,7 @@ public static final FoDScanDescriptor startScanAdvanced(UnirestInstance unirest, .queryString("remdiationScanPreferenceType", (req.getRemdiationScanPreferenceType() != null ? FoDEnums.RemediationScanPreferenceType.valueOf(req.getRemdiationScanPreferenceType()) : FoDEnums.RemediationScanPreferenceType.NonRemediationScanOnly)) .queryString("inProgressScanActionType", (req.getInProgressScanActionType() != null ? - FoDEnums.InProgressScanActionType.valueOf(req.getInProgressScanActionType()) : FoDEnums.InProgressScanActionType.DoNotStartScan)) + req.getInProgressScanActionType() : FoDEnums.InProgressScanActionType.DoNotStartScan.toString())) .queryString("scanTool", req.getScanTool()) .queryString("scanToolVersion", req.getScanToolVersion()) .queryString("scanMethodType", req.getScanMethodType()); diff --git a/fcli-core/fcli-fod/src/main/java/com/fortify/cli/fod/sast_scan/cli/cmd/FoDSastScanStartCommand.java b/fcli-core/fcli-fod/src/main/java/com/fortify/cli/fod/sast_scan/cli/cmd/FoDSastScanStartCommand.java index 85df65310af..b78db8e2fa5 100644 --- a/fcli-core/fcli-fod/src/main/java/com/fortify/cli/fod/sast_scan/cli/cmd/FoDSastScanStartCommand.java +++ b/fcli-core/fcli-fod/src/main/java/com/fortify/cli/fod/sast_scan/cli/cmd/FoDSastScanStartCommand.java @@ -41,6 +41,10 @@ public class FoDSastScanStartCommand extends AbstractFoDScanStartCommand { @Option(names = {"--notes"}) private String notes; + @Option(names = {"--in-progress-action"}, descriptionKey = "fcli.fod.sast-scan.start.in-progress-action") + private FoDEnums.InProgressScanActionType inProgressScanActionType; + @Option(names = {"--entitlement-preference"}, descriptionKey = "fcli.fod.scan.entitlement-preference") + private FoDEnums.EntitlementPreferenceType entitlementPreferenceType; @Mixin private CommonOptionMixins.RequiredFile scanFileMixin; @Mixin private FoDRemediationScanPreferenceTypeMixins.OptionalOption remediationScanType; @@ -49,27 +53,40 @@ public class FoDSastScanStartCommand extends AbstractFoDScanStartCommand { @Override protected FoDScanDescriptor startScan(UnirestInstance unirest, FoDReleaseDescriptor releaseDescriptor) { String relId = releaseDescriptor.getReleaseId(); - Boolean isRemediation = false; - - // if we have requested remediation scan use it to find appropriate assessment type - if (remediationScanType != null && remediationScanType.getRemediationScanPreferenceType() != null) { - if (remediationScanType.getRemediationScanPreferenceType().equals(FoDEnums.RemediationScanPreferenceType.RemediationScanIfAvailable) || - remediationScanType.getRemediationScanPreferenceType().equals(FoDEnums.RemediationScanPreferenceType.RemediationScanOnly)) { - isRemediation = true; - } - } validateScanSetup(unirest, relId); - FoDScanSastStartRequest startScanRequest = FoDScanSastStartRequest.builder() - .isRemediationScan(isRemediation) + FoDEnums.RemediationScanPreferenceType remediationPref = remediationScanType.getRemediationScanPreferenceType(); + + boolean useAdvanced = entitlementPreferenceType != null || inProgressScanActionType != null; + + FoDScanSastStartRequest.FoDScanSastStartRequestBuilder requestBuilder = FoDScanSastStartRequest.builder() .scanMethodType("Other") .notes(notes != null && !notes.isEmpty() ? notes : "") .scanTool(FcliBuildProperties.INSTANCE.getFcliProjectName()) - .scanToolVersion(FcliBuildProperties.INSTANCE.getFcliVersion()) - .build(); + .scanToolVersion(FcliBuildProperties.INSTANCE.getFcliVersion()); try (IProgressWriter progressWriter = progressWriterFactory.create()) { + if (useAdvanced) { + FoDEnums.InProgressScanActionType inProgressAction = inProgressScanActionType != null + ? inProgressScanActionType : FoDEnums.InProgressScanActionType.Queue; + // FoD's start-scan-advanced expects 'CancelInProgressScan' rather than the enum's 'CancelScanInProgress' + String inProgressApiValue = inProgressAction == FoDEnums.InProgressScanActionType.CancelScanInProgress + ? "CancelInProgressScan" : inProgressAction.name(); + FoDScanSastStartRequest startScanRequest = requestBuilder + .entitlementPreferenceType(entitlementPreferenceType != null ? entitlementPreferenceType.name() : null) + .purchaseEntitlement(false) + .remdiationScanPreferenceType(remediationPref != null ? remediationPref.name() : null) + .inProgressScanActionType(inProgressApiValue) + .build(); + return FoDScanSastHelper.startScanAdvanced(unirest, releaseDescriptor, startScanRequest, scanFileMixin.getFile(), progressWriter); + } + boolean isRemediation = remediationPref != null + && (remediationPref.equals(FoDEnums.RemediationScanPreferenceType.RemediationScanIfAvailable) + || remediationPref.equals(FoDEnums.RemediationScanPreferenceType.RemediationScanOnly)); + FoDScanSastStartRequest startScanRequest = requestBuilder + .isRemediationScan(isRemediation) + .build(); return FoDScanSastHelper.startScanWithDefaults(unirest, releaseDescriptor, startScanRequest, scanFileMixin.getFile(), progressWriter); } } diff --git a/fcli-core/fcli-fod/src/main/resources/com/fortify/cli/fod/i18n/FoDMessages.properties b/fcli-core/fcli-fod/src/main/resources/com/fortify/cli/fod/i18n/FoDMessages.properties index 411e3cfbd51..326322e9ba5 100644 --- a/fcli-core/fcli-fod/src/main/resources/com/fortify/cli/fod/i18n/FoDMessages.properties +++ b/fcli-core/fcli-fod/src/main/resources/com/fortify/cli/fod/i18n/FoDMessages.properties @@ -542,6 +542,7 @@ fcli.fod.sast-scan.start.remediation = Identify this scan as a remediation scan. fcli.fod.sast-scan.start.skip-if-running = Check to see if static scan is already running before starting. fcli.fod.sast-scan.start.entitlement-id = The Id of the entitlement to use for the scan. fcli.fod.sast-scan.start.purchase-entitlement = Purchase an entitlement if one is not currently allocated or available. +fcli.fod.sast-scan.start.in-progress-action = The action to use if a scan is already in progress. Valid values: ${COMPLETION-CANDIDATES}. Defaults to 'Queue' when this or '--entitlement-preference' is specified; otherwise the FoD-side default applies. fcli.fod.sast-scan.start.notes = Scan notes. fcli.fod.sast-scan.start.file = Absolute path of the ScanCentral package (.Zip) file to upload. fcli.fod.sast-scan.start.validate-entitlement = Validate if an entitlement has been set and is still valid.