feat(04-04): add StdinSource, URLSource, and ClipboardSource
- StdinSource reads from an injectable io.Reader (INPUT-03) - URLSource fetches http/https with 30s timeout, 50MB cap, scheme whitelist, and Content-Type filter (INPUT-04) - ClipboardSource wraps atotto/clipboard with graceful fallback for missing tooling (INPUT-05) - emitByteChunks local helper mirrors file.go windowing to stay independent of sibling wave-1 plans - Tests cover happy path, cancellation, redirects, oversize bodies, binary content types, scheme rejection, and clipboard error paths
This commit is contained in:
54
pkg/engine/sources/clipboard_test.go
Normal file
54
pkg/engine/sources/clipboard_test.go
Normal file
@@ -0,0 +1,54 @@
|
||||
package sources
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/salvacybersec/keyhunter/pkg/types"
|
||||
)
|
||||
|
||||
func TestClipboardSource_FixtureReader(t *testing.T) {
|
||||
src := &ClipboardSource{
|
||||
Reader: func() (string, error) { return "sk-live-xxxxxx", nil },
|
||||
ChunkSize: defaultChunkSize,
|
||||
}
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||||
defer cancel()
|
||||
out := make(chan types.Chunk, 4)
|
||||
errCh := make(chan error, 1)
|
||||
go func() { errCh <- src.Chunks(ctx, out); close(out) }()
|
||||
|
||||
var got []types.Chunk
|
||||
for c := range out {
|
||||
got = append(got, c)
|
||||
}
|
||||
require.NoError(t, <-errCh)
|
||||
require.Len(t, got, 1)
|
||||
require.Equal(t, "clipboard", got[0].Source)
|
||||
require.Equal(t, "sk-live-xxxxxx", string(got[0].Data))
|
||||
}
|
||||
|
||||
func TestClipboardSource_ReaderError(t *testing.T) {
|
||||
src := &ClipboardSource{
|
||||
Reader: func() (string, error) { return "", errors.New("no xclip installed") },
|
||||
}
|
||||
out := make(chan types.Chunk, 1)
|
||||
err := src.Chunks(context.Background(), out)
|
||||
require.Error(t, err)
|
||||
require.Contains(t, strings.ToLower(err.Error()), "clipboard")
|
||||
}
|
||||
|
||||
func TestClipboardSource_EmptyClipboard(t *testing.T) {
|
||||
src := &ClipboardSource{
|
||||
Reader: func() (string, error) { return "", nil },
|
||||
}
|
||||
out := make(chan types.Chunk, 1)
|
||||
err := src.Chunks(context.Background(), out)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, out, 0)
|
||||
}
|
||||
Reference in New Issue
Block a user