Lint / lint (push) Waiting to run
Release / Release (push) Waiting to run
Scan for secrets / test (push) Waiting to run
Snifftest / Run Snifftest (push) Waiting to run
Test / test (push) Waiting to run
Test / test-detectors (push) Waiting to run
45 lines
1000 B
Go
45 lines
1000 B
Go
package decoders
|
|
|
|
import (
|
|
"bytes"
|
|
"unicode/utf8"
|
|
|
|
"github.com/trufflesecurity/trufflehog/v3/pkg/sources"
|
|
)
|
|
|
|
type UTF8 struct{}
|
|
|
|
func (d *UTF8) FromChunk(chunk *sources.Chunk) *sources.Chunk {
|
|
if chunk == nil || len(chunk.Data) == 0 {
|
|
return nil
|
|
}
|
|
|
|
if !utf8.Valid(chunk.Data) {
|
|
chunk.Data = extractSubstrings(chunk.Data)
|
|
return chunk
|
|
}
|
|
|
|
return chunk
|
|
}
|
|
|
|
// extractSubstrings performs similarly to the strings binutil,
|
|
// extacting contigous portions of printable characters that we care
|
|
// about from some bytes
|
|
func extractSubstrings(b []byte) []byte {
|
|
fields := bytes.FieldsFunc(b, func(r rune) bool {
|
|
// https://www.rapidtables.com/code/text/ascii-table.html
|
|
// split on anything that is not ascii space through tilde
|
|
return !(r > 31 && r < 127)
|
|
})
|
|
|
|
keep := [][]byte{}
|
|
for _, field := range fields {
|
|
// Remove fields shorter than 6 characters.
|
|
if bts := bytes.TrimSpace(field); len(bts) > 5 {
|
|
keep = append(keep, bts)
|
|
}
|
|
}
|
|
|
|
return bytes.Join(keep, []byte("\n"))
|
|
}
|