class CASClient::Tickets::Storage::LocalDirTicketStore

A Ticket Store that keeps it’s tickets in a directory on the local filesystem. Service tickets are stored under tmp/sessions by default and Proxy Granting Tickets and their IOUs are stored in tmp/cas_pgt.pstore This Ticket Store works fine for small sites but will most likely have concurrency problems under heavy load. It also requires that all your worker processes have access to a shared file system.

This ticket store takes the following config parameters :storage_dir - The directory to store data in. Defaults to Rails.root/tmp :service_session_lookup_dir - The directory to store Service Ticket/Session ID files in. Defaults to :storage_dir/sessions :pgt_store_path - The location to store the pgt PStore file. Defaults to :storage_dir/cas_pgt.pstore

Public Class Methods

new(config={}) click to toggle source
# File lib/casclient/tickets/storage.rb, line 81
def initialize(config={})
  config ||= {}
  default_tmp_dir = defined?(Rails.root) ? "#{Rails.root}/tmp" : "#{Dir.pwd}/tmp"
  @tmp_dir = config[:storage_dir] || default_tmp_dir
  @service_session_lookup_dir = config[:service_session_lookup_dir] || "#{@tmp_dir}/sessions"
  @pgt_store_path = config[:pgt_store_path] || "#{@tmp_dir}/cas_pgt.pstore"
end

Public Instance Methods

cleanup_service_session_lookup(st) click to toggle source

Removes a stored relationship between a ServiceTicket and a local Rails session id. This should be called when the session is being closed.

See store_service_session_lookup.

# File lib/casclient/tickets/storage.rb, line 124
def cleanup_service_session_lookup(st)
  raise CASException, "No service_ticket specified." if st.nil?

  st = st.ticket if st.kind_of? ServiceTicket
  ssl_filename = filename_of_service_session_lookup(st)
  File.delete(ssl_filename) if File.exists?(ssl_filename)
end
read_service_session_lookup(st) click to toggle source

Returns the local Rails session ID corresponding to the given ServiceTicket. This is done by reading the contents of the cas_sess.<session ticket> file created in a prior call to store_service_session_lookup.

# File lib/casclient/tickets/storage.rb, line 111
def read_service_session_lookup(st)
  raise CASException, "No service_ticket specified." if st.nil?

  st = st.ticket if st.kind_of? ServiceTicket
  ssl_filename = filename_of_service_session_lookup(st)
  return IO.read(ssl_filename) if File.exists?(ssl_filename)
end
retrieve_pgt(pgt_iou) click to toggle source
# File lib/casclient/tickets/storage.rb, line 144
def retrieve_pgt(pgt_iou)
  raise CASException, "No pgt_iou specified. Cannot retrieve the pgt." unless pgt_iou

  pstore = open_pstore

  pgt = nil
  # TODO: need to periodically clean the storage, otherwise it will just keep growing
  pstore.transaction do
    pgt = pstore[pgt_iou]
    pstore.delete pgt_iou
  end

  raise CASException, "Invalid pgt_iou specified. Perhaps this pgt has already been retrieved?" unless pgt

  pgt
end
save_pgt_iou(pgt_iou, pgt) click to toggle source
# File lib/casclient/tickets/storage.rb, line 132
def save_pgt_iou(pgt_iou, pgt)
  raise CASException, "Invalid pgt_iou" if pgt_iou.nil?
  raise CASException, "Invalid pgt" if pgt.nil?

  # TODO: pstore contents should probably be encrypted...
  pstore = open_pstore

  pstore.transaction do
    pstore[pgt_iou] = pgt
  end
end
store_service_session_lookup(st, controller) click to toggle source

Creates a file in tmp/sessions linking a SessionTicket with the local Rails session id. The file is named cas_sess.<session ticket> and its text contents is the corresponding Rails session id. Returns the filename of the lookup file created.

# File lib/casclient/tickets/storage.rb, line 94
def store_service_session_lookup(st, controller)
  raise CASException, "No service_ticket specified." if st.nil?
  raise CASException, "No controller specified." if controller.nil?

  sid = session_id_from_controller(controller)

  st = st.ticket if st.kind_of? ServiceTicket
  f = File.new(filename_of_service_session_lookup(st), 'w')
  f.write(sid)
  f.close
  return f.path
end

Private Instance Methods

filename_of_service_session_lookup(st) click to toggle source

Returns the path and filename of the service session lookup file.

# File lib/casclient/tickets/storage.rb, line 164
def filename_of_service_session_lookup(st)
  st = st.ticket if st.kind_of? ServiceTicket
  return "#{@service_session_lookup_dir}/cas_sess.#{st}"
end
open_pstore() click to toggle source
# File lib/casclient/tickets/storage.rb, line 169
def open_pstore
  PStore.new(@pgt_store_path)
end