class Rack::LTI::Middleware

Attributes

app[R]
config[R]

Public Class Methods

new(app, options = {}, &block) click to toggle source
# File lib/rack/lti/middleware.rb, line 9
def initialize(app, options = {}, &block)
  @app    = app
  @config = Config.new(options, &block)
end

Public Instance Methods

call(env) click to toggle source
# File lib/rack/lti/middleware.rb, line 14
def call(env)
  request = Rack::Request.new(env)

  if routes.has_key?(request.path)
    env['rack.lti'] = true
    send(routes[request.path], request, env)
  else
    @app.call(env)
  end
end
routes() click to toggle source
# File lib/rack/lti/middleware.rb, line 25
def routes
  {
    @config.config_path => :config_action,
    @config.launch_path => :launch_action
  }
end

Private Instance Methods

config_action(request, env) click to toggle source
# File lib/rack/lti/middleware.rb, line 34
def config_action(request, env)
  launch_url = request.url.sub(@config.config_path, @config.launch_path)
  response = [@config.to_xml(request, launch_url: launch_url)]
  [200, { 'Content-Type' => 'application/xml', 'Content-Length' => response[0].length.to_s }, response]
end
launch_action(request, env) click to toggle source
# File lib/rack/lti/middleware.rb, line 40
def launch_action(request, env)
  provider = IMS::LTI::ToolProvider.new(@config.consumer_key(*request.params.values_at('oauth_consumer_key', 'tool_consumer_instance_guid'), request),
                                        @config.consumer_secret(*request.params.values_at('oauth_consumer_key', 'tool_consumer_instance_guid'), request),
                                        request.params)

  if valid?(provider, request)
    req = Rack::Request.new(env)
    res = Rack::Response.new([], 302, { 'Content-Length' => '0',
      'Content-Type' => 'text/html', 'Location' => @config.app_path })
    @config.success.call(provider.to_params, req, res)
    if @config.redirect
      res.finish
    else
      @app.call(env)
    end
  else
    response = 'Invalid launch.'
    [403, { 'Content-Type' => 'text/plain', 'Content-Length' => response.length.to_s }, [response]]
  end
end
valid?(provider, request) click to toggle source
# File lib/rack/lti/middleware.rb, line 61
def valid?(provider, request)
  valid_request?(provider, request) &&
    valid_nonce?(request.params['oauth_nonce']) &&
    valid_timestamp?(request.params['oauth_timestamp'].to_i)
end
valid_nonce?(nonce) click to toggle source
# File lib/rack/lti/middleware.rb, line 71
def valid_nonce?(nonce)
  if @config[:nonce_validator].respond_to?(:call)
    @config.nonce_validator(nonce)
  else
    @config.nonce_validator
  end
end
valid_request?(provider, request) click to toggle source
# File lib/rack/lti/middleware.rb, line 67
def valid_request?(provider, request)
  @config.public? ? true : provider.valid_request?(request)
end
valid_timestamp?(timestamp) click to toggle source
# File lib/rack/lti/middleware.rb, line 79
def valid_timestamp?(timestamp)
  now = Time.now.to_i

  # timestamp too far into the past?
  return false if (past = config.time_limit) && (now - past > timestamp)

  # timestamp too far into the future?
  return false if (future = config.future_time_limit) && (now + future < timestamp)

  true
end