[Date Prev][Date Next][Thread Prev][][Date Index][Thread Index]

Re: Hiki::PermissionError



青田です。

TSUCHIYA Masatoshi <tsuchiya@xxxxxxxxxx> writes:

> emacs-w3m の CVS 先端で HiKi のページを編集すると,
>
>     Error
>     Hiki::PermissionError
>
> というエラーが出てしまいます.同じ WiKi に Firefox で書き込むと大丈夫なの
> で,どうもブラウザ側の問題のようです.
>
> 再現性がない上に,apache の error.log にも何も情報が出なくて困っているの
> ですが,どなたか同様の問題に遭遇された方はいらっしゃいませんか?

Hiki は使う機会がないので、この問題に遭遇したことはないのですがとりあえず
Hiki のソースにあたってみました。 結論から言いますと Hiki 側のバグなんじゃ
ないかなと思います。

おそらくこのエラーは以下の部分からのものです。 (hiki/command.rb から)

    def cmd_save( page, text, md5hex, update_timestamp = true )
      raise PermissionError if @plugin.session_id && @plugin.session_id != @cgi['session_id']

@cgi['session_id'] は POST の引数 session_id の値で @plugin.session_id は
以下のように設定されています。(同じく hiki/command.rb から)

      @plugin = Plugin::new( options, @conf )
      session_id = @cgi.cookies['session_id'][0]
      if session_id
        session = Hiki::Session::new( @conf, session_id )
        if session.check
          @plugin.user = session.user
          @plugin.session_id = session_id
        end
      end
      if @conf.use_session && !@xxxxxxxxxxxxxxxxx
        session = Hiki::Session::new( @conf )
        session.save
        @plugin.session_id = session.session_id
        @plugin.add_cookie( session_cookie( @plugin.session_id ))
      end
      @body_enter = @plugin.body_enter_proc
    end

ここで、 cookie から session_id をとれても cookie の session_id の有効期
限(デフォルトでは一時間)を更新しにいかないので以下のような、ユーザからす
ると奇妙なことが起こりえます。 (左の数字は時間経過です。)

0:00 最初のページを編集開始
      => cookie がないので session_id を発行
         session_id = '12345' のような cookie をうけとる。
         form には <input type="hidden" name="session_id" value="12345">
         がはいる。
0:10 編集終了
     => cookie の session_id と form の session_id が一致するので正常に
        処理される。

あちこちながめる

0:55 別のページを編集開始
     => cookie が残っているので form には 
        <input type="hidden" name="session_id" value="12345"> 
        がはいる。
1:05 編集終了
     => 前の cookie が消えてしまっているので session_id が再発行される。
        @plugin.session_id != @cgi['session_id'] となってしまい PermissionError 発生。

ということで、 Hiki にこんな patch をあてるとうまくいきそうです。

diff -u hiki/command.rb~ hiki/command.rb
--- hiki/command.rb~	2007-06-24 03:50:41.000000000 +0900
+++ hiki/command.rb	2008-07-18 23:47:33.000000000 +0900
@@ -65,6 +65,7 @@
         if session.check
           @plugin.user = session.user
           @plugin.session_id = session_id
+          @plugin.add_cookie( session_cookie( @plugin.session_id ))
         end
       end
       if @conf.use_session && !@xxxxxxxxxxxxxxxxx

長々と書きましたが外していたらすみません。

--
青田