diff --git a/internal/commands/scan.go b/internal/commands/scan.go index 60e12ed97..558317c86 100644 --- a/internal/commands/scan.go +++ b/internal/commands/scan.go @@ -19,6 +19,7 @@ import ( "strconv" "strings" "time" + "unicode" "github.com/checkmarx/ast-cli/internal/commands/asca" "github.com/checkmarx/ast-cli/internal/commands/scarealtime" @@ -1551,9 +1552,9 @@ func runScaResolver(sourceDir, scaResolver, scaResolverParams, projectName strin scaResolverResultsFile, } if scaResolverParams != "" { - args = append(args, scaResolverParams) + parsedscaResolverParams := parseArgs(scaResolverParams) + args = append(args, parsedscaResolverParams...) } - log.Println(fmt.Sprintf("Using SCA resolver: %s %v", scaResolver, args)) out, err := exec.Command(scaResolver, args...).Output() logger.PrintIfVerbose(string(out)) @@ -1727,6 +1728,7 @@ func getScaResolverFlags(cmd *cobra.Command) (scaResolverParams, scaResolver str scaResolver = "" scaResolverParams = "" } + logger.PrintfIfVerbose("HM:: in getScaResolverFlags scaResolverParams:: %v", scaResolverParams) return scaResolverParams, scaResolver } @@ -2973,3 +2975,34 @@ func validateBooleanString(value string) error { } return nil } + +func parseArgs(input string) []string { + var args []string + var current strings.Builder + var quote rune + inQuotes := false + + for i, r := range input { + switch { + case (r == '\'' || r == '"') && !inQuotes: + inQuotes = true + quote = r + case r == quote && inQuotes: + inQuotes = false + case unicode.IsSpace(r) && !inQuotes: + if current.Len() > 0 { + args = append(args, current.String()) + current.Reset() + } + default: + current.WriteRune(r) + } + + // Append last token if input ends + if i == len(input)-1 && current.Len() > 0 { + args = append(args, current.String()) + } + } + + return args +} diff --git a/internal/commands/scan_test.go b/internal/commands/scan_test.go index fe2d92ac0..12f1ffc9c 100644 --- a/internal/commands/scan_test.go +++ b/internal/commands/scan_test.go @@ -2237,3 +2237,22 @@ func TestCreateScanWith_ScaResolver_Source_as_Zip(t *testing.T) { err := execCmdNotNilAssertion(t, baseArgs...) assert.Assert(t, strings.Contains(err.Error(), ScaResolverZipNotSupportedErr), err.Error()) } + +func Test_parseArgs(t *testing.T) { + tests := []struct { + inputString string + lenOfArgs int + }{ + {"hitesh", 1}, + {`test test1`, 2}, + {"--gradle-parameters='-Prepository.proxy.url=123 -Prepository.proxy.username=123 -Prepository.proxy.password=123' --log-level Debug", 3}, + } + + for _, test := range tests { + fmt.Println("test ::", test) + result := parseArgs(test.inputString) + if len(result) != test.lenOfArgs { + t.Errorf(" test case failed for params %v", test) + } + } +}