skimemo


skimemo - 日記/2017-11-26/pukiwikiの添付ファイル問題

_ pukiwikiの添付ファイル問題

このblogはpukiwikiを使っているわけですが、最近サーバーの移行を行いました。
そしてその際にphpのバージョンアップをすると共にdefault_charserをtutf-8にしました。
そこで問題になったのが、そう、添付ファイル問題です。

現象としては、添付を実行しようとすると、

Runtime error Error message : No such page

と出て添付できないというものです。

解決策としてはエンコードを合わせろ、ということになっているのですが、他のサービスも動かしている関係上そう簡単に変更できません。
結局問題はattachプラグインなので、そこだけ修正することにしました。

原因は、ページ名がEUCで来るのに、htmlspecialcharsをUTF8でかけてしまい、ページが見つけられなくなるというものです。 従って、このhtmlspecialcharsにpukiwikiのエンコードの指定を付加します。

$s_page = htmlspecialchars($page);

$s_page = htmlspecialchars($page,ENT_COMPAT | ENT_HTML401,SOURCE_ENCODING);

でも、何カ所もあるので別途関数を作って全てそこに飛ばすようにしました。 そのパッチが以下です。
attach.patch

--- attach.inc.php.orig	2017-11-26 15:42:12.000000000 +0900
+++ attach.inc.php	2017-11-26 15:39:50.000000000 +0900
@@ -485,7 +485,7 @@
	global $script, $vars, $_attach_messages;

	$r_page = rawurlencode($page);
-	$s_page = htmlspecialchars($page);
+	$s_page = attach_htmlspecialchars($page);
	$navi = <<<EOD
  <span class="small">
   [<a href="$script?plugin=attach&amp;pcmd=list&amp;refer=$r_page">{$_attach_messages['msg_list']}</a>]
@@ -600,7 +600,7 @@
		$param  = '&amp;file=' . rawurlencode($this->file) . '&amp;refer=' . rawurlencode($this->page) .
			($this->age ? '&amp;age=' . $this->age : '');
		$title = $this->time_str . ' ' . $this->size_str;
-		$label = ($showicon ? PLUGIN_ATTACH_FILE_ICON : '') . htmlspecialchars($this->file);
+		$label = ($showicon ? PLUGIN_ATTACH_FILE_ICON : '') . attach_htmlspecialchars($this->file);
		if ($this->age) {
			$label .= ' (backup No.' . $this->age . ')';
		}
@@ -620,8 +620,8 @@
		global $script, $_attach_messages;

		$r_page = rawurlencode($this->page);
-		$s_page = htmlspecialchars($this->page);
-		$s_file = htmlspecialchars($this->file);
+		$s_page = attach_htmlspecialchars($this->page);
+		$s_file = attach_htmlspecialchars($this->file);
		$s_err = ($err == '') ? '' : '<p style="font-weight:bold">' . $_attach_messages[$err] . '</p>';

		$msg_rename  = '';
@@ -662,7 +662,7 @@
		}
		$info = $this->toString(TRUE, FALSE);
 
-		$retval = array('msg'=>sprintf($_attach_messages['msg_info'], htmlspecialchars($this->file)));
+		$retval = array('msg'=>sprintf($_attach_messages['msg_info'], attach_htmlspecialchars($this->file)));
		$retval['body'] = <<< EOD
<p class="small">
 [<a href="$script?plugin=attach&amp;pcmd=list&amp;refer=$r_page">{$_attach_messages['msg_list']}</a>]
@@ -809,7 +809,7 @@
				break;
			}
		}
-		$filename = htmlspecialchars($filename);
+		$filename = attach_htmlspecialchars($filename);

		ini_set('default_charset', '');
		mb_http_output('pass');
@@ -903,7 +903,7 @@
				$_files[$age] = $this->files[$file][$age]->toString(FALSE, TRUE);
			}
			if (! isset($_files[0])) {
-				$_files[0] = htmlspecialchars($file);
+				$_files[0] = attach_htmlspecialchars($file);
			}
			ksort($_files);
			$_file = $_files[0];
@@ -1188,4 +1188,9 @@

	return $files;
}
+
+// エンコード指定のhtmlspecialchars
+function attach_htmlspecialchars($str){
+	return htmlspecialchars($str,ENT_COMPAT | ENT_HTML401,SOURCE_ENCODING);
+}
?>
Category: [Linux] - 15:53:51



 
Last-modified: 2017-11-26 (日) 16:01:51 (1678d)