module OpenID class Consumer # A set of discovered services, for tracking which providers have # been attempted for an OpenID identifier class DiscoveredServices attr_reader :current def initialize(starting_url, yadis_url, services) @starting_url = starting_url @yadis_url = yadis_url @services = services.dup @current = nil end def next @current = @services.shift end def for_url?(url) [@starting_url, @yadis_url].member?(url) end def started? !@current.nil? end def empty? @services.empty? end end # Manages calling discovery and tracking which endpoints have # already been attempted. class DiscoveryManager def initialize(session, url, session_key_suffix=nil) @url = url @session = session @session_key_suffix = session_key_suffix || 'auth' end def get_next_service manager = get_manager if !manager.nil? && manager.empty? destroy_manager manager = nil end if manager.nil? yadis_url, services = yield @url manager = create_manager(yadis_url, services) end if !manager.nil? service = manager.next store(manager) else service = nil end return service end def cleanup(force=false) manager = get_manager(force) if !manager.nil? service = manager.current destroy_manager(force) else service = nil end return service end protected def get_manager(force=false) manager = load if force || manager.nil? || manager.for_url?(@url) return manager else return nil end end def create_manager(yadis_url, services) manager = get_manager if !manager.nil? raise StandardError, "There is already a manager for #{yadis_url}" end if services.empty? return nil end manager = DiscoveredServices.new(@url, yadis_url, services) store(manager) return manager end def destroy_manager(force=false) if !get_manager(force).nil? destroy! end end def session_key 'OpenID::Consumer::DiscoveredServices::' + @session_key_suffix end def store(manager) @session[session_key] = manager end def load @session[session_key] end def destroy! @session[session_key] = nil end end end end