fix: サーバー全体のアップロードサイズ上限とロールポリシーのアップロードサイズ上限に関する修正 (#17389)

* fix(backend): ロールポリシーのファイルサイズ制限の上限値をサーバー全体のファイルサイズ制限にする

* fix(frontend): サーバー全体のファイルサイズ制限に関する説明を追加

* fix: ベースロールしか与えられていないときにaggregateが走らない問題を修正

今までは問題なかったけど、maxFIleSizeMbで上限capするようになったため
This commit is contained in:
かっこかり 2026-06-03 09:12:56 +09:00 committed by GitHub
commit e50603e30b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 15 additions and 2 deletions

View file

@ -2112,6 +2112,7 @@ _role:
driveCapacity: "ドライブ容量"
maxFileSize: "アップロード可能な最大ファイルサイズ"
maxFileSize_caption: "リバースプロキシやCDNなど、前段で別の設定値が存在する場合があります。"
maxFileSize_caption2: "サーバー全体の最大ファイルサイズ設定は {max} です。これより大きいファイルをアップロードできるようにするには、Misskeyの設定ファイルからこの設定を緩和してください。"
alwaysMarkNsfw: "ファイルにNSFWを常に付与"
canUpdateBioMedia: "アイコンとバナーの更新を許可"
pinMax: "ノートのピン留めの最大数"

View file

@ -17,6 +17,7 @@ import type {
} from '@/models/_.js';
import { MemoryKVCache, MemorySingleCache } from '@/misc/cache.js';
import type { MiUser } from '@/models/User.js';
import type { Config } from '@/config.js';
import { DI } from '@/di-symbols.js';
import { bindThis } from '@/decorators.js';
import { CacheService } from '@/core/CacheService.js';
@ -134,6 +135,9 @@ export class RoleService implements OnApplicationShutdown, OnModuleInit {
constructor(
private moduleRef: ModuleRef,
@Inject(DI.config)
private config: Config,
@Inject(DI.meta)
private meta: MiMeta,
@ -378,7 +382,7 @@ export class RoleService implements OnApplicationShutdown, OnModuleInit {
const roles = await this.getUserRoles(userId);
function calc<T extends keyof RolePolicies>(name: T, aggregate: (values: RolePolicies[T][]) => RolePolicies[T]) {
if (roles.length === 0) return basePolicies[name];
if (roles.length === 0) return aggregate([basePolicies[name]]);
const policies = roles.map(role => role.policies[name] ?? { priority: 0, useDefault: true });
@ -397,6 +401,8 @@ export class RoleService implements OnApplicationShutdown, OnModuleInit {
return 'unavailable';
}
const serverMaxFileSizeMb = Math.floor(this.config.maxFileSize / (1024 * 1024));
return {
gtlAvailable: calc('gtlAvailable', vs => vs.some(v => v === true)),
ltlAvailable: calc('ltlAvailable', vs => vs.some(v => v === true)),
@ -414,7 +420,7 @@ export class RoleService implements OnApplicationShutdown, OnModuleInit {
canHideAds: calc('canHideAds', vs => vs.some(v => v === true)),
canCreateChannel: calc('canCreateChannel', vs => vs.some(v => v === true)),
driveCapacityMb: calc('driveCapacityMb', vs => Math.max(...vs)),
maxFileSizeMb: calc('maxFileSizeMb', vs => Math.max(...vs)),
maxFileSizeMb: calc('maxFileSizeMb', vs => Math.min(serverMaxFileSizeMb, Math.max(...vs))),
alwaysMarkNsfw: calc('alwaysMarkNsfw', vs => vs.some(v => v === true)),
canUpdateBioMedia: calc('canUpdateBioMedia', vs => vs.some(v => v === true)),
pinLimit: calc('pinLimit', vs => Math.max(...vs)),

View file

@ -188,6 +188,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<MkInput v-model="valuesModel.maxFileSizeMb" type="number" :disabled="disabled">
<template #suffix>MB</template>
<template #caption>
<div>{{ i18n.tsx._role._options.maxFileSize_caption2({ max: `${Math.floor(instance.maxFileSize / (1024 * 1024))}MB` }) }}</div>
<div><i class="ti ti-alert-triangle" style="color: var(--MI_THEME-warn);"></i> {{ i18n.ts._role._options.maxFileSize_caption }}</div>
</template>
</MkInput>
@ -401,6 +402,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts">
import * as Misskey from 'misskey-js';
import { instance } from '@/instance.js';
export type PolicyMeta = {
useDefault: boolean;

View file

@ -8137,6 +8137,10 @@ export interface Locale extends ILocale {
* CDNなど
*/
"maxFileSize_caption": string;
/**
* {max} Misskeyの設定ファイルからこの設定を緩和してください
*/
"maxFileSize_caption2": ParameterizedString<"max">;
/**
* NSFWを常に付与
*/