Платформа ЦРНП "Мирокод" для разработки проектов
https://git.mirocod.ru
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.2 KiB
58 lines
1.2 KiB
// 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 |
|
}
|
|
|