ContainerImage.Pinniped/internal/secret/cache.go

72 lines
1.9 KiB
Go
Raw Permalink Normal View History

2020-12-10 21:54:02 +00:00
// Copyright 2020 the Pinniped contributors. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package secret
import (
"sync"
"sync/atomic"
)
2020-12-10 21:54:02 +00:00
type Cache struct {
csrfCookieEncoderHashKey atomic.Value
federationDomainCacheMap sync.Map
2020-12-10 21:54:02 +00:00
}
// New returns an empty Cache.
func New() *Cache { return &Cache{} }
2020-12-10 21:54:02 +00:00
type federationDomainCache struct {
tokenHMACKey atomic.Value
stateEncoderHashKey atomic.Value
stateEncoderBlockKey atomic.Value
2020-12-10 21:54:02 +00:00
}
func (c *Cache) GetCSRFCookieEncoderHashKey() []byte {
return bytesOrNil(c.csrfCookieEncoderHashKey.Load())
2020-12-10 21:54:02 +00:00
}
func (c *Cache) SetCSRFCookieEncoderHashKey(key []byte) {
c.csrfCookieEncoderHashKey.Store(key)
2020-12-10 21:54:02 +00:00
}
func (c *Cache) GetTokenHMACKey(oidcIssuer string) []byte {
return bytesOrNil(c.getFederationDomainCache(oidcIssuer).tokenHMACKey.Load())
2020-12-10 21:54:02 +00:00
}
func (c *Cache) SetTokenHMACKey(oidcIssuer string, key []byte) {
c.getFederationDomainCache(oidcIssuer).tokenHMACKey.Store(key)
2020-12-10 21:54:02 +00:00
}
func (c *Cache) GetStateEncoderHashKey(oidcIssuer string) []byte {
return bytesOrNil(c.getFederationDomainCache(oidcIssuer).stateEncoderHashKey.Load())
2020-12-10 21:54:02 +00:00
}
func (c *Cache) SetStateEncoderHashKey(oidcIssuer string, key []byte) {
c.getFederationDomainCache(oidcIssuer).stateEncoderHashKey.Store(key)
2020-12-10 21:54:02 +00:00
}
func (c *Cache) GetStateEncoderBlockKey(oidcIssuer string) []byte {
return bytesOrNil(c.getFederationDomainCache(oidcIssuer).stateEncoderBlockKey.Load())
2020-12-10 21:54:02 +00:00
}
func (c *Cache) SetStateEncoderBlockKey(oidcIssuer string, key []byte) {
c.getFederationDomainCache(oidcIssuer).stateEncoderBlockKey.Store(key)
2020-12-10 21:54:02 +00:00
}
func (c *Cache) getFederationDomainCache(oidcIssuer string) *federationDomainCache {
value, ok := c.federationDomainCacheMap.Load(oidcIssuer)
if !ok {
value = &federationDomainCache{}
c.federationDomainCacheMap.Store(oidcIssuer, value)
}
return value.(*federationDomainCache)
2020-12-10 21:54:02 +00:00
}
func bytesOrNil(b interface{}) []byte {
if b == nil {
return nil
}
return b.([]byte)
2020-12-10 21:54:02 +00:00
}