class OmniAuth::Strategies::Tequila

Attributes

raw_info[RW]
user_info[RW]

Public Instance Methods

callback_phase() click to toggle source
Calls superclass method
# File lib/omniauth/strategies/tequila.rb, line 36
def callback_phase
  response = fetch_attributes( request.params['key'] )

  return fail!(:invalid_response, TequilaFail.new('nil response from Tequila')) if response.nil?
  return fail!(:invalid_response, TequilaFail.new('Invalid reponse from Tequila: ' + response.code)) unless response.code == '200'

  # parse attributes
  self.raw_info = {}
  response.body.each_line { |line|
    item = line.split('=', 2)
    if item.length == 2
      raw_info[item[0]] = item[1].strip
    end
  }

  missing_info = @options[:request_info].values.reject { |k| raw_info.include?(k) }
  if !missing_info.empty?
    log :error, 'Missing attributes in Tequila server response: ' + missing_info.join(', ')
    return fail!(:invalid_info, TequilaFail.new('Invalid info from Tequila'))
  end

  super
end
request_phase() click to toggle source
# File lib/omniauth/strategies/tequila.rb, line 60
def request_phase
  response = get_request_key
  if response.nil? or response.code != '200'
    log :error, 'Received invalid response from Tequila server: ' + (response.nil? ? 'nil' : response.code)
    return fail!(:invalid_response, TequilaFail.new('Invalid response from Tequila server'))
  end

  request_key = response.body[/^key=(.*)$/, 1]
  if request_key.nil? or request_key.empty?
    log :error, 'Received invalid key from Tequila server: ' + (request_key.nil? ? 'nil' : request_key)
    return fail!(:invalid_key, TequilaFail.new('Invalid key from Tequila'))
  end

  # redirect to the Tequila server's login page
  [
    302,
    {
      'Location' => tequila_uri.to_s + '/requestauth?requestkey=' + request_key,
      'Content-Type' => 'text/plain'
    },
    ['You are being redirected to Tequila for sign-in.']
  ]
end

Private Instance Methods

fetch_attributes( request_key ) click to toggle source

retrieves user attributes from the Tequila server

# File lib/omniauth/strategies/tequila.rb, line 87
def fetch_attributes( request_key )
  tequila_post '/fetchattributes', "key=" + request_key
end
get_request_key() click to toggle source

retrieves the request key from the Tequila server

# File lib/omniauth/strategies/tequila.rb, line 92
def get_request_key
  # NB: You might want to set the service and required group yourself.
  request_fields = @options[:request_info].values << @options[:uid_field]
  body = 'urlaccess=' + callback_url + "\nservice=Omniauth\n" +
    'request=' + request_fields.join(',') + "\nrequire=group=my-group"
  tequila_post '/createrequest', body
end
tequila_post( path, body ) click to toggle source
# File lib/omniauth/strategies/tequila.rb, line 117
def tequila_post( path, body )
  http = Net::HTTP.new(tequila_uri.host, tequila_uri.port)
  http.use_ssl = @options.ssl
  if http.use_ssl?
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE if @options.disable_ssl_verification?
    http.ca_path = @options.ca_path
  end
  response = nil
  http.start do |c|
    response = c.request_post tequila_uri.path + path, body
  end
  response
end
tequila_uri() click to toggle source

Build a Tequila host with protocol and port

# File lib/omniauth/strategies/tequila.rb, line 103
def tequila_uri
  @tequila_uri ||= begin
    if @options.port.nil?
      @options.port = @options.ssl ? 443 : 80
    end
    Addressable::URI.new(
      :scheme => @options.ssl ? 'https' : 'http',
      :host   => @options.host,
      :port   => @options.port,
      :path   => @options.path
    )
  end
end