[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Hiki::PermissionError
- From: Naohiro Aota <nao.aota@xxxxxxxxx>
- Date: Fri, 18 Jul 2008 23:59:31 +0900
- X-ml-name: emacs-w3m
- X-mail-count: 10307
- References: <87tzenhak6.fsf@xxxxxxxxxxxxxxxxxxxxxxx>
青田です。
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
長々と書きましたが外していたらすみません。
--
青田