github.com/devseccon/trivy@v0.47.1-0.20231123133102-bd902a0bd996/pkg/fanal/utils/utils.go (about) 1 package utils 2 3 import ( 4 "bufio" 5 "fmt" 6 "io" 7 "math" 8 "os" 9 "os/exec" 10 "path/filepath" 11 12 dio "github.com/aquasecurity/go-dep-parser/pkg/io" 13 ) 14 15 var ( 16 PathSeparator = fmt.Sprintf("%c", os.PathSeparator) 17 ) 18 19 func CacheDir() string { 20 cacheDir, err := os.UserCacheDir() 21 if err != nil { 22 cacheDir = os.TempDir() 23 } 24 return cacheDir 25 } 26 27 func StringInSlice(a string, list []string) bool { 28 for _, b := range list { 29 if b == a { 30 return true 31 } 32 } 33 return false 34 } 35 36 func IsCommandAvailable(name string) bool { 37 if _, err := exec.LookPath(name); err != nil { 38 return false 39 } 40 return true 41 } 42 43 func IsGzip(f *bufio.Reader) bool { 44 buf, err := f.Peek(3) 45 if err != nil { 46 return false 47 } 48 return buf[0] == 0x1F && buf[1] == 0x8B && buf[2] == 0x8 49 } 50 51 func Keys(m map[string]struct{}) []string { 52 var keys []string 53 for k := range m { 54 keys = append(keys, k) 55 } 56 return keys 57 } 58 59 func IsExecutable(fileInfo os.FileInfo) bool { 60 // For Windows 61 if filepath.Ext(fileInfo.Name()) == ".exe" { 62 return true 63 } 64 65 mode := fileInfo.Mode() 66 if !mode.IsRegular() { 67 return false 68 } 69 70 // Check unpackaged file 71 if mode.Perm()&0111 != 0 { 72 return true 73 } 74 return false 75 } 76 77 func IsBinary(content dio.ReadSeekerAt, fileSize int64) (bool, error) { 78 headSize := int(math.Min(float64(fileSize), 300)) 79 head := make([]byte, headSize) 80 if _, err := content.Read(head); err != nil { 81 return false, err 82 } 83 if _, err := content.Seek(0, io.SeekStart); err != nil { 84 return false, err 85 } 86 87 // cf. https://github.com/file/file/blob/f2a6e7cb7db9b5fd86100403df6b2f830c7f22ba/src/encoding.c#L151-L228 88 for _, b := range head { 89 if b < 7 || b == 11 || (13 < b && b < 27) || (27 < b && b < 0x20) || b == 0x7f { 90 return true, nil 91 } 92 } 93 94 return false, nil 95 }