main
 1# frozen_string_literal: true
 2
 3module Saml
 4  module Kit
 5    class Parser
 6      # Creates a `{Saml::Kit::Metadata}` object from a raw XML [String].
 7      #
 8      # @param content [String] the raw metadata XML.
 9      # @return [Saml::Kit::Metadata] the metadata document or subclass.
10      def metadata_from(content)
11        document = Nokogiri::XML(content)
12        return unless document.at_xpath('/md:EntityDescriptor', XmlParseable::NAMESPACES)
13
14        xpath = '/md:EntityDescriptor/md:SPSSODescriptor'
15        sp = document.at_xpath(xpath, XmlParseable::NAMESPACES)
16        xpath = '/md:EntityDescriptor/md:IDPSSODescriptor'
17        idp = document.at_xpath(xpath, XmlParseable::NAMESPACES)
18        if sp && idp
19          Saml::Kit::CompositeMetadata.new(content)
20        elsif sp
21          Saml::Kit::ServiceProviderMetadata.new(content)
22        elsif idp
23          Saml::Kit::IdentityProviderMetadata.new(content)
24        end
25      end
26    end
27  end
28end