From 2da2599e78e508f7807cf64117f4516abdfd0de9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Zurcher?= Date: Wed, 4 Jan 2012 16:10:29 +0100 Subject: Session: update to be rack session compatible --- lib/zorglub/session.rb | 143 ++++++++++++++++++++++++++++--------------------- 1 file changed, 81 insertions(+), 62 deletions(-) diff --git a/lib/zorglub/session.rb b/lib/zorglub/session.rb index 8162cf1..f47335a 100644 --- a/lib/zorglub/session.rb +++ b/lib/zorglub/session.rb @@ -6,97 +6,116 @@ module Zorglub # class Node # + @sessions = {} + # + class << self + attr_reader :sessions + end + # def session - @session ||= Session.new @request, @response + @session ||= SessionHash.new @request, @response, Node.sessions end end # - class SessionHash + class SessionHash < Hash # - @data = {} - class << self - attr_reader :data - def sid_exists? sid - not @data[sid].nil? - end + def initialize req, resp, sessions + @request = req + @response = resp + @sessions = sessions + @sid = nil + super() end # - attr_reader :sid - # - def initialize sid - @sid = sid - @session_data = SessionHash.data[sid]||={} + def [] key + load_data! + super key end # - def destroy! - SessionHash.data.delete @sid - @session_data = nil - @sid = nil + def has_key? key + load_data! + super key end + alias :key? :has_key? + alias :include? :has_key? # - def [] idx - @session_data[idx] + def []= key, value + load_data! + super key, value end # - def []= idx, v - @session_data[idx] = v + def clear + load_data! +# @response.delete_cookie Zorglub::Config.session_key +# @sessions.delete @sid +# @sid = nil + super end - end - # - class Session # - @key = 'zorglub.sid' - @kls = Zorglub::SessionHash - @sid_length = 64 + def to_hash + load_data! + h = {}.replace(self) + h.delete_if { |k,v| v.nil? } + h + end # - class << self - attr_accessor :key, :kls, :sid_length + def update hash + load_data! + super stringify_keys(hash) end # - def initialize req, resp - @request = req - @response = resp - @instance = nil + def delete key + load_data! + super key end # - def setup! - if Config.session_on - cookie = @request.cookies[Session.key] - if cookie.nil? - cookie = generate_sid - @response.set_cookie Session.key, cookie - end - @instance = Session.kls.new cookie + def inspect + if loaded? + super + else + "#<#{self.class}:0x#{self.object_id.to_s(16)} not yet loaded>" end end - private :setup! # - def destroy! - @response.delete_cookie Session.key - @instance.destroy! if @instance - @instance = nil + def exists? + ( loaded? ? @sessions.has_key?(@sid) : false ) end # - def sid - setup! if @instance.nil? - return nil if @instance.nil? - @instance.sid + def loaded? + not @sid.nil? end # - def [] idx - setup! if @instance.nil? - return nil if @instance.nil? - @instance[idx] + def empty? + load_data! + super end # - def []= idx, v - setup! if @instance.nil? - return nil if @instance.nil? - @instance[idx] = v + private + # + def load_data! + return if loaded? + if Config.session_on + sid = @request.cookies[Zorglub::Config.session_key] + if sid.nil? + sid = generate_sid! + @response.set_cookie Zorglub::Config.session_key, sid + end + replace @sessions[sid] ||={} + @sessions[sid] = self + @sid = sid + end + end + # + def stringify_keys other + hash = {} + other.each do |key, value| + hash[key] = value + end + hash end # - def generate_sid - begin sid = sid_algorithm end while Session.kls.sid_exists? sid + def generate_sid! + begin sid = sid_algorithm end while @sessions.has_key? sid sid end # @@ -106,7 +125,7 @@ module Zorglub # SecureRandom is available since Ruby 1.8.7. # For Ruby versions earlier than that, you can require the uuidtools gem, # which has a drop-in replacement for SecureRandom. - def sid_algorithm; SecureRandom.hex(Session.sid_length); end + def sid_algorithm; SecureRandom.hex(Zorglub::Config.session_sid_len); end rescue LoadError require 'openssl' # Using OpenSSL::Random for generation, this is comparable in performance @@ -114,7 +133,7 @@ module Zorglub # have the same behaviour as the SecureRandom::hex method of the # uuidtools gem. def sid_algorithm - OpenSSL::Random.random_bytes(Session.sid_length / 2).unpack('H*')[0] + OpenSSL::Random.random_bytes(Zorglub::Config.session_sid_len / 2).unpack('H*')[0] end rescue LoadError # Digest::SHA2::hexdigest produces a string of length 64, although -- cgit v1.1-2-g2b99