|
- // Copyright 2017 The Gitea Authors. All rights reserved.
- // Use of this source code is governed by a MIT-style
- // license that can be found in the LICENSE file.
-
- package openid
-
- import (
- "sync"
- "time"
-
- "github.com/yohcop/openid-go"
- )
-
- type timedDiscoveredInfo struct {
- info openid.DiscoveredInfo
- time time.Time
- }
-
- type timedDiscoveryCache struct {
- cache map[string]timedDiscoveredInfo
- ttl time.Duration
- mutex *sync.Mutex
- }
-
- func newTimedDiscoveryCache(ttl time.Duration) *timedDiscoveryCache {
- return &timedDiscoveryCache{cache: map[string]timedDiscoveredInfo{}, ttl: ttl, mutex: &sync.Mutex{}}
- }
-
- func (s *timedDiscoveryCache) Put(id string, info openid.DiscoveredInfo) {
- s.mutex.Lock()
- defer s.mutex.Unlock()
-
- s.cache[id] = timedDiscoveredInfo{info: info, time: time.Now()}
- }
-
- // Delete timed-out cache entries
- func (s *timedDiscoveryCache) cleanTimedOut() {
- now := time.Now()
- for k, e := range s.cache {
- diff := now.Sub(e.time)
- if diff > s.ttl {
- delete(s.cache, k)
- }
- }
- }
-
- func (s *timedDiscoveryCache) Get(id string) openid.DiscoveredInfo {
- s.mutex.Lock()
- defer s.mutex.Unlock()
-
- // Delete old cached while we are at it.
- s.cleanTimedOut()
-
- if info, has := s.cache[id]; has {
- return info.info
- }
- return nil
- }
|