require "rack" require "rack/openid" module Rack class GoogleMarketplace attr_accessor :domain_param, :session_key def initialize app, &block @app = app # Set default values @domain_param ||= "domain" @session_key ||= "user_id" @return_to ||= "/" yield self if block_given? end # Duplicate self on call to make code thread safe def call env dup._call env end def _call env status, headers, response = @app.call env request = Rack::Request.new env session = env["rack.session"] @domain = request[domain_param] if env["PATH_INFO"] == "/login" and @domain status = 401 headers["WWW-Authenticate"] = Rack::OpenID.build_header( :identifier => identifier, :return_to => "/?#{query({@domain_param => @domain})}", :required => ax_required, :method => "post" ) elsif resp = env["rack.openid.response"] and @domain if resp.status == :success user = {} user[:email] = ax_response ax_schema("contact/email") user[:first_name] = ax_response ax_schema("namePerson/first") user[:last_name] = ax_response ax_schema("namePerson/last") env["rack.googlemarketplace.openid_response"] = resp env["rack.googlemarketplace.user"] = user env["rack.googlemarketplace.domain"] = @domain end status = 302 headers["Location"] = @return_to end [ status, headers, response ] end def identifier "https://www.google.com/accounts/o8/site-xrds?hd=#{@domain}" end def ax_required [ ax_schema("contact/email"), ax_schema("namePerson/first"), ax_schema("namePerson/last") ] end def ax_response resp OpenID::AX::FetchResponse.from_success_response(resp) end private def ax_schema path "http://axschema.org/#{path}" end def query(params = {}) Rack::Utils.build_query params end end end