| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- package detect
- import (
- "context"
- "errors"
- "os"
- "sync"
- "github.com/zricethezav/gitleaks/v8/logging"
- "github.com/zricethezav/gitleaks/v8/report"
- "github.com/zricethezav/gitleaks/v8/sources"
- )
- // DetectFiles runs detections against a chanel of scan targets
- //
- // Deprecated: Use sources.Files and Detector.DetectSource instead
- func (d *Detector) DetectFiles(scanTargets <-chan sources.ScanTarget) ([]report.Finding, error) {
- var wg sync.WaitGroup
- for scanTarget := range scanTargets {
- wg.Add(1)
- d.Sema.Go(func() error {
- defer wg.Done()
- logger := logging.With().Str("path", scanTarget.Path).Logger()
- logger.Trace().Msg("scanning path")
- f, err := os.Open(scanTarget.Path)
- if err != nil {
- if os.IsPermission(err) {
- err = errors.New("permission denied")
- }
- logger.Warn().Err(err).Msg("skipping file")
- return nil
- }
- defer func() {
- _ = f.Close()
- }()
- info, err := f.Stat()
- if err != nil {
- logger.Error().Err(err).Msg("skipping file: could not get info")
- return nil
- }
- // Empty; nothing to do here.
- if info.Size() == 0 {
- logger.Debug().Msg("skipping empty file")
- return nil
- }
- // Too large; nothing to do here.
- if d.MaxTargetMegaBytes > 0 {
- rawLength := info.Size() / 1_000_000
- if rawLength > int64(d.MaxTargetMegaBytes) {
- logger.Warn().Msgf(
- "skipping file: too large max_size=%dMB, size=%dMB",
- d.MaxTargetMegaBytes, rawLength,
- )
- return nil
- }
- }
- // Convert this to a file source
- file := sources.File{
- Content: f,
- Path: scanTarget.Path,
- Symlink: scanTarget.Symlink,
- Config: &d.Config,
- MaxArchiveDepth: d.MaxArchiveDepth,
- }
- ctx := context.Background()
- return file.Fragments(ctx, func(fragment sources.Fragment, err error) error {
- if err != nil {
- logging.Error().Err(err)
- return nil
- }
- for _, finding := range d.Detect(Fragment(fragment)) {
- d.AddFinding(finding)
- }
- return nil
- })
- })
- }
- wg.Wait()
- return d.findings, nil
- }
|