日本語などのマルチバイトを名前に含むファイルをアップロードすると、WWW ブラウザによってはダウンロード時にファイル名の文字化けを起こします。ということで、マルチバイトファイル名でのアップロードを禁止してみました。
修正は少なめ。
lib/uploadlib.php の validate_file() を修正します。以下のようにコードを追加。
if (empty($file)) { return false; } // ここから if (!mb_check_encoding($file['name'], "ASCII")) { $file['uploadlog'] .= "\n".get_string("multibytefilename"); return false; } // ここまで if (!is_uploaded_file($file['tmp_name']) || $file['size'] == 0) { $file['uploadlog'] .= "\n".$this->get_file_upload_error($file); return false; }
get_string() で取得するエラーメッセージを lang/ja_utf8/moodle.php と lang/en_utf8/moodle.php に追加します。
$string["multibytefilename"] = '日本語を含む名前のファイルはアップロードできません。ファイル名は半角英数字記号のみ許可されています。';
あやしい英語ですがご勘弁…。
$string["multibytefilename"] = 'Multi-byte character(s) is used in this file name. A file name must consist of ONLY ASCII characters.';
mb_check_encoding() がちょっとあやしかったり、ASCII でええんかい、という話もありますが、とりあえず…。
(2011年04月15日 追記)
リネームも禁止しとかないと。 files/index.php を以下のように修正。
case "rename": if (($name != '') and confirm_sesskey() ){ html_header($course, $wdir); $name = clean_filename($name); if (!mb_check_encoding($name, "ASCII")) { echo "<center>" . get_string("multibytefilename") . "</center>"; } else if (file_exists($basedir.$wdir."/".$name)) { echo "<center>Error: $name already exists!</center>";