Commit 7884966
Changed files (4)
lib
saml
spec
saml
lib/saml/kit/composite_metadata.rb
@@ -0,0 +1,30 @@
+module Saml
+ module Kit
+ class CompositeMetadata < Metadata
+ attr_reader :service_provider, :identity_provider
+
+ def initialize(xml)
+ super("", xml)
+ @service_provider = Saml::Kit::ServiceProviderMetadata.new(xml)
+ @identity_provider = Saml::Kit::IdentityProviderMetadata.new(xml)
+ end
+
+ def single_sign_on_services(*args)
+ identity_provider.single_sign_on_services(*args)
+ end
+
+ def assertion_consumer_services(*args)
+ service_provider.assertion_consumer_services(*args)
+ end
+
+ def services(type)
+ xpath = "//md:EntityDescriptor/md:SPSSODescriptor/md:#{type}|//md:EntityDescriptor/md:IDPSSODescriptor/md:#{type}"
+ document.find_all(xpath).map do |item|
+ binding = item.attribute("Binding").value
+ location = item.attribute("Location").value
+ Saml::Kit::Bindings.create_for(binding, location)
+ end
+ end
+ end
+ end
+end
lib/saml/kit/metadata.rb
@@ -99,7 +99,9 @@ module Saml
def self.from(content)
hash = Hash.from_xml(content)
entity_descriptor = hash["EntityDescriptor"]
- if entity_descriptor.keys.include?("SPSSODescriptor")
+ if entity_descriptor.key?("SPSSODescriptor") || entity_descriptor.key?("IDPSSODescriptor")
+ Saml::Kit::CompositeMetadata.new(content)
+ elsif entity_descriptor.keys.include?("SPSSODescriptor")
Saml::Kit::ServiceProviderMetadata.new(content)
elsif entity_descriptor.keys.include?("IDPSSODescriptor")
Saml::Kit::IdentityProviderMetadata.new(content)
lib/saml/kit.rb
@@ -34,6 +34,7 @@ require "saml/kit/fingerprint"
require "saml/kit/logout_response"
require "saml/kit/logout_request"
require "saml/kit/metadata"
+require "saml/kit/composite_metadata"
require "saml/kit/response"
require "saml/kit/id"
require "saml/kit/identity_provider_metadata"
spec/saml/metadata_spec.rb
@@ -38,7 +38,12 @@ RSpec.describe Saml::Kit::Metadata do
</ContactPerson>
</EntityDescriptor>
XML
- expect(subject.from(xml)).to be_present
+ result = subject.from(xml)
+ expect(result).to be_present
+
+ expect(result.single_sign_on_services.count).to eql(2)
+ expect(result.assertion_consumer_services.count).to eql(1)
+ expect(result.single_logout_services.count).to eql(2)
end
end
end