attachプラグインで添付ファイルのリネームができますが、物理ファイルのリネームは最新の1ファイルのみにしか行われておらず、過去に削除されたバックアップファイル(拡張子 .1, .2, ...)とステータスファイル(拡張子 .log)のリネームが行われていません。
結果として、バックアップファイルが失われる、ダウンロードカウンタがリセットされる、などの不具合が発生します。
diff --git a/attach.inc.php b/attach.inc.php --- a/attach.inc.php +++ b/attach.inc.php @@ -672,10 +672,40 @@ if (file_exists($newbase)) { return array('msg'=>$_attach_messages['err_exists']); } - if (! PLUGIN_ATTACH_RENAME_ENABLE || ! rename($this->basename, $newbase)) { + if (! PLUGIN_ATTACH_RENAME_ENABLE) { return array('msg'=>$_attach_messages['err_rename']); + } else { + if (! rename($this->basename, $newbase)) { + return array('msg'=>$_attach_messages['err_rename']); + } + // リネーム成功 + // バックアップファイル・ログファイルもリネームする + // エラー処理は省略 + $rename_targets = array(); + if ($dir = opendir(UPLOAD_DIR)) { + $matches_leaf = array(); + if (preg_match('/(((?:[0-9A-F]{2})+)_((?:[0-9A-F]{2})+))$/', $this->basename, $matches_leaf)) { + $attachfile_leafname = $matches_leaf[1]; + $attachfile_leafname_pattern = preg_quote($attachfile_leafname, '/'); + $pattern = "/^({$attachfile_leafname_pattern})(\.((\d+)|(log)))$/"; + + $matches = array(); + while ($file = readdir($dir)) { + if (! preg_match($pattern, $file, $matches)) + continue; + $basename2 = $matches[0]; + $newbase2 = $newbase . $matches[2]; + $rename_targets[$basename2] = $newbase2; + } + } + closedir($dir); + } + foreach ($rename_targets as $basename2=>$newbase2) { + $basename2path = UPLOAD_DIR . $basename2; + echo "rename '$basename2path' to '$newbase2'<br>\n"; + rename($basename2path, $newbase2); + } } - return array('msg'=>$_attach_messages['msg_renamed']); }
バックアップファイルを持つ a.txt を b.txt にリネームしたとき:
rename 'attach/41_612E747874.1' to 'attach/41_622E747874.1' rename 'attach/41_612E747874.log' to 'attach/41_622E747874.log'
if (! rename($this->basename, $newbase)) { return array('msg'=>$_attach_messages['err_rename']); }のようなエラーメッセージ処理を入れていないという意味かなとエスパーしてみる -- 2011-05-09 (月) 03:40:39