Sha256: 948b55585f85d94671c969222c45ef53cbbf1d8af27533521a0753331cd6262d

Contents?: true

Size: 1.73 KB

Versions: 1

Compression:

Stored size: 1.73 KB

Contents

require 'net/http'

module Cas
  module Client
    class Middleware
      def initialize(app, config={})
        @app = app
        @config = config
        @config[:extra_attributes] = [] if config[:extra_attributes].nil?
        @request = nil
      end

      def call(env)
        @request = Rack::Request.new(env)
        server = Cas::Client::Server.new(@config[:server_url])
        status, headers, rack_body = @app.call(env)
        log(env, "Middleware called. Status: #{status}, Headers: #{headers}")

        if ticket_validation?
          attributes = server.validate_service(self_url(@request), ticket_param, {extra_attributes: @config[:extra_attributes]})
          set_session(@request, attributes)
          return redirect_to(self_url(@request))
        elsif status == 401
          return redirect_to(server.login_url({service_url: self_url(@request)}))
        else
          return [status, headers, rack_body]
        end
      end

      private

      def set_session(req, attributes)
        req.session['cas'] = attributes
      end

      def redirect_to(url, status=302)
        [ status, { 'Location' => url, 'Content-Type' => 'text/plain' }, ["Redirecting you to #{url}"] ]
      end

      def self_url(req)
        req.url.split('?')[0]
      end

      def ticket_validation?
        !!(@request.get? && ticket_param && ticket_param.to_s =~ /\AST\-[^\s]{1,253}\Z/)
      end

      def ticket_param
        @request.params['ticket']
      end

      def xml_namespace
        @config[:cas_namespace] || 'cas'
      end

      def log(env, message, level = :info)
        if env['rack.logger']
          env['rack.logger'].send(level, message)
        else
          env['rack.errors'].write(message)
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
cas-client-0.1.3 lib/cas/client/middleware.rb