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  }