Commit 29ea668

mo <mo@mokhan.ca>
2018-02-08 18:00:48
use is an optional attribute on the KeyDescriptor.
According to the SAML metadata schema, the md:KeyDescriptor/@use XML attribute is an optional attribute. A KeyDescriptor with no use XML attribute such as <md:KeyDescriptor> is merely an optimization for a pair of contiguous elements <md:KeyDescriptor use=”signing”> <md:KeyDescriptor use=”encryption”> each with exactly the same content. https://wiki.shibboleth.net/confluence/plugins/viewsource/viewpagesrc.action?pageId=24183588
1 parent c3ed007
lib/saml/kit/metadata.rb
@@ -77,7 +77,9 @@ module Saml
       def certificates
         @certificates ||= document.find_all("/md:EntityDescriptor/md:#{name}/md:KeyDescriptor").map do |item|
           cert = item.at_xpath("./ds:KeyInfo/ds:X509Data/ds:X509Certificate", NAMESPACES).text
-          ::Xml::Kit::Certificate.new(cert, use: item.attribute('use').value.to_sym)
+          attribute = item.attribute('use')
+          use = attribute.nil? ? nil : item.attribute('use').value
+          ::Xml::Kit::Certificate.new(cert, use: use)
         end
       end
 
lib/saml/kit/version.rb
@@ -1,5 +1,5 @@
 module Saml
   module Kit
-    VERSION = "1.0.2"
+    VERSION = "1.0.3"
   end
 end
spec/saml/metadata_spec.rb
@@ -47,4 +47,19 @@ RSpec.describe Saml::Kit::Metadata do
       expect(result.contact_person_company).to eql("mailto:hi@example.com")
     end
   end
+
+  describe "#certificates" do
+    it 'returns each certificate when missing a "use"' do
+      configuration = Saml::Kit::Configuration.new do |config|
+        config.generate_key_pair_for(use: :signing)
+      end
+      xml = Saml::Kit::Metadata.build_xml(configuration: configuration) do |x|
+        x.embed_signature = false
+        x.build_identity_provider
+      end
+      modified_xml = xml.gsub(/use/, 'misuse')
+      subject = described_class.from(modified_xml)
+      expect(subject.certificates.count).to eql(1)
+    end
+  end
 end
saml-kit.gemspec
@@ -24,7 +24,7 @@ Gem::Specification.new do |spec|
   spec.require_paths = ["lib"]
 
   spec.add_dependency "activemodel", ">= 4.2.0"
-  spec.add_dependency "xml-kit", "~> 0.1"
+  spec.add_dependency "xml-kit", ">= 0.1.4", "<= 1.0.0"
   spec.add_development_dependency "bundler", "~> 1.15"
   spec.add_development_dependency "ffaker", "~> 2.7"
   spec.add_development_dependency "rake", "~> 10.0"