| package auth |
|
|
| import ( |
| "context" |
| "fmt" |
|
|
| "github.com/router-for-me/CLIProxyAPI/v6/internal/config" |
| coreauth "github.com/router-for-me/CLIProxyAPI/v6/sdk/cliproxy/auth" |
| ) |
|
|
| |
| type Manager struct { |
| authenticators map[string]Authenticator |
| store coreauth.Store |
| } |
|
|
| |
| |
| func NewManager(store coreauth.Store, authenticators ...Authenticator) *Manager { |
| mgr := &Manager{ |
| authenticators: make(map[string]Authenticator), |
| store: store, |
| } |
| for i := range authenticators { |
| mgr.Register(authenticators[i]) |
| } |
| return mgr |
| } |
|
|
| |
| func (m *Manager) Register(a Authenticator) { |
| if a == nil { |
| return |
| } |
| if m.authenticators == nil { |
| m.authenticators = make(map[string]Authenticator) |
| } |
| m.authenticators[a.Provider()] = a |
| } |
|
|
| |
| func (m *Manager) SetStore(store coreauth.Store) { |
| m.store = store |
| } |
|
|
| |
| func (m *Manager) Login(ctx context.Context, provider string, cfg *config.Config, opts *LoginOptions) (*coreauth.Auth, string, error) { |
| auth, ok := m.authenticators[provider] |
| if !ok { |
| return nil, "", fmt.Errorf("cliproxy auth: authenticator %s not registered", provider) |
| } |
|
|
| record, err := auth.Login(ctx, cfg, opts) |
| if err != nil { |
| return nil, "", err |
| } |
| if record == nil { |
| return nil, "", fmt.Errorf("cliproxy auth: authenticator %s returned nil record", provider) |
| } |
|
|
| if m.store == nil { |
| return record, "", nil |
| } |
|
|
| if cfg != nil { |
| if dirSetter, ok := m.store.(interface{ SetBaseDir(string) }); ok { |
| dirSetter.SetBaseDir(cfg.AuthDir) |
| } |
| } |
|
|
| savedPath, err := m.store.Save(ctx, record) |
| if err != nil { |
| return record, "", err |
| } |
| return record, savedPath, nil |
| } |
|
|
| |
| func (m *Manager) SaveAuth(record *coreauth.Auth, cfg *config.Config) (string, error) { |
| if m.store == nil { |
| return "", fmt.Errorf("no store configured") |
| } |
| if cfg != nil { |
| if dirSetter, ok := m.store.(interface{ SetBaseDir(string) }); ok { |
| dirSetter.SetBaseDir(cfg.AuthDir) |
| } |
| } |
| return m.store.Save(context.Background(), record) |
| } |
|
|