mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00

rb_io_fread() by freezing it temporarily. [ruby-dev:24479] * dir.c (rb_push_glob): block call at once the end of method. [ruby-dev:24487] * ext/enumerator/enumerator.c (enum_each_slice): remove rb_gc_force_recycle() to prevent potential SEGV. [ruby-dev:24499] * ext/zlib/zlib.c (zstream_expand_buffer): hide internal string buffer by clearing klass. [ruby-dev:24510] * ext/socket/socket.c (sock_s_getservbyaname): protocol string might be altered. [ruby-dev:24503] * string.c (rb_str_upto): check if return value from succ is a string. [ruby-dev:24504] * io.c (rb_io_popen): get mode string via rb_io_flags_mode() to avoid mode string modification. [ruby-dev:24454] * io.c (rb_io_getline_fast): should take delim as unsigned char to distinguish EOF and '\377'. [ruby-dev:24460] * io.c (rb_io_getline): add check for RS modification. [ruby-dev:24461] * enum.c (enum_sort_by): use qsort() directly instead using rb_iterate(). [ruby-dev:24462] * enum.c (enum_each_with_index): remove rb_gc_force_recycle() to prevent access to recycled object (via continuation for example). [ruby-dev:24463] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@7071 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
117 lines
3.1 KiB
Ruby
117 lines
3.1 KiB
Ruby
#
|
|
# 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.
|
|
|
|
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
|
|
|
|
# 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.
|
|
class PStore
|
|
# 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.
|
|
def initialize session, option={}
|
|
dir = option['tmpdir'] || Dir::tmpdir
|
|
prefix = option['prefix'] || ''
|
|
id = session.session_id
|
|
require 'digest/md5'
|
|
md5 = Digest::MD5.hexdigest(id)[0,16]
|
|
path = dir+"/"+prefix+md5
|
|
path.untaint
|
|
unless File::exist? path
|
|
@hash = {}
|
|
end
|
|
@p = ::PStore.new(path)
|
|
@p.transaction do |p|
|
|
File.chmod(0600, p.path)
|
|
end
|
|
end
|
|
|
|
# Restore session state from the session's PStore file.
|
|
#
|
|
# Returns the session state as a hash.
|
|
def restore
|
|
unless @hash
|
|
@p.transaction do
|
|
@hash = @p['hash'] || {}
|
|
end
|
|
end
|
|
@hash
|
|
end
|
|
|
|
# Save session state to the session's PStore file.
|
|
def update
|
|
@p.transaction do
|
|
@p['hash'] = @hash
|
|
end
|
|
end
|
|
|
|
# Update and close the session's PStore file.
|
|
def close
|
|
update
|
|
end
|
|
|
|
# Close and delete the session's PStore file.
|
|
def delete
|
|
path = @p.path
|
|
File::unlink path
|
|
end
|
|
|
|
end
|
|
end
|
|
end
|
|
|
|
if $0 == __FILE__
|
|
# :enddoc:
|
|
STDIN.reopen("/dev/null")
|
|
cgi = CGI.new
|
|
session = CGI::Session.new(cgi, 'database_manager' => CGI::Session::PStore)
|
|
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
|