Commit 74df8b2

mo <mo.khan@gmail.com>
2017-11-14 00:01:55
fetch the logout service url.
1 parent 436f76d
lib/saml/kit/identity_provider_metadata.rb
@@ -22,7 +22,7 @@ module Saml
         end
       end
 
-      def single_sign_on_service_for(binding:)
+      def single_sign_on_service_for(binding)
         binding = Saml::Kit::Namespaces.binding_for(binding)
         result = single_sign_on_services.find do |item|
           item[:binding] == binding
lib/saml/kit/metadata.rb
@@ -62,6 +62,14 @@ module Saml
         end
       end
 
+      def single_logout_service_for(binding)
+        binding = Saml::Kit::Namespaces.binding_for(binding)
+        result = single_logout_services.find do |item|
+          item[:binding] == binding
+        end
+        return result[:location] if result
+      end
+
       def matches?(fingerprint, use: :signing)
         if :signing == use.to_sym
           hash_value = fingerprint.algorithm(hash_algorithm)
spec/saml/identity_provider_metadata_spec.rb
@@ -233,8 +233,8 @@ RSpec.describe Saml::Kit::IdentityProviderMetadata do
     end
 
     it 'returns the binding that matches the requested' do
-      expect(subject.single_sign_on_service_for(binding: :post)).to eql(post_url)
-      expect(subject.single_sign_on_service_for(binding: :http_redirect)).to eql(redirect_url)
+      expect(subject.single_sign_on_service_for(:post)).to eql(post_url)
+      expect(subject.single_sign_on_service_for(:http_redirect)).to eql(redirect_url)
     end
 
     it 'returns nil if the binding cannot be found' do
@@ -282,4 +282,25 @@ RSpec.describe Saml::Kit::IdentityProviderMetadata do
       expect(subject.build_request(Saml::Kit::AuthenticationRequest)).to_not be_signed
     end
   end
+
+  describe "#single_logout_service_for" do
+    let(:builder) { described_class::Builder.new }
+    let(:redirect_url) { FFaker::Internet.http_url }
+    let(:post_url) { FFaker::Internet.http_url }
+    let(:subject) { builder.build }
+
+    before :each do
+      builder.add_single_logout_service(redirect_url, binding: :http_redirect)
+      builder.add_single_logout_service(post_url, binding: :post)
+    end
+
+    it 'returns the location for the matching binding' do
+      expect(subject.single_logout_service_for(:post)).to eql(post_url)
+      expect(subject.single_logout_service_for(:http_redirect)).to eql(redirect_url)
+    end
+
+    it 'returns nil if the binding is not available' do
+      expect(subject.single_logout_service_for(:soap)).to be_nil
+    end
+  end
 end