From 1008fa32a059f4c66c17a2ab77c3d5595d998233 Mon Sep 17 00:00:00 2001
From: syuilo <4439005+syuilo@users.noreply.github.com>
Date: Thu, 22 Aug 2024 14:03:11 +0900
Subject: [PATCH 1/5] better boot error screen
---
packages/backend/src/server/web/boot.js | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/packages/backend/src/server/web/boot.js b/packages/backend/src/server/web/boot.js
index 4275dc9527..5e52360456 100644
--- a/packages/backend/src/server/web/boot.js
+++ b/packages/backend/src/server/web/boot.js
@@ -176,10 +176,10 @@
Reload / リロード
The following actions may solve the problem. / 以下を行うと解決する可能性があります。
- Clear the browser cache / ブラウザのキャッシュをクリアする
Update your os and browser / ブラウザおよびOSを最新バージョンに更新する
Disable an adblocker / アドブロッカーを無効にする
- (Tor Browser) Set dom.webaudio.enabled to true / dom.webaudio.enabledをtrueに設定する
+ Clear the browser cache / ブラウザのキャッシュをクリアする
+ (Tor Browser) Set dom.webaudio.enabled to true / dom.webaudio.enabledをtrueに設定する
Other options / その他のオプション
@@ -212,7 +212,7 @@
ERROR CODE: ${code}
- ${JSON.stringify(details)}
`;
+ ${details.toString()} ${JSON.stringify(details)}
`;
errorsElement.appendChild(detailsElement);
addStyle(`
* {
From f85aa7b6415eaf61d213deb370f598f603f3fe9b Mon Sep 17 00:00:00 2001
From: syuilo <4439005+syuilo@users.noreply.github.com>
Date: Fri, 23 Aug 2024 16:29:05 +0900
Subject: [PATCH 2/5] =?UTF-8?q?fix(backend):=20=E3=83=95=E3=82=A1=E3=82=A4?=
=?UTF-8?q?=E3=83=AB=E3=81=8C=E3=82=B5=E3=82=A4=E3=82=BA=E3=81=AE=E5=88=B6?=
=?UTF-8?q?=E9=99=90=E3=82=92=E8=B6=85=E3=81=88=E3=81=A6=E3=82=A2=E3=83=83?=
=?UTF-8?q?=E3=83=97=E3=83=AD=E3=83=BC=E3=83=89=E3=81=95=E3=82=8C=E3=81=9F?=
=?UTF-8?q?=E9=9A=9B=E3=81=AB=E3=82=A8=E3=83=A9=E3=83=BC=E3=82=92=E8=BF=94?=
=?UTF-8?q?=E3=81=95=E3=81=AA=E3=81=8B=E3=81=A3=E3=81=9F=E5=95=8F=E9=A1=8C?=
=?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
CHANGELOG.md | 2 +-
packages/backend/src/server/api/ApiCallService.ts | 10 +++++++++-
2 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index da204c9198..ad070cc981 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,7 +7,7 @@
-
### Server
--
+- ファイルがサイズの制限を超えてアップロードされた際にエラーを返さなかった問題を修正
## 2024.8.0
diff --git a/packages/backend/src/server/api/ApiCallService.ts b/packages/backend/src/server/api/ApiCallService.ts
index 47f64f6609..ea852d590d 100644
--- a/packages/backend/src/server/api/ApiCallService.ts
+++ b/packages/backend/src/server/api/ApiCallService.ts
@@ -199,9 +199,17 @@ export class ApiCallService implements OnApplicationShutdown {
return;
}
- const [path] = await createTemp();
+ const [path, cleanup] = await createTemp();
await stream.pipeline(multipartData.file, fs.createWriteStream(path));
+ // ファイルサイズが制限を超えていた場合
+ if (multipartData.file.truncated) {
+ cleanup();
+ reply.code(413);
+ reply.send();
+ return;
+ }
+
const fields = {} as Record;
for (const [k, v] of Object.entries(multipartData.fields)) {
fields[k] = typeof v === 'object' && 'value' in v ? v.value : undefined;
From 2f009f7d49e2468da6950c7ff8448565b095df38 Mon Sep 17 00:00:00 2001
From: syuilo <4439005+syuilo@users.noreply.github.com>
Date: Fri, 23 Aug 2024 16:31:16 +0900
Subject: [PATCH 3/5] add note
---
packages/backend/src/server/api/ApiCallService.ts | 1 +
1 file changed, 1 insertion(+)
diff --git a/packages/backend/src/server/api/ApiCallService.ts b/packages/backend/src/server/api/ApiCallService.ts
index ea852d590d..f95c272757 100644
--- a/packages/backend/src/server/api/ApiCallService.ts
+++ b/packages/backend/src/server/api/ApiCallService.ts
@@ -203,6 +203,7 @@ export class ApiCallService implements OnApplicationShutdown {
await stream.pipeline(multipartData.file, fs.createWriteStream(path));
// ファイルサイズが制限を超えていた場合
+ // なお truncated はストリームを読み切ってからでないと機能しないため、stream.pipeline より後にある必要がある
if (multipartData.file.truncated) {
cleanup();
reply.code(413);
From 8032a4e12ad0425b3a2b4d7a857f12de656a718d Mon Sep 17 00:00:00 2001
From: syuilo <4439005+syuilo@users.noreply.github.com>
Date: Fri, 23 Aug 2024 16:40:11 +0900
Subject: [PATCH 4/5] =?UTF-8?q?enhance(frontend):=20=E3=82=B5=E3=82=A4?=
=?UTF-8?q?=E3=82=BA=E5=88=B6=E9=99=90=E3=82=92=E8=B6=85=E9=81=8E=E3=81=99?=
=?UTF-8?q?=E3=82=8B=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E3=82=92=E3=82=A2?=
=?UTF-8?q?=E3=83=83=E3=83=97=E3=83=AD=E3=83=BC=E3=83=89=E3=81=97=E3=82=88?=
=?UTF-8?q?=E3=81=86=E3=81=A8=E3=81=97=E3=81=9F=E9=9A=9B=E3=81=AB=E3=82=A8?=
=?UTF-8?q?=E3=83=A9=E3=83=BC=E3=82=92=E5=87=BA=E3=81=99=E3=82=88=E3=81=86?=
=?UTF-8?q?=E3=81=AB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
CHANGELOG.md | 2 +-
packages/backend/src/config.ts | 4 ++--
packages/backend/src/core/DownloadService.ts | 2 +-
.../backend/src/core/entities/MetaEntityService.ts | 1 +
packages/backend/src/models/json-schema/meta.ts | 4 ++++
packages/backend/src/server/api/ApiServerService.ts | 2 +-
packages/frontend/src/scripts/upload.ts | 10 ++++++++++
packages/misskey-js/src/autogen/types.ts | 1 +
8 files changed, 21 insertions(+), 5 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ad070cc981..6359033c1b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,7 +4,7 @@
-
### Client
--
+- サイズ制限を超過するファイルをアップロードしようとした際にエラーを出すように
### Server
- ファイルがサイズの制限を超えてアップロードされた際にエラーを返さなかった問題を修正
diff --git a/packages/backend/src/config.ts b/packages/backend/src/config.ts
index 3e5a1e81cd..cff0194780 100644
--- a/packages/backend/src/config.ts
+++ b/packages/backend/src/config.ts
@@ -133,7 +133,7 @@ export type Config = {
proxySmtp: string | undefined;
proxyBypassHosts: string[] | undefined;
allowedPrivateNetworks: string[] | undefined;
- maxFileSize: number | undefined;
+ maxFileSize: number;
clusterLimit: number | undefined;
id: string;
outgoingAddress: string | undefined;
@@ -250,7 +250,7 @@ export function loadConfig(): Config {
proxySmtp: config.proxySmtp,
proxyBypassHosts: config.proxyBypassHosts,
allowedPrivateNetworks: config.allowedPrivateNetworks,
- maxFileSize: config.maxFileSize,
+ maxFileSize: config.maxFileSize ?? 262144000,
clusterLimit: config.clusterLimit,
outgoingAddress: config.outgoingAddress,
outgoingAddressFamily: config.outgoingAddressFamily,
diff --git a/packages/backend/src/core/DownloadService.ts b/packages/backend/src/core/DownloadService.ts
index 21ae798f9f..93f4a38246 100644
--- a/packages/backend/src/core/DownloadService.ts
+++ b/packages/backend/src/core/DownloadService.ts
@@ -42,7 +42,7 @@ export class DownloadService {
const timeout = 30 * 1000;
const operationTimeout = 60 * 1000;
- const maxSize = this.config.maxFileSize ?? 262144000;
+ const maxSize = this.config.maxFileSize;
const urlObj = new URL(url);
let filename = urlObj.pathname.split('/').pop() ?? 'untitled';
diff --git a/packages/backend/src/core/entities/MetaEntityService.ts b/packages/backend/src/core/entities/MetaEntityService.ts
index 44ec0d6a7b..f4b1e302d0 100644
--- a/packages/backend/src/core/entities/MetaEntityService.ts
+++ b/packages/backend/src/core/entities/MetaEntityService.ts
@@ -129,6 +129,7 @@ export class MetaEntityService {
mediaProxy: this.config.mediaProxy,
enableUrlPreview: instance.urlPreviewEnabled,
noteSearchableScope: (this.config.meilisearch == null || this.config.meilisearch.scope !== 'local') ? 'global' : 'local',
+ maxFileSize: this.config.maxFileSize,
};
return packed;
diff --git a/packages/backend/src/models/json-schema/meta.ts b/packages/backend/src/models/json-schema/meta.ts
index 3bcf9cac92..99feeaa7d7 100644
--- a/packages/backend/src/models/json-schema/meta.ts
+++ b/packages/backend/src/models/json-schema/meta.ts
@@ -253,6 +253,10 @@ export const packedMetaLiteSchema = {
optional: false, nullable: false,
default: 'local',
},
+ maxFileSize: {
+ type: 'number',
+ optional: false, nullable: false,
+ },
},
} as const;
diff --git a/packages/backend/src/server/api/ApiServerService.ts b/packages/backend/src/server/api/ApiServerService.ts
index 4a5935f930..13cbdfc3be 100644
--- a/packages/backend/src/server/api/ApiServerService.ts
+++ b/packages/backend/src/server/api/ApiServerService.ts
@@ -49,7 +49,7 @@ export class ApiServerService {
fastify.register(multipart, {
limits: {
- fileSize: this.config.maxFileSize ?? 262144000,
+ fileSize: this.config.maxFileSize,
files: 1,
},
});
diff --git a/packages/frontend/src/scripts/upload.ts b/packages/frontend/src/scripts/upload.ts
index 3e947183c9..abb0e1e677 100644
--- a/packages/frontend/src/scripts/upload.ts
+++ b/packages/frontend/src/scripts/upload.ts
@@ -13,6 +13,7 @@ import { apiUrl } from '@/config.js';
import { $i } from '@/account.js';
import { alert } from '@/os.js';
import { i18n } from '@/i18n.js';
+import { instance } from '@/instance.js';
type Uploading = {
id: string;
@@ -39,6 +40,15 @@ export function uploadFile(
if (folder && typeof folder === 'object') folder = folder.id;
+ if (file.size > instance.maxFileSize) {
+ alert({
+ type: 'error',
+ title: i18n.ts.failedToUpload,
+ text: i18n.ts.cannotUploadBecauseExceedsFileSizeLimit,
+ });
+ return Promise.reject();
+ }
+
return new Promise((resolve, reject) => {
const id = uuid();
diff --git a/packages/misskey-js/src/autogen/types.ts b/packages/misskey-js/src/autogen/types.ts
index 6d2f787767..0c50825203 100644
--- a/packages/misskey-js/src/autogen/types.ts
+++ b/packages/misskey-js/src/autogen/types.ts
@@ -4947,6 +4947,7 @@ export type components = {
* @enum {string}
*/
noteSearchableScope: 'local' | 'global';
+ maxFileSize: number;
};
MetaDetailedOnly: {
features?: {
From 44f62160cb4b876f415b48b0574592f87bea9b3d Mon Sep 17 00:00:00 2001
From: syuilo <4439005+syuilo@users.noreply.github.com>
Date: Sat, 24 Aug 2024 16:59:17 +0900
Subject: [PATCH 5/5] enhance(frontend): error message i18n
---
locales/index.d.ts | 4 ++++
locales/ja-JP.yml | 1 +
packages/frontend/src/scripts/get-note-menu.ts | 5 +++++
3 files changed, 10 insertions(+)
diff --git a/locales/index.d.ts b/locales/index.d.ts
index 75e1703b4a..9fd3441ab1 100644
--- a/locales/index.d.ts
+++ b/locales/index.d.ts
@@ -5068,6 +5068,10 @@ export interface Locale extends ILocale {
* 作成したアンテナ
*/
"createdAntennas": string;
+ /**
+ * これ以上このクリップにノートを追加できません。
+ */
+ "clipNoteLimitExceeded": string;
"_delivery": {
/**
* 配信状態
diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index 98e3cbfa41..587b67d987 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -1263,6 +1263,7 @@ confirmWhenRevealingSensitiveMedia: "センシティブなメディアを表示
sensitiveMediaRevealConfirm: "センシティブなメディアです。表示しますか?"
createdLists: "作成したリスト"
createdAntennas: "作成したアンテナ"
+clipNoteLimitExceeded: "これ以上このクリップにノートを追加できません。"
_delivery:
status: "配信状態"
diff --git a/packages/frontend/src/scripts/get-note-menu.ts b/packages/frontend/src/scripts/get-note-menu.ts
index 2563b0baf3..b5d7350a41 100644
--- a/packages/frontend/src/scripts/get-note-menu.ts
+++ b/packages/frontend/src/scripts/get-note-menu.ts
@@ -66,6 +66,11 @@ export async function getNoteClipMenu(props: {
});
if (props.currentClip?.id === clip.id) props.isDeleted.value = true;
}
+ } else if (err.id === 'f0dba960-ff73-4615-8df4-d6ac5d9dc118') {
+ os.alert({
+ type: 'error',
+ text: i18n.ts.clipNoteLimitExceeded,
+ });
} else {
os.alert({
type: 'error',