Commit 23ecfc5

mo <mo.khan@gmail.com>
2017-11-10 19:19:51
add zlib compression support.
1 parent dd7fe18
Changed files (4)
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