# Copyright (c) 2002-2003 HORIKAWA Hisashi. All rights reserved. # mailto:vzw00011@nifty.ne.jp # http://www.nslabs.jp/ require "cgi/session" class File def File.rel2abs(rel_path, this_file) File.expand_path(rel_path, File.dirname(File.expand_path(this_file))) end end require File.rel2abs("./datesup.rb", __FILE__) class CGI module QueryExtension if $COMPAT_VERSION && $COMPAT_VERSION < '1.8.0' def [](key) return @params[key] end elsif RUBY_VERSION == '1.8.1' def [](key) value = @params[key].first if @multipart if value return value elsif defined?(StringIO) StringIO.new("") else Tempfile.new("CGI") end else return value || "" end end end def file_control(key) io, = @params[key] if !io return nil elsif !defined?(io.read) raise RuntimeError, "The enctype attribute must be 'multipart/form-data.'" else return io end end # @return control value or "" def get(key, default = "") value, = @params[key] if defined?(value.read) r = value.read return r != "" ? r : default else return value || default end end end end if RUBY_VERSION == '1.8.1' class CGI class Session class FileStore def delete path = @f.path @f.close File.unlink path.untaint end end end end end # メニューコントロールを生成する # @param name select要素の名前 # @param options 選択肢のvalueの配列(eachメソッドを持つオブジェクト) # @param default 初期状態で選択されるvalue # @param block 選択肢の表示文字列 def menu_control(name, options, default = nil) s = "" return s end class CGI class Session include Enumerable class FileStore # セッション保存ファイルのうち,古いものを削除する # @param option オプションを格納したハッシュ。tmpdir,holdtime必須。 def FileStore.sweep_sessions(option) dir = option['tmpdir'] prefix = option['prefix'] || '' holdtime = option['holdtime'] raise ArgumentError, "no tmpdir option" if !dir raise ArgumentError, "no holdtime option" if !holdtime now = Time.now Dir.glob(dir + "/" + prefix + "*") {|fname| fname.untaint File.open(fname, "r") {|fp| # ロックはしない fp.each_line {|line| k, v = line.chomp.split('=', 2) if k == CGI.unescape("_last-accessed") if CGI.unescape(v) != "" && ParseDate.get_time(CGI.unescape(v)) + holdtime < now File.unlink fp.path.untaint break end end } } } end # @param option オプションを格納したハッシュ。tmpdir必須。 # @return セッションファイルが存在したらtrue def FileStore.exist?(id, option) dir = option['tmpdir'] prefix = option['prefix'] || '' raise ArgumentError, "no tmpdir option" if !dir raise ArgumentError, "session_id '#{id}' is invalid" if /[^0-9a-zA-Z]/ =~ id.to_s id.untaint return FileTest.exist?(dir + "/" + prefix + id) end end # of Session::FileStore def Session.exist?(request, option) session_key = option['session_key'] || '_session_id' id, = request[session_key] id, = request.cookies[session_key] if !id if id dbman = option['database_manager'] || FileStore return dbman.exist?(id, option) else return false end end # セッションが存在すればSessionインスタンスを、そうでなければnilを返す def Session.get(request, option) session_key = option['session_key'] || '_session_id' id, = request[session_key] id, = request.cookies[session_key] if !id if id dbman = option['database_manager'] || FileStore return Session.new(request, option) if dbman.exist?(id, option) end return nil end def Session.sweep(option) dbman = option['database_manager'] || FileStore dbman.sweep_sessions(option) end def update_access_time() self["_last-accessed"] = CGI.rfc1123_date(Time.now) end def each() if !@data @data = @dbman.restore end @data.each {|k, v| if k != "_last-accessed" yield k, v end } end end end