mirror of
https://github.com/projectdiscovery/httpx
synced 2026-06-08 16:50:17 +00:00
a780d059ee
- Test Cookie.Parse edge cases (equals in value, spaces, empty fields) - Test Secret validation for all auth types - Test file loading with different extensions (case-insensitive) - Test all auth strategies (Apply and ApplyOnRR methods) - Test FileAuthProvider domain lookup (exact and regex) - Test MultiAuthProvider delegation Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
257 lines
5.2 KiB
Go
257 lines
5.2 KiB
Go
package authprovider
|
|
|
|
import (
|
|
"net/url"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
urlutil "github.com/projectdiscovery/utils/url"
|
|
)
|
|
|
|
func createTestSecretsFile(t *testing.T, content string) string {
|
|
t.Helper()
|
|
tmpDir := t.TempDir()
|
|
filePath := filepath.Join(tmpDir, "secrets.yaml")
|
|
err := os.WriteFile(filePath, []byte(content), 0644)
|
|
if err != nil {
|
|
t.Fatalf("Failed to create test secrets file: %v", err)
|
|
}
|
|
return filePath
|
|
}
|
|
|
|
func TestFileAuthProviderLookupAddr(t *testing.T) {
|
|
content := `id: test
|
|
info:
|
|
name: test
|
|
static:
|
|
- type: BasicAuth
|
|
domains:
|
|
- example.com
|
|
- api.example.com:443
|
|
username: user
|
|
password: pass
|
|
- type: BearerToken
|
|
domains-regex:
|
|
- ".*\\.test\\.com"
|
|
token: regextoken
|
|
`
|
|
filePath := createTestSecretsFile(t, content)
|
|
provider, err := NewFileAuthProvider(filePath)
|
|
if err != nil {
|
|
t.Fatalf("NewFileAuthProvider() error = %v", err)
|
|
}
|
|
|
|
tests := []struct {
|
|
name string
|
|
addr string
|
|
wantCount int
|
|
}{
|
|
{
|
|
name: "exact match",
|
|
addr: "example.com",
|
|
wantCount: 1,
|
|
},
|
|
{
|
|
name: "exact match case insensitive",
|
|
addr: "EXAMPLE.COM",
|
|
wantCount: 1,
|
|
},
|
|
{
|
|
name: "with port 443 normalized",
|
|
addr: "example.com:443",
|
|
wantCount: 1,
|
|
},
|
|
{
|
|
name: "with port 80 normalized",
|
|
addr: "example.com:80",
|
|
wantCount: 1,
|
|
},
|
|
{
|
|
name: "subdomain exact match",
|
|
addr: "api.example.com",
|
|
wantCount: 1,
|
|
},
|
|
{
|
|
name: "regex match",
|
|
addr: "foo.test.com",
|
|
wantCount: 1,
|
|
},
|
|
{
|
|
name: "regex match subdomain",
|
|
addr: "bar.baz.test.com",
|
|
wantCount: 1,
|
|
},
|
|
{
|
|
name: "no match",
|
|
addr: "unknown.com",
|
|
wantCount: 0,
|
|
},
|
|
{
|
|
name: "non-standard port not normalized",
|
|
addr: "example.com:8080",
|
|
wantCount: 0,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
strategies := provider.LookupAddr(tt.addr)
|
|
if len(strategies) != tt.wantCount {
|
|
t.Errorf("LookupAddr(%q) returned %d strategies, want %d", tt.addr, len(strategies), tt.wantCount)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestFileAuthProviderLookupURL(t *testing.T) {
|
|
content := `id: test
|
|
info:
|
|
name: test
|
|
static:
|
|
- type: BasicAuth
|
|
domains:
|
|
- example.com
|
|
username: user
|
|
password: pass
|
|
`
|
|
filePath := createTestSecretsFile(t, content)
|
|
provider, err := NewFileAuthProvider(filePath)
|
|
if err != nil {
|
|
t.Fatalf("NewFileAuthProvider() error = %v", err)
|
|
}
|
|
|
|
t.Run("LookupURL", func(t *testing.T) {
|
|
u, _ := url.Parse("https://example.com/path")
|
|
strategies := provider.LookupURL(u)
|
|
if len(strategies) != 1 {
|
|
t.Errorf("LookupURL() returned %d strategies, want 1", len(strategies))
|
|
}
|
|
})
|
|
|
|
t.Run("LookupURLX", func(t *testing.T) {
|
|
u, _ := urlutil.Parse("https://example.com/path")
|
|
strategies := provider.LookupURLX(u)
|
|
if len(strategies) != 1 {
|
|
t.Errorf("LookupURLX() returned %d strategies, want 1", len(strategies))
|
|
}
|
|
})
|
|
}
|
|
|
|
func TestMultiAuthProvider(t *testing.T) {
|
|
content1 := `id: test1
|
|
info:
|
|
name: test1
|
|
static:
|
|
- type: BasicAuth
|
|
domains:
|
|
- first.com
|
|
username: user1
|
|
password: pass1
|
|
`
|
|
content2 := `id: test2
|
|
info:
|
|
name: test2
|
|
static:
|
|
- type: BearerToken
|
|
domains:
|
|
- second.com
|
|
token: token2
|
|
`
|
|
filePath1 := createTestSecretsFile(t, content1)
|
|
provider1, err := NewFileAuthProvider(filePath1)
|
|
if err != nil {
|
|
t.Fatalf("NewFileAuthProvider() error = %v", err)
|
|
}
|
|
|
|
// Create second file in different temp dir
|
|
tmpDir2 := t.TempDir()
|
|
filePath2 := filepath.Join(tmpDir2, "secrets2.yaml")
|
|
err = os.WriteFile(filePath2, []byte(content2), 0644)
|
|
if err != nil {
|
|
t.Fatalf("Failed to create test secrets file: %v", err)
|
|
}
|
|
provider2, err := NewFileAuthProvider(filePath2)
|
|
if err != nil {
|
|
t.Fatalf("NewFileAuthProvider() error = %v", err)
|
|
}
|
|
|
|
multi := NewMultiAuthProvider(provider1, provider2)
|
|
|
|
tests := []struct {
|
|
name string
|
|
addr string
|
|
wantCount int
|
|
}{
|
|
{
|
|
name: "match first provider",
|
|
addr: "first.com",
|
|
wantCount: 1,
|
|
},
|
|
{
|
|
name: "match second provider",
|
|
addr: "second.com",
|
|
wantCount: 1,
|
|
},
|
|
{
|
|
name: "no match",
|
|
addr: "third.com",
|
|
wantCount: 0,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
strategies := multi.LookupAddr(tt.addr)
|
|
if len(strategies) != tt.wantCount {
|
|
t.Errorf("LookupAddr(%q) returned %d strategies, want %d", tt.addr, len(strategies), tt.wantCount)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestNewFileAuthProviderErrors(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
content string
|
|
wantErr bool
|
|
}{
|
|
{
|
|
name: "empty secrets",
|
|
content: `id: test`,
|
|
wantErr: true,
|
|
},
|
|
{
|
|
name: "invalid secret type",
|
|
content: `id: test
|
|
static:
|
|
- type: InvalidType
|
|
domains:
|
|
- example.com
|
|
`,
|
|
wantErr: true,
|
|
},
|
|
{
|
|
name: "missing required field",
|
|
content: `id: test
|
|
static:
|
|
- type: BasicAuth
|
|
domains:
|
|
- example.com
|
|
username: user
|
|
`,
|
|
wantErr: true,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
filePath := createTestSecretsFile(t, tt.content)
|
|
_, err := NewFileAuthProvider(filePath)
|
|
if (err != nil) != tt.wantErr {
|
|
t.Errorf("NewFileAuthProvider() error = %v, wantErr %v", err, tt.wantErr)
|
|
}
|
|
})
|
|
}
|
|
}
|