Improve sort logics
This commit is contained in:
@@ -463,7 +463,11 @@ func (p *ReportCmd) Execute(_ context.Context, f *flag.FlagSet, _ ...interface{}
|
||||
|
||||
var res models.ScanResults
|
||||
for _, r := range results {
|
||||
//TODO remove
|
||||
res = append(res, r.FilterByCvssOver())
|
||||
|
||||
// TODO Add sort function to ScanResults
|
||||
|
||||
//remove
|
||||
// for _, vuln := range r.ScannedCves {
|
||||
// // if _, ok := vuln.CveContents.Get(models.NewCveContentType(r.Family)); !ok {
|
||||
// // pp.Printf("not in oval: %s %f\n%v\n",
|
||||
@@ -477,7 +481,6 @@ func (p *ReportCmd) Execute(_ context.Context, f *flag.FlagSet, _ ...interface{}
|
||||
// // pp.Println(vuln)
|
||||
// // }
|
||||
// }
|
||||
res = append(res, r.FilterByCvssOver())
|
||||
}
|
||||
|
||||
for _, w := range reports {
|
||||
@@ -490,7 +493,6 @@ func (p *ReportCmd) Execute(_ context.Context, f *flag.FlagSet, _ ...interface{}
|
||||
}
|
||||
|
||||
// fillCveDetail fetches NVD, JVN from CVE Database, and then set to fields.
|
||||
//TODO rename to FillCveDictionary
|
||||
func fillCveDetail(r *models.ScanResult) error {
|
||||
var cveIDs []string
|
||||
for _, v := range r.ScannedCves {
|
||||
@@ -515,10 +517,13 @@ func fillCveDetail(r *models.ScanResult) error {
|
||||
}
|
||||
}
|
||||
}
|
||||
//TODO sort
|
||||
// sort.Sort(r.KnownCves)
|
||||
// sort.Sort(r.UnknownCves)
|
||||
// sort.Sort(r.IgnoredCves)
|
||||
//TODO Remove
|
||||
// sort.Slice(r.ScannedCves, func(i, j int) bool {
|
||||
// if r.ScannedCves[j].CveContents.CvssV2Score() == r.ScannedCves[i].CveContents.CvssV2Score() {
|
||||
// return r.ScannedCves[j].CveContents.CvssV2Score() < r.ScannedCves[i].CveContents.CvssV2Score()
|
||||
// }
|
||||
// return r.ScannedCves[j].CveContents.CvssV2Score() < r.ScannedCves[i].CveContents.CvssV2Score()
|
||||
// })
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
@@ -44,17 +44,6 @@ var jsonDirPattern = regexp.MustCompile(
|
||||
// JSONDirs is array of json files path.
|
||||
type jsonDirs []string
|
||||
|
||||
// sort as recent directories are at the head
|
||||
func (d jsonDirs) Len() int {
|
||||
return len(d)
|
||||
}
|
||||
func (d jsonDirs) Swap(i, j int) {
|
||||
d[i], d[j] = d[j], d[i]
|
||||
}
|
||||
func (d jsonDirs) Less(i, j int) bool {
|
||||
return d[j] < d[i]
|
||||
}
|
||||
|
||||
// getValidJSONDirs return valid json directory as array
|
||||
// Returned array is sorted so that recent directories are at the head
|
||||
func lsValidJSONDirs() (dirs jsonDirs, err error) {
|
||||
@@ -69,7 +58,9 @@ func lsValidJSONDirs() (dirs jsonDirs, err error) {
|
||||
dirs = append(dirs, jsonDir)
|
||||
}
|
||||
}
|
||||
sort.Sort(dirs)
|
||||
sort.Slice(dirs, func(i, j int) bool {
|
||||
return dirs[j] < dirs[i]
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@@ -5,7 +5,6 @@ import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"sort"
|
||||
"strings"
|
||||
)
|
||||
|
||||
@@ -35,18 +34,18 @@ func appendIfMissing(slice []string, str string) []string {
|
||||
func Parse(path string) ([]string, error) {
|
||||
file, err := os.Open(path)
|
||||
if err != nil {
|
||||
return []string{}, fmt.Errorf("Failed to open: %s", err)
|
||||
return nil, fmt.Errorf("Failed to open: %s", err)
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
b, err := ioutil.ReadAll(file)
|
||||
if err != nil {
|
||||
return []string{}, fmt.Errorf("Failed to read: %s", err)
|
||||
return nil, fmt.Errorf("Failed to read: %s", err)
|
||||
}
|
||||
|
||||
var anal analysis
|
||||
if err := xml.Unmarshal(b, &anal); err != nil {
|
||||
fmt.Errorf("Failed to unmarshal: %s", err)
|
||||
return nil, fmt.Errorf("Failed to unmarshal: %s", err)
|
||||
}
|
||||
|
||||
cpes := []string{}
|
||||
@@ -59,6 +58,7 @@ func Parse(path string) ([]string, error) {
|
||||
}
|
||||
}
|
||||
}
|
||||
sort.Strings(cpes)
|
||||
//TODO remove
|
||||
// sort.Strings(cpes)
|
||||
return cpes, nil
|
||||
}
|
||||
|
||||
@@ -21,7 +21,6 @@ import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"sort"
|
||||
"time"
|
||||
|
||||
"github.com/cenkalti/backoff"
|
||||
@@ -69,7 +68,6 @@ type response struct {
|
||||
CveDetail cve.CveDetail
|
||||
}
|
||||
|
||||
//TODO rename to FetchCveDictionary
|
||||
func (api cvedictClient) FetchCveDetails(cveIDs []string) (cveDetails cve.CveDetails, err error) {
|
||||
switch config.Conf.CveDBType {
|
||||
case "sqlite3", "mysql", "postgres":
|
||||
@@ -130,7 +128,8 @@ func (api cvedictClient) FetchCveDetails(cveIDs []string) (cveDetails cve.CveDet
|
||||
fmt.Errorf("Failed to fetch CVE. err: %v", errs)
|
||||
}
|
||||
|
||||
sort.Sort(cveDetails)
|
||||
//TODO
|
||||
// sort.Sort(cveDetails)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -158,8 +157,9 @@ func (api cvedictClient) FetchCveDetailsFromCveDB(cveIDs []string) (cveDetails c
|
||||
}
|
||||
}
|
||||
|
||||
//TODO
|
||||
// order by CVE ID desc
|
||||
sort.Sort(cveDetails)
|
||||
// sort.Sort(cveDetails)
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
202
models/models.go
202
models/models.go
@@ -19,7 +19,6 @@ package models
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sort"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
@@ -30,23 +29,24 @@ import (
|
||||
// ScanResults is slice of ScanResult.
|
||||
type ScanResults []ScanResult
|
||||
|
||||
// Len implement Sort Interface
|
||||
func (s ScanResults) Len() int {
|
||||
return len(s)
|
||||
}
|
||||
//TODO
|
||||
// // Len implement Sort Interface
|
||||
// func (s ScanResults) Len() int {
|
||||
// return len(s)
|
||||
// }
|
||||
|
||||
// Swap implement Sort Interface
|
||||
func (s ScanResults) Swap(i, j int) {
|
||||
s[i], s[j] = s[j], s[i]
|
||||
}
|
||||
// // Swap implement Sort Interface
|
||||
// func (s ScanResults) Swap(i, j int) {
|
||||
// s[i], s[j] = s[j], s[i]
|
||||
// }
|
||||
|
||||
// Less implement Sort Interface
|
||||
func (s ScanResults) Less(i, j int) bool {
|
||||
if s[i].ServerName == s[j].ServerName {
|
||||
return s[i].Container.ContainerID < s[i].Container.ContainerID
|
||||
}
|
||||
return s[i].ServerName < s[j].ServerName
|
||||
}
|
||||
// // Less implement Sort Interface
|
||||
// func (s ScanResults) Less(i, j int) bool {
|
||||
// if s[i].ServerName == s[j].ServerName {
|
||||
// return s[i].Container.ContainerID < s[i].Container.ContainerID
|
||||
// }
|
||||
// return s[i].ServerName < s[j].ServerName
|
||||
// }
|
||||
|
||||
// ScanResult has the result of scanned CVE information.
|
||||
type ScanResult struct {
|
||||
@@ -260,15 +260,6 @@ func (r ScanResult) CveSummary() string {
|
||||
high+medium+low+unknown, high, medium, low, unknown)
|
||||
}
|
||||
|
||||
// NWLink has network link information.
|
||||
//TODO remove
|
||||
// type NWLink struct {
|
||||
// IPAddress string
|
||||
// Netmask string
|
||||
// DevName string
|
||||
// LinkState string
|
||||
// }
|
||||
|
||||
// Confidence is a ranking how confident the CVE-ID was deteted correctly
|
||||
// Score: 0 - 100
|
||||
type Confidence struct {
|
||||
@@ -382,33 +373,6 @@ func (v *VulnInfos) Upsert(vInfo VulnInfo) {
|
||||
}
|
||||
}
|
||||
|
||||
// immutable
|
||||
// func (v *VulnInfos) set(cveID string, v VulnInfo) VulnInfos {
|
||||
// for i, p := range s {
|
||||
// if cveID == p.CveID {
|
||||
// s[i] = v
|
||||
// return s
|
||||
// }
|
||||
// }
|
||||
// return append(s, v)
|
||||
// }
|
||||
|
||||
//TODO GO 1.8
|
||||
// Len implement Sort Interface
|
||||
// func (s VulnInfos) Len() int {
|
||||
// return len(s)
|
||||
// }
|
||||
|
||||
// // Swap implement Sort Interface
|
||||
// func (s VulnInfos) Swap(i, j int) {
|
||||
// s[i], s[j] = s[j], s[i]
|
||||
// }
|
||||
|
||||
// // Less implement Sort Interface
|
||||
// func (s VulnInfos) Less(i, j int) bool {
|
||||
// return s[i].CveID < s[j].CveID
|
||||
// }
|
||||
|
||||
// VulnInfo holds a vulnerability information and unsecure packages
|
||||
type VulnInfo struct {
|
||||
CveID string
|
||||
@@ -432,133 +396,6 @@ func (v *VulnInfo) NilSliceToEmpty() {
|
||||
}
|
||||
}
|
||||
|
||||
// CveInfos is for sorting
|
||||
// type CveInfos []CveInfo
|
||||
|
||||
// func (c CveInfos) Len() int {
|
||||
// return len(c)
|
||||
// }
|
||||
|
||||
// func (c CveInfos) Swap(i, j int) {
|
||||
// c[i], c[j] = c[j], c[i]
|
||||
// }
|
||||
|
||||
// func (c CveInfos) Less(i, j int) bool {
|
||||
// if c[i].CvssV2Score() == c[j].CvssV2Score() {
|
||||
// return c[i].CveID < c[j].CveID
|
||||
// }
|
||||
// return c[j].CvssV2Score() < c[i].CvssV2Score()
|
||||
// }
|
||||
|
||||
// // Get cveInfo by cveID
|
||||
// func (c CveInfos) Get(cveID string) (CveInfo, bool) {
|
||||
// for _, cve := range c {
|
||||
// if cve.VulnInfo.CveID == cveID {
|
||||
// return cve, true
|
||||
// }
|
||||
// }
|
||||
// return CveInfo{}, false
|
||||
// }
|
||||
|
||||
// // Delete by cveID
|
||||
// func (c *CveInfos) Delete(cveID string) {
|
||||
// cveInfos := *c
|
||||
// for i, cve := range cveInfos {
|
||||
// if cve.VulnInfo.CveID == cveID {
|
||||
// *c = append(cveInfos[:i], cveInfos[i+1:]...)
|
||||
// break
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// // Insert cveInfo
|
||||
// func (c *CveInfos) Insert(cveInfo CveInfo) {
|
||||
// *c = append(*c, cveInfo)
|
||||
// }
|
||||
|
||||
// // Update cveInfo
|
||||
// func (c CveInfos) Update(cveInfo CveInfo) (ok bool) {
|
||||
// for i, cve := range c {
|
||||
// if cve.VulnInfo.CveID == cveInfo.VulnInfo.CveID {
|
||||
// c[i] = cveInfo
|
||||
// return true
|
||||
// }
|
||||
// }
|
||||
// return false
|
||||
// }
|
||||
|
||||
// // Upsert cveInfo
|
||||
// func (c *CveInfos) Upsert(cveInfo CveInfo) {
|
||||
// ok := c.Update(cveInfo)
|
||||
// if !ok {
|
||||
// c.Insert(cveInfo)
|
||||
// }
|
||||
// }
|
||||
|
||||
//TODO
|
||||
// CveInfo has CVE detailed Information.
|
||||
// type CveInfo struct {
|
||||
// VulnInfo
|
||||
// CveContents []CveContent
|
||||
// }
|
||||
|
||||
// Get a CveContent specified by arg
|
||||
// func (c *CveInfo) Get(typestr CveContentType) (*CveContent, bool) {
|
||||
// for _, cont := range c.CveContents {
|
||||
// if cont.Type == typestr {
|
||||
// return &cont, true
|
||||
// }
|
||||
// }
|
||||
// return &CveContent{}, false
|
||||
// }
|
||||
|
||||
// // Insert a CveContent to specified by arg
|
||||
// func (c *CveInfo) Insert(con CveContent) {
|
||||
// c.CveContents = append(c.CveContents, con)
|
||||
// }
|
||||
|
||||
// // Update a CveContent to specified by arg
|
||||
// func (c *CveInfo) Update(to CveContent) bool {
|
||||
// for i, cont := range c.CveContents {
|
||||
// if cont.Type == to.Type {
|
||||
// c.CveContents[i] = to
|
||||
// return true
|
||||
// }
|
||||
// }
|
||||
// return false
|
||||
// }
|
||||
|
||||
// // CvssV2Score returns CVSS V2 Score
|
||||
// func (c *CveInfo) CvssV2Score() float64 {
|
||||
// //TODO
|
||||
// if cont, found := c.Get(NVD); found {
|
||||
// return cont.Cvss2Score
|
||||
// } else if cont, found := c.Get(JVN); found {
|
||||
// return cont.Cvss2Score
|
||||
// } else if cont, found := c.Get(RedHat); found {
|
||||
// return cont.Cvss2Score
|
||||
// }
|
||||
// return -1
|
||||
// }
|
||||
|
||||
// // NilSliceToEmpty set nil slice fields to empty slice to avoid null in JSON
|
||||
// func (c *CveInfo) NilSliceToEmpty() {
|
||||
// return
|
||||
// // TODO
|
||||
// // if c.CveDetail.Nvd.Cpes == nil {
|
||||
// // c.CveDetail.Nvd.Cpes = []cve.Cpe{}
|
||||
// // }
|
||||
// // if c.CveDetail.Jvn.Cpes == nil {
|
||||
// // c.CveDetail.Jvn.Cpes = []cve.Cpe{}
|
||||
// // }
|
||||
// // if c.CveDetail.Nvd.References == nil {
|
||||
// // c.CveDetail.Nvd.References = []cve.Reference{}
|
||||
// // }
|
||||
// // if c.CveDetail.Jvn.References == nil {
|
||||
// // c.CveDetail.Jvn.References = []cve.Reference{}
|
||||
// // }
|
||||
// }
|
||||
|
||||
// CveContentType is a source of CVE information
|
||||
type CveContentType string
|
||||
|
||||
@@ -732,7 +569,8 @@ func (ps PackageInfoList) UniqByName() (distincted PackageInfoList) {
|
||||
for key := range set {
|
||||
keys = append(keys, key)
|
||||
}
|
||||
sort.Strings(keys)
|
||||
//TODO remove
|
||||
// sort.Strings(keys)
|
||||
for _, key := range keys {
|
||||
distincted = append(distincted, set[key])
|
||||
}
|
||||
@@ -800,10 +638,6 @@ func (ps PackageInfoList) FormatUpdatablePacksSummary() string {
|
||||
// the Name field.
|
||||
type PackageInfosByName []PackageInfo
|
||||
|
||||
func (a PackageInfosByName) Len() int { return len(a) }
|
||||
func (a PackageInfosByName) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
|
||||
func (a PackageInfosByName) Less(i, j int) bool { return a[i].Name < a[j].Name }
|
||||
|
||||
// PackageInfo has installed packages.
|
||||
type PackageInfo struct {
|
||||
Name string
|
||||
|
||||
16
scan/base.go
16
scan/base.go
@@ -20,7 +20,6 @@ package scan
|
||||
import (
|
||||
"fmt"
|
||||
"regexp"
|
||||
"sort"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
@@ -266,12 +265,15 @@ func (l base) isAwsInstanceID(str string) bool {
|
||||
}
|
||||
|
||||
func (l *base) convertToModel() models.ScanResult {
|
||||
for _, p := range l.VulnInfos {
|
||||
//TODO
|
||||
sort.Sort(models.PackageInfosByName(p.Packages))
|
||||
}
|
||||
//TODO
|
||||
// sort.Sort(l.VulnInfos)
|
||||
//TODO Remove
|
||||
// for _, p := range l.VulnInfos {
|
||||
// sort.Slice(p.Packages, func(i, j int) bool {
|
||||
// return p.Packages[i].Name < p.Packages[j].Name
|
||||
// })
|
||||
// }
|
||||
// sort.Slice(l.VulnInfos, func(i, j int) bool {
|
||||
// return l.VulnInfos[i].CveID < l.VulnInfos[j].CveID
|
||||
// })
|
||||
|
||||
ctype := l.ServerInfo.Containers.Type
|
||||
if l.ServerInfo.Container.ContainerID != "" && ctype == "" {
|
||||
|
||||
@@ -20,7 +20,6 @@ package scan
|
||||
import (
|
||||
"fmt"
|
||||
"regexp"
|
||||
"sort"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
@@ -770,7 +769,9 @@ func (o *redhat) parseYumUpdateinfo(stdout string) (result []distroAdvisoryCveID
|
||||
for cveID := range cveIDsSetInThisSection {
|
||||
foundCveIDs = append(foundCveIDs, cveID)
|
||||
}
|
||||
sort.Strings(foundCveIDs)
|
||||
//TODO remove
|
||||
// sort.Strings(foundCveIDs)
|
||||
|
||||
result = append(result, distroAdvisoryCveIDs{
|
||||
DistroAdvisory: advisory,
|
||||
CveIDs: foundCveIDs,
|
||||
|
||||
Reference in New Issue
Block a user