2003-08-29 09:27:20 -04:00
|
|
|
#
|
|
|
|
# cgi/session/pstore.rb - persistent storage of marshalled session data
|
|
|
|
#
|
|
|
|
# Documentation: William Webber (william@williamwebber.com)
|
|
|
|
#
|
|
|
|
# == Overview
|
|
|
|
#
|
|
|
|
# This file provides the CGI::Session::PStore class, which builds
|
|
|
|
# persistent of session data on top of the pstore library. See
|
|
|
|
# cgi/session.rb for more details on session storage managers.
|
|
|
|
|
2003-07-15 03:35:14 -04:00
|
|
|
require 'cgi/session'
|
|
|
|
require 'pstore'
|
|
|
|
|
|
|
|
class CGI
|
|
|
|
class Session
|
|
|
|
def []=(key, val)
|
|
|
|
unless @write_lock
|
|
|
|
@write_lock = true
|
|
|
|
end
|
|
|
|
unless @data
|
|
|
|
@data = @dbman.restore
|
|
|
|
end
|
|
|
|
#@data[key] = String(val)
|
|
|
|
@data[key] = val
|
|
|
|
end
|
|
|
|
|
2003-08-29 09:27:20 -04:00
|
|
|
# PStore-based session storage class.
|
|
|
|
#
|
|
|
|
# This builds upon the top-level PStore class provided by the
|
|
|
|
# library file pstore.rb. Session data is marshalled and stored
|
|
|
|
# in a file. File locking and transaction services are provided.
|
2003-07-15 03:35:14 -04:00
|
|
|
class PStore
|
2003-08-29 09:27:20 -04:00
|
|
|
def check_id(id) #:nodoc:
|
2003-07-15 03:35:14 -04:00
|
|
|
/[^0-9a-zA-Z]/ =~ id.to_s ? false : true
|
|
|
|
end
|
|
|
|
|
2003-08-29 09:27:20 -04:00
|
|
|
# Create a new CGI::Session::PStore instance
|
|
|
|
#
|
|
|
|
# This constructor is used internally by CGI::Session. The
|
|
|
|
# user does not generally need to call it directly.
|
|
|
|
#
|
|
|
|
# +session+ is the session for which this instance is being
|
|
|
|
# created. The session id must only contain alphanumeric
|
|
|
|
# characters; automatically generated session ids observe
|
|
|
|
# this requirement.
|
|
|
|
#
|
|
|
|
# +option+ is a hash of options for the initialiser. The
|
|
|
|
# following options are recognised:
|
|
|
|
#
|
|
|
|
# tmpdir:: the directory to use for storing the PStore
|
|
|
|
# file. Defaults to Dir::tmpdir (generally "/tmp"
|
|
|
|
# on Unix systems).
|
|
|
|
# prefix:: the prefix to add to the session id when generating
|
|
|
|
# the filename for this session's PStore file.
|
|
|
|
# Defaults to the empty string.
|
|
|
|
#
|
|
|
|
# This session's PStore file will be created if it does
|
|
|
|
# not exist, or opened if it does.
|
2003-07-15 03:35:14 -04:00
|
|
|
def initialize session, option={}
|
|
|
|
dir = option['tmpdir'] || ENV['TMP'] || '/tmp'
|
|
|
|
prefix = option['prefix'] || ''
|
|
|
|
id = session.session_id
|
|
|
|
unless check_id(id)
|
|
|
|
raise ArgumentError, "session_id `%s' is invalid" % id
|
|
|
|
end
|
|
|
|
path = dir+"/"+prefix+id
|
|
|
|
path.untaint
|
|
|
|
unless File::exist? path
|
|
|
|
@hash = {}
|
|
|
|
end
|
2003-10-16 13:47:19 -04:00
|
|
|
@p = ::PStore.new(path)
|
2003-07-15 03:35:14 -04:00
|
|
|
end
|
|
|
|
|
2003-08-29 09:27:20 -04:00
|
|
|
# Restore session state from the session's PStore file.
|
|
|
|
#
|
|
|
|
# Returns the session state as a hash.
|
2003-07-15 03:35:14 -04:00
|
|
|
def restore
|
|
|
|
unless @hash
|
|
|
|
@p.transaction do
|
|
|
|
begin
|
|
|
|
@hash = @p['hash']
|
|
|
|
rescue
|
|
|
|
@hash = {}
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
@hash
|
|
|
|
end
|
|
|
|
|
2003-08-29 09:27:20 -04:00
|
|
|
# Save session state to the session's PStore file.
|
2003-07-15 03:35:14 -04:00
|
|
|
def update
|
|
|
|
@p.transaction do
|
|
|
|
@p['hash'] = @hash
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2003-08-29 09:27:20 -04:00
|
|
|
# Update and close the session's PStore file.
|
2003-07-15 03:35:14 -04:00
|
|
|
def close
|
|
|
|
update
|
|
|
|
end
|
|
|
|
|
2003-08-29 09:27:20 -04:00
|
|
|
# Close and delete the session's PStore file.
|
2003-07-15 03:35:14 -04:00
|
|
|
def delete
|
|
|
|
path = @p.path
|
|
|
|
File::unlink path
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
if $0 == __FILE__
|
2003-08-29 09:27:20 -04:00
|
|
|
# :enddoc:
|
2003-07-15 03:35:14 -04:00
|
|
|
STDIN.reopen("/dev/null")
|
|
|
|
cgi = CGI.new
|
2003-10-16 13:47:19 -04:00
|
|
|
session = CGI::Session.new(cgi, 'database_manager' => CGI::Session::PStore)
|
2003-07-15 03:35:14 -04:00
|
|
|
session['key'] = {'k' => 'v'}
|
|
|
|
puts session['key'].class
|
|
|
|
fail unless Hash === session['key']
|
|
|
|
puts session['key'].inspect
|
|
|
|
fail unless session['key'].inspect == '{"k"=>"v"}'
|
|
|
|
end
|