Commit b454c60

mo <mo.khan@gmail.com>
2017-11-01 18:11:55
add signature to service provider metadata.
1 parent 7d61e4d
lib/saml/kit/service_provider_metadata.rb
@@ -12,20 +12,30 @@ module Saml
       class Builder
         attr_accessor :id, :entity_id, :acs_url
 
-        def initialize
+        def initialize(configuration = Saml::Kit.configuration)
           @id = SecureRandom.uuid
+          @configuration = configuration
         end
 
         def to_xml
+          signature = Signature.new(id)
           xml = ::Builder::XmlMarkup.new
           xml.instruct!
-          xml.EntityDescriptor entity_descriptor_options do
+          xml.tag! 'md:EntityDescriptor', entity_descriptor_options do
+            signature.template(xml)
             xml.tag! "md:SPSSODescriptor", descriptor_options do
               xml.tag! "md:NameIDFormat", Namespaces::Formats::NameId::PERSISTENT
               xml.tag! "md:AssertionConsumerService", Binding: Namespaces::Bindings::POST, Location: acs_url, index: "0", isDefault: "true"
+              xml.tag! "md:KeyDescriptor", use: "signing" do
+                xml.tag! "ds:KeyInfo", "xmlns:ds": Saml::Kit::Signature::XMLDSIG do
+                  xml.tag! "ds:X509Data" do
+                    xml.tag! "ds:X509Certificate", @configuration.stripped_certificate
+                  end
+                end
+              end
             end
           end
-          xml.target!
+          signature.finalize(xml)
         end
 
         def build
@@ -37,7 +47,7 @@ module Saml
         def entity_descriptor_options
           {
             'xmlns:md': Namespaces::METADATA,
-            ID: "_#{id}",
+            ID: id,
             entityID: entity_id,
           }
         end
spec/saml/service_provider_metadata_spec.rb
@@ -35,6 +35,9 @@ RSpec.describe Saml::Kit::ServiceProviderMetadata do
       expect(result['EntityDescriptor']['SPSSODescriptor']['AssertionConsumerService']['Location']).to eql(acs_url)
       expect(result['EntityDescriptor']['SPSSODescriptor']['AssertionConsumerService']['isDefault']).to eql('true')
       expect(result['EntityDescriptor']['SPSSODescriptor']['AssertionConsumerService']['index']).to eql('0')
+      expect(result['EntityDescriptor']['Signature']).to be_present
+      expect(result['EntityDescriptor']['SPSSODescriptor']['KeyDescriptor']['use']).to eql("signing")
+      expect(result['EntityDescriptor']['SPSSODescriptor']['KeyDescriptor']['KeyInfo']['X509Data']['X509Certificate']).to eql(Saml::Kit.configuration.stripped_certificate)
     end
   end
 end