From f116907792e040d6a4abd71ecc24261c60c77643 Mon Sep 17 00:00:00 2001 From: kozakura913 <98575220+kozakura913@users.noreply.github.com> Date: Fri, 21 Jun 2024 23:28:49 +0900 Subject: [PATCH] =?UTF-8?q?1=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E3=81=AE?= =?UTF-8?q?=E5=AE=B9=E9=87=8F=E5=88=B6=E9=99=90=20(#104)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG_yojo.md | 1 + locales/index.d.ts | 4 ++++ locales/ja-JP.yml | 1 + packages/backend/src/core/DriveService.ts | 6 ++++++ packages/backend/src/core/RoleService.ts | 3 +++ .../backend/src/models/json-schema/role.ts | 4 ++++ .../api/endpoints/drive/files/create.ts | 6 ++++++ packages/cherrypick-js/src/autogen/types.ts | 1 + packages/frontend/src/const.ts | 1 + .../frontend/src/pages/admin/roles.editor.vue | 20 +++++++++++++++++++ packages/frontend/src/pages/admin/roles.vue | 7 +++++++ 11 files changed, 54 insertions(+) diff --git a/CHANGELOG_yojo.md b/CHANGELOG_yojo.md index 8a76aeb707..eda238bdc8 100644 --- a/CHANGELOG_yojo.md +++ b/CHANGELOG_yojo.md @@ -22,6 +22,7 @@ ### General - メディアプロキシurlと拡大画像urlを分割 +- 1ファイルの容量をロールでも制限できるように ### Client - enhance: ノートとユーザーの検索時に照会を行うかが選択できるようになりました diff --git a/locales/index.d.ts b/locales/index.d.ts index f812123c7a..b484cee80b 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -7324,6 +7324,10 @@ export interface Locale extends ILocale { * ドライブ容量 */ "driveCapacity": string; + /** + * ファイルサイズ上限 + */ + "fileSizeLimit": string; /** * ファイルにNSFWを常に付与 */ diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index a476457aa0..16ad6d7346 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1898,6 +1898,7 @@ _role: canManageCustomEmojis: "カスタム絵文字の管理" canManageAvatarDecorations: "アバターデコレーションの管理" driveCapacity: "ドライブ容量" + fileSizeLimit: "ファイルサイズ上限" alwaysMarkNsfw: "ファイルにNSFWを常に付与" pinMax: "ノートのピン留めの最大数" antennaMax: "アンテナの作成可能数" diff --git a/packages/backend/src/core/DriveService.ts b/packages/backend/src/core/DriveService.ts index 08601385ac..3fb083e4b7 100644 --- a/packages/backend/src/core/DriveService.ts +++ b/packages/backend/src/core/DriveService.ts @@ -493,6 +493,12 @@ export class DriveService { sensitiveThresholdForPorn: 0.75, enableSensitiveMediaDetectionForVideos: instance.enableSensitiveMediaDetectionForVideos, }); + //ファイル単位の容量制限チェック + if (user == null) { + //system user skip + } else if (info.size > (await this.roleService.getUserPolicies(user.id)).fileSizeLimit * 1024 * 1024) { + throw new IdentifiableError('e5989b6d-ae66-49ed-88af-516ded10ca0c', 'File size limit over'); + } this.registerLogger.info(`${JSON.stringify(info)}`); // 現状 false positive が多すぎて実用に耐えない diff --git a/packages/backend/src/core/RoleService.ts b/packages/backend/src/core/RoleService.ts index ff52d02fa2..4a87e0c29a 100644 --- a/packages/backend/src/core/RoleService.ts +++ b/packages/backend/src/core/RoleService.ts @@ -58,6 +58,7 @@ export type RolePolicies = { userEachUserListsLimit: number; rateLimitFactor: number; avatarDecorationLimit: number; + fileSizeLimit: number; }; export const DEFAULT_POLICIES: RolePolicies = { @@ -87,6 +88,7 @@ export const DEFAULT_POLICIES: RolePolicies = { userEachUserListsLimit: 50, rateLimitFactor: 1, avatarDecorationLimit: 1, + fileSizeLimit: 50, }; @Injectable() @@ -352,6 +354,7 @@ export class RoleService implements OnApplicationShutdown, OnModuleInit { userEachUserListsLimit: calc('userEachUserListsLimit', vs => Math.max(...vs)), rateLimitFactor: calc('rateLimitFactor', vs => Math.max(...vs)), avatarDecorationLimit: calc('avatarDecorationLimit', vs => Math.max(...vs)), + fileSizeLimit: calc('fileSizeLimit', vs => Math.max(...vs)), }; } diff --git a/packages/backend/src/models/json-schema/role.ts b/packages/backend/src/models/json-schema/role.ts index 5eb7d2b9b8..c0b5082a61 100644 --- a/packages/backend/src/models/json-schema/role.ts +++ b/packages/backend/src/models/json-schema/role.ts @@ -228,6 +228,10 @@ export const packedRolePoliciesSchema = { type: 'integer', optional: false, nullable: false, }, + fileSizeLimit: { + type: 'integer', + optional: false, nullable: false, + }, canEditNote: { type: 'boolean', optional: false, nullable: false, diff --git a/packages/backend/src/server/api/endpoints/drive/files/create.ts b/packages/backend/src/server/api/endpoints/drive/files/create.ts index 955314bbaf..50fd33c023 100644 --- a/packages/backend/src/server/api/endpoints/drive/files/create.ts +++ b/packages/backend/src/server/api/endpoints/drive/files/create.ts @@ -55,6 +55,11 @@ export const meta = { code: 'NO_FREE_SPACE', id: 'd08dbc37-a6a9-463a-8c47-96c32ab5f064', }, + invalidFileSize: { + message: 'File size exceeds limit.', + code: 'INVALID_FILE_SIZE', + id: '9068668f-0465-4c0e-8341-1c52fd6f5ab3', + }, }, } as const; @@ -114,6 +119,7 @@ export default class extends Endpoint { // eslint- if (err instanceof IdentifiableError) { if (err.id === '282f77bf-5816-4f72-9264-aa14d8261a21') throw new ApiError(meta.errors.inappropriate); if (err.id === 'c6244ed2-a39a-4e1c-bf93-f0fbd7764fa6') throw new ApiError(meta.errors.noFreeSpace); + if (err.id === 'e5989b6d-ae66-49ed-88af-516ded10ca0c') throw new ApiError(meta.errors.invalidFileSize); } throw new ApiError(); } finally { diff --git a/packages/cherrypick-js/src/autogen/types.ts b/packages/cherrypick-js/src/autogen/types.ts index c8fcc29b51..cc7be9d9aa 100644 --- a/packages/cherrypick-js/src/autogen/types.ts +++ b/packages/cherrypick-js/src/autogen/types.ts @@ -5006,6 +5006,7 @@ export type components = { userEachUserListsLimit: number; rateLimitFactor: number; avatarDecorationLimit: number; + fileSizeLimit: number; canEditNote: boolean; }; ReversiGameLite: { diff --git a/packages/frontend/src/const.ts b/packages/frontend/src/const.ts index d71e9cf6e5..6ca4a7a912 100644 --- a/packages/frontend/src/const.ts +++ b/packages/frontend/src/const.ts @@ -99,6 +99,7 @@ export const ROLE_POLICIES = [ 'userEachUserListsLimit', 'rateLimitFactor', 'avatarDecorationLimit', + 'fileSizeLimit', ] as const; // なんか動かない diff --git a/packages/frontend/src/pages/admin/roles.editor.vue b/packages/frontend/src/pages/admin/roles.editor.vue index ec007737f6..208120029c 100644 --- a/packages/frontend/src/pages/admin/roles.editor.vue +++ b/packages/frontend/src/pages/admin/roles.editor.vue @@ -592,6 +592,26 @@ SPDX-License-Identifier: AGPL-3.0-only + + + +
+ + + + + + + + + + +
+
diff --git a/packages/frontend/src/pages/admin/roles.vue b/packages/frontend/src/pages/admin/roles.vue index a7fdbeed61..25cee616c0 100644 --- a/packages/frontend/src/pages/admin/roles.vue +++ b/packages/frontend/src/pages/admin/roles.vue @@ -214,6 +214,13 @@ SPDX-License-Identifier: AGPL-3.0-only + + + + + + + {{ i18n.ts.save }}