Commit 61c8b41
Changed files (2)
lib
saml
kit
spec
saml
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]}"