mirror of
https://github.com/router-for-me/CLIProxyAPI.git
synced 2026-06-23 03:32:59 +08:00
- Introduced `FrontendAuthProviderExclusive` capability to restrict authentication to a single selected provider. - Added `SetExclusiveProvider` and `ClearExclusiveProvider` methods for managing exclusive providers in the access registry. - Updated `pluginhost` to prioritize and enforce exclusive providers based on plugin priority and ID. - Enhanced RPC capabilities schema to include `FrontendAuthProviderExclusive` field. - Added example plugin and tests for exclusive frontend auth behavior.
82 lines
2.3 KiB
Go
82 lines
2.3 KiB
Go
package access
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"testing"
|
|
)
|
|
|
|
type testProvider struct {
|
|
id string
|
|
}
|
|
|
|
func (p testProvider) Identifier() string {
|
|
return p.id
|
|
}
|
|
|
|
func (p testProvider) Authenticate(context.Context, *http.Request) (*Result, *AuthError) {
|
|
return &Result{Provider: p.id, Principal: p.id}, nil
|
|
}
|
|
|
|
func TestRegisteredProvidersReturnsOnlyExclusiveProvider(t *testing.T) {
|
|
UnregisterProvider("test-a")
|
|
UnregisterProvider("test-b")
|
|
ClearExclusiveProvider()
|
|
defer UnregisterProvider("test-a")
|
|
defer UnregisterProvider("test-b")
|
|
defer ClearExclusiveProvider()
|
|
|
|
RegisterProvider("test-a", testProvider{id: "test-a"})
|
|
RegisterProvider("test-b", testProvider{id: "test-b"})
|
|
SetExclusiveProvider("test-b")
|
|
|
|
providers := RegisteredProviders()
|
|
if len(providers) != 1 {
|
|
t.Fatalf("RegisteredProviders() len = %d, want 1", len(providers))
|
|
}
|
|
if providers[0].Identifier() != "test-b" {
|
|
t.Fatalf("RegisteredProviders()[0] = %q, want test-b", providers[0].Identifier())
|
|
}
|
|
}
|
|
|
|
func TestRegisteredProvidersRestoresAllProvidersAfterExclusiveCleared(t *testing.T) {
|
|
UnregisterProvider("test-a")
|
|
UnregisterProvider("test-b")
|
|
ClearExclusiveProvider()
|
|
defer UnregisterProvider("test-a")
|
|
defer UnregisterProvider("test-b")
|
|
defer ClearExclusiveProvider()
|
|
|
|
RegisterProvider("test-a", testProvider{id: "test-a"})
|
|
RegisterProvider("test-b", testProvider{id: "test-b"})
|
|
SetExclusiveProvider("test-b")
|
|
ClearExclusiveProvider()
|
|
|
|
providers := RegisteredProviders()
|
|
if len(providers) != 2 {
|
|
t.Fatalf("RegisteredProviders() len = %d, want 2", len(providers))
|
|
}
|
|
if providers[0].Identifier() != "test-a" || providers[1].Identifier() != "test-b" {
|
|
t.Fatalf("RegisteredProviders() = [%q, %q], want [test-a, test-b]", providers[0].Identifier(), providers[1].Identifier())
|
|
}
|
|
}
|
|
|
|
func TestRegisteredProvidersIgnoresStaleExclusiveProvider(t *testing.T) {
|
|
UnregisterProvider("test-a")
|
|
UnregisterProvider("missing")
|
|
ClearExclusiveProvider()
|
|
defer UnregisterProvider("test-a")
|
|
defer ClearExclusiveProvider()
|
|
|
|
RegisterProvider("test-a", testProvider{id: "test-a"})
|
|
SetExclusiveProvider("missing")
|
|
|
|
providers := RegisteredProviders()
|
|
if len(providers) != 1 {
|
|
t.Fatalf("RegisteredProviders() len = %d, want 1", len(providers))
|
|
}
|
|
if providers[0].Identifier() != "test-a" {
|
|
t.Fatalf("RegisteredProviders()[0] = %q, want test-a", providers[0].Identifier())
|
|
}
|
|
}
|