74 lines
1.4 KiB
Go
74 lines
1.4 KiB
Go
package main
|
|
|
|
import (
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
// AuthCache structure, to avoid hitting to hard on the ldap servers
|
|
type AuthCache struct {
|
|
m sync.RWMutex
|
|
users map[string]time.Time
|
|
gpgKeys []string
|
|
gpgTime time.Time
|
|
}
|
|
|
|
// lock the structure
|
|
func (a *AuthCache) lock() {
|
|
a.m.Lock()
|
|
}
|
|
|
|
// or unlock it
|
|
func (a *AuthCache) unlock() {
|
|
a.m.Unlock()
|
|
}
|
|
|
|
// NewAuthCache initializes the cache
|
|
func NewAuthCache() *AuthCache {
|
|
return &AuthCache{
|
|
users: make(map[string]time.Time),
|
|
}
|
|
}
|
|
|
|
// Get checks if a user is cached
|
|
// and reinitialize counter to add another minute
|
|
func (a *AuthCache) Get(user string) bool {
|
|
a.lock()
|
|
defer a.unlock()
|
|
now := time.Now()
|
|
if added, ok := a.users[user]; ok {
|
|
if added.Add(5 * time.Minute).After(now) {
|
|
a.users[user] = now
|
|
return true
|
|
}
|
|
delete(a.users, user)
|
|
}
|
|
return false
|
|
}
|
|
|
|
// Set marks the user valid for a minute
|
|
func (a *AuthCache) Set(user string) {
|
|
a.lock()
|
|
defer a.unlock()
|
|
a.users[user] = time.Now()
|
|
}
|
|
|
|
// PgpGet the pgp Keys if cached
|
|
// and reinitialize the counter to add another minute
|
|
func (a *AuthCache) PgpGet() []string {
|
|
now := time.Now()
|
|
if len(a.gpgKeys) > 0 && a.gpgTime.Add(5*time.Minute).After(now) {
|
|
a.gpgTime = now
|
|
return a.gpgKeys
|
|
}
|
|
return []string{}
|
|
}
|
|
|
|
// PgpSet store the pgp Keys for a minute
|
|
func (a *AuthCache) PgpSet(keys []string) {
|
|
a.lock()
|
|
defer a.unlock()
|
|
a.gpgKeys = keys
|
|
a.gpgTime = time.Now()
|
|
}
|