require "rack/utils" module Rots module Test module RequestHelper def openid_request(openid_request_uri) openid_response = Net::HTTP.get_response(URI.parse(openid_request_uri)) openid_response_uri = URI(openid_response["Location"]) openid_response_qs = Rack::Utils.parse_query(openid_response_uri.query) { url: openid_response_uri.to_s, query_params: openid_response_qs, } end def checkid_setup(request, params = {}, with_associate = true) assoc_handle = make_association(request) if with_associate send_checkid(request, :setup, params, assoc_handle) end def checkid_immediate(request, params = {}, with_associate = true) assoc_handle = make_association(request) if with_associate send_checkid(request, :immediate, params, assoc_handle) end def openid_params(response) uri = URI(response.headers["Location"]) Rack::Utils.parse_query(uri.query) end protected def send_checkid(request, mode, params = {}, assoc_handle = nil) params = send(:"checkid_#{mode}_params", params) params.merge("openid.assoc_handle" => assoc_handle) if assoc_handle qs = "/?" + Rack::Utils.build_query(params) request.get(qs) end def make_association(request) associate_qs = Rack::Utils.build_query(associate_params) response = request.post("/", input: associate_qs) parse_assoc_handle_from(response) end def parse_assoc_handle_from(response) response.body.split("\n")[0].match(/^assoc_handle:(.*)$/).captures[0] end def checkid_setup_params(params = {}) { "openid.ns" => "http://specs.openid.net/auth/2.0", "openid.mode" => "checkid_setup", "openid.claimed_id" => "john.doe", "openid.identity" => "john.doe", "openid.return_to" => "http://www.google.com", # need to specify the openid_handle by hand }.merge!(params) end def checkid_immediate_params(params = {}) checkid_setup_params({"openid.mode" => "checkid_immediate"}.merge!(params)) end def associate_params { "openid.ns" => "http://specs.openid.net/auth/2.0", "openid.mode" => "associate", "openid.session_type" => "DH-SHA1", "openid.assoc_type" => "HMAC-SHA1", "openid.dh_consumer_public" => "U672/RsDUNxAFFAXA+ShVh5LMD2CRdsoqdqhDCPUzfCNy2f44uTWuid/MZuGfJmiVA7QmxqM3GSb8EVq3SGK8eGEwwyzUtatqHidx72rfwAav5AUrZTnwSPQJyiCFrKNGmNhXdRJzcfzSkgaC3hVz2kpADzEevIExG6agns1sYY=", } end end end end