#author("2016-12-15T02:17:38+09:00","","") #author("2016-12-15T02:18:07+09:00","","") RIGHT:&size(12){Category:[[:Plugin]]}; * bugtrack_list プラグインで、&と表示される [#b878c7d1] - ページ: [[BugTrack2]] - 投稿者: [[muu-muu-]] - 優先順位: 低 - 状態: 提案 - 状態: 完了 - カテゴリー: 本体バグ - 投稿日: 2006-07-03 (月) 14:15:48 - バージョン: - バージョン: 1.4.7 - リリース予定バージョン: 1.5.2 ** メッセージ [#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}; - 対応しました。summaryはhtmlscしないようにしました [[commit:2373432c61]] -- [[umorigu]] &new{2016-12-15 (木) 02:17:38}; #comment