Skip to content

Commit 56b78d8

Browse files
Fixed SCA export API when minio is disabled (AST-112743) (#1301)
SCA export API fixed with FF minio is disabled
1 parent f0268c1 commit 56b78d8

File tree

11 files changed

+170
-26
lines changed

11 files changed

+170
-26
lines changed

internal/commands/result.go

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1211,7 +1211,7 @@ func CreateScanReport(
12111211
return nil, err
12121212
}
12131213
if !scanPending {
1214-
results, err = ReadResults(resultsWrapper, exportWrapper, scan, resultsParams, agent)
1214+
results, err = ReadResults(resultsWrapper, exportWrapper, scan, resultsParams, agent, featureFlagsWrapper)
12151215
if err != nil {
12161216
return nil, err
12171217
}
@@ -1498,8 +1498,7 @@ func ReadResults(
14981498
exportWrapper wrappers.ExportWrapper,
14991499
scan *wrappers.ScanResponseModel,
15001500
resultsParams map[string]string,
1501-
agent string,
1502-
) (results *wrappers.ScanResultsCollection, err error) {
1501+
agent string, featureflagsWrappers wrappers.FeatureFlagsWrapper) (results *wrappers.ScanResultsCollection, err error) {
15031502
var resultsModel *wrappers.ScanResultsCollection
15041503
var errorModel *wrappers.WebError
15051504

@@ -1522,7 +1521,7 @@ func ReadResults(
15221521
// Compute SAST results redundancy
15231522
resultsModel = ComputeRedundantSastResults(resultsModel)
15241523
}
1525-
resultsModel, err = enrichScaResults(exportWrapper, scan, resultsModel, scaHideDevAndTestDep)
1524+
resultsModel, err = enrichScaResults(exportWrapper, scan, resultsModel, scaHideDevAndTestDep, featureflagsWrappers)
15261525
if err != nil {
15271526
return nil, err
15281527
}
@@ -1545,10 +1544,9 @@ func enrichScaResults(
15451544
exportWrapper wrappers.ExportWrapper,
15461545
scan *wrappers.ScanResponseModel,
15471546
resultsModel *wrappers.ScanResultsCollection,
1548-
scaHideDevAndTestDep bool,
1549-
) (*wrappers.ScanResultsCollection, error) {
1547+
scaHideDevAndTestDep bool, featureflagWrapper wrappers.FeatureFlagsWrapper) (*wrappers.ScanResultsCollection, error) {
15501548
if slices.Contains(scan.Engines, commonParams.ScaType) {
1551-
scaExportDetails, err := services.GetExportPackage(exportWrapper, scan.ID, scaHideDevAndTestDep)
1549+
scaExportDetails, err := services.GetExportPackage(exportWrapper, scan.ID, scaHideDevAndTestDep, featureflagWrapper)
15521550
if err != nil {
15531551
return nil, errors.Wrapf(err, "%s", failedListingResults)
15541552
}

internal/services/export.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ const (
2020
pollingTimeout = 15 // minutes
2121
)
2222

23-
func GetExportPackage(exportWrapper wrappers.ExportWrapper, scanID string, scaHideDevAndTestDep bool) (*wrappers.ScaPackageCollectionExport, error) {
23+
func GetExportPackage(exportWrapper wrappers.ExportWrapper, scanID string, scaHideDevAndTestDep bool, featureflagWrappers wrappers.FeatureFlagsWrapper) (*wrappers.ScaPackageCollectionExport, error) {
2424
var scaPackageCollection = &wrappers.ScaPackageCollectionExport{
2525
Packages: []wrappers.ScaPackage{},
2626
ScaTypes: []wrappers.ScaType{},
@@ -44,9 +44,16 @@ func GetExportPackage(exportWrapper wrappers.ExportWrapper, scanID string, scaHi
4444
if err != nil {
4545
return nil, err
4646
}
47+
minioEnabled, _ := wrappers.GetSpecificFeatureFlag(featureflagWrappers, wrappers.MinioEnabled)
4748

4849
if exportResponse != nil && strings.EqualFold(exportResponse.ExportStatus, completedStatus) && exportResponse.FileURL != "" {
49-
scaPackageCollection, err = exportWrapper.GetScaPackageCollectionExport(exportResponse.FileURL)
50+
filePath := ""
51+
if minioEnabled.Status {
52+
filePath = exportResponse.FileURL
53+
} else {
54+
filePath = exportID.ExportID
55+
}
56+
scaPackageCollection, err = exportWrapper.GetScaPackageCollectionExport(filePath, minioEnabled.Status)
5057
if err != nil {
5158
return nil, err
5259
}

internal/wrappers/export-http.go

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -176,23 +176,27 @@ func (e *ExportHTTPWrapper) DownloadExportReport(reportID, targetFile string) er
176176
return nil
177177
}
178178

179-
func (e *ExportHTTPWrapper) GetScaPackageCollectionExport(fileURL string) (*ScaPackageCollectionExport, error) {
179+
func (e *ExportHTTPWrapper) GetScaPackageCollectionExport(fileURL string, auth bool) (*ScaPackageCollectionExport, error) {
180180
const bomPrefix = "\xef\xbb\xbf"
181-
182-
accessToken, err := GetAccessToken()
183-
if err != nil {
184-
return nil, errors.Wrap(err, "failed to get access token")
185-
}
186-
187181
start := time.Now()
188182
var resp *http.Response
183+
var err error
184+
var accessToken string
189185

190186
for {
191187
if time.Since(start) > timeout {
192188
return nil, errors.New(errorTimeoutMsg)
193189
}
194-
195-
resp, err = SendHTTPRequestByFullURL(http.MethodGet, fileURL, http.NoBody, true, viper.GetUint(commonParams.ClientTimeoutKey), accessToken, true)
190+
if !auth {
191+
customURL := fmt.Sprintf("%s/requests/%s/download", e.path, fileURL)
192+
resp, err = SendHTTPRequest(http.MethodGet, customURL, http.NoBody, true, viper.GetUint(commonParams.ClientTimeoutKey))
193+
} else {
194+
accessToken, err = GetAccessToken()
195+
if err != nil {
196+
return nil, errors.Wrap(err, "failed to get access token")
197+
}
198+
resp, err = SendHTTPRequestByFullURL(http.MethodGet, fileURL, http.NoBody, true, viper.GetUint(commonParams.ClientTimeoutKey), accessToken, true)
199+
}
196200
if err == nil && resp.StatusCode == http.StatusOK {
197201
break
198202
}

internal/wrappers/export.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ type ExportWrapper interface {
44
InitiateExportRequest(payload *ExportRequestPayload) (*ExportResponse, error)
55
GetExportReportStatus(reportID string) (*ExportPollingResponse, error)
66
DownloadExportReport(reportID, targetFile string) error
7-
GetScaPackageCollectionExport(fileURL string) (*ScaPackageCollectionExport, error)
7+
GetScaPackageCollectionExport(fileURL string, auth bool) (*ScaPackageCollectionExport, error)
88
}
99

1010
type ScaPackageCollectionExport struct {

internal/wrappers/mock/export-mock.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,6 @@ func (*ExportMockWrapper) DownloadExportReport(_, targetFile string) error {
4343
return nil
4444
}
4545

46-
func (e *ExportMockWrapper) GetScaPackageCollectionExport(fileURL string) (*wrappers.ScaPackageCollectionExport, error) {
46+
func (e *ExportMockWrapper) GetScaPackageCollectionExport(fileURL string, auth bool) (*wrappers.ScaPackageCollectionExport, error) {
4747
return &wrappers.ScaPackageCollectionExport{}, nil
4848
}

test/integration/logs_test.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
//go:build integration
2+
3+
package integration
4+
5+
import (
6+
"github.com/checkmarx/ast-cli/internal/commands/util/printer"
7+
commonParams "github.com/checkmarx/ast-cli/internal/params"
8+
"github.com/stretchr/testify/assert"
9+
"testing"
10+
)
11+
12+
func Test_DownloadScan_Logs_Success(t *testing.T) {
13+
args := []string{
14+
"scan", "create",
15+
flag(commonParams.ProjectName), GenerateRandomProjectNameForScan(),
16+
flag(commonParams.SourcesFlag), "data/sources.zip",
17+
flag(commonParams.ScanTypes), commonParams.SastType,
18+
flag(commonParams.BranchFlag), "dummy_branch",
19+
flag(commonParams.ScanInfoFormatFlag), printer.FormatJSON,
20+
}
21+
scanID, _ := executeCreateScan(t, args)
22+
args1 := []string{
23+
"scan", "logs", flag(commonParams.ScanIDFlag), scanID, flag(commonParams.ScanTypeFlag), commonParams.SastType,
24+
}
25+
err, _ := executeCommand(t, args1...)
26+
assert.Nil(t, err)
27+
28+
}
29+
30+
func Test_DownloadScan_Logs_Failed(t *testing.T) {
31+
args1 := []string{
32+
"scan", "logs", flag(commonParams.ScanIDFlag), "fake-scan-id", flag(commonParams.ScanTypeFlag), commonParams.SastType,
33+
}
34+
err, _ := executeCommand(t, args1...)
35+
assert.Error(t, err, "failed to download log")
36+
}

test/integration/pre_commit_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,15 @@ func TestHooksPreCommitUpdatePreCommitHook(t *testing.T) {
3939
_ = executeCmdNilAssertion(t, "Uninstalling cx-secret-detection hook", "hooks", "pre-commit", "secrets-uninstall-git-hook")
4040
}
4141

42+
func TestHooksPreCommitSecretsIgnore(t *testing.T) {
43+
tmpDir, cleanup := setupTempDir(t)
44+
defer cleanup()
45+
// Initialize Git repository
46+
execCmd(t, tmpDir, "git", "init")
47+
// Ignore precommit hook command
48+
_ = executeCmdNilAssertion(t, "precommit secrets Ignore", "hooks", "pre-commit", "secrets-ignore", "--all")
49+
}
50+
4251
// Helper functions
4352
func execCmd(t *testing.T, dir string, name string, args ...string) {
4453
cmd := exec.Command(name, args...)

test/integration/predicate_test.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,69 @@ func TestPredicateWithInvalidValues(t *testing.T) {
150150
assert.Assert(t, kicsPredicate.TotalCount == 0, "Predicate with invalid values should have 0 as the result.")
151151
}
152152

153+
func TestSastUpdateAndGetPredicatesForNotFoundSimilarityId(t *testing.T) {
154+
scanID, projectID := getRootScan(t)
155+
_ = executeCmdNilAssertion(
156+
t, "Results show generating JSON report with options should pass",
157+
"results", "show",
158+
flag(params.ScanIDFlag), scanID, flag(params.TargetFormatFlag), printer.FormatJSON,
159+
flag(params.TargetPathFlag), resultsDirectory,
160+
flag(params.TargetFlag), fileName,
161+
)
162+
163+
defer func() {
164+
_ = os.RemoveAll(fmt.Sprintf(resultsDirectory))
165+
}()
166+
167+
result := wrappers.ScanResultsCollection{}
168+
169+
_, err := os.Stat(fmt.Sprintf("%s%s.%s", resultsDirectory, fileName, printer.FormatJSON))
170+
assert.NilError(t, err, "Report file should exist for extension "+printer.FormatJSON)
171+
172+
file, err := os.ReadFile(fmt.Sprintf("%s%s.%s", resultsDirectory, fileName, printer.FormatJSON))
173+
assert.NilError(t, err, "error reading file")
174+
175+
err = json.Unmarshal(file, &result)
176+
assert.NilError(t, err, "error unmarshalling file")
177+
178+
index := 0
179+
for i := range result.Results {
180+
if strings.EqualFold(result.Results[i].Type, params.SastType) {
181+
index = i
182+
break
183+
}
184+
}
185+
186+
similarityID := "1"
187+
188+
state := "CONFIRMED"
189+
if !strings.EqualFold(result.Results[index].State, "Urgent") {
190+
state = "URGENT"
191+
}
192+
severity := "HIGH"
193+
if !strings.EqualFold(result.Results[index].Severity, "Medium") {
194+
severity = "MEDIUM"
195+
}
196+
comment := "Testing CLI Command for triage."
197+
scanType := result.Results[index].Type
198+
199+
args := []string{
200+
"triage", "update",
201+
flag(params.ProjectIDFlag), projectID,
202+
flag(params.SimilarityIDFlag), similarityID,
203+
flag(params.StateFlag), state,
204+
flag(params.SeverityFlag), severity,
205+
flag(params.CommentFlag), comment,
206+
flag(params.ScanTypeFlag), scanType,
207+
}
208+
209+
err, outputBufferForStep1 := executeCommand(t, args...)
210+
_, readingError := io.ReadAll(outputBufferForStep1)
211+
assert.NilError(t, readingError, "Reading result should pass")
212+
213+
assert.ErrorContains(t, err, "Predicate not found")
214+
}
215+
153216
func TestTriageShowAndUpdateWithCustomStates(t *testing.T) {
154217
t.Skip("Skipping this test temporarily until the API becomes available in the DEU environment.")
155218
fmt.Println("Step 1: Testing the command 'triage show' with predefined values.")

test/integration/project_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -143,19 +143,18 @@ func TestCreateProjectWhenUserdoes_not_have_groups_permission(t *testing.T) {
143143
}
144144

145145
groups := []string{
146-
"it_test_group_1",
147-
"it_test_group_2",
146+
"TT_Group1",
148147
}
149148

150149
groupsStr := formatGroups(groups)
151150

152-
err, _ := executeCommand(
151+
_, outBuffer := executeCommand(
153152
t, "project", "create",
154153
flag(params.FormatFlag),
155154
printer.FormatJSON,
156-
flag(params.ProjectName), "project-1", flag(params.GroupList), groupsStr,
155+
flag(params.ProjectName), projectNameRandom, flag(params.GroupList), groupsStr,
157156
)
158-
assertError(t, err, "Failed creating a project: CODE: 233, Unauthorized groups")
157+
assert.Assert(t, outBuffer != nil, "Project creation output response should not be nil")
159158
}
160159

161160
func TestCreateProjectWhenUserdoes_not_have_groups_permission_butonlyAM1_is_On(t *testing.T) {
@@ -180,6 +179,7 @@ func TestCreateProjectWhenUserdoes_not_have_groups_permission_butonlyAM1_is_On(t
180179
createdProject := wrappers.ProjectResponseModel{}
181180
unmarshall(t, outBuffer, &createdProject, "Reading project create response JSON should pass")
182181
fmt.Printf("New project created with id: %s \n", createdProject.ID)
182+
assert.Assert(t, createdProject.ID != "", "Project ID should not be empty")
183183
defer deleteProject(t, createdProject.ID)
184184
}
185185

test/integration/scan_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
errorConstants "github.com/checkmarx/ast-cli/internal/constants/errors"
2828
exitCodes "github.com/checkmarx/ast-cli/internal/constants/exit-codes"
2929
"github.com/checkmarx/ast-cli/internal/params"
30+
commonParams "github.com/checkmarx/ast-cli/internal/params"
3031
"github.com/checkmarx/ast-cli/internal/services"
3132
"github.com/checkmarx/ast-cli/internal/wrappers"
3233
"github.com/checkmarx/ast-cli/internal/wrappers/configuration"
@@ -2136,7 +2137,8 @@ func TestCreateAsyncScan_CallExportServiceBeforeScanFinishWithRetry_Success(t *t
21362137
flag(params.ScanInfoFormatFlag), printer.FormatJSON,
21372138
}
21382139
scanID, _ := executeCreateScan(t, args)
2139-
exportRes, err := services.GetExportPackage(wrappers.NewExportHTTPWrapper("api/sca/export"), scanID, false)
2140+
featureFlagsPath := viper.GetString(commonParams.FeatureFlagsKey)
2141+
exportRes, err := services.GetExportPackage(wrappers.NewExportHTTPWrapper("api/sca/export"), scanID, false, wrappers.NewFeatureFlagsHTTPWrapper(featureFlagsPath))
21402142
asserts.Nil(t, err)
21412143
assert.Assert(t, exportRes != nil, "Export response should not be nil")
21422144
}

0 commit comments

Comments
 (0)