You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
3.0 KiB
117 lines
3.0 KiB
package s3api
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/seaweedfs/seaweedfs/weed/iam/integration"
|
|
"github.com/seaweedfs/seaweedfs/weed/iam/sts"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestS3IAMIntegration_isSTSIssuer(t *testing.T) {
|
|
// Create test STS service with configuration
|
|
stsService := sts.NewSTSService()
|
|
|
|
// Set up STS configuration with a specific issuer
|
|
testIssuer := "https://seaweedfs-prod.company.com/sts"
|
|
stsConfig := &sts.STSConfig{
|
|
Issuer: testIssuer,
|
|
SigningKey: []byte("test-signing-key-32-characters-long"),
|
|
TokenDuration: sts.FlexibleDuration{time.Hour},
|
|
MaxSessionLength: sts.FlexibleDuration{12 * time.Hour}, // Required field
|
|
}
|
|
|
|
// Initialize STS service with config (this sets the Config field)
|
|
err := stsService.Initialize(stsConfig)
|
|
assert.NoError(t, err)
|
|
|
|
// Create S3IAM integration with configured STS service
|
|
s3iam := &S3IAMIntegration{
|
|
iamManager: &integration.IAMManager{}, // Mock
|
|
stsService: stsService,
|
|
filerAddress: "test-filer:8888",
|
|
enabled: true,
|
|
}
|
|
|
|
tests := []struct {
|
|
name string
|
|
issuer string
|
|
expected bool
|
|
}{
|
|
// Only exact match should return true
|
|
{
|
|
name: "exact match with configured issuer",
|
|
issuer: testIssuer,
|
|
expected: true,
|
|
},
|
|
// All other issuers should return false (exact matching)
|
|
{
|
|
name: "similar but not exact issuer",
|
|
issuer: "https://seaweedfs-prod.company.com/sts2",
|
|
expected: false,
|
|
},
|
|
{
|
|
name: "substring of configured issuer",
|
|
issuer: "seaweedfs-prod.company.com",
|
|
expected: false,
|
|
},
|
|
{
|
|
name: "contains configured issuer as substring",
|
|
issuer: "prefix-" + testIssuer + "-suffix",
|
|
expected: false,
|
|
},
|
|
{
|
|
name: "case sensitive - different case",
|
|
issuer: strings.ToUpper(testIssuer),
|
|
expected: false,
|
|
},
|
|
{
|
|
name: "Google OIDC",
|
|
issuer: "https://accounts.google.com",
|
|
expected: false,
|
|
},
|
|
{
|
|
name: "Azure AD",
|
|
issuer: "https://login.microsoftonline.com/tenant-id/v2.0",
|
|
expected: false,
|
|
},
|
|
{
|
|
name: "Auth0",
|
|
issuer: "https://mycompany.auth0.com",
|
|
expected: false,
|
|
},
|
|
{
|
|
name: "Keycloak",
|
|
issuer: "https://keycloak.mycompany.com/auth/realms/master",
|
|
expected: false,
|
|
},
|
|
{
|
|
name: "Empty string",
|
|
issuer: "",
|
|
expected: false,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
result := s3iam.isSTSIssuer(tt.issuer)
|
|
assert.Equal(t, tt.expected, result, "isSTSIssuer should use exact matching against configured issuer")
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestS3IAMIntegration_isSTSIssuer_NoSTSService(t *testing.T) {
|
|
// Create S3IAM integration without STS service
|
|
s3iam := &S3IAMIntegration{
|
|
iamManager: &integration.IAMManager{},
|
|
stsService: nil, // No STS service
|
|
filerAddress: "test-filer:8888",
|
|
enabled: true,
|
|
}
|
|
|
|
// Should return false when STS service is not available
|
|
result := s3iam.isSTSIssuer("seaweedfs-sts")
|
|
assert.False(t, result, "isSTSIssuer should return false when STS service is nil")
|
|
}
|