63 lines
1.4 KiB
Go
63 lines
1.4 KiB
Go
// Copyright (C) 2018 Marius Schellenberger
|
|
|
|
package jwt
|
|
|
|
import "sync"
|
|
|
|
// Blacklist is the blacklisting storage interface
|
|
type Blacklist interface {
|
|
Add(string, int64) error
|
|
Remove(string) error
|
|
Check(string) bool
|
|
Map() (BlacklistMap, error)
|
|
}
|
|
|
|
// BlacklistMap is the blacklist map structure
|
|
type BlacklistMap map[string]int64
|
|
|
|
// MemBlacklist implements the Blacklist interface
|
|
type MemBlacklist struct {
|
|
// protects list
|
|
sync.RWMutex
|
|
list BlacklistMap
|
|
}
|
|
|
|
// NewMemBlacklist implements the Blacklist interface using an in-memory map
|
|
func NewMemBlacklist() *MemBlacklist {
|
|
return &MemBlacklist{list: make(BlacklistMap)}
|
|
}
|
|
|
|
// Add adds a new token signature with expiration time to the blacklist
|
|
func (mb *MemBlacklist) Add(sig string, exp int64) error {
|
|
mb.Lock()
|
|
mb.list[sig] = exp
|
|
mb.Unlock()
|
|
return nil
|
|
}
|
|
|
|
// Remove deletes a token signature from the blacklist
|
|
func (mb *MemBlacklist) Remove(sig string) error {
|
|
mb.Lock()
|
|
delete(mb.list, sig)
|
|
mb.Unlock()
|
|
return nil
|
|
}
|
|
|
|
// Check returns true if a token signature is blacklisted and false otherwise
|
|
func (mb *MemBlacklist) Check(sig string) (ok bool) {
|
|
mb.RLock()
|
|
_, ok = mb.list[sig]
|
|
mb.RUnlock()
|
|
return
|
|
}
|
|
|
|
// Map returns the blacklist in the form of a iterable map structure for cleanup
|
|
func (mb *MemBlacklist) Map() (list BlacklistMap, err error) {
|
|
list = make(BlacklistMap)
|
|
mb.RLock()
|
|
for k, v := range mb.list {
|
|
list[k] = v
|
|
}
|
|
mb.RUnlock()
|
|
return
|
|
}
|