Commit 7884966

mo <mo@mokhan.ca>
2017-12-05 20:21:37
create composite metadata.
1 parent 2d873ae
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