class Cie::Saml::LogoutResponse

Constants

ASSERTION
DSIG
PROTOCOL

Public Class Methods

new( options = { } ) click to toggle source
# File lib/cie/ruby-saml/logout_response.rb, line 14
def initialize( options = { } )
                  opt = { :response => nil, :settings => nil }.merge(options)
                  # We've recieved a LogoutResponse from the IdP
                  if opt[:response]
                          begin
                                  @response = Cie::XMLSecurity::SignedDocument.new(decode( opt[:response] ))
                                  # Check to see if we have a root tag using the "protocol" namespace.
                                  # If not, it means this is deflated text and we need to raise to
                                  # the rescue below
                                          raise if @response.nil?
                                          raise if @response.root.nil?
                                          raise if @response.root.namespace != PROTOCOL
                                  document
                          rescue
                                  @response = Cie::XMLSecurity::SignedDocument.new( inflate(decode( opt[:response] ) ) )
                          end
                  end
                  # We plan to create() a new LogoutResponse
                  if opt[:settings]
                          @settings = opt[:settings]
                  end
end

Public Instance Methods

create( options ) click to toggle source

Create a LogoutResponse to to the IdP's LogoutRequest

(For IdP initiated SLO)
# File lib/cie/ruby-saml/logout_response.rb, line 39
def create( options )
        opt = { :transaction_id => nil, 
                :in_response_to => nil,
                :status => "urn:oasis:names:tc:SAML:2.0:status:Success", 
                :extra_parameters => nil }.merge(options)
        return nil if opt[:transaction_id].nil?
        @response = REXML::Document.new
        @response.context[:attribute_quote] = :quote
        uuid = "_" + UUID.new.generate
        time = Time.now.utc.strftime("%Y-%m-%dT%H:%M:%SZ")
        root = @response.add_element "saml2p:LogoutResponse", { "xmlns:saml2p" => PROTOCOL }
        root.attributes['ID'] = uuid
        root.attributes['IssueInstant'] = time
        root.attributes['Version'] = "2.0"
        # Just convenient naming to accept both names as InResponseTo
        if opt[:transaction_id] 
                root.attributes['InResponseTo'] = opt[:transaction_id]
        elsif opt[:in_response_to]
                root.attributes['InResponseTo'] = opt[:in_response_to]
        end
        if opt[:status]
                status = root.add_element "saml2p:Status"
                status_code = status.add_element "saml2p:StatusCode", {
                                "Value" => opt[:status]
                }
        end
        if @settings && @settings.issuer
                issuer = root.add_element "saml:Issuer", {
                        "xmlns:saml" => "urn:oasis:names:tc:SAML:2.0:assertion"
                }
                issuer.text = @settings.issuer
        end
        meta = Metadata.new( @settings )
        Logging.debug "Created LogoutResponse:\n#{@response}"
        return meta.create_slo_response( to_s, opt[:extra_parameters] )
        
        #root.attributes['Destination'] = action
        
end
in_response_to() click to toggle source
# File lib/cie/ruby-saml/logout_response.rb, line 95
def in_response_to
                  element = REXML::XPath.first(@response, "/p:LogoutResponse", {
                                   "p" => PROTOCOL })
                  return nil if element.nil?
  element.attributes["InResponseTo"]
end
is_valid?() click to toggle source
# File lib/cie/ruby-saml/logout_response.rb, line 109
def is_valid?
        validate(soft = true)
end
issuer() click to toggle source
# File lib/cie/ruby-saml/logout_response.rb, line 88
def issuer
                  element = REXML::XPath.first(@response, "/p:LogoutResponse/a:Issuer", { 
                                          "p" => PROTOCOL, "a" => ASSERTION} )
                  return nil if element.nil?
                  element.text
end
success?() click to toggle source
# File lib/cie/ruby-saml/logout_response.rb, line 102
def success?
                  element = REXML::XPath.first(@response, "/p:LogoutResponse/p:Status/p:StatusCode", {
                                  "p" => PROTOCOL })
                  return false if element.nil?
  element.attributes["Value"] == "urn:oasis:names:tc:SAML:2.0:status:Success"
  
end
to_s() click to toggle source
# File lib/cie/ruby-saml/logout_response.rb, line 84
def to_s
        @response.to_s
end
to_xml() click to toggle source

function to return the created request as an XML document

# File lib/cie/ruby-saml/logout_response.rb, line 79
def to_xml
        text = ""
        @response.write(text, 1)
        return text
end
validate( soft = true ) click to toggle source
# File lib/cie/ruby-saml/logout_response.rb, line 116
def validate( soft = true )
        return false if @response.nil?
        # Skip validation with a failed response if we don't have settings
        return false if @settings.nil?
        return false if @response.validate(@settings, soft) == false
        
        return true
        
end
validate!() click to toggle source
# File lib/cie/ruby-saml/logout_response.rb, line 113
def validate!
        validate( soft = false )
end

Protected Instance Methods

document() click to toggle source
# File lib/cie/ruby-saml/logout_response.rb, line 127
def document
  REXML::Document.new(@response)
end