新規ページ初回保存直後において、そのページの参照権限レベルの読み出し値が誤った値となる。
- 投稿者: ぐうます
- カテゴリ: 本体
- 優先度: 重要
- 状態: リリース済
- 日時: 2007年03月03日 20時40分50秒
概要
新規に入力したページを初めて保存した直後、save_after hook に登録された処理内において、直前に保存したページの参照権限レベルを読み出すとき、「ページの参照権限のデフォルト値」とは異なる値が戻ってくるようです。
背景
上記現象は、次の不具合の原因を追っていった結果として見つかったものです。
- 自サイトにて、BugTrack-plugin/325 RSS関連プラグインを使用して RSS を生成しているのですが、「ログインユーザのみ参照可能」なページの情報が RSS に出力されてしまうことがありました。しかし、RSS のキャッシュを消して再度生成すると正しい結果が得られるのです。
- 現象を追っていくと、新規ページの内容を入力後、初めて保存した直後にそのページの情報が RSS に出力されることが分かりました。そこで、RSS 生成中にページ参照権限レベルをチェックしている箇所で get_page_level() の戻り値を見てみると、直前に保存した新規ページでは参照権限の戻り値として「誰でも参照可能」が返ってくることが分かりました。自サイトでは、ページの参照権限のデフォルト値を「ログインユーザのみ参照可能」に設定して運用しているので、この戻り値は正しい値ではなく、これが RSS に新規ページの情報が出力される直接原因であることが判明しました。
原因箇所
- 原因箇所としては、lib/Wiki/DefaultStorage.pm の get_page_level() だと考えています。ソースファイルから抜粋して下記に示します。
-- lib/Wiki/DefaultStorage.pm より get_page_level() --
#============================================================================== # <p> # ページの参照レベルを取得します。 # </p> #============================================================================== sub get_page_level { my $self = shift; my $page = shift; my $path = shift; if(!defined($path)){ $path = ""; } unless(defined($self->{"$path:show_level"})){ # config_dirを差し替えて実行 my $configdir = $self->{wiki}->config('config_dir'); if($path ne ""){ $self->{wiki}->config('config_dir',"$configdir/$path"); } $self->{"$path:show_level"} = &Util::load_config_hash($self->{wiki},"showlevel.log"); # config_dirを元に戻す $self->{wiki}->config('config_dir',$configdir); } if(defined($page)){ if(defined($self->{"$path:show_level"}->{$page})){ return $self->{"$path:show_level"}->{$page}; } else { #return $self->{wiki}->config('refer_level'); return 0; } } else { return $self->{"$path:show_level"}; } }
- 処理内容を見ると、ページ参照権限の情報がハッシュとして存在しない場合にはファイルから読み出してハッシュを生成した後、ハッシュからページの参照権限レベルを読み出しているのですが、ハッシュ上にそのページの参照権限レベルが定義されていないとき、無条件で 0 (=「誰でも参照可能」)を返しています。
- とりあえず、上記不具合では「ハッシュ上にそのページの参照権限レベルが定義されていないとき」に該当するようなので、無条件で 0 を返す代わりにページの参照権限のデフォルト値 $self->{wiki}->config('refer_level') を返すように
#return $self->{wiki}->config('refer_level'); return 0;
を
return $self->{wiki}->config('refer_level'); #return 0;
と変更したところ、不具合は起きなくなりました。
- ソースファイルを追った範囲では、ハッシュ $self->{"$path:show_level"} は、一度作成されると更新されないように見えます。BugTrack-plugin/325 では、save_after hook に RSS 生成処理を登録しておくことによってページ保存直後に RSS を生成しているので、新規ページ保存前にハッシュ $self->{"$path:show_level"} が作られると、ページ保存処理によって追加された新規ページの参照権限レベルがハッシュには反映されないので、上記現象が起こるのではないかと考えています。
開発者の方に質問
上記変更による副作用等はないでしょうか? もともとコメントアウトしてあったのは何か理由があってのことだと思いますので、そこが不安です。
備考
- より正しくは、ページ保存処理によってハッシュ $self->{"$path:show_level"} が更新されることではないかと思うのですが、get_page_level() と異なり set_page_level() は引数 $path をとらないのでどう直すべきかは分かりませんでした。
- 調べたソースファイルは、FreeStyle Wiki 3.6.2 のものです。
コメント
- 返事が遅れて申し訳ないです。正しい修正箇所は以下の部分かと思われます。 - KG (2007年03月16日 19時08分59秒)
--- DefaultStorage.pm.org Sun Jul 02 18:10:04 2006 +++ DefaultStorage.pm Fri Mar 16 18:54:19 2007 @@ -576,6 +576,7 @@ delete($all->{$page}); } &Util::save_config_hash($self->{wiki},"showlevel.log",$all); + $self->{":show_level"} = $all; } #==============================================================================
- 上記修正箇所は、set_page_level() 内です。保存処理で set_page_level が呼び出されますが、save_after フックを含む後続処理にて get_page_level を使用している場合は、set_page_level の値が反映されていません。上記修正によって、set_page_level における変更値で置き換えるようになりますので正しい設定値が返るようになると思います。 - KG (2007年03月16日 19時17分55秒)
- ご回答ありがとうございます。やはり、set_page_level() 内を直すのが正しいのですね。get_page_level() 内の $path の効果が未だ理解できていないのですが($path が "" でない場合って、":" を含むページ名のときなんですよね...)、とりあえず解が分かってホッとしました。ありがとうございました。 - ぐうます (2007年03月17日 09時34分22秒)
- KGさんのCVSに修正をコミットしておきました。 - たけぞう (2007年12月31日 11時48分38秒)
- 3.6.3でリリースしました。 - たけぞう (2008年12月14日 23時31分31秒)
最終更新時間:2008年12月14日 23時31分31秒