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) }