Skip to content
This repository has been archived by the owner on Jan 23, 2025. It is now read-only.

Commit

Permalink
fix(sarif): Fix SARIF URIs to always be local to project (#889)
Browse files Browse the repository at this point in the history
Resolves #888 

Signed-off-by: Liam Galvin <[email protected]>
  • Loading branch information
liamg authored Aug 19, 2022
1 parent 336c3cf commit 946f5ee
Show file tree
Hide file tree
Showing 8 changed files with 30 additions and 20 deletions.
2 changes: 1 addition & 1 deletion pkg/formatters/checkstyle.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ func outputCheckStyle(b ConfigurableFormatter, results scan.Results) error {

rng := res.Range()

path := b.Path(res)
path := b.Path(res, res.Metadata())

files[path] = append(
files[path],
Expand Down
2 changes: 1 addition & 1 deletion pkg/formatters/csv.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ func outputCSV(b ConfigurableFormatter, results scan.Results) error {
}

rng := res.Range()
path := b.Path(res)
path := b.Path(res, res.Metadata())

records = append(records, []string{
path,
Expand Down
10 changes: 6 additions & 4 deletions pkg/formatters/formatter.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import (
"os"
"sort"

"github.com/aquasecurity/defsec/pkg/types"

"github.com/aquasecurity/defsec/pkg/severity"

"github.com/aquasecurity/defsec/pkg/scan"
Expand All @@ -25,7 +27,7 @@ type ConfigurableFormatter interface {
GroupResults([]scan.Result) ([]GroupedResult, error)
IncludePassed() bool
IncludeIgnored() bool
Path(result scan.Result) string
Path(result scan.Result, metadata types.Metadata) string
}

type Base struct {
Expand Down Expand Up @@ -62,11 +64,11 @@ func NewBase() *Base {
}
}

func (b *Base) Path(result scan.Result) string {
func (b *Base) Path(result scan.Result, metadata types.Metadata) string {
if b.relative {
return result.RelativePathTo(b.fsRoot, b.baseDir)
return result.RelativePathTo(b.fsRoot, b.baseDir, metadata)
}
return result.AbsolutePath(b.fsRoot)
return result.AbsolutePath(b.fsRoot, metadata)
}

func (b *Base) IncludePassed() bool {
Expand Down
2 changes: 1 addition & 1 deletion pkg/formatters/json.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ func outputJSON(b ConfigurableFormatter, results scan.Results) error {
}
flat := result.Flatten()
flat.Links = b.GetLinks(result)
flat.Location.Filename = b.Path(result)
flat.Location.Filename = b.Path(result, result.Metadata())
flatResults = append(flatResults, flat)
}
return jsonWriter.Encode(struct {
Expand Down
4 changes: 2 additions & 2 deletions pkg/formatters/junit.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ func outputJUnit(b ConfigurableFormatter, results scan.Results) error {
continue
}
}
path := b.Path(res)
path := b.Path(res, res.Metadata())
output.TestCases = append(output.TestCases,
jUnitTestCase{
Classname: path,
Expand Down Expand Up @@ -120,7 +120,7 @@ func buildFailure(b ConfigurableFormatter, res scan.Result) *jUnitFailure {
if !res.Range().IsMultiLine() {
lineInfo = fmt.Sprintf("%d", res.Range().GetStartLine())
}
location := fmt.Sprintf("%s:%s", b.Path(res), lineInfo)
location := fmt.Sprintf("%s:%s", b.Path(res, res.Metadata()), lineInfo)

return &jUnitFailure{
Message: res.Description(),
Expand Down
6 changes: 4 additions & 2 deletions pkg/formatters/sarif.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,9 @@ func outputSARIF(b ConfigurableFormatter, results scan.Results) error {
rule.WithHelpURI(links[0])
}

rng := res.Range()
metadata := res.Metadata().Root()

rng := metadata.Range()
message := sarif.NewTextMessage(res.Description())
region := sarif.NewSimpleRegion(rng.GetStartLine(), rng.GetEndLine())
var level string
Expand All @@ -53,7 +55,7 @@ func outputSARIF(b ConfigurableFormatter, results scan.Results) error {
level = "error"
}

path := b.Path(res)
path := b.Path(res, metadata)

location := sarif.NewPhysicalLocation().
WithArtifactLocation(sarif.NewSimpleArtifactLocation(path)).
Expand Down
16 changes: 7 additions & 9 deletions pkg/scan/result.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,35 +104,33 @@ func (r Result) Traces() []string {
return r.traces
}

func (r *Result) AbsolutePath(fsRoot string) string {
func (r *Result) AbsolutePath(fsRoot string, metadata defsecTypes.Metadata) string {
if strings.HasSuffix(fsRoot, ":") {
fsRoot += "/"
}

m := r.Metadata()
if m.IsUnmanaged() || m.Range() == nil {
if metadata.IsUnmanaged() || metadata.Range() == nil {
return ""
}
rng := m.Range()
rng := metadata.Range()
if rng.GetSourcePrefix() != "" && !strings.HasPrefix(rng.GetSourcePrefix(), ".") {
return rng.GetFilename()
}
return filepath.Join(fsRoot, rng.GetLocalFilename())
}

func (r *Result) RelativePathTo(fsRoot string, to string) string {
func (r *Result) RelativePathTo(fsRoot, to string, metadata defsecTypes.Metadata) string {

absolute := r.AbsolutePath(fsRoot)
absolute := r.AbsolutePath(fsRoot, metadata)

if strings.HasSuffix(fsRoot, ":") {
fsRoot += "/"
}

m := r.Metadata()
if m.IsUnmanaged() || m.Range() == nil {
if metadata.IsUnmanaged() || metadata.Range() == nil {
return absolute
}
rng := m.Range()
rng := metadata.Range()
if rng.GetSourcePrefix() != "" && !strings.HasPrefix(rng.GetSourcePrefix(), ".") {
return absolute
}
Expand Down
8 changes: 8 additions & 0 deletions pkg/types/metadata.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,14 @@ func (m Metadata) Parent() *Metadata {
return m.parent
}

func (m Metadata) Root() Metadata {
meta := &m
for meta.Parent() != nil {
meta = meta.Parent()
}
return *meta
}

func (m Metadata) IsMultiLine() bool {
return m.rnge.GetStartLine() < m.rnge.GetEndLine()
}
Expand Down

0 comments on commit 946f5ee

Please sign in to comment.