From 894575879b21fa12444e08f02bf097eda4d6cd5e Mon Sep 17 00:00:00 2001 From: kadraman Date: Fri, 18 Sep 2026 14:36:40 +0100 Subject: [PATCH] feat: `fod sast-scan setup` add support for `--scan-policy` feat: `fod sast-scan start` add support for `--scan-policy` fix: `fod sast-scan start` no longer overrides existing Scan Policy if no `--scan-policy` is not supplied (fixes #1095) --- .../scan/helper/sast/FoDScanSastHelper.java | 42 +++++++++++++++++++ .../helper/sast/FoDScanSastStartRequest.java | 1 + .../cli/cmd/FoDSastScanSetupCommand.java | 4 ++ .../cli/cmd/FoDSastScanStartCommand.java | 14 +++++-- .../helper/FoDScanConfigSastDescriptor.java | 1 + .../helper/FoDScanConfigSastSetupRequest.java | 1 + .../cli/fod/i18n/FoDMessages.properties | 2 + .../helper/sast/FoDScanSastHelperTest.java | 41 ++++++++++++++++++ .../fortify/cli/ftest/fod/FoDScanSpec.groovy | 15 ++++++- 9 files changed, 117 insertions(+), 4 deletions(-) create mode 100644 fcli-core/fcli-fod/src/test/java/com/fortify/cli/fod/_common/scan/helper/sast/FoDScanSastHelperTest.java 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 a3531083fe6..2fdafef532a 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 @@ -39,9 +39,45 @@ import lombok.Getter; public class FoDScanSastHelper extends FoDScanHelper { + private static final String LEGACY_SETUP_SCAN_POLICY = "FoD_Legacy"; + private static final String LEGACY_START_SCAN_POLICY = "FoD_Legacy_"; + private static final String SECURITY_SCAN_POLICY = "Security"; + private static final String DEVOPS_SCAN_POLICY = "DevOps"; + private static final String CLASSIC_SCAN_POLICY = "Classic"; + @Getter private static final ObjectMapper objectMapper = new ObjectMapper(); + public static final String normalizeSetupScanPolicy(String scanPolicy) { + String normalizedScanPolicy = normalizeScanPolicy(scanPolicy); + return isLegacyScanPolicy(normalizedScanPolicy) ? LEGACY_SETUP_SCAN_POLICY : normalizedScanPolicy; + } + + public static final String normalizeStartScanPolicy(String scanPolicy) { + String normalizedScanPolicy = normalizeScanPolicy(scanPolicy); + return isLegacyScanPolicy(normalizedScanPolicy) ? LEGACY_START_SCAN_POLICY : normalizedScanPolicy; + } + + private static String normalizeScanPolicy(String scanPolicy) { + String normalizedScanPolicy = StringUtils.trimToNull(scanPolicy); + if (SECURITY_SCAN_POLICY.equalsIgnoreCase(normalizedScanPolicy)) { + return SECURITY_SCAN_POLICY; + } else if (DEVOPS_SCAN_POLICY.equalsIgnoreCase(normalizedScanPolicy)) { + return DEVOPS_SCAN_POLICY; + } else if (CLASSIC_SCAN_POLICY.equalsIgnoreCase(normalizedScanPolicy)) { + return CLASSIC_SCAN_POLICY; + } + return normalizedScanPolicy; + } + + private static boolean isLegacyScanPolicy(String scanPolicy) { + return "Legacy".equalsIgnoreCase(scanPolicy) + || LEGACY_SETUP_SCAN_POLICY.equalsIgnoreCase(scanPolicy) + || LEGACY_START_SCAN_POLICY.equalsIgnoreCase(scanPolicy) + || "FoD(Legacy)".equalsIgnoreCase(scanPolicy) + || "FoD (Legacy)".equalsIgnoreCase(scanPolicy); + } + public static final FoDScanDescriptor startScanWithDefaults(UnirestInstance unirest, FoDReleaseDescriptor releaseDescriptor, FoDScanSastStartRequest req, File scanFile, IProgressWriter progressWriter) { var relId = releaseDescriptor.getReleaseId(); @@ -54,6 +90,9 @@ public static final FoDScanDescriptor startScanWithDefaults(UnirestInstance unir String truncatedNotes = StringUtils.abbreviate(req.getNotes(), FoDConstants.MAX_NOTES_LENGTH); request = request.queryString("notes", truncatedNotes); } + if (StringUtils.isNotBlank(req.getSastScanPolicy())) { + request = request.queryString("sastScanPolicy", req.getSastScanPolicy()); + } return startScan(unirest, releaseDescriptor, request, scanFile, progressWriter); } @@ -78,6 +117,9 @@ public static final FoDScanDescriptor startScanAdvanced(UnirestInstance unirest, String truncatedNotes = StringUtils.abbreviate(req.getNotes(), FoDConstants.MAX_NOTES_LENGTH); request = request.queryString("notes", truncatedNotes); } + if (StringUtils.isNotBlank(req.getSastScanPolicy())) { + request = request.queryString("sastScanPolicy", req.getSastScanPolicy()); + } return startScan(unirest, releaseDescriptor, request, scanFile, progressWriter); } diff --git a/fcli-core/fcli-fod/src/main/java/com/fortify/cli/fod/_common/scan/helper/sast/FoDScanSastStartRequest.java b/fcli-core/fcli-fod/src/main/java/com/fortify/cli/fod/_common/scan/helper/sast/FoDScanSastStartRequest.java index 1a195d28405..e86a157d375 100644 --- a/fcli-core/fcli-fod/src/main/java/com/fortify/cli/fod/_common/scan/helper/sast/FoDScanSastStartRequest.java +++ b/fcli-core/fcli-fod/src/main/java/com/fortify/cli/fod/_common/scan/helper/sast/FoDScanSastStartRequest.java @@ -32,4 +32,5 @@ public class FoDScanSastStartRequest { private String scanTool; private String scanToolVersion; private String notes; + private String sastScanPolicy; } diff --git a/fcli-core/fcli-fod/src/main/java/com/fortify/cli/fod/sast_scan/cli/cmd/FoDSastScanSetupCommand.java b/fcli-core/fcli-fod/src/main/java/com/fortify/cli/fod/sast_scan/cli/cmd/FoDSastScanSetupCommand.java index 550b58894a8..affccef6693 100644 --- a/fcli-core/fcli-fod/src/main/java/com/fortify/cli/fod/sast_scan/cli/cmd/FoDSastScanSetupCommand.java +++ b/fcli-core/fcli-fod/src/main/java/com/fortify/cli/fod/sast_scan/cli/cmd/FoDSastScanSetupCommand.java @@ -62,6 +62,8 @@ public class FoDSastScanSetupCommand extends AbstractFoDScanSetupCommand