まつもと ゆきひろです

In message "Re: [ruby-list:40419] Re: 1.8のcgi/session.rb"
    on Tue, 14 Dec 2004 12:19:10 +0900, 植田裕之 <ueda / netforest.ad.jp> writes:

|> ということは、まとめると(デフォルトでは)[ruby-list:40368]
|> ように強制的に新しいセッションを開始しちゃうのがよさそうとい
|> うことなんでしょうか。
|
|としていただければ、志村さんの要望も満たされるのではありませんか? 議論
|に追いついていけてないのに投稿して申し訳ありませんが、ザッと考えた限りで
|[ruby-list:40368] のような仕様だとありがたいなぁ、とうちの rubyist と
|話しておりました。

こんな感じでしょうか。

手元の簡単なスクリプトで試験しただけなので、実験結果の報告は
大歓迎です。この修正はdatabase_manager で対応しなければ元の
穴が残るという点では筋がよくありませんが(標準添付でない
database_managerが既に存在するから)、他の方法は思いつきませ
んでした。

Index: lib/cgi/session.rb
===================================================================
RCS file: /var/cvs/src/ruby/lib/cgi/session.rb,v
retrieving revision 1.34
diff -p -u -1 -r1.34 session.rb
--- lib/cgi/session.rb	29 Nov 2004 06:09:39 -0000	1.34
+++ lib/cgi/session.rb	14 Dec 2004 03:36:02 -0000
@@ -157,2 +157,5 @@ class CGI
 
+    #:nodoc:
+    class NoSession < RuntimeError; end
+
     # The id of this session.
@@ -245,17 +248,17 @@ class CGI
       session_key = option['session_key'] || '_session_id'
-      id = option['session_id']
-      unless id
+      session_id = option['session_id']
+      unless session_id
 	if option['new_session']
-	  id = create_new_id
+	  session_id = create_new_id
 	end
       end
-      unless id
+      unless session_id
 	if request.key?(session_key)
-	  id = request[session_key] 
-	  id = id.read if id.respond_to?(:read)
+	  session_id = request[session_key] 
+	  session_id = session_id.read if session_id.respond_to?(:read)
 	end
-	unless id
-	  id, = request.cookies[session_key]
+	unless session_id
+	  session_id, = request.cookies[session_key]
 	end
-	unless id
+	unless session_id
 	  if option.key?('new_session') and not option['new_session']
@@ -263,13 +266,18 @@ class CGI
 	  end
-	  id = create_new_id
+	  session_id = create_new_id
 	end
       end
-      @session_id = id
+      @session_id = session_id
       dbman = option['database_manager'] || FileStore
-      @dbman = dbman::new(self, option)
+      begin
+        @dbman = dbman::new(self, option)
+      rescue NoSession
+        session_id = @session_id = create_new_id
+        retry
+      end
       request.instance_eval do
-	@output_hidden = {session_key => id}
+	@output_hidden = {session_key => session_id}
 	@output_cookies =  [
           Cookie::new("name" => session_key,
-		      "value" => id,
+		      "value" => session_id,
 		      "expires" => option['session_expires'],
@@ -373,3 +381,3 @@ class CGI
           unless session.new_session
-            raise RuntimeError, "uninitialized session"
+            raise CGI::Session::NoSession, "uninitialized session"
           end
@@ -443,3 +451,3 @@ class CGI
           unless session.new_session
-            raise RuntimeError, "uninitialized session"
+            raise CGI::Session::NoSession, "uninitialized session"
           end
Index: lib/cgi/session/pstore.rb
===================================================================
RCS file: /var/cvs/src/ruby/lib/cgi/session/pstore.rb,v
retrieving revision 1.7
diff -p -u -1 -r1.7 pstore.rb
--- lib/cgi/session/pstore.rb	19 Nov 2004 16:59:11 -0000	1.7
+++ lib/cgi/session/pstore.rb	14 Dec 2004 03:36:02 -0000
@@ -65,3 +65,3 @@ class CGI
           unless session.new_session
-            raise RuntimeError, "uninitialized session"
+            raise CGI::Session::NoSession, "uninitialized session"
           end