Class: CASClient::Tickets::Storage::LocalDirTicketStore

Inherits:
AbstractTicketStore show all
Defined in:
lib/casclient/tickets/storage.rb

Overview

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

Instance Attribute Summary

Attributes inherited from AbstractTicketStore

#log

Instance Method Summary collapse

Methods inherited from AbstractTicketStore

#get_session_for_service_ticket, #process_single_sign_out

Constructor Details

#initialize(config = {}) ⇒ LocalDirTicketStore

Returns a new instance of LocalDirTicketStore.



81
82
83
84
85
86
87
# 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

Instance Method Details

#cleanup_service_session_lookup(st) ⇒ Object

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.

Raises:



124
125
126
127
128
129
130
# 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) ⇒ Object

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.

Raises:



111
112
113
114
115
116
117
# 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) ⇒ Object

Raises:



144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# 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) ⇒ Object

Raises:



132
133
134
135
136
137
138
139
140
141
142
# 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) ⇒ Object

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.

Raises:



94
95
96
97
98
99
100
101
102
103
104
105
# 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