class Polar::Authentication

Public Class Methods

new(app, api_key, secret_key, &failed_handler) click to toggle source
# File lib/polar/authentication.rb, line 7
def initialize(app, api_key, secret_key, &failed_handler)
  @app = app
  @api_key = api_key
  @secret_key = secret_key
  @signature_calculator = SignatureCalculator.new(@secret_key)
  @required_keys = %w{user session_key ss expires}.collect { |e| @api_key + "_" + e } << @api_key
  @failed_handler = block_given? ? failed_handler : proc { [401, {"Content-Type" => "text/plain"}, ["Unauthorized!"]] }
end

Public Instance Methods

call(env) click to toggle source
# File lib/polar/authentication.rb, line 16
def call(env)
  request = Rack::Request.new(env)
  if %r{^/people/(?<person_id>\d+)} =~ request.path_info
    cookies = request.cookies
    if valid?(cookies) && cookies["#{@api_key}_user"] == person_id
      @app.call(env)
    else
      @failed_handler.call(env)
    end
  else
    @app.call(env)
  end
end

Private Instance Methods

filter(cookies) click to toggle source
# File lib/polar/authentication.rb, line 40
def filter(cookies)
  hash = {}
  %w{user session_key ss expires}.each { |e| hash[e] = cookies["#{@api_key}_#{e}"] }
  hash
end
valid?(cookies) click to toggle source
# File lib/polar/authentication.rb, line 32
def valid?(cookies)
  @required_keys.each do |k|
    return false unless cookies.has_key?(k)
  end
  return false if cookies["#{@api_key}_expires"].to_i < Time.now.to_i
  cookies[@api_key] == @signature_calculator.calculate(filter(cookies))
end