Skip to content

Commit 52d00b8

Browse files
rebase from main
2 parents 8363a60 + 0f89a04 commit 52d00b8

File tree

21 files changed

+481
-53
lines changed

21 files changed

+481
-53
lines changed

.github/workflows/ci.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ jobs:
4545
run: go build -o ./bin/cx ./cmd
4646
- name: Install gocovmerge
4747
run: go install github.com/wadey/gocovmerge@latest
48+
- name: Install pre-commit
49+
run: |
50+
pip install pre-commit
51+
pre-commit install
4852
- name: Go Integration test
4953
shell: bash
5054
env:

cmd/main.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ func main() {
2727
var err error
2828
bindProxy()
2929
bindKeysToEnvAndDefault()
30-
configuration.LoadConfiguration()
30+
err = configuration.LoadConfiguration()
31+
exitIfError(err)
3132
scans := viper.GetString(params.ScansPathKey)
3233
groups := viper.GetString(params.GroupsPathKey)
3334
logs := viper.GetString(params.LogsPathKey)
@@ -85,7 +86,7 @@ func main() {
8586
scaRealTimeWrapper := wrappers.NewHTTPScaRealTimeWrapper()
8687
chatWrapper := wrappers.NewChatWrapper()
8788
featureFlagsWrapper := wrappers.NewFeatureFlagsHTTPWrapper(featureFlagsPath)
88-
policyWrapper := wrappers.NewHTTPPolicyWrapper(policyEvaluationPath)
89+
policyWrapper := wrappers.NewHTTPPolicyWrapper(policyEvaluationPath, featureFlagsWrapper)
8990
sastMetadataWrapper := wrappers.NewSastIncrementalHTTPWrapper(sastMetadataPath)
9091
accessManagementWrapper := wrappers.NewAccessManagementHTTPWrapper(accessManagementPath)
9192
byorWrapper := wrappers.NewByorHTTPWrapper(byorPath)

internal/commands/policymanagement/policy.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -110,12 +110,11 @@ func isPolicyEvaluated(
110110
log.Println("Policy status: ", policyResponseModel.Status)
111111
return false, nil, nil
112112
}
113-
}
114-
// Case the policy is evaluated or None
115-
logger.PrintIfVerbose("Policy evaluation finished with status: " + policyResponseModel.Status)
116-
if policyResponseModel.Status == completedPolicy || policyResponseModel.Status == nonePolicy {
117-
logger.PrintIfVerbose("Policy status: " + policyResponseModel.Status)
118-
return true, policyResponseModel, nil
113+
logger.PrintIfVerbose("Policy evaluation finished with status: " + policyResponseModel.Status)
114+
if policyResponseModel.Status == completedPolicy || policyResponseModel.Status == nonePolicy {
115+
logger.PrintIfVerbose("Policy status: " + policyResponseModel.Status)
116+
return true, policyResponseModel, nil
117+
}
119118
}
120119
return true, nil, nil
121120
}

