trackerプラグインの入力フォームからファイル添付ができなくなっている†
- 元タイトル: file形式を含む trackerのformで Runtime Errorが常に発生する
- ページ: BugTrack
- 投稿者: jjyun
- 優先順位: 低
- 状態: 完了
- カテゴリー: プラグイン
- 投稿日: 2004-08-21 (土) 11:52:05
- バージョン: 1.4.4rc1
メッセージ†
現在のtracker.inc.php のコードには、
selectやtextfieldとといった形式の他に、
「file」というファイルの添付フォームを
trackerの入力フォームに提供する形式が存在しています。
これはページの新規作成時に attach.inc.php を呼び出して、
指定されたファイルを、新規のページに添付する動作を行ってますが、
現在の処理では、ページの作成の前にファイルの添付処理を行っています。
そのため、先日のBugTrack/654での修正による、
存在しないページへのファイルの添付処理を制限により、
この機能を利用時に(trackerの入力フォームの形式のひとつに、
「file」形式にあたるフィールドがひとつでも定義すると)
attach.inc.php の制限によるRuntime errorが生じます。
ぱんださんのページでも紹介されてはいないので*1、どの程度 利用者がいるのか定かではありませんが、
attach.inc.php の制限を尊重しながら
trackerの上記機能を有効にするために、
以下のような修正案を考えてみました。
(修正案の概略)
- ファイルの添付処理の前に投稿ページを先に作成させます。
- 各項目の処理を行います(foreach~の部分)
- 投稿内容の書き込み時には、直前に作成したページのタイムスタンプを変更しないようにオプションで指定します。(foreach~後のpage_write()の部分)
(コード修正案)
function plugin_tracker_action()
{
:
$fields = plugin_tracker_get_fields($page,$refer,$config);
+ // 書き込み : attach.inc.php のセキュリティ対策の回避
+ // 空のコンテンツを書き込んでページを先に作成する
+ page_write($page," ");
foreach (array_keys($fields) as $key)
{
:
}
// 書き込み
- page_write($page,join('',$postdata));
+ page_write($page,join('',$postdata),TRUE);
(関連)
- 状況を確認しました。page_write() ほど重たい処理である必要はないので、page_write() で半角スペース一つ分のデータを書き込むのではなく、touch()で空のファイルを作る様にしました。touch()の場合、error_reporting を E_ALL にしていると、この処理の途中でis_freeze() で空のファイルを読み込む際に Noticeを出して動作が中断してしまいますが、それはis_freeze()やそれを呼んでいる部分の問題と考えます。 -- henoheno
- 詳細なレポートをありがとうございました :) -- henoheno
- 修正を確認しました。対応ありがとうござまいた。
空ファイルの作成方法の修正もありがとうございます。コメントでは「空ファイルの作成」としておきながら、半角スペースを書き出しているのは、まさにコメントを頂いた理由からでした。 -- jjyun
trackerプラグインから新規に追加したページが recent プラグインにリストアップされない†
- jjyunさんの提案された修正案ではpage_writeを2回呼んでいるのでage状態になりますが、実際には1回目のpage_writeはtouchでCVSにコミットされていて2回目のpage_writeは第3引数がtrueのままなのでsageの状態になりますがこれはそのような意図ですか? -- ishii
- (henohenoさんが回答を書いていただいているので蛇足にしかなりませんが)上記のコードのように2回 page_writeが必要なように書いた時には、1度のtrackerの投稿で2度目も投稿ページの更新時刻を変更する必要はないと私は考えたからです。CVSやage、sageといったことはわかりませんし考慮していませんでした。振舞いの確認時にページファイルの更新時刻の確認は行ってませんでした。*2 -- jjyun
- ちなみに、実際の書き込み時のpage_writeの第3引数を無しにしてもファイルの添付が出来ることを確認しています。 -- ishii
- こんにちは :) page_write() を1度しか呼んでいないのは、一度呼ぶだけで充分だからです。それ以外の意図はありません。 -- henoheno
- ファイル添付のオプションを用意したときとそうでないときとで、(ファイル添付自体には問題はないけれども)ページ追加時の挙動が異なっているということでしょうか? -- henoheno
- 新規のバグ報告があった時に最新のXX件に出なくなっているので、バグ報告されていることに気が付かないことがあって、なぜ第3引数にtrueが指定されているのか知りたいです。 -- ishii
- なるほど。これはこの話の最初に jjyun さんが「2回呼ぶから」 という意図で2回目にTRUE をつけた案を、私が消化して1つ目をtouch()にしたのだけれど、page_write()の引数はTRUEのままで問題無いと誤解したのが原因のようです。 -- henoheno
- 手元で挙動を把握しました。この件をきっかけにして、新規tracker文書(defaultの状態でも) が新規ページとして認知(age)されなくなったのじゃないかということですね。ちょっと確認します。 -- henoheno
- 確認しました。TRUEは余計です。外しましょう。このせいでrecent.datがすぐに更新されず、そのためにrecentプラグインが新しく追加したページをすぐに表示しない(他のページを更新すれば表示する)ため、trackerのユーザーを混乱させてしまいます。1.4.4rc2から1.4.4_php5 まではこの状況になっていると思います。 -- henoheno
- cvs:plugin/tracker.inc.php (v1.4:1.25)