Commit 23ecfc5
Changed files (4)
lib
saml
spec
saml
lib/saml/kit/content.rb
@@ -0,0 +1,46 @@
+module Saml
+ module Kit
+ class Content
+ BASE64_FORMAT = %r(\A([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?\Z)
+
+ def self.encode_raw_saml(xml)
+ encode(deflate(xml))
+ end
+
+ def self.decode_raw_saml(xml)
+ return xml unless base64_encoded?(xml)
+
+ decoded = decode(xml)
+ begin
+ inflate(decoded)
+ rescue
+ decoded
+ end
+ end
+
+ def url_encode(xml)
+ CGI.escape(Base64.encode64(deflate(xml)))
+ end
+
+ def self.decode(value)
+ Base64.decode64(value)
+ end
+
+ def self.encode(value)
+ Base64.encode64(value).gsub(/\n/, '')
+ end
+
+ def self.base64_encoded?(value)
+ !!value.gsub(/[\r\n]|\\r|\\n|\s/, "").match(BASE64_FORMAT)
+ end
+
+ def self.inflate(value)
+ Zlib::Inflate.new.inflate(value)
+ end
+
+ def self.deflate(value, level: Zlib::BEST_COMPRESSION)
+ Zlib::Deflate.deflate(value, level)
+ end
+ end
+ end
+end
lib/saml/kit/request.rb
@@ -2,7 +2,7 @@ module Saml
module Kit
class Request
def self.encode(document)
- Base64.encode64(compress(document.to_xml))
+ Saml::Kit::Content.encode_raw_saml(document.to_xml)
end
def self.authentication(assertion_consumer_service:, entity_id: nil)
@@ -12,13 +12,9 @@ module Saml
encode(builder)
end
- def self.compress(content)
- content
- #Zlib::Deflate.deflate(xml, 9)[2..-5]
- end
-
def self.decode(raw_request)
- AuthenticationRequest.new(Base64.decode64(raw_request))
+ request = Saml::Kit::Content.decode_raw_saml(raw_request)
+ AuthenticationRequest.new(request)
end
end
end
lib/saml/kit.rb
@@ -6,6 +6,7 @@ require "active_support/core_ext/hash/conversions"
require "active_support/core_ext/numeric/time"
require "active_support/duration"
require "builder"
+require "cgi"
require "net/http"
require "nokogiri"
require "securerandom"
@@ -14,6 +15,7 @@ require "xmldsig"
require "saml/kit/xsd_validatable"
require "saml/kit/authentication_request"
require "saml/kit/configuration"
+require "saml/kit/content"
require "saml/kit/default_registry"
require "saml/kit/fingerprint"
require "saml/kit/namespaces"
spec/saml/request_spec.rb
@@ -7,7 +7,23 @@ RSpec.describe Saml::Kit::Request do
it 'returns a compressed and base64 encoded document' do
xml = "<xml></xml>"
document = double(to_xml: xml)
- expect(subject.encode(document)).to eql(Base64.encode64(xml))
+
+ expected_value = Base64.encode64(Zlib::Deflate.deflate(xml, 9)).gsub(/\n/, '')
+ expect(subject.encode(document)).to eql(expected_value)
+ end
+ end
+
+ describe ".decode" do
+ subject { described_class }
+ let(:issuer) { FFaker::Internet.http_url }
+
+ it 'decodes the raw_request' do
+ builder = Saml::Kit::AuthenticationRequest::Builder.new
+ builder.issuer = issuer
+ raw_saml = subject.encode(builder)
+
+ result = subject.decode(raw_saml)
+ expect(result.issuer).to eql(issuer)
end
end
end