Class: FederazioneTrentina::Saml::Response

Inherits:
Object
  • Object
show all
Defined in:
lib/federazione_trentina/ruby-saml/response.rb

Constant Summary collapse

ASSERTION =
"urn:oasis:names:tc:SAML:2.0:assertion"
PROTOCOL =
"urn:oasis:names:tc:SAML:2.0:protocol"
DSIG =
"http://www.w3.org/2000/09/xmldsig#"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(response, options = {}) ⇒ Response

Returns a new instance of Response.

Raises:

  • (ArgumentError)


20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/federazione_trentina/ruby-saml/response.rb', line 20

def initialize(response, options = {})
  raise ArgumentError.new("Response cannot be nil") if response.nil?
  self.options  = options
  self.response = response
  begin
    self.document = XMLSecurity::SignedDocument.new(Base64.decode64(response))
  rescue REXML::ParseException => e
    if response =~ /</
      self.document = XMLSecurity::SignedDocument.new(response)
    else
      raise e
    end
  end
  
end

Instance Attribute Details

#documentObject

Returns the value of attribute document.



18
19
20
# File 'lib/federazione_trentina/ruby-saml/response.rb', line 18

def document
  @document
end

#optionsObject

Returns the value of attribute options.



18
19
20
# File 'lib/federazione_trentina/ruby-saml/response.rb', line 18

def options
  @options
end

#responseObject

Returns the value of attribute response.



18
19
20
# File 'lib/federazione_trentina/ruby-saml/response.rb', line 18

def response
  @response
end

#settingsObject

Returns the value of attribute settings.



18
19
20
# File 'lib/federazione_trentina/ruby-saml/response.rb', line 18

def settings
  @settings
end

Instance Method Details

#attributesObject

A hash of alle the attributes with the response. Assuming there is only one value for each key



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/federazione_trentina/ruby-saml/response.rb', line 56

def attributes
  @attr_statements ||= begin
    result = {}

    stmt_element = REXML::XPath.first(document, "/p:Response/a:Assertion/a:AttributeStatement", { "p" => PROTOCOL, "a" => ASSERTION })
    return {} if stmt_element.nil?

    stmt_element.elements.each do |attr_element|
      name  = attr_element.attributes["Name"]
      value = attr_element.elements.first.text

      result[name] = value
    end

    result.keys.each do |key|
      result[key.intern] = result[key]
    end

    result
  end
end

#conditionsObject

Conditions (if any) for the assertion to run



95
96
97
98
99
# File 'lib/federazione_trentina/ruby-saml/response.rb', line 95

def conditions
  @conditions ||= begin
    REXML::XPath.first(document, "/p:Response/a:Assertion[@ID='#{document.signed_element_id}']/a:Conditions", { "p" => PROTOCOL, "a" => ASSERTION })
  end
end

#is_valid?Boolean

Returns:

  • (Boolean)


36
37
38
# File 'lib/federazione_trentina/ruby-saml/response.rb', line 36

def is_valid?
  validate
end

#issuerObject



101
102
103
104
105
106
107
# File 'lib/federazione_trentina/ruby-saml/response.rb', line 101

def issuer
  @issuer ||= begin
    node = REXML::XPath.first(document, "/p:Response/a:Issuer", { "p" => PROTOCOL, "a" => ASSERTION })
    node ||= REXML::XPath.first(document, "/p:Response/a:Assertion/a:Issuer", { "p" => PROTOCOL, "a" => ASSERTION })
    node.nil? ? nil : node.text
  end
end

#name_idObject

The value of the user identifier as designated by the initialization request response



45
46
47
48
49
50
51
52
53
# File 'lib/federazione_trentina/ruby-saml/response.rb', line 45

def name_id
  @name_id ||= begin
    # non va..  node = REXML::XPath.first(document, "/saml2p:Response/saml2:Assertion[@ID='#{document.signed_element_id}']/saml2:Subject/saml2:NameID", { "p" => PROTOCOL, "a" => ASSERTION })
    node = REXML::XPath.first(document, "/saml2p:Response/saml2:Assertion[@ID='#{document.signed_element_id}']/saml2:Subject/saml2:NameID")
    #node ||=  REXML::XPath.first(document, "/p:Response[@ID='#{document.signed_element_id}']/a:Assertion/a:Subject/a:NameID", { "p" => PROTOCOL, "a" => ASSERTION })
    node ||=  REXML::XPath.first(document, "/saml2p:Response[@ID='#{document.signed_element_id}']/saml2:Assertion/saml2:Subject/saml2:NameID")
    node.nil? ? nil : node.text
  end
end

#session_expires_atObject

When this user session should expire at latest



79
80
81
82
83
84
# File 'lib/federazione_trentina/ruby-saml/response.rb', line 79

def session_expires_at
  @expires_at ||= begin
    node = REXML::XPath.first(document, "/p:Response/a:Assertion/a:AuthnStatement", { "p" => PROTOCOL, "a" => ASSERTION })
    parse_time(node, "SessionNotOnOrAfter")
  end
end

#success?Boolean

Checks the status of the response for a “Success” code

Returns:

  • (Boolean)


87
88
89
90
91
92
# File 'lib/federazione_trentina/ruby-saml/response.rb', line 87

def success?
  @status_code ||= begin
    node = REXML::XPath.first(document, "/p:Response/p:Status/p:StatusCode", { "p" => PROTOCOL, "a" => ASSERTION })
    node.attributes["Value"] == "urn:oasis:names:tc:SAML:2.0:status:Success"
  end
end

#validate!Object



40
41
42
# File 'lib/federazione_trentina/ruby-saml/response.rb', line 40

def validate!
  validate(false)
end