class SamlIdpMetadata::Parser

SAML IdP metadata parser

Attributes

entity_id[R]
nameid_format[R]
slo_url[R]
sso_http_post_url[R]
sso_http_redirect_url[R]
x509_certificate[R]
xml[R]
xmlns[R]

Public Class Methods

call(xml:) click to toggle source
# File lib/saml_idp_metadata/parser.rb, line 27
def self.call(xml:)
  new(xml: xml).call
end
new(xml:) click to toggle source
# File lib/saml_idp_metadata/parser.rb, line 14
def initialize(xml:)
  @xml = xml
  @hash = Hash.from_xml(xml)

  @xmlns = nil
  @entity_id = nil
  @sso_http_redirect_url = nil
  @sso_http_post_url = nil
  @slo_url = nil
  @nameid_format = nil
  @x509_certificate = nil
end

Public Instance Methods

build_params() click to toggle source
# File lib/saml_idp_metadata/parser.rb, line 52
def build_params
  {
    entity_id: entity_id,
    sso_http_redirect_url: sso_http_redirect_url,
    sso_http_post_url: sso_http_post_url,
    certificate: x509_certificate,
    slo_url: slo_url,
    nameid_format: nameid_format,
    metadata: xml
  }
end
call() click to toggle source
# File lib/saml_idp_metadata/parser.rb, line 31
def call
  @xmlns = parse_xmlns

  @entity_id = parse_entity_id
  @sso_http_redirect_url = parse_sso_http_redirect_url
  @sso_http_post_url = parse_sso_http_post_url
  @slo_url = parse_slo_url
  @nameid_format = parse_nameid_format
  @x509_certificate = parse_x509_certificate

  self
end
ensure_params?() click to toggle source
# File lib/saml_idp_metadata/parser.rb, line 48
def ensure_params?
  entity_id.present? && (sso_http_redirect_url.present? && sso_http_post_url.present?) && x509_certificate.present?
end
validate_xmlns() click to toggle source
# File lib/saml_idp_metadata/parser.rb, line 44
def validate_xmlns
  xmlns == 'urn:oasis:names:tc:SAML:2.0:metadata'
end

Private Instance Methods

entity_descriptor() click to toggle source
# File lib/saml_idp_metadata/parser.rb, line 66
def entity_descriptor
  @hash['EntityDescriptor']
end
parse_entity_id() click to toggle source
# File lib/saml_idp_metadata/parser.rb, line 70
def parse_entity_id
  entity_descriptor['entityID']
end
parse_nameid_format() click to toggle source
# File lib/saml_idp_metadata/parser.rb, line 114
def parse_nameid_format
  return nil if entity_descriptor.dig('IDPSSODescriptor', 'NameIDFormat').nil?

  if entity_descriptor['IDPSSODescriptor']['NameIDFormat'].instance_of?(Array)
    entity_descriptor['IDPSSODescriptor']['NameIDFormat'].last
  else
    entity_descriptor['IDPSSODescriptor']['NameIDFormat']
  end
end
parse_slo_url() click to toggle source
# File lib/saml_idp_metadata/parser.rb, line 102
def parse_slo_url
  return nil if entity_descriptor.dig('IDPSSODescriptor', 'SingleLogoutService').nil?

  single_logout_services = entity_descriptor['IDPSSODescriptor']['SingleLogoutService']

  return single_logout_services['Location'] if single_logout_services.is_a?(Hash)

  single_logout_services.each do |service|
    return service['Location'] if service['Binding'] == 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect'
  end
end
parse_sso_http_post_url() click to toggle source
# File lib/saml_idp_metadata/parser.rb, line 90
def parse_sso_http_post_url
  return nil if entity_descriptor.dig('IDPSSODescriptor', 'SingleSignOnService').nil?

  single_signon_services = entity_descriptor['IDPSSODescriptor']['SingleSignOnService']

  return single_signon_services['Location'] if single_signon_services.is_a?(Hash)

  single_signon_services.each do |service|
    return service['Location'] if service['Binding'] == 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST'
  end
end
parse_sso_http_redirect_url() click to toggle source
# File lib/saml_idp_metadata/parser.rb, line 78
def parse_sso_http_redirect_url
  return nil if entity_descriptor.dig('IDPSSODescriptor', 'SingleSignOnService').nil?

  single_signon_services = entity_descriptor['IDPSSODescriptor']['SingleSignOnService']

  return single_signon_services['Location'] if single_signon_services.is_a?(Hash)

  single_signon_services.each do |service|
    return service['Location'] if service['Binding'] == 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect'
  end
end
parse_x509_certificate() click to toggle source
# File lib/saml_idp_metadata/parser.rb, line 124
def parse_x509_certificate
  return nil if entity_descriptor.dig('IDPSSODescriptor', 'KeyDescriptor').nil?

  if entity_descriptor['IDPSSODescriptor']['KeyDescriptor'].instance_of?(Array)
    entity_descriptor['IDPSSODescriptor']['KeyDescriptor'].last['KeyInfo']['X509Data']['X509Certificate']
  else
    entity_descriptor['IDPSSODescriptor']['KeyDescriptor']['KeyInfo']['X509Data']['X509Certificate']
  end
end
parse_xmlns() click to toggle source
# File lib/saml_idp_metadata/parser.rb, line 74
def parse_xmlns
  entity_descriptor.key?('xmlns:md') ? entity_descriptor['xmlns:md'] : entity_descriptor['xmlns']
end