internal/commands/result.go

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ func NewResultsCommand(
201201
codeBashingCmd := resultCodeBashing(codeBashingWrapper)
202202
bflResultCmd := resultBflSubCommand(bflWrapper)
203203
exitCodeSubcommand := exitCodeSubCommand(scanWrapper)
204-
riskManagementSubCommand := riskManagementSubCommand(riskManagementWrapper)
204+
riskManagementSubCommand := riskManagementSubCommand(riskManagementWrapper, featureFlagsWrapper)
205205
resultCmd.AddCommand(
206206
showResultCmd, bflResultCmd, codeBashingCmd, exitCodeSubcommand, riskManagementSubCommand,
207207
)
@@ -226,7 +226,8 @@ func exitCodeSubCommand(scanWrapper wrappers.ScansWrapper) *cobra.Command {
226226

227227
return exitCodeCmd
228228
}
229-
func riskManagementSubCommand(riskManagement wrappers.RiskManagementWrapper) *cobra.Command {
229+
func riskManagementSubCommand(riskManagement wrappers.RiskManagementWrapper, featureFlagsWrapper wrappers.FeatureFlagsWrapper,
230+
) *cobra.Command {
230231
riskManagementCmd := &cobra.Command{
231232
Use: "risk-management",
232233
Short: "Show risk-management results of a project",
@@ -236,7 +237,7 @@ func riskManagementSubCommand(riskManagement wrappers.RiskManagementWrapper) *co
236237
$ cx results risk-management --project-id <project Id> --limit <limit> (1-50, default: 50)
237238
`,
238239
),
239-
RunE: runRiskManagementCommand(riskManagement),
240+
RunE: runRiskManagementCommand(riskManagement, featureFlagsWrapper),
240241
}
241242

242243
riskManagementCmd.PersistentFlags().String(commonParams.ProjectIDFlag, "", "Project ID")
@@ -350,11 +351,17 @@ func runGetExitCodeCommand(scanWrapper wrappers.ScansWrapper) func(cmd *cobra.Co
350351
}
351352
}
352353

353-
func runRiskManagementCommand(riskManagement wrappers.RiskManagementWrapper) func(cmd *cobra.Command, args []string) error {
354+
func runRiskManagementCommand(riskManagement wrappers.RiskManagementWrapper, featureFlagsWrapper wrappers.FeatureFlagsWrapper,
355+
) func(cmd *cobra.Command, args []string) error {
354356
return func(cmd *cobra.Command, args []string) error {
355357
projectID, _ := cmd.Flags().GetString(commonParams.ProjectIDFlag)
356358
limit, _ := cmd.Flags().GetInt(commonParams.LimitFlag)
357359

360+
flagResponse, _ := wrappers.GetSpecificFeatureFlag(featureFlagsWrapper, wrappers.RiskManagementEnabled)
361+
ASPMEnabled := flagResponse.Status
362+
if !ASPMEnabled {
363+
return errors.Errorf("%s", "Risk management results are currently unavailable for your tenant.")
364+
}
358365
results, err := getRiskManagementResults(riskManagement, projectID)
359366
if err != nil {
360367
return err
@@ -1536,11 +1543,13 @@ func parseScaExportPackage(packages []wrappers.ScaPackage) *[]wrappers.ScaPackag
15361543
for _, pkg := range packages {
15371544
pkg := pkg
15381545
scaPackages = append(scaPackages, wrappers.ScaPackageCollection{
1539-
ID: pkg.ID,
1540-
Locations: pkg.Locations,
1541-
DependencyPathArray: parsePackagePathToDependencyPath(&pkg),
1542-
Outdated: pkg.Outdated,
1543-
IsDirectDependency: pkg.IsDirectDependency,
1546+
ID: pkg.ID,
1547+
Locations: pkg.Locations,
1548+
DependencyPathArray: parsePackagePathToDependencyPath(&pkg),
1549+
Outdated: pkg.Outdated,
1550+
IsDirectDependency: pkg.IsDirectDependency,
1551+
IsDevelopmentDependency: pkg.IsDevelopmentDependency,
1552+
IsTestDependency: pkg.IsTestDependency,
15441553
})
15451554
}
15461555
return &scaPackages

internal/commands/result_test.go

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1562,6 +1562,79 @@ func TestRiskManagementHelp(t *testing.T) {
15621562
execCmdNilAssertion(t, "help", "results", "risk-management")
15631563
}
15641564

1565+
func TestRiskManagement_ShouldFFBeFalseAndReturnError(t *testing.T) {
1566+
clearFlags()
1567+
err := execCmdNotNilAssertion(t, "results", "risk-management")
1568+
assert.Equal(t, err.Error(), "Risk management results are currently unavailable for your tenant.", "Expected error message")
1569+
1570+
}
1571+
15651572
func TestRiskManagement(t *testing.T) {
1573+
clearFlags()
1574+
mock.Flag = wrappers.FeatureFlagResponseModel{Name: wrappers.RiskManagementEnabled, Status: true}
15661575
execCmdNilAssertion(t, "results", "risk-management")
15671576
}
1577+
1578+
func Test_addPackageInformation_DependencyTypes(t *testing.T) {
1579+
// Create dependency paths with different types
1580+
var dependencyPaths = [][]wrappers.DependencyPath{
1581+
{{
1582+
ID: "dev-pkg",
1583+
IsDevelopment: true,
1584+
}},
1585+
{{
1586+
ID: "test-pkg",
1587+
IsDevelopment: false,
1588+
}},
1589+
}
1590+
1591+
// Create results model with two results - one dev and one test
1592+
resultsModel := &wrappers.ScanResultsCollection{
1593+
Results: []*wrappers.ScanResult{
1594+
{
1595+
Type: "sca",
1596+
ScanResultData: wrappers.ScanResultData{
1597+
PackageIdentifier: "dev-pkg",
1598+
},
1599+
},
1600+
{
1601+
Type: "sca",
1602+
ScanResultData: wrappers.ScanResultData{
1603+
PackageIdentifier: "test-pkg",
1604+
},
1605+
},
1606+
},
1607+
}
1608+
1609+
// Create package model with different dev/test settings
1610+
scaPackageModel := &[]wrappers.ScaPackageCollection{
1611+
{
1612+
ID: "dev-pkg",
1613+
DependencyPathArray: dependencyPaths[:1],
1614+
IsDevelopmentDependency: true,
1615+
IsTestDependency: false,
1616+
},
1617+
{
1618+
ID: "test-pkg",
1619+
DependencyPathArray: dependencyPaths[1:],
1620+
IsDevelopmentDependency: false,
1621+
IsTestDependency: true,
1622+
},
1623+
}
1624+
1625+
scaTypeModel := &[]wrappers.ScaTypeCollection{{}}
1626+
1627+
// Execute the function
1628+
resultsModel = addPackageInformation(resultsModel, scaPackageModel, scaTypeModel)
1629+
1630+
// Get the results
1631+
devPackage := resultsModel.Results[0].ScanResultData.ScaPackageCollection
1632+
testPackage := resultsModel.Results[1].ScanResultData.ScaPackageCollection
1633+
1634+
// Verify the fields were transferred correctly
1635+
assert.Equal(t, true, devPackage.IsDevelopmentDependency, "First package should be marked as development dependency")
1636+
assert.Equal(t, false, devPackage.IsTestDependency, "First package should not be marked as test dependency")
1637+
1638+
assert.Equal(t, false, testPackage.IsDevelopmentDependency, "Second package should not be marked as development dependency")
1639+
assert.Equal(t, true, testPackage.IsTestDependency, "Second package should be marked as test dependency")
1640+
}

internal/commands/util/configuration_test.go

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package util
22

33
import (
4+
"github.com/checkmarx/ast-cli/internal/params"
5+
"github.com/spf13/viper"
46
"os"
57
"strings"
68
"testing"
@@ -47,9 +49,11 @@ func TestGetConfigFilePath_CheckmarxConfigFileExists_Success(t *testing.T) {
4749
}
4850

4951
func TestWriteSingleConfigKeyToExistingFile_ChangeAscaPortToZero_Success(t *testing.T) {
50-
configuration.LoadConfiguration()
52+
err := configuration.LoadConfiguration()
53+
assert.NilError(t, err)
54+
5155
configFilePath, _ := configuration.GetConfigFilePath()
52-
err := configuration.SafeWriteSingleConfigKey(configFilePath, cxAscaPort, 0)
56+
err = configuration.SafeWriteSingleConfigKey(configFilePath, cxAscaPort, 0)
5357
assert.NilError(t, err)
5458

5559
config, err := configuration.LoadConfig(configFilePath)
@@ -78,7 +82,9 @@ func TestWriteSingleConfigKeyNonExistingFile_CreatingTheFileAndWritesTheKey_Succ
7882
}
7983

8084
func TestChangedOnlyAscaPortInConfigFile_ConfigFileExistsWithDefaultValues_OnlyAscaPortChangedSuccess(t *testing.T) {
81-
configuration.LoadConfiguration()
85+
err := configuration.LoadConfiguration()
86+
assert.NilError(t, err)
87+
8288
configFilePath, _ := configuration.GetConfigFilePath()
8389

8490
oldConfig, err := configuration.LoadConfig(configFilePath)
@@ -100,9 +106,11 @@ func TestChangedOnlyAscaPortInConfigFile_ConfigFileExistsWithDefaultValues_OnlyA
100106
}
101107

102108
func TestWriteSingleConfigKeyStringToExistingFile_UpdateScsScanOverviewPath_Success(t *testing.T) {
103-
configuration.LoadConfiguration()
109+
err := configuration.LoadConfiguration()
110+
assert.NilError(t, err)
111+
104112
configFilePath, _ := configuration.GetConfigFilePath()
105-
err := configuration.SafeWriteSingleConfigKeyString(configFilePath, cxScsScanOverviewPath, defaultScsScanOverviewPath)
113+
err = configuration.SafeWriteSingleConfigKeyString(configFilePath, cxScsScanOverviewPath, defaultScsScanOverviewPath)
106114
assert.NilError(t, err)
107115

108116
config, err := configuration.LoadConfig(configFilePath)
@@ -131,7 +139,9 @@ func TestWriteSingleConfigKeyStringNonExistingFile_CreatingTheFileAndWritesTheKe
131139
}
132140

133141
func TestChangedOnlyScsScanOverviewPathInConfigFile_ConfigFileExistsWithDefaultValues_OnlyScsScanOverviewPathChangedSuccess(t *testing.T) {
134-
configuration.LoadConfiguration()
142+
err := configuration.LoadConfiguration()
143+
assert.NilError(t, err)
144+
135145
configFilePath, _ := configuration.GetConfigFilePath()
136146

137147
oldConfig, err := configuration.LoadConfig(configFilePath)
@@ -151,3 +161,12 @@ func TestChangedOnlyScsScanOverviewPathInConfigFile_ConfigFileExistsWithDefaultV
151161
}
152162
}
153163
}
164+
165+
func TestGetConfigFilePath_CustomFile(t *testing.T) {
166+
expectedPath := "/custom/path/checkmarxcli.yaml"
167+
viper.Set(params.ConfigFilePathKey, expectedPath)
168+
169+
actualPath, err := configuration.GetConfigFilePath()
170+
assert.NilError(t, err)
171+
assert.Equal(t, actualPath, expectedPath, "Expected path to match the set value in viper")
172+
}

internal/constants/feature-flags/feature-flags.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@ package featureflags
22

33
const (
44
AccessManagementEnabled = "ACCESS_MANAGEMENT_ENABLED"
5-
AccessManagementPhase2 = "ACCESS_MANAGEMENT_PHASE2"
5+
AccessManagementPhase2 = "ACCESS_MANAGEMENT_PHASE_2"
66
)

internal/params/binds.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,5 +74,6 @@ var EnvVarsBinds = []struct {
7474
{ASCAPortKey, ASCAPortEnv, ""},
7575
{ScsRepoTokenKey, ScsRepoTokenEnv, ""},
7676
{RiskManagementPathKey, RiskManagementPathEnv, "api/risk-management/projects/%s/results"},
77+
{ConfigFilePathKey, ConfigFilePathEnv, ""},
7778
{EnginePathKey, EnginePathEnv, "api/engines"},
7879
}

internal/params/envs.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,5 +73,6 @@ const (
7373
ASCAPortEnv = "CX_ASCA_PORT"
7474
ScsRepoTokenEnv = "SCS_REPO_TOKEN"
7575
RiskManagementPathEnv = "CX_RISK_MANAGEMENT_PATH"
76+
ConfigFilePathEnv = "CX_CONFIG_FILE_PATH"
7677
EnginePathEnv = "CX_ENGINE_PATH"
7778
)

internal/params/keys.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,5 +73,6 @@ var (
7373
ASCAPortKey = strings.ToLower(ASCAPortEnv)
7474
ScsRepoTokenKey = strings.ToLower(ScsRepoTokenEnv)
7575
RiskManagementPathKey = strings.ToLower(RiskManagementPathEnv)
76+
ConfigFilePathKey = strings.ToLower(ConfigFilePathEnv)
7677
EnginePathKey = strings.ToLower(ResultsPathKey)
7778
)

0 commit comments

Comments
 (0)