Class: Saml::Kit::Document

Inherits:
Object
  • Object
show all
Includes:
ActiveModel::Validations, Buildable, Translatable, Trustable, XsdValidatable
Defined in:
lib/saml/kit/document.rb

Constant Summary collapse

PROTOCOL_XSD =
File.expand_path('./xsd/saml-schema-protocol-2.0.xsd', File.dirname(__FILE__)).freeze
NAMESPACES =
{
  "NameFormat": ::Saml::Kit::Namespaces::ATTR_SPLAT,
  "ds": ::Xml::Kit::Namespaces::XMLDSIG,
  "md": ::Saml::Kit::Namespaces::METADATA,
  "saml": ::Saml::Kit::Namespaces::ASSERTION,
  "samlp": ::Saml::Kit::Namespaces::PROTOCOL,
  'xmlenc' => ::Xml::Kit::Namespaces::XMLENC,
}.freeze
XPATH =
[
  '/samlp:AuthnRequest',
  '/samlp:LogoutRequest',
  '/samlp:LogoutResponse',
  '/samlp:Response',
].join('|')

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Trustable

#signed?, #trusted?

Constructor Details

#initialize(xml, name:, configuration: Saml::Kit.configuration) ⇒ Document

Returns a new instance of Document.



27
28
29
30
31
32
# File 'lib/saml/kit/document.rb', line 27

def initialize(xml, name:, configuration: Saml::Kit.configuration)
  @configuration = configuration
  @registry = configuration.registry
  @content = xml
  @name = name
end

Instance Attribute Details

#registryObject

Returns the value of attribute registry.



20
21
22
# File 'lib/saml/kit/document.rb', line 20

def registry
  @registry
end

Class Method Details

.to_saml_document(xml, configuration: Saml::Kit.configuration) ⇒ Object

Returns the raw xml as a Saml::Kit SAML document.

Parameters:

  • xml (String)

    the raw xml string.

  • configuration (Saml::Kit::Configuration) (defaults to: Saml::Kit.configuration)

    the configuration to use for unpacking the document.



108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/saml/kit/document.rb', line 108

def to_saml_document(xml, configuration: Saml::Kit.configuration)
  constructor = {
    'AuthnRequest' => Saml::Kit::AuthenticationRequest,
    'LogoutRequest' => Saml::Kit::LogoutRequest,
    'LogoutResponse' => Saml::Kit::LogoutResponse,
    'Response' => Saml::Kit::Response,
  }[Nokogiri::XML(xml).at_xpath(XPATH, "samlp": ::Saml::Kit::Namespaces::PROTOCOL).name] || InvalidDocument
  constructor.new(xml, configuration: configuration)
rescue StandardError => error
  Saml::Kit.logger.error(error)
  InvalidDocument.new(xml, configuration: configuration)
end

Instance Method Details

#destinationObject

Returns the Destination of the SAML document.



50
51
52
# File 'lib/saml/kit/document.rb', line 50

def destination
  at_xpath('./*/@Destination').try(:value)
end

#idObject

Returns the ID for the SAML document.



35
36
37
# File 'lib/saml/kit/document.rb', line 35

def id
  at_xpath('./*/@ID').try(:value)
end

#issue_instantObject

Returns the Destination of the SAML document.



55
56
57
# File 'lib/saml/kit/document.rb', line 55

def issue_instant
  Time.parse(at_xpath('./*/@IssueInstant').try(:value))
end

#issuerObject

Returns the Issuer for the SAML document.



40
41
42
# File 'lib/saml/kit/document.rb', line 40

def issuer
  at_xpath('./*/saml:Issuer').try(:text)
end

#to_hObject

Returns the SAML document returned as a Hash.



60
61
62
# File 'lib/saml/kit/document.rb', line 60

def to_h
  @xml_hash ||= Hash.from_xml(content) || {}
end

#to_sObject



92
93
94
# File 'lib/saml/kit/document.rb', line 92

def to_s
  to_xml
end

#to_xhtmlObject

Returns the SAML document as an XHTML string. This is useful for rendering in a web page.



73
74
75
# File 'lib/saml/kit/document.rb', line 73

def to_xhtml
  Nokogiri::XML(to_xml, &:noblanks).to_xhtml
end

#to_xml(pretty: false) ⇒ Object

Returns the SAML document as an XML string.

Parameters:

  • pretty (Boolean) (defaults to: false)

    formats the xml or returns the raw xml.



67
68
69
# File 'lib/saml/kit/document.rb', line 67

def to_xml(pretty: false)
  pretty ? to_nokogiri.to_xml(indent: 2) : content
end

#versionObject

Returns the Version of the SAML document.



45
46
47
# File 'lib/saml/kit/document.rb', line 45

def version
  at_xpath('./*/@Version').try(:value)
end