From 584faa52da53a5101748f778557f27e7c520c103 Mon Sep 17 00:00:00 2001 From: jay-nanduri <72423211+jay-nanduri@users.noreply.github.com> Date: Wed, 27 Apr 2022 11:51:13 -0400 Subject: [PATCH] Ast 11625 add individual scan type filters (#395) * engine filters configuration and unit test --- internal/commands/scan.go | 92 ++++++++++++++--------------- internal/commands/scan_test.go | 21 +++++++ internal/params/flags.go | 8 +++ internal/wrappers/scans.go | 17 ++++++ test/integration/data/insecure.zip | Bin 0 -> 51262 bytes test/integration/scan_test.go | 38 ++++++++++++ 6 files changed, 129 insertions(+), 47 deletions(-) create mode 100644 test/integration/data/insecure.zip diff --git a/internal/commands/scan.go b/internal/commands/scan.go index 7ccf33807..bc9a47a37 100644 --- a/internal/commands/scan.go +++ b/internal/commands/scan.go @@ -358,6 +358,9 @@ func scanCreateSubCommand( commonParams.BranchFlag, commonParams.BranchFlagSh, commonParams.Branch, commonParams.BranchFlagUsage, ) + createScanCmd.PersistentFlags().String(commonParams.SastFilterFlag, "", commonParams.SastFilterUsage) + createScanCmd.PersistentFlags().String(commonParams.KicsFilterFlag, "", commonParams.KicsFilterUsage) + createScanCmd.PersistentFlags().String(commonParams.ScaFilterFlag, "", commonParams.ScaFilterUsage) addResultFormatFlag( createScanCmd, printer.FormatSummaryConsole, @@ -517,15 +520,15 @@ func updateScanRequestValues( return err } } - var sastConfig = addSastScan(cmd) + sastConfig := addSastScan(cmd) if sastConfig != nil { configArr = append(configArr, sastConfig) } - var kicsConfig = addKicsScan() + var kicsConfig = addKicsScan(cmd) if kicsConfig != nil { configArr = append(configArr, kicsConfig) } - var scaConfig = addScaScan() + var scaConfig = addScaScan(cmd) if scaConfig != nil { configArr = append(configArr, scaConfig) } @@ -534,6 +537,45 @@ func updateScanRequestValues( return err } +func addSastScan(cmd *cobra.Command) map[string]interface{} { + if scanTypeEnabled("sast") { + sastMapConfig := make(map[string]interface{}) + sastConfig := wrappers.SastConfig{} + sastMapConfig["type"] = "sast" + incrementalVal, _ := cmd.Flags().GetBool(commonParams.IncrementalSast) + sastConfig.Incremental = strconv.FormatBool(incrementalVal) + sastConfig.PresetName, _ = cmd.Flags().GetString(commonParams.PresetName) + sastConfig.Filter, _ = cmd.Flags().GetString(commonParams.SastFilterFlag) + sastMapConfig["value"] = &sastConfig + return sastMapConfig + } + return nil +} + +func addKicsScan(cmd *cobra.Command) map[string]interface{} { + if scanTypeEnabled("kics") { + kicsMapConfig := make(map[string]interface{}) + kicsConfig := wrappers.KicsConfig{} + kicsMapConfig["type"] = "kics" + kicsConfig.Filter, _ = cmd.Flags().GetString(commonParams.KicsFilterFlag) + kicsMapConfig["value"] = &kicsConfig + return kicsMapConfig + } + return nil +} + +func addScaScan(cmd *cobra.Command) map[string]interface{} { + if scanTypeEnabled("sca") { + scaMapConfig := make(map[string]interface{}) + scaConfig := wrappers.ScaConfig{} + scaMapConfig["type"] = "sca" + scaConfig.Filter, _ = cmd.Flags().GetString(commonParams.ScaFilterFlag) + scaMapConfig["value"] = &scaConfig + return scaMapConfig + } + return nil +} + func determineScanTypes(cmd *cobra.Command) { userScanTypes, _ := cmd.Flags().GetString(commonParams.ScanTypes) if len(userScanTypes) > 0 { @@ -567,50 +609,6 @@ func scanTypeEnabled(scanType string) bool { return false } -func addSastScan(cmd *cobra.Command) map[string]interface{} { - if scanTypeEnabled("sast") { - var objArr map[string]interface{} - _ = json.Unmarshal([]byte("{}"), &objArr) - newIncremental, _ := cmd.Flags().GetBool(commonParams.IncrementalSast) - newPresetName, _ := cmd.Flags().GetString(commonParams.PresetName) - objArr["type"] = "sast" - var valueMap map[string]interface{} - _ = json.Unmarshal([]byte("{}"), &valueMap) - valueMap["incremental"] = fmt.Sprintf("%v", newIncremental) - if newPresetName != "" { - valueMap["presetName"] = newPresetName - } - - objArr["value"] = valueMap - return objArr - } - return nil -} - -func addKicsScan() map[string]interface{} { - if scanTypeEnabled("kics") { - var objArr map[string]interface{} - _ = json.Unmarshal([]byte("{}"), &objArr) - objArr["type"] = "kics" - var valueMap map[string]interface{} - _ = json.Unmarshal([]byte("{}"), &valueMap) - return objArr - } - return nil -} - -func addScaScan() map[string]interface{} { - if scanTypeEnabled("sca") { - var objArr map[string]interface{} - _ = json.Unmarshal([]byte("{}"), &objArr) - objArr["type"] = "sca" - var valueMap map[string]interface{} - _ = json.Unmarshal([]byte("{}"), &valueMap) - return objArr - } - return nil -} - func compressFolder(sourceDir, filter, userIncludeFilter, scaResolver string) (string, error) { scaToolPath := scaResolver outputFile, err := ioutil.TempFile(os.TempDir(), "cx-*.zip") diff --git a/internal/commands/scan_test.go b/internal/commands/scan_test.go index e7e6c9131..8d12507ae 100644 --- a/internal/commands/scan_test.go +++ b/internal/commands/scan_test.go @@ -228,3 +228,24 @@ func TestScanWorkflowMissingID(t *testing.T) { err := execCmdNotNilAssertion(t, "scan", "workflow") assert.Error(t, err, "Please provide a scan ID", err.Error()) } + +func TestScanWorkFlowWithSastFilter(t *testing.T) { + baseArgs := []string{"scan", "create", "--project-name", "sastFilterMock", "-b", "dummy_branch", "-s", dummyRepo, "--sast-filter", "!*.go"} + cmd := createASTTestCommand() + err := executeTestCommand(cmd, baseArgs...) + assert.NilError(t, err) +} + +func TestScanWorkFlowWithKicsFilter(t *testing.T) { + baseArgs := []string{"scan", "create", "--project-name", "kicsFilterMock", "-b", "dummy_branch", "-s", dummyRepo, "--kics-filter", "!Dockerfile"} + cmd := createASTTestCommand() + err := executeTestCommand(cmd, baseArgs...) + assert.NilError(t, err) +} + +func TestScanWorkFlowWithScaFilter(t *testing.T) { + baseArgs := []string{"scan", "create", "--project-name", "scaFilterMock", "-b", "dummy_branch", "-s", dummyRepo, "--sca-filter", "!jQuery"} + cmd := createASTTestCommand() + err := executeTestCommand(cmd, baseArgs...) + assert.NilError(t, err) +} diff --git a/internal/params/flags.go b/internal/params/flags.go index bc03b782a..77e3efc7d 100644 --- a/internal/params/flags.go +++ b/internal/params/flags.go @@ -98,6 +98,14 @@ const ( GitLabURLFlag = "url-gitlab" URLFlagUsage = "API base URL" QueryIDFlag = "query-id" + + // INDIVIDUAL FILTER FLAGS + SastFilterFlag = "sast-filter" + SastFilterUsage = "SAST filter" + KicsFilterFlag = "kics-filter" + KicsFilterUsage = "KICS filter" + ScaFilterFlag = "sca-filter" + ScaFilterUsage = "SCA filter" ) // Parameter values diff --git a/internal/wrappers/scans.go b/internal/wrappers/scans.go index 537ff036d..68d455d71 100644 --- a/internal/wrappers/scans.go +++ b/internal/wrappers/scans.go @@ -111,3 +111,20 @@ type ScansWrapper interface { Cancel(scanID string) (*ErrorModel, error) Tags() (map[string][]string, *ErrorModel, error) } + +type SastConfig struct { + Incremental string `json:"incremental,omitempty"` + Filter string `json:"filter,omitempty"` + EngineVerbose string `json:"engineVerbose,omitempty"` + LanguageMode string `json:"languageMode,omitempty"` + PresetName string `json:"presetName,omitempty"` +} + +type KicsConfig struct { + Filter string `json:"filter,omitempty"` + Platforms string `json:"platforms,omitempty"` +} + +type ScaConfig struct { + Filter string `json:"filter,omitempty"` +} diff --git a/test/integration/data/insecure.zip b/test/integration/data/insecure.zip new file mode 100644 index 0000000000000000000000000000000000000000..3126b16db86af253fc773fbcb165f4b9465ae9ae GIT binary patch literal 51262 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 Heck>AS_eBc literal 0 HcmV?d00001 diff --git a/test/integration/scan_test.go b/test/integration/scan_test.go index 189f7893d..223911504 100644 --- a/test/integration/scan_test.go +++ b/test/integration/scan_test.go @@ -6,8 +6,10 @@ import ( "bufio" "bytes" "context" + "encoding/json" "fmt" "io" + "io/ioutil" "log" "os" "strings" @@ -509,3 +511,39 @@ func TestFailedScanWithWrongPreset(t *testing.T) { err, _ := executeCommand(t, args...) assertError(t, err, "scan did not complete successfully") } + +func retrieveResultsFromScanId(t *testing.T, scanId string) (wrappers.ScanResultsCollection, error) { + resultsArgs := []string{ + "results", + "show", + flag(params.ScanIDFlag), + scanId, + } + executeCmdNilAssertion(t, "Getting results should pass", resultsArgs...) + file, err := ioutil.ReadFile("cx_result.json") + defer func() { + os.Remove("cx_result.json") + }() + if err != nil { + return wrappers.ScanResultsCollection{}, err + } + results := wrappers.ScanResultsCollection{} + _ = json.Unmarshal([]byte(file), &results) + return results, err +} + +func TestScanWorkFlowWithSastEngineFilter(t *testing.T) { + insecurePath := "data/insecure.zip" + args := getCreateArgsWithName(insecurePath, Tags, getProjectNameForScanTests(), "sast") + args = append(args, flag(params.SastFilterFlag), "!*.java") + scanId, projectId := executeCreateScan(t, args) + assert.Assert(t, scanId != "", "Scan ID should not be empty") + assert.Assert(t, projectId != "", "Project ID should not be empty") + results, err := retrieveResultsFromScanId(t, scanId) + assert.Assert(t, err == nil, "Results retrieved should not throw an error") + for _, result := range results.Results { + for _, node := range result.ScanResultData.Nodes { + assert.Assert(t, !strings.HasSuffix(node.FileName, "java"), "File name should not contain java") + } + } +}