Commit f649199

mo <mo.khan@gmail.com>
2017-11-14 01:58:47
return the properly parsed request.
1 parent 8de60c4
Changed files (3)
proof
app
saml-kit
lib
saml
spec
proof/app/controllers/sessions_controller.rb
@@ -1,6 +1,6 @@
 class SessionsController < ApplicationController
   skip_before_action :verify_authenticity_token, only: [:new, :destroy]
-  before_action :load_saml_request, only: [:new, :create]
+  before_action :load_saml_request, only: [:new, :create, :destroy]
 
   def new
     session[:SAMLRequest] ||= params[:SAMLRequest]
saml-kit/lib/saml/kit/request.rb
@@ -2,8 +2,13 @@ module Saml
   module Kit
     class Request
       def self.deserialize(raw_request)
-        request = Saml::Kit::Content.decode_raw_saml(raw_request)
-        AuthenticationRequest.new(request)
+        xml = Saml::Kit::Content.decode_raw_saml(raw_request)
+        hash = Hash.from_xml(xml)
+        if hash['AuthnRequest'].present?
+          AuthenticationRequest.new(xml)
+        else
+          LogoutRequest.new(xml)
+        end
       rescue => error
         Saml::Kit.logger.error(error)
         InvalidRequest.new(raw_request)
saml-kit/spec/saml/request_spec.rb
@@ -29,5 +29,14 @@ RSpec.describe Saml::Kit::Request do
     it 'returns an invalid request when the raw request is corrupted' do
       expect(subject.deserialize("nonsense")).to be_invalid
     end
+
+    it 'returns a logout request' do
+      user = double(:user, name_id_for: SecureRandom.uuid)
+      builder = Saml::Kit::LogoutRequest::Builder.new(user)
+
+      result = subject.deserialize(builder.build.serialize)
+      expect(result).to be_instance_of(Saml::Kit::LogoutRequest)
+      expect(result.name_id).to eql(user.name_id_for)
+    end
   end
 end