Skip to content

Commit

Permalink
Check for closed channel in HandleFile (#895)
Browse files Browse the repository at this point in the history
* Check for closed channel in HandleFile

* Refactor to be more readable

* Fix handler search
  • Loading branch information
mcastorina committed Nov 2, 2022
1 parent 85f5f3e commit ab54ec4
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 16 deletions.
27 changes: 27 additions & 0 deletions pkg/handlers/archive_test.go
@@ -1,11 +1,15 @@
package handlers

import (
"context"
"net/http"
"regexp"
"strings"
"testing"

diskbufferreader "github.com/bill-rich/disk-buffer-reader"
"github.com/stretchr/testify/assert"
"github.com/trufflesecurity/trufflehog/v3/pkg/sources"
)

func TestArchiveHandler(t *testing.T) {
Expand Down Expand Up @@ -94,3 +98,26 @@ func TestArchiveHandler(t *testing.T) {
}
}
}

func TestHandleFile(t *testing.T) {
ch := make(chan *sources.Chunk, 2)

// Context cancels the operation.
canceledCtx, cancel := context.WithCancel(context.Background())
cancel()
assert.False(t, HandleFile(canceledCtx, strings.NewReader("file"), &sources.Chunk{}, ch))

// Only one chunk is sent on the channel.
// TODO: Embed a zip without making an HTTP request.
resp, err := http.Get("https://raw.githubusercontent.com/bill-rich/bad-secrets/master/aws-canary-creds.zip")
assert.NoError(t, err)
defer resp.Body.Close()
archive := Archive{}
archive.New()
reader, err := diskbufferreader.New(resp.Body)
assert.NoError(t, err)

assert.Equal(t, 0, len(ch))
assert.True(t, HandleFile(context.Background(), reader, &sources.Chunk{}, ch))
assert.Equal(t, 1, len(ch))
}
43 changes: 27 additions & 16 deletions pkg/handlers/handlers.go
Expand Up @@ -20,28 +20,39 @@ type Handler interface {
}

func HandleFile(ctx context.Context, file io.Reader, chunkSkel *sources.Chunk, chunksChan chan (*sources.Chunk)) bool {
for _, handler := range DefaultHandlers() {
handler.New()
// Find a handler for this file.
var handler Handler
for _, h := range DefaultHandlers() {
h.New()
var isType bool
file, isType = handler.IsFiletype(file)
if !isType {
continue
if file, isType = h.IsFiletype(file); isType {
handler = h
break
}
handlerChan := handler.FromFile(file)
for {
}
if handler == nil {
return false
}

// Process the file and read all []byte chunks from handlerChan.
handlerChan := handler.FromFile(file)
for {
select {
case data, open := <-handlerChan:
if !open {
// We finished reading everything from handlerChan.
return true
}
chunk := *chunkSkel
chunk.Data = data
// Send data on chunksChan.
select {
case data := <-handlerChan:
chunk := *chunkSkel
chunk.Data = data
chunksChan <- &chunk
case chunksChan <- &chunk:
case <-ctx.Done():
return false
}
if handlerChan == nil {
break
}
case <-ctx.Done():
return false
}
return true
}
return false
}

0 comments on commit ab54ec4

Please sign in to comment.