45 lines
958 B
Go
45 lines
958 B
Go
package auth
|
|
|
|
import (
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
// nonceCache merkt sich verwendete Nonces, solange ihr Zeitstempel noch
|
|
// akzeptiert würde. Danach verhindert schon die Zeitprüfung jede
|
|
// Wiederverwendung, der Eintrag kann weg.
|
|
type nonceCache struct {
|
|
mu sync.Mutex
|
|
seen map[string]time.Time // Schlüssel+Nonce -> Ablauf
|
|
lastPurge time.Time
|
|
}
|
|
|
|
// add vermerkt nonce für key und meldet false, wenn sie schon bekannt ist.
|
|
func (c *nonceCache) add(key, nonce string, expires, now time.Time) bool {
|
|
c.mu.Lock()
|
|
defer c.mu.Unlock()
|
|
if c.seen == nil {
|
|
c.seen = map[string]time.Time{}
|
|
}
|
|
if now.Sub(c.lastPurge) > time.Minute {
|
|
for k, exp := range c.seen {
|
|
if !now.Before(exp) {
|
|
delete(c.seen, k)
|
|
}
|
|
}
|
|
c.lastPurge = now
|
|
}
|
|
id := key + "\x00" + nonce
|
|
if _, dup := c.seen[id]; dup {
|
|
return false
|
|
}
|
|
c.seen[id] = expires
|
|
return true
|
|
}
|
|
|
|
func (c *nonceCache) len() int {
|
|
c.mu.Lock()
|
|
defer c.mu.Unlock()
|
|
return len(c.seen)
|
|
}
|