class Rots::ServerApp

Attributes

openid_request[RW]
openid_response[RW]
request[RW]
response[RW]
server[RW]

Public Class Methods

new(config, server_options) click to toggle source
# File lib/rots/server_app.rb, line 19
def initialize(config, server_options)
  @server_options = server_options
  @sreg_fields = config['sreg']
end

Public Instance Methods

call(env) click to toggle source
# File lib/rots/server_app.rb, line 24
def call(env)
  on_openid_request(env) do
    if !is_checkid_request?
      @openid_response = @server.handle_request(@openid_request)
      reply_consumer
    elsif is_checkid_immediate?
      process_immediate_checkid_request
    else
      process_checkid_request
    end
  end
end

Protected Instance Methods

bad_request() click to toggle source
# File lib/rots/server_app.rb, line 130
def bad_request()
  [ 400, {'Content-Type'=>'text/plain', 'Content-Length'=>'0'},
    [] ]
end
checkid_immediate_is_valid?() click to toggle source
# File lib/rots/server_app.rb, line 84
def checkid_immediate_is_valid?
  @request.params['openid.success'] == 'true'
end
checkid_request_is_valid?() click to toggle source
# File lib/rots/server_app.rb, line 80
def checkid_request_is_valid?
  @request.params['openid.success'] == 'true'
end
create_wrappers(env) click to toggle source
# File lib/rots/server_app.rb, line 49
def create_wrappers(env)
  @request = Rack::Request.new(env)
  @server  = OpenID::Server::Server.new(storage, op_endpoint)
  @openid_request = @server.decode_request(@request.params)
  @openid_sreg_request = OpenID::SReg::Request.from_openid_request(@openid_request) unless @openid_request.nil?
end
is_checkid_immediate?() click to toggle source
# File lib/rots/server_app.rb, line 60
def is_checkid_immediate?
  @openid_request && @openid_request.immediate
end
is_checkid_request?() click to toggle source
# File lib/rots/server_app.rb, line 56
def is_checkid_request?
  @openid_request.is_a?(OpenID::Server::CheckIDRequest)
end
on_openid_request(env) { || ... } click to toggle source
# File lib/rots/server_app.rb, line 39
def on_openid_request(env)
  create_wrappers(env)
  if @openid_request.nil?
    [200, {'Content-Type' => 'text/html'}, 
      ["<html><body><h1>ROTS => This is an OpenID endpoint</h1></body></html>"] ]
  else
    yield
  end
end
op_endpoint() click to toggle source
# File lib/rots/server_app.rb, line 145
def op_endpoint
  if @request.url =~ /(.*\?openid.success=true)/
    $1
  elsif @request.url =~ /([^?]*)/
    $1
  else
    nil
  end
end
process_checkid_request() click to toggle source
# File lib/rots/server_app.rb, line 72
def process_checkid_request
  if checkid_request_is_valid?
    return_successful_openid_response
  else
    return_cancel_openid_response
  end
end
process_immediate_checkid_request() click to toggle source
# File lib/rots/server_app.rb, line 64
def process_immediate_checkid_request
  if checkid_immediate_is_valid?
    return_successful_openid_response
  else
    return_setup_needed_openid_response
  end
end
process_sreg_extension() click to toggle source
# File lib/rots/server_app.rb, line 96
def process_sreg_extension
  return if @openid_sreg_request.nil?
  response = OpenID::SReg::Response.extract_response(@openid_sreg_request, @sreg_fields)
  @openid_response.add_extension(response)
end
redirect(uri) click to toggle source
# File lib/rots/server_app.rb, line 124
def redirect(uri)
  [ 303, {'Content-Length'=>'0', 'Content-Type'=>'text/plain',
    'Location' => uri},
    [] ]
end
reply_consumer() click to toggle source
# File lib/rots/server_app.rb, line 112
def reply_consumer
  web_response = @server.encode_response(@openid_response)
  case web_response.code
  when OpenID::Server::HTTP_OK
    success(web_response.body)
  when OpenID::Server::HTTP_REDIRECT
    redirect(web_response.headers['location'])
  else
    bad_request
  end   
end
return_cancel_openid_response() click to toggle source
# File lib/rots/server_app.rb, line 102
def return_cancel_openid_response
  redirect(@openid_request.cancel_url)
end
return_setup_needed_openid_response() click to toggle source
# File lib/rots/server_app.rb, line 106
def return_setup_needed_openid_response
  setup_needed_args = @request.params.merge('openid.mode' => 'setup_needed', 'user_setup_url' => '')
  url = OpenID::Util.append_args(@openid_request.return_to, setup_needed_args)
  redirect(url)
end
return_successful_openid_response() click to toggle source
# File lib/rots/server_app.rb, line 88
def return_successful_openid_response
  @openid_response = @openid_request.answer(true)
  process_sreg_extension
  # TODO: Add support for SREG extension
  @server.signatory.sign(@openid_response) if @openid_response.needs_signing
  reply_consumer
end
storage() click to toggle source
# File lib/rots/server_app.rb, line 135
def storage
  # create the folder if it doesn't exist
  FileUtils.mkdir_p(@server_options[:storage]) unless File.exist?(@server_options[:storage])
  OpenID::Store::Filesystem.new(@server_options[:storage])
end
success(text="") click to toggle source
# File lib/rots/server_app.rb, line 141
def success(text="")
  Rack::Response.new(text).finish
end