Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
32dc1fb
add IncludeDirs option to Xray Bom Lib
attiasas Feb 12, 2026
1a1a659
prepare to pass working dirs
attiasas Feb 12, 2026
26955ad
format
attiasas Feb 12, 2026
b004474
use isSingleTarget, start deprecate old JAS interface to remove apps-…
attiasas Feb 12, 2026
c33f179
Merge remote-tracking branch 'upstream/dev' into pass_wd_to_xray_lib
attiasas Feb 12, 2026
d641985
deprecate JAS apps config module, use scan target
attiasas Feb 12, 2026
12005ea
new scan target detection logic
attiasas Feb 13, 2026
abc25bb
start impl new flow in Secrets
attiasas Feb 13, 2026
5fb9622
update xray lib to 0.0.3-47
attiasas Feb 16, 2026
1bff793
fix tests
attiasas Feb 16, 2026
1d4fd00
Merge remote-tracking branch 'upstream/dev' into pass_wd_to_xray_lib
attiasas Feb 17, 2026
8eac512
fix static tests
attiasas Feb 17, 2026
1ec4aeb
Merge remote-tracking branch 'upstream/dev' into pass_wd_to_xray_lib
attiasas Feb 17, 2026
4711afb
Fix target creation and JAS results parsing
attiasas Feb 19, 2026
d0f5aed
pass target to applicable, fix invocations
attiasas Feb 19, 2026
803b115
fix get cwd as path in old flow and tech aggregator for target
attiasas Feb 19, 2026
1c8f55d
fix wd in sarif
attiasas Feb 19, 2026
c1d2f08
fix get module for old flow
attiasas Feb 19, 2026
f6fb891
make sure sarif sca invocation also include the included wd
attiasas Feb 19, 2026
4f2aa4b
move configs to ScanTarget. refactor and fix exclude for target and s…
attiasas Feb 21, 2026
8b4f728
fix some tests
attiasas Feb 22, 2026
7385416
fix static
attiasas Feb 23, 2026
721a304
Merge remote-tracking branch 'upstream/dev' into pass_wd_to_xray_lib
attiasas Feb 24, 2026
f107544
Merge remote-tracking branch 'upstream/dev' into pass_wd_to_xray_lib
attiasas Feb 25, 2026
7cc338b
Fix apps config
attiasas Feb 25, 2026
3540e40
remove uneeded comment
attiasas Feb 25, 2026
18e78fd
Merge remote-tracking branch 'upstream/dev' into pass_wd_to_xray_lib
attiasas Mar 10, 2026
a663fbe
Merge remote-tracking branch 'upstream/dev' into pass_wd_to_xray_lib
attiasas Mar 15, 2026
46d21f4
Merge remote-tracking branch 'upstream/dev' into pass_wd_to_xray_lib
attiasas Mar 22, 2026
e1491f5
Merge remote-tracking branch 'upstream/dev' into pass_wd_to_xray_lib
attiasas Mar 30, 2026
fe9d1f3
add tests and warning logs
attiasas Mar 30, 2026
79951ac
fix tests
attiasas Mar 30, 2026
620fda6
Convert scan target to support multi tech
attiasas Mar 30, 2026
c0e333b
Merge remote-tracking branch 'upstream/dev' into pass_wd_to_xray_lib
attiasas Mar 31, 2026
8df8a53
Merge remote-tracking branch 'upstream/dev' into pass_wd_to_xray_lib
attiasas Apr 6, 2026
9647163
Merge remote-tracking branch 'upstream/dev' into pass_wd_to_xray_lib
attiasas Apr 13, 2026
87a9ec5
Fix TestDetectScansToPerform
attiasas Apr 15, 2026
ecd7895
Merge remote-tracking branch 'upstream/dev' into pass_wd_to_xray_lib
attiasas May 4, 2026
3acb020
remove unrelated changes
attiasas May 4, 2026
116b2b4
Merge remote-tracking branch 'upstream/dev' into pass_wd_to_xray_lib
attiasas May 5, 2026
91b9214
add some todo for tech changes
attiasas May 6, 2026
373e3f1
Merge remote-tracking branch 'upstream/dev' into pass_wd_to_xray_lib
attiasas May 11, 2026
a240224
update deps
attiasas May 11, 2026
c355cf7
Start CR + enable profiles in git audit
attiasas May 14, 2026
7e9440c
done exclude include for SCA
attiasas May 14, 2026
a7a52a8
fix all include/exclude add support for custom releases from config
attiasas May 14, 2026
8635538
support allow partial results from config
attiasas May 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions artifactory_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ func TestDownloadAnalyzerManagerIfNeeded(t *testing.T) {
defer setEnvCallBack()

// Download
err := jas.DownloadAnalyzerManagerIfNeeded(0)
err := jas.DownloadAnalyzerManagerIfNeeded("", nil, 0)
assert.NoError(t, err)

// Validate Analyzer manager app & checksum.sh2 file exist
Expand All @@ -259,7 +259,7 @@ func TestDownloadAnalyzerManagerIfNeeded(t *testing.T) {
// Validate no second download occurred
firstFileStat, err := os.Stat(amPath)
assert.NoError(t, err)
err = jas.DownloadAnalyzerManagerIfNeeded(0)
err = jas.DownloadAnalyzerManagerIfNeeded("", nil, 0)
assert.NoError(t, err)
secondFileStat, err := os.Stat(amPath)
assert.NoError(t, err)
Expand Down
107 changes: 77 additions & 30 deletions audit_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -964,10 +964,14 @@ func testXrayAuditGem(t *testing.T, format string) string {

// New Sca

func testAuditCommandNewSca(t *testing.T, project string, params auditCommandTestParams) (string, error) {
func testAuditCommandNewSca(t *testing.T, params auditCommandTestParams, projects ...string) (string, error) {
// Must have one target, in new SCA mode the flow should not 'dirty' the local environment
// No need to copy or change directories just point to the project directory
params.WorkingDirsToScan = []string{filepath.Join(filepath.FromSlash(securityTests.GetTestResourcesPath()), "projects", project)}
if len(params.WorkingDirsToScan) == 0 {
for _, project := range projects {
params.WorkingDirsToScan = append(params.WorkingDirsToScan, filepath.Join(filepath.FromSlash(securityTests.GetTestResourcesPath()), "projects", project))
}
}
params.WithStaticSca = true
// No **/tests/** exclusion, we are scanning projects in the test resources path
params.CustomExclusion = []string{"*.git*", "*node_modules*", "*target*", "*venv*", "dist"}
Expand All @@ -983,10 +987,12 @@ func testAuditCommandNewSca(t *testing.T, project string, params auditCommandTes
func TestAuditNewScaCycloneDxNpm(t *testing.T) {
securityIntegrationTestUtils.InitAuditNewScaTests(t, utils.StaticScanMinVersion)

output, err := testAuditCommandNewSca(t, filepath.Join("jas", "jas-npm"), auditCommandTestParams{
output, err := testAuditCommandNewSca(t, auditCommandTestParams{
WithSbom: true,
Format: format.CycloneDx,
})
},
filepath.Join("jas", "jas-npm"),
)
assert.NoError(t, err)
validations.VerifyCycloneDxResults(t, output, validations.ValidationParams{
ExactResultsMatch: true,
Expand All @@ -999,6 +1005,25 @@ func TestAuditNewScaCycloneDxNpm(t *testing.T) {
})
}

func TestAuditNewScaSimpleJsonMultipleWorkingDirs(t *testing.T) {
securityIntegrationTestUtils.InitAuditNewScaTests(t, utils.StaticScanMinVersion)
output, err := testAuditCommandNewSca(t, auditCommandTestParams{
WithSbom: true,
Format: format.SimpleJson,
},
filepath.Join("jas", "jas-npm"),
filepath.Join("package-managers", "go", "simple-project"),
)
assert.NoError(t, err)
validations.VerifySimpleJsonResults(t, output, validations.ValidationParams{
ExactResultsMatch: true,
Total: &validations.TotalCount{Vulnerabilities: 10},
Vulnerabilities: &validations.VulnerabilityCount{
ValidateScan: &validations.ScanCount{Sca: 7, Sast: 2, Secrets: 1},
},
})
}

func TestAuditNewScaSimpleJsonViolations(t *testing.T) {
securityIntegrationTestUtils.InitAuditNewScaTests(t, utils.StaticScanMinVersion)

Expand All @@ -1007,13 +1032,15 @@ func TestAuditNewScaSimpleJsonViolations(t *testing.T) {
watchName, deleteWatch := securityTestUtils.CreateWatchOnArtifactoryRepos(t, policyName, "static-sca-watch", xrayUtils.Security)
defer deleteWatch()

output, err := testAuditCommandNewSca(t, filepath.Join("jas", "jas-npm"), auditCommandTestParams{
output, err := testAuditCommandNewSca(t, auditCommandTestParams{
WithSbom: true,
WithVuln: true,
WithLicense: true,
Format: format.SimpleJson,
Watches: []string{watchName},
})
},
filepath.Join("jas", "jas-npm"),
)
// Make Sure to check violations with fail build error
assert.Equal(t, err, policy.NewFailBuildError())
// Validate results
Expand All @@ -1033,10 +1060,12 @@ func TestAuditNewScaSimpleJsonViolations(t *testing.T) {

func TestAuditNewScaCycloneDxPnpm(t *testing.T) {
securityIntegrationTestUtils.InitAuditNewScaTests(t, utils.StaticScanMinVersion)
output, err := testAuditCommandNewSca(t, filepath.Join("package-managers", "npm", "pnpm-lock"), auditCommandTestParams{
output, err := testAuditCommandNewSca(t, auditCommandTestParams{
WithSbom: true,
Format: format.CycloneDx,
})
},
filepath.Join("package-managers", "npm", "pnpm-lock"),
)
assert.NoError(t, err)
validations.VerifyCycloneDxResults(t, output, validations.ValidationParams{
ExactResultsMatch: true,
Expand All @@ -1051,11 +1080,13 @@ func TestAuditNewScaCycloneDxPnpm(t *testing.T) {

func TestAuditNewScaCycloneDxMaven(t *testing.T) {
securityIntegrationTestUtils.InitAuditNewScaTests(t, utils.StaticScanMinVersion)
output, err := testAuditCommandNewSca(t, filepath.Join("package-managers", "maven", "maven-example"), auditCommandTestParams{
output, err := testAuditCommandNewSca(t, auditCommandTestParams{
WithSbom: true,
Threads: 5,
Format: format.CycloneDx,
})
},
filepath.Join("package-managers", "maven", "maven-example"),
)
assert.NoError(t, err)
validations.VerifyCycloneDxResults(t, output, validations.ValidationParams{
ExactResultsMatch: true,
Expand All @@ -1070,15 +1101,17 @@ func TestAuditNewScaCycloneDxMaven(t *testing.T) {

func TestAuditNewScaCycloneDxGradle(t *testing.T) {
securityIntegrationTestUtils.InitAuditNewScaTests(t, utils.StaticScanMinVersion)
output, err := testAuditCommandNewSca(t, filepath.Join("package-managers", "gradle", "gradle-lock"), auditCommandTestParams{
output, err := testAuditCommandNewSca(t, auditCommandTestParams{
WithSbom: true,
Format: format.CycloneDx,
})
},
filepath.Join("package-managers", "gradle", "gradle-lock"),
)
assert.NoError(t, err)
validations.VerifyCycloneDxResults(t, output, validations.ValidationParams{
ExactResultsMatch: true,
Total: &validations.TotalCount{Vulnerabilities: 11, BomComponents: 7 + 1, Licenses: 5},
SbomComponents: &validations.SbomCount{Direct: 7, Root: 1},
Total: &validations.TotalCount{Vulnerabilities: 11, BomComponents: 6 + 1, Licenses: 5},
SbomComponents: &validations.SbomCount{Direct: 6, Root: 1},
Vulnerabilities: &validations.VulnerabilityCount{
ValidateScan: &validations.ScanCount{Sca: 11},
ValidateApplicabilityStatus: &validations.ApplicabilityStatusCount{NotCovered: 5, NotApplicable: 1, MissingContext: 5},
Expand All @@ -1088,10 +1121,12 @@ func TestAuditNewScaCycloneDxGradle(t *testing.T) {

func TestAuditNewScaCycloneDxGo(t *testing.T) {
securityIntegrationTestUtils.InitAuditNewScaTests(t, utils.StaticScanMinVersion)
output, err := testAuditCommandNewSca(t, filepath.Join("package-managers", "go", "simple-project"), auditCommandTestParams{
output, err := testAuditCommandNewSca(t, auditCommandTestParams{
WithSbom: true,
Format: format.CycloneDx,
})
},
filepath.Join("package-managers", "go", "simple-project"),
)
assert.NoError(t, err)
validations.VerifyCycloneDxResults(t, output, validations.ValidationParams{
ExactResultsMatch: true,
Expand All @@ -1106,10 +1141,12 @@ func TestAuditNewScaCycloneDxGo(t *testing.T) {

func TestAuditNewScaCycloneDxYarn(t *testing.T) {
securityIntegrationTestUtils.InitAuditNewScaTests(t, utils.StaticScanMinVersion)
output, err := testAuditCommandNewSca(t, filepath.Join("package-managers", "yarn", "yarn-v3"), auditCommandTestParams{
output, err := testAuditCommandNewSca(t, auditCommandTestParams{
WithSbom: true,
Format: format.CycloneDx,
})
},
filepath.Join("package-managers", "yarn", "yarn-v3"),
)
assert.NoError(t, err)
validations.VerifyCycloneDxResults(t, output, validations.ValidationParams{
ExactResultsMatch: true,
Expand All @@ -1124,10 +1161,12 @@ func TestAuditNewScaCycloneDxYarn(t *testing.T) {

func TestAuditNewScaCycloneDxPip(t *testing.T) {
securityIntegrationTestUtils.InitAuditNewScaTests(t, utils.StaticScanMinVersion)
output, err := testAuditCommandNewSca(t, filepath.Join("jas", "jas"), auditCommandTestParams{
output, err := testAuditCommandNewSca(t, auditCommandTestParams{
WithSbom: true,
Format: format.CycloneDx,
})
},
filepath.Join("jas", "jas"),
)
assert.NoError(t, err)
validations.VerifyCycloneDxResults(t, output, validations.ValidationParams{
ExactResultsMatch: true,
Expand All @@ -1141,10 +1180,12 @@ func TestAuditNewScaCycloneDxPip(t *testing.T) {

func TestAuditNewScaCycloneDxPoetry(t *testing.T) {
securityIntegrationTestUtils.InitAuditNewScaTests(t, utils.StaticScanMinVersion)
output, err := testAuditCommandNewSca(t, filepath.Join("package-managers", "python", "poetry", "poetry-project"), auditCommandTestParams{
output, err := testAuditCommandNewSca(t, auditCommandTestParams{
WithSbom: true,
Format: format.CycloneDx,
})
},
filepath.Join("package-managers", "python", "poetry", "poetry-project"),
)
assert.NoError(t, err)
validations.VerifyCycloneDxResults(t, output, validations.ValidationParams{
ExactResultsMatch: true,
Expand All @@ -1159,10 +1200,12 @@ func TestAuditNewScaCycloneDxPoetry(t *testing.T) {

func TestAuditNewScaCycloneDxPipenv(t *testing.T) {
securityIntegrationTestUtils.InitAuditNewScaTests(t, utils.StaticScanMinVersion)
output, err := testAuditCommandNewSca(t, filepath.Join("package-managers", "python", "pipenv", "pipenv-lock"), auditCommandTestParams{
output, err := testAuditCommandNewSca(t, auditCommandTestParams{
WithSbom: true,
Format: format.CycloneDx,
})
},
filepath.Join("package-managers", "python", "pipenv", "pipenv-lock"),
)
assert.NoError(t, err)
validations.VerifyCycloneDxResults(t, output, validations.ValidationParams{
ExactResultsMatch: true,
Expand All @@ -1177,10 +1220,12 @@ func TestAuditNewScaCycloneDxPipenv(t *testing.T) {

func TestAuditNewScaCycloneDxUV(t *testing.T) {
securityIntegrationTestUtils.InitAuditNewScaTests(t, utils.StaticScanMinVersion)
output, err := testAuditCommandNewSca(t, filepath.Join("package-managers", "python", "uv", "uv"), auditCommandTestParams{
output, err := testAuditCommandNewSca(t, auditCommandTestParams{
WithSbom: true,
Format: format.CycloneDx,
})
},
filepath.Join("package-managers", "python", "uv", "uv"),
)
assert.NoError(t, err)
validations.VerifyCycloneDxResults(t, output, validations.ValidationParams{
ExactResultsMatch: true,
Expand All @@ -1195,10 +1240,12 @@ func TestAuditNewScaCycloneDxUV(t *testing.T) {

func TestAuditNewScaCycloneDxNuget(t *testing.T) {
securityIntegrationTestUtils.InitAuditNewScaTests(t, utils.StaticScanMinVersion)
output, err := testAuditCommandNewSca(t, filepath.Join("package-managers", "nuget", "single4.0"), auditCommandTestParams{
output, err := testAuditCommandNewSca(t, auditCommandTestParams{
WithSbom: true,
Format: format.CycloneDx,
})
},
filepath.Join("package-managers", "nuget", "single4.0"),
)
assert.NoError(t, err)
validations.VerifyCycloneDxResults(t, output, validations.ValidationParams{
ExactResultsMatch: true,
Expand All @@ -1224,14 +1271,14 @@ func TestAuditNewScaSnippetDetection(t *testing.T) {
Watches: []string{watchName},
}
// No snippet detection. nothing should be found
output, err := testAuditCommandNewSca(t, filepath.Join("package-managers", "c", "snippet_detection"), params)
output, err := testAuditCommandNewSca(t, params, filepath.Join("package-managers", "c", "snippet_detection"))
assert.NoError(t, err)
validations.VerifySimpleJsonResults(t, output,
validations.ValidationParams{ExactResultsMatch: true},
)
// With snippet detection. should find 4 licenses violations
params.WithSnippetDetection = true
output, err = testAuditCommandNewSca(t, filepath.Join("package-managers", "c", "snippet_detection"), params)
output, err = testAuditCommandNewSca(t, params, filepath.Join("package-managers", "c", "snippet_detection"))
assert.NoError(t, err)
validations.VerifySimpleJsonResults(t, output,
validations.ValidationParams{
Expand Down
8 changes: 6 additions & 2 deletions cli/docs/flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,8 @@ const (
DetailedSummary = "detailed-summary"
CacheValidity = "cache-validity"
GitThreads = gitPrefix + Threads

UseConfigProfile = "use-config-profile"
)

// Mapping between security commands (key) and their flags (key).
Expand Down Expand Up @@ -217,8 +219,8 @@ var commandFlags = map[string][]string{
// Violations params
scanProjectKey, Watches, Snippet, ScanVuln, Fail,
// Scan params
Threads, ExclusionsAudit,
auditSca, auditIac, auditSast, auditSecrets, auditWithoutCA, SecretValidation, Sbom,
Threads, ExclusionsAudit, WorkingDirs,
auditSca, auditIac, auditSast, auditSecrets, auditWithoutCA, SecretValidation, Sbom, UseConfigProfile,
// Output params
Licenses, OutputFormat, ExtendedTable, OutputDir, UploadRtRepoPath,
// Scan Logic params
Expand Down Expand Up @@ -363,6 +365,8 @@ var flagsMap = map[string]components.Flag{
AddSastRules: components.NewStringFlag(AddSastRules, "Incorporate any additional SAST rules (in JSON format, with absolute path) into this local scan."),
Port: components.NewStringFlag(Port, "Specifies the port to run the SAST server on.", components.SetMandatory()),

UseConfigProfile: components.NewBoolFlag(UseConfigProfile, "Set to false to override config profile for the audit.", components.WithBoolDefaultValue(true), components.SetHiddenBoolFlag()),

// Docker flags
DockerImageName: components.NewStringFlag(DockerImageName, "Specifies the Docker image name to audit. Uses the same format as the Docker CLI, including Artifactory-hosted images."),

Expand Down
2 changes: 2 additions & 0 deletions cli/gitcommands.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ func GitAuditCmd(c *components.Context) error {
return err
}
gitAuditCmd.SetServerDetails(serverDetails).SetXrayVersion(xrayVersion).SetXscVersion(xscVersion)
// Set config profile params
gitAuditCmd.SetUseConfigProfile(c.GetBoolFlagValue(flags.UseConfigProfile))
// Set violations params
format, err := outputFormat.ParseOutputFormat(c.GetStringFlagValue(flags.OutputFormat), outputFormat.All)
if err != nil {
Expand Down
4 changes: 1 addition & 3 deletions cli/scancommands.go
Original file line number Diff line number Diff line change
Expand Up @@ -556,14 +556,12 @@ func CreateAuditCmd(c *components.Context) (string, string, *coreConfig.ServerDe
return "", "", nil, nil, err
}
auditCmd.SetBomGenerator(sbomGenerator).SetCustomBomGenBinaryPath(c.GetStringFlagValue(flags.XrayLibPluginBinaryCustomPath))
auditCmd.SetScaScanStrategy(scaScanStrategy)
auditCmd.SetViolationGenerator(violationGenerator)
auditCmd.SetScaScanStrategy(scaScanStrategy).SetViolationGenerator(violationGenerator).SetIncludeSbom(shouldIncludeSbom(c, format))
auditCmd.SetUploadCdxResults(uploadResults).SetRtResultRepository(c.GetStringFlagValue(flags.UploadRtRepoPath))
auditCmd.SetTargetRepoPath(addTrailingSlashToRepoPathIfNeeded(c)).
SetProject(getProject(c)).
SetIncludeVulnerabilities(c.GetBoolFlagValue(flags.Vuln)).
SetIncludeLicenses(c.GetBoolFlagValue(flags.Licenses)).
SetIncludeSbom(shouldIncludeSbom(c, format)).
SetIncludeSnippetDetection(includeSnippetDetection).
SetFail(c.GetBoolFlagValue(flags.Fail)).
SetPrintExtendedTable(c.GetBoolFlagValue(flags.ExtendedTable)).
Expand Down
Loading
Loading