- 追加された行はこの色です。
- 削除された行はこの色です。
* bugtrack_list プラグインで、&と表示される [#b878c7d1]
- ページ: [[BugTrack2]]
- 投稿者: [[muu-muu-]]
- 優先順位: 低
- 状態: 提案
- カテゴリー: 本体バグ
- 投稿日: 2006-07-03 (月) 14:15:48
- バージョン:
** メッセージ [#j2ae6029]
bugtrack プラグインのサマリに、&を含む文字列を入力して追加します。
bugtrack_list プラグインで一覧を表示すると、サマリ中の&が、&となります。
[[BugTrack2]]で、[[BugTrack2/18]]のサマリを見ると、現象を確認できます。
**原因 [#d81774d4]
plugin_bugtrack_list_convert() の戻り値までは、正常だったのですが、その戻り値に対して、どこかで htmlspecialchars を多重に実行しているのだと思いますが、見つける事が出来ませんでした。
--------
- なるほど、お知らせいただきありがとうございます :) -- [[henoheno]] &new{2006-07-03 (月) 23:09:53};
- いろいろ試してわかったことを書きます。ていうか、試してみたけどわからなかっただけです。 -- &new{2007-05-03 (木) 04:44:16};
-- 'summary' 以外は正常に動作していそうです。~
「'summary', 'name', 'priority', 'state', 'category'」の5つの項目に"(ダブルクオート)を書いて試したところ、~
'summary'だけ " に変わっていました。~
テスト場所は、[[お試しサイト>test1.4:FrontPage]]です。何かの役に立つ・・・といいな。 -- &new{2007-05-03 (木) 04:44:16};
- ひと休みして調査してみたら原因がわかりました。 -- &new{2007-05-04 (金) 13:49:11};
//もし写し間違いがあった場合は、指摘をよろしくお願いします
-- 上のから、値を代入するときが怪しいので見てみました。
// $Id: bugtrack.inc.php,v 1.25 2005/04/03 03:33:47 henoheno Exp $
(中略)
function plugin_bugtrack_list_pageinfo($page, $no = NULL, $recurse = TRUE)
{
global $WikiName, $InterWikiName, $BracketName, $_plugin_bugtrack;
(中略)
$body = join("\n", $source);
foreach(array('summary', 'name', 'priority', 'state', 'category') as $item) {
$regex = '/-\s*' . preg_quote($_plugin_bugtrack[$item], '/') . '\s*:(.*)/';
if (preg_match($regex, $body, $matches)) {
if ($item == 'name') {
$$item = strip_bracket(trim($matches[1]));
} else {
$$item = trim($matches[1]);
}
} else {
$$item = ''; // Data not found
}
}
if (preg_match("/\*([^\n]*)/", $body, $matches)) {
$summary = $matches[1];
make_heading($summary);
}
return array($page, $no, $summary, $name, $priority, $state, $category);
}
$summary とそれ以外の大きな違いが、make_heading を使っているかどうかでした。そこで、試しに
if (preg_match("/\*([^\n]*)/", $body, $matches)) {
$summary = $matches[1];
make_heading($summary, FALSE);
としてみました。その結果、注釈が一覧に表示されるようになったものの、htmlspecialchars の多重実行は解消されました。~
もし、bugtrack.inc.php だけに修正範囲をとどめるのなら、こんなのはどうでしょう?
// $Id: bugtrack.inc.php,v 1.25 2005/04/03 03:33:47 henoheno Exp $
(中略)
function plugin_bugtrack_list_pageinfo($page, $no = NULL, $recurse = TRUE)
{
- global $WikiName, $InterWikiName, $BracketName, $_plugin_bugtrack;
+ global $WikiName, $InterWikiName, $BracketName, $_plugin_bugtrack, $NotePattern;
(中略)
if (preg_match("/\*([^\n]*)/", $body, $matches)) {
- $summary = $matches[1];
+ $summary = preg_replace($NotePattern, '', $matches[1]);
- make_heading($summary);
+ make_heading($summary, FALSE);
}
return array($page, $no, $summary, $name, $priority, $state, $category);
}
たぶん問題ないと思いますが、確認をお願いします。 -- &new{2007-05-04 (金) 13:49:11};
--- 全パラメータに対してhtmlspecialchars しているところから、$summary をはずすほうが簡単な気が。
-- これだけだと、どこでhtmlspecialchars を実行しているのかがわからないので、追跡調査をしてみました。
// $Id: html.php,v 1.59 2007/02/11 05:53:30 henoheno Exp $
(中略)
function make_heading(& $str, $strip = TRUE)
{
(中略)
// Cut footnotes and tags
if ($strip === TRUE)
$str = strip_htmltag(make_link(preg_replace($NotePattern, '', $str)));
return $id;
}
make_heading には、htmlspecialchars が無かったので、次にmake_link を見てみました。
// $Id: make_link.php,v 1.35 2006/09/30 02:10:50 henoheno Exp $
(中略)
// Hyperlink decoration
function make_link($string, $page = '')
{
global $vars;
static $converter;
if (! isset($converter)) $converter = new InlineConverter();
$clone = $converter->get_clone($converter);
return $clone->convert($string, ($page != '') ? $page : $vars['page']);
}
// Converters of inline element
class InlineConverter
{
var $converters; // as array()
var $pattern;
var $pos;
var $result;
(中略)
function convert($string, $page)
{
$this->page = $page;
$this->result = array();
$string = preg_replace_callback('/' . $this->pattern . '/x',
array(& $this, 'replace'), $string);
$arr = explode("\x08", make_line_rules(htmlspecialchars($string)));
$retval = '';
while (! empty($arr)) {
$retval .= array_shift($arr) . array_shift($this->result);
}
return $retval;
}
結論だけを書くためにかなり省略してますが、function convert の中にある
$arr = explode("\x08", make_line_rules(htmlspecialchars($string)));
の部分で1回実行していたようです。~
このプラグイン以外で「 make_heading($str [, TRUE]) 」 のように使っている場所が、同じような問題を抱えているかは調べていませんのであしからず。 -- &new{2007-05-04 (金) 13:49:11};
#comment