pdns-auth-proxy/authCache.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()
}