添付ファイルのリネーム時、バックアップファイルとログファイルがリネームがされない

メッセージ

内容

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'

実装


コメント



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-01-27 (水) 01:00:01
Site admin: PukiWiki Development Team

PukiWiki 1.5.3+ © 2001-2020 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u12. HTML convert time: 0.449 sec.

OSDN