Commit 61c8b41

mo <mo@mokhan.ca>
2017-11-15 21:46:25
extract method to build payload.
1 parent dc311b3
Changed files (2)
lib/saml/kit/url_builder.rb
@@ -5,15 +5,8 @@ module Saml
         @private_key = private_key
       end
 
-      def build(saml_document, binding:, relay_state: nil)
-        payload = {
-          saml_document.query_string_parameter => Content.encode_raw_saml(saml_document.to_xml),
-          'RelayState' => relay_state,
-          'SigAlg' => Saml::Kit::Namespaces::SHA256,
-        }.map do |(x, y)|
-          "#{x}=#{y}"
-        end.join('&')
-        payload = URI.encode(payload)
+      def build(saml_document, binding: :http_redirect, relay_state: nil)
+        payload = build_payload(saml_document, relay_state)
         "#{saml_document.destination}?#{payload}&Signature=#{signature_for(payload)}"
       end
 
@@ -24,6 +17,17 @@ module Saml
       def signature_for(payload)
         Base64.strict_encode64(private_key.sign(OpenSSL::Digest::SHA256.new, payload))
       end
+
+      def build_payload(saml_document, relay_state)
+        payload = {
+          saml_document.query_string_parameter => Content.encode_raw_saml(saml_document.to_xml),
+          'RelayState' => relay_state,
+          'SigAlg' => Saml::Kit::Namespaces::SHA256,
+        }.map do |(x, y)|
+          "#{x}=#{y}"
+        end.join('&')
+        payload = URI.encode(payload)
+      end
     end
   end
 end
spec/saml/url_builder_spec.rb
@@ -14,16 +14,20 @@ RSpec.describe Saml::Kit::UrlBuilder do
     ].each do |(response_type, query_string_parameter)|
       describe response_type.to_s do
         let(:response) { instance_double(response_type, destination: destination, to_xml: xml, query_string_parameter: query_string_parameter) }
-        let(:result) { subject.build(response, binding: :http_redirect, relay_state: relay_state) }
-        let(:result_uri) { URI.parse(result) }
-        let(:query_params) { Hash[result_uri.query.split("&").map { |x| x.split('=', 2) }] }
+
+        def to_query_params(url)
+          Hash[URI.parse(url).query.split("&").map { |x| x.split('=', 2) }]
+        end
 
         it 'returns a url containing the target location' do
+          result_uri = URI.parse(subject.build(response))
           expect(result_uri.scheme).to eql("http")
           expect(result_uri.host).to eql(URI.parse(destination).host)
         end
 
         it 'includes the message deflated (without header and checksum), base64-encoded, and URL-encoded' do
+          result = subject.build(response, relay_state: relay_state)
+          query_params = to_query_params(result)
           level = Zlib::BEST_COMPRESSION
           expected = URI.encode(Base64.encode64(Zlib::Deflate.deflate(xml, level)[2..-5]).gsub(/\n/, ''))
           expect(result).to include("#{query_string_parameter}=#{expected}")
@@ -31,11 +35,15 @@ RSpec.describe Saml::Kit::UrlBuilder do
         end
 
         it 'includes the relay state' do
+          result = subject.build(response, relay_state: relay_state)
+          query_params = to_query_params(result)
           expect(query_params['RelayState']).to eql(URI.encode(relay_state))
           expect(result).to include("RelayState=#{URI.encode(relay_state)}")
         end
 
         it 'includes a signature' do
+          result = subject.build(response, relay_state: relay_state)
+          query_params = to_query_params(result)
           expect(query_params['SigAlg']).to eql(URI.encode(Saml::Kit::Namespaces::SHA256))
 
           payload = "#{query_string_parameter}=#{query_params[query_string_parameter]}"