package openid import ( "sync" ) type DiscoveredInfo interface { OpEndpoint() string OpLocalID() string ClaimedID() string // ProtocolVersion: it's always openId 2. } type DiscoveryCache interface { Put(id string, info DiscoveredInfo) // Return a discovered info, or nil. Get(id string) DiscoveredInfo } type SimpleDiscoveredInfo struct { opEndpoint string opLocalID string claimedID string } func (s *SimpleDiscoveredInfo) OpEndpoint() string { return s.opEndpoint } func (s *SimpleDiscoveredInfo) OpLocalID() string { return s.opLocalID } func (s *SimpleDiscoveredInfo) ClaimedID() string { return s.claimedID } type SimpleDiscoveryCache struct { cache map[string]DiscoveredInfo mutex *sync.Mutex } func NewSimpleDiscoveryCache() *SimpleDiscoveryCache { return &SimpleDiscoveryCache{cache: map[string]DiscoveredInfo{}, mutex: &sync.Mutex{}} } func (s *SimpleDiscoveryCache) Put(id string, info DiscoveredInfo) { s.mutex.Lock() defer s.mutex.Unlock() s.cache[id] = info } func (s *SimpleDiscoveryCache) Get(id string) DiscoveredInfo { s.mutex.Lock() defer s.mutex.Unlock() if info, has := s.cache[id]; has { return info } return nil } func compareDiscoveredInfo(a DiscoveredInfo, opEndpoint, opLocalID, claimedID string) bool { return a != nil && a.OpEndpoint() == opEndpoint && a.OpLocalID() == opLocalID && a.ClaimedID() == claimedID }