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

fix(sarif): Fix SARIF URIs to always be local to project #889

Merged
merged 1 commit into from
Aug 19, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
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