46 lines
1.3 KiB
Go
46 lines
1.3 KiB
Go
package server
|
|
|
|
import "sync"
|
|
|
|
// interface for user credential provider
|
|
// hint: can be extended for more functionality
|
|
// =================================IMPORTANT NOTE===============================
|
|
// if the password in a third-party credential provider could be updated at runtime, we have to invalidate the caching
|
|
// for 'caching_sha2_password' by calling 'func (s *Server)InvalidateCache(string, string)'.
|
|
type CredentialProvider interface {
|
|
// check if the user exists
|
|
CheckUsername(username string) (bool, error)
|
|
// get user credential
|
|
GetCredential(username string) (password string, found bool, err error)
|
|
}
|
|
|
|
func NewInMemoryProvider() *InMemoryProvider {
|
|
return &InMemoryProvider{
|
|
userPool: sync.Map{},
|
|
}
|
|
}
|
|
|
|
// implements a in memory credential provider
|
|
type InMemoryProvider struct {
|
|
userPool sync.Map // username -> password
|
|
}
|
|
|
|
func (m *InMemoryProvider) CheckUsername(username string) (found bool, err error) {
|
|
_, ok := m.userPool.Load(username)
|
|
return ok, nil
|
|
}
|
|
|
|
func (m *InMemoryProvider) GetCredential(username string) (password string, found bool, err error) {
|
|
v, ok := m.userPool.Load(username)
|
|
if !ok {
|
|
return "", false, nil
|
|
}
|
|
return v.(string), true, nil
|
|
}
|
|
|
|
func (m *InMemoryProvider) AddUser(username, password string) {
|
|
m.userPool.Store(username, password)
|
|
}
|
|
|
|
type Provider InMemoryProvider
|