summaryrefslogtreecommitdiff
path: root/lib/cgi/session.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/cgi/session.rb')
-rw-r--r--lib/cgi/session.rb189
1 files changed, 0 insertions, 189 deletions
diff --git a/lib/cgi/session.rb b/lib/cgi/session.rb
deleted file mode 100644
index 79ee0e3fef..0000000000
--- a/lib/cgi/session.rb
+++ /dev/null
@@ -1,189 +0,0 @@
-# Copyright (C) 2001 Yukihiro "Matz" Matsumoto
-# Copyright (C) 2000 Network Applied Communication Laboratory, Inc.
-# Copyright (C) 2000 Information-technology Promotion Agency, Japan
-
-require 'cgi'
-
-class CGI
- class Session
-
- attr_reader :session_id
-
- def Session::callback(dbman)
- lambda{
- dbman[0].close unless dbman.empty?
- }
- end
-
- def Session::create_new_id
- require 'digest/md5'
- md5 = Digest::MD5::new
- md5.update(String(Time::now))
- md5.update(String(rand(0)))
- md5.update(String($$))
- md5.update('foobar')
- md5.hexdigest[0,16]
- end
-
- def initialize(request, option={})
- session_key = option['session_key'] || '_session_id'
- id, = option['session_id']
- unless id
- if option['new_session']
- id = Session::create_new_id
- end
- end
- unless id
- id, = request[session_key]
- id = id.read if id.respond_to?(:read)
- unless id
- id, = request.cookies[session_key]
- end
- unless id
- if option.key?('new_session') and not option['new_session']
- raise ArgumentError, "session_key `%s' should be supplied"%session_key
- end
- id = Session::create_new_id
- end
- end
- @session_id = id
- dbman = option['database_manager'] || FileStore
- @dbman = dbman::new(self, option)
- request.instance_eval do
- @output_hidden = {session_key => id}
- @output_cookies = [
- Cookie::new("name" => session_key,
- "value" => id,
- "expires" => option['session_expires'],
- "domain" => option['session_domain'],
- "secure" => option['session_secure'],
- "path" => if option['session_path'] then
- option['session_path']
- elsif ENV["SCRIPT_NAME"] then
- File::dirname(ENV["SCRIPT_NAME"])
- else
- ""
- end)
- ]
- end
- @dbprot = [@dbman]
- ObjectSpace::define_finalizer(self, Session::callback(@dbprot))
- end
-
- def [](key)
- unless @data
- @data = @dbman.restore
- end
- @data[key]
- end
-
- def []=(key, val)
- unless @write_lock
- @write_lock = true
- end
- unless @data
- @data = @dbman.restore
- end
- @data[key] = val
- end
-
- def update
- @dbman.update
- end
-
- def close
- @dbman.close
- @dbprot.clear
- end
-
- def delete
- @dbman.delete
- @dbprot.clear
- end
-
- class FileStore
- def check_id(id)
- /[^0-9a-zA-Z]/ =~ id.to_s ? false : true
- end
-
- 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
- begin
- @f = open(path, "r+")
- rescue Errno::ENOENT
- @f = open(path, "w+")
- end
- end
-
- def restore
- unless @hash
- @hash = {}
- @f.flock File::LOCK_EX
- @f.rewind
- for line in @f
- line.chomp!
- k, v = line.split('=',2)
- @hash[CGI::unescape(k)] = CGI::unescape(v)
- end
- end
- @hash
- end
-
- def update
- return unless @hash
- @f.rewind
- for k,v in @hash
- @f.printf "%s=%s\n", CGI::escape(k), CGI::escape(String(v))
- end
- @f.truncate @f.tell
- end
-
- def close
- return if @f.closed?
- update
- @f.close
- end
-
- def delete
- path = @f.path
- @f.close
- File::unlink path
- end
- end
-
- class MemoryStore
- GLOBAL_HASH_TABLE = {}
-
- def initialize(session, option=nil)
- @session_id = session.session_id
- GLOBAL_HASH_TABLE[@session_id] ||= {}
- end
-
- def restore
- GLOBAL_HASH_TABLE[@session_id]
- end
-
- def update
- # don't need to update; hash is shared
- end
-
- def close
- # don't need to close
- end
-
- def delete
- GLOBAL_HASH_TABLE.delete(@session_id)
- end
- end
- end
-end