#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

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Site admin: PukiWiki Development Team

PukiWiki 1.5.4+ © 2001-2022 PukiWiki Development Team. Powered by PHP 8.2.12. HTML convert time: 0.069 sec.

SourceForge