require File.expand_path(File.join(File.dirname(__FILE__), "test_helper")) class RequestTest < Minitest::Test describe "Authrequest" do let(:settings) { OneLogin::RubySaml::Settings.new } before do settings.idp_sso_target_url = "http://example.com" end it "create the deflated SAMLRequest URL parameter" do auth_url = OneLogin::RubySaml::Authrequest.new.create(settings) assert auth_url =~ /^http:\/\/example\.com\?SAMLRequest=/ payload = CGI.unescape(auth_url.split("=").last) decoded = Base64.decode64(payload) zstream = Zlib::Inflate.new(-Zlib::MAX_WBITS) inflated = zstream.inflate(decoded) zstream.finish zstream.close assert_match /^') assert inflated.include?("testuser@example.com") assert inflated.include?("") end it "accept extra parameters" do auth_url = OneLogin::RubySaml::Authrequest.new.create(settings, { :hello => "there" }) assert auth_url =~ /&hello=there$/ auth_url = OneLogin::RubySaml::Authrequest.new.create(settings, { :hello => nil }) assert auth_url =~ /&hello=$/ end describe "when the target url doesn't contain a query string" do it "create the SAMLRequest parameter correctly" do auth_url = OneLogin::RubySaml::Authrequest.new.create(settings) assert auth_url =~ /^http:\/\/example.com\?SAMLRequest/ end end describe "when the target url contains a query string" do it "create the SAMLRequest parameter correctly" do settings.idp_sso_target_url = "http://example.com?field=value" auth_url = OneLogin::RubySaml::Authrequest.new.create(settings) assert auth_url =~ /^http:\/\/example.com\?field=value&SAMLRequest/ end end describe "#create_params when the settings indicate to sign (embebed) the request" do before do settings.compress_request = false settings.idp_sso_target_url = "http://example.com?field=value" settings.security[:authn_requests_signed] = true settings.security[:embed_sign] = true settings.certificate = ruby_saml_cert_text settings.private_key = ruby_saml_key_text end it "create a signed request" do params = OneLogin::RubySaml::Authrequest.new.create_params(settings) request_xml = Base64.decode64(params["SAMLRequest"]) assert_match %r[([a-zA-Z0-9/+=]+)], request_xml assert_match %r[], request_xml end it "create a signed request with 256 digest and signature methods" do settings.security[:signature_method] = XMLSecurity::Document::RSA_SHA256 settings.security[:digest_method] = XMLSecurity::Document::SHA512 params = OneLogin::RubySaml::Authrequest.new.create_params(settings) request_xml = Base64.decode64(params["SAMLRequest"]) assert_match %r[([a-zA-Z0-9/+=]+)], request_xml assert_match %r[], request_xml assert_match %r[], request_xml end end describe "#create_params when the settings indicate to sign the request" do let(:cert) { OpenSSL::X509::Certificate.new(ruby_saml_cert_text) } before do settings.compress_request = false settings.idp_sso_target_url = "http://example.com?field=value" settings.security[:authn_requests_signed] = true settings.security[:embed_sign] = false settings.certificate = ruby_saml_cert_text settings.private_key = ruby_saml_key_text end it "create a signature parameter with RSA_SHA1 and validate it" do settings.security[:signature_method] = XMLSecurity::Document::RSA_SHA1 params = OneLogin::RubySaml::Authrequest.new.create_params(settings, :RelayState => 'http://example.com') assert params['SAMLRequest'] assert params[:RelayState] assert params['Signature'] assert_equal params['SigAlg'], XMLSecurity::Document::RSA_SHA1 query_string = "SAMLRequest=#{CGI.escape(params['SAMLRequest'])}" query_string << "&RelayState=#{CGI.escape(params[:RelayState])}" query_string << "&SigAlg=#{CGI.escape(params['SigAlg'])}" signature_algorithm = XMLSecurity::BaseDocument.new.algorithm(params['SigAlg']) assert_equal signature_algorithm, OpenSSL::Digest::SHA1 assert cert.public_key.verify(signature_algorithm.new, Base64.decode64(params['Signature']), query_string) end it "create a signature parameter with RSA_SHA256 and validate it" do settings.security[:signature_method] = XMLSecurity::Document::RSA_SHA256 params = OneLogin::RubySaml::Authrequest.new.create_params(settings, :RelayState => 'http://example.com') assert params['Signature'] assert_equal params['SigAlg'], XMLSecurity::Document::RSA_SHA256 query_string = "SAMLRequest=#{CGI.escape(params['SAMLRequest'])}" query_string << "&RelayState=#{CGI.escape(params[:RelayState])}" query_string << "&SigAlg=#{CGI.escape(params['SigAlg'])}" signature_algorithm = XMLSecurity::BaseDocument.new.algorithm(params['SigAlg']) assert_equal signature_algorithm, OpenSSL::Digest::SHA256 assert cert.public_key.verify(signature_algorithm.new, Base64.decode64(params['Signature']), query_string) end end end end