summaryrefslogtreecommitdiff
path: root/packages/backend/src/misc
diff options
context:
space:
mode:
authortamaina <tamaina@hotmail.co.jp>2023-08-08 13:24:30 +0900
committerGitHub <noreply@github.com>2023-08-08 13:24:30 +0900
commitf6a3f6f5f10734c50e6c00b410d7ea12d1d8f505 (patch)
tree1f9d21b9d50f5f6c9a54515ae0e5bfe89a0698be /packages/backend/src/misc
parentfix: muteがapiからのuser list timeline取得で機能しない (#11480) (diff)
downloadmisskey-f6a3f6f5f10734c50e6c00b410d7ea12d1d8f505.tar.gz
misskey-f6a3f6f5f10734c50e6c00b410d7ea12d1d8f505.tar.bz2
misskey-f6a3f6f5f10734c50e6c00b410d7ea12d1d8f505.zip
enhance(backend): Improve behavior of correctFilename (#11484)
* enhance(backend): Improve behavior of correctFilename * :v: * 未知のファイル形式かつ拡張子がある場合は何もしない * :v: * .ext --------- Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
Diffstat (limited to 'packages/backend/src/misc')
-rw-r--r--packages/backend/src/misc/correct-filename.ts54
1 files changed, 45 insertions, 9 deletions
diff --git a/packages/backend/src/misc/correct-filename.ts b/packages/backend/src/misc/correct-filename.ts
index a702f0be0d..34cb458a2c 100644
--- a/packages/backend/src/misc/correct-filename.ts
+++ b/packages/backend/src/misc/correct-filename.ts
@@ -3,18 +3,54 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
-// 与えられた拡張子とファイル名が一致しているかどうかを確認し、
-// 一致していない場合は拡張子を付与して返す
+/**
+ * Array.includes()よりSet.has()の方が高速
+ */
+const targetExtsToSkip = new Set([
+ '.gz',
+ '.tar',
+ '.tgz',
+ '.bz2',
+ '.xz',
+ '.zip',
+ '.7z',
+]);
+
+const extRegExp = /\.[0-9a-zA-Z]+$/i;
+
+/**
+ * 与えられた拡張子とファイル名が一致しているかどうかを確認し、
+ * 一致していない場合は拡張子を付与して返す
+ *
+ * extはfile-typeのextを想定
+ */
export function correctFilename(filename: string, ext: string | null) {
- const dotExt = ext ? ext.startsWith('.') ? ext : `.${ext}` : '.unknown';
- if (filename.endsWith(dotExt)) {
- return filename;
- }
- if (ext === 'jpg' && filename.endsWith('.jpeg')) {
- return filename;
+ const dotExt = ext ? ext[0] === '.' ? ext : `.${ext}` : '.unknown';
+
+ const match = extRegExp.exec(filename);
+ if (!match || !match[0]) {
+ // filenameが拡張子を持っていない場合は拡張子をつける
+ return `${filename}${dotExt}`;
}
- if (ext === 'tif' && filename.endsWith('.tiff')) {
+
+ const filenameExt = match[0].toLowerCase();
+ if (
+ // 未知のファイル形式かつ拡張子がある場合は何もしない
+ ext === null ||
+ // 拡張子が一致している場合は何もしない
+ filenameExt === dotExt ||
+
+ // jpeg, tiffを同一視
+ dotExt === '.jpg' && filenameExt === '.jpeg' ||
+ dotExt === '.tif' && filenameExt === '.tiff' ||
+
+ // 圧縮形式っぽければ下手に拡張子を変えない
+ // https://github.com/misskey-dev/misskey/issues/11482
+ targetExtsToSkip.has(dotExt)
+ ) {
return filename;
}
+
+ // 拡張子があるが一致していないなどの場合は拡張子を付け足す
return `${filename}${dotExt}`;
}