class CASClient::ValidationResponse

Represents a response from the CAS server to a ‘validate’ request (i.e. after validating a service/proxy ticket).

Attributes

extra_attributes[R]
pgt_iou[R]
protocol[R]
proxies[R]
user[R]

Public Class Methods

new(raw_text, options={}) click to toggle source
# File lib/casclient/responses.rb, line 34
def initialize(raw_text, options={})
  parse(raw_text, options)
end

Public Instance Methods

is_failure?() click to toggle source
# File lib/casclient/responses.rb, line 125
def is_failure?
  (instance_variable_defined?(:@valid) && !@valid) || (protocol > 1.0 && xml.name == "authenticationFailure" )
end
is_success?() click to toggle source
# File lib/casclient/responses.rb, line 121
def is_success?
  (instance_variable_defined?(:@valid) &&  @valid) || (protocol > 1.0 && xml.name == "authenticationSuccess")
end
parse(raw_text, options) click to toggle source
# File lib/casclient/responses.rb, line 38
def parse(raw_text, options)
  raise BadResponseException, 
    "CAS response is empty/blank." if raw_text.blank?
  @parse_datetime = Time.now
  if raw_text =~ /^(yes|no)\n(.*?)\n$/m
    @protocol = 1.0
    @valid = $~[1] == 'yes'
    @user = $~[2]
    return
  end

  @xml = check_and_parse_xml(raw_text)

  # if we got this far then we've got a valid XML response, so we're doing CAS 2.0
  @protocol = 2.0

  if is_success?
    cas_user = @xml.elements["cas:user"]
    @user = cas_user.text.strip if cas_user
    @pgt_iou =  @xml.elements["cas:proxyGrantingTicket"].text.strip if @xml.elements["cas:proxyGrantingTicket"]

    proxy_els = @xml.elements.to_a('//cas:authenticationSuccess/cas:proxies/cas:proxy')
    if proxy_els.size > 0
      @proxies = []
      proxy_els.each do |el|
        @proxies << el.text
      end
    end

    @extra_attributes = {}
    @xml.elements.to_a('//cas:authenticationSuccess/cas:attributes/* | //cas:authenticationSuccess/*[local-name() != \'proxies\' and local-name() != \'proxyGrantingTicket\' and local-name() != \'user\' and local-name() != \'attributes\']').each do |el|
      inner_text = el.cdatas.length > 0 ? el.cdatas.join('') : el.text
      name = el.name
      unless (attrs = el.attributes).empty?
        name       = attrs['name']
        inner_text = attrs['value']
      end
      @extra_attributes.merge! name => inner_text
    end

    # unserialize extra attributes
    @extra_attributes.each do |k, v|
      @extra_attributes[k] = parse_extra_attribute_value(v, options[:encode_extra_attributes_as])
    end
  elsif is_failure?
    @failure_code = @xml.elements['//cas:authenticationFailure'].attributes['code']
    @failure_message = @xml.elements['//cas:authenticationFailure'].text.strip
  else
    # this should never happen, since the response should already have been recognized as invalid
    raise BadResponseException, "BAD CAS RESPONSE:\n#{raw_text.inspect}\n\nXML DOC:\n#{doc.inspect}"
  end
end
parse_extra_attribute_value(value, encode_extra_attributes_as) click to toggle source
# File lib/casclient/responses.rb, line 91
def parse_extra_attribute_value(value, encode_extra_attributes_as)
  attr_value = if value.blank?
     nil
   elsif !encode_extra_attributes_as
     begin
       YAML.load(value)
     rescue ArgumentError => e
       raise ArgumentError, "Error parsing extra attribute with value #{value} as YAML: #{e}"
     end
   else
     if encode_extra_attributes_as == :json
       begin
         JSON.parse(value)
       rescue JSON::ParserError
         value
       end
     elsif encode_extra_attributes_as == :raw
       value
     else
       YAML.load(value)
     end
   end

  unless attr_value.kind_of?(Enumerable) || attr_value.kind_of?(TrueClass) || attr_value.kind_of?(FalseClass) || attr_value.nil?
    attr_value.to_s
  else
    attr_value
  end
end