From b383bf9848b89f499a12531e5c9491c415f43c0a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 22 Jan 2026 12:14:53 +0000 Subject: [PATCH 1/8] Initial plan From d4c2d840d74e90b30ac90677847ef6c9d7dea064 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 22 Jan 2026 12:17:38 +0000 Subject: [PATCH 2/8] Add canCreateChannel role policy to control channel creation Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com> --- packages/backend/src/core/RoleService.ts | 2 ++ packages/backend/src/models/json-schema/role.ts | 4 ++++ packages/backend/src/server/api/endpoints/channels/create.ts | 2 ++ 3 files changed, 8 insertions(+) diff --git a/packages/backend/src/core/RoleService.ts b/packages/backend/src/core/RoleService.ts index 2ffee69c21..faf80a5641 100644 --- a/packages/backend/src/core/RoleService.ts +++ b/packages/backend/src/core/RoleService.ts @@ -47,6 +47,7 @@ export type RolePolicies = { canSearchUsers: boolean; canUseTranslator: boolean; canHideAds: boolean; + canCreateChannel: boolean; driveCapacityMb: number; maxFileSizeMb: number; alwaysMarkNsfw: boolean; @@ -88,6 +89,7 @@ export const DEFAULT_POLICIES: RolePolicies = { canSearchUsers: true, canUseTranslator: true, canHideAds: false, + canCreateChannel: true, driveCapacityMb: 100, maxFileSizeMb: 30, alwaysMarkNsfw: false, diff --git a/packages/backend/src/models/json-schema/role.ts b/packages/backend/src/models/json-schema/role.ts index b9000152d4..eaed3ac710 100644 --- a/packages/backend/src/models/json-schema/role.ts +++ b/packages/backend/src/models/json-schema/role.ts @@ -224,6 +224,10 @@ export const packedRolePoliciesSchema = { type: 'boolean', optional: false, nullable: false, }, + canCreateChannel: { + type: 'boolean', + optional: false, nullable: false, + }, driveCapacityMb: { type: 'integer', optional: false, nullable: false, diff --git a/packages/backend/src/server/api/endpoints/channels/create.ts b/packages/backend/src/server/api/endpoints/channels/create.ts index 8d49b6fd0f..0536f7a775 100644 --- a/packages/backend/src/server/api/endpoints/channels/create.ts +++ b/packages/backend/src/server/api/endpoints/channels/create.ts @@ -22,6 +22,8 @@ export const meta = { kind: 'write:channels', + requiredRolePolicy: 'canCreateChannel', + limit: { duration: ms('1hour'), max: 10, From 52df703cd20959473cca5ca6d3ad88dcaed46815 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 22 Jan 2026 12:20:16 +0000 Subject: [PATCH 3/8] Add canCreateChannel to getUserPolicies return value Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com> --- packages/backend/src/core/RoleService.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/backend/src/core/RoleService.ts b/packages/backend/src/core/RoleService.ts index faf80a5641..7fd26726a7 100644 --- a/packages/backend/src/core/RoleService.ts +++ b/packages/backend/src/core/RoleService.ts @@ -412,6 +412,7 @@ export class RoleService implements OnApplicationShutdown, OnModuleInit { canSearchUsers: calc('canSearchUsers', vs => vs.some(v => v === true)), canUseTranslator: calc('canUseTranslator', vs => vs.some(v => v === true)), 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)), alwaysMarkNsfw: calc('alwaysMarkNsfw', vs => vs.some(v => v === true)), From ecdfc6bd6e238753c5547f152195b67a48665eea Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 22 Jan 2026 12:21:15 +0000 Subject: [PATCH 4/8] Add canCreateChannel translations for en-US and ja-JP Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com> --- locales/en-US.yml | 1 + locales/ja-JP.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/locales/en-US.yml b/locales/en-US.yml index 17268af1cb..c828c5c2f8 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -2096,6 +2096,7 @@ _role: canSearchNotes: "Usage of note search" canSearchUsers: "User search" canUseTranslator: "Translator usage" + canCreateChannel: "Can create channels" avatarDecorationLimit: "Maximum number of avatar decorations" canImportAntennas: "Can import antennas" canImportBlocking: "Can import blocking" diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 45d2efdf35..50a4e83548 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -2121,6 +2121,7 @@ _role: canSearchNotes: "ノート検索の利用" canSearchUsers: "ユーザー検索の利用" canUseTranslator: "翻訳機能の利用" + canCreateChannel: "チャンネルの作成" avatarDecorationLimit: "アイコンデコレーションの最大取付個数" canImportAntennas: "アンテナのインポートを許可" canImportBlocking: "ブロックのインポートを許可" From 7c5c0afe13d81e472553ae3e54f820ecdcf079aa Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 22 Jan 2026 12:22:01 +0000 Subject: [PATCH 5/8] Add canCreateChannel to misskey-js rolePolicies array Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com> --- packages/misskey-js/src/consts.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/misskey-js/src/consts.ts b/packages/misskey-js/src/consts.ts index 8789ee056d..dc12bc7d56 100644 --- a/packages/misskey-js/src/consts.ts +++ b/packages/misskey-js/src/consts.ts @@ -205,6 +205,7 @@ export const rolePolicies = [ 'canSearchUsers', 'canUseTranslator', 'canHideAds', + 'canCreateChannel', 'driveCapacityMb', 'maxFileSizeMb', 'alwaysMarkNsfw', From cd767b237e5e622e6e39b526c81f32981d66a0fa Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 22 Jan 2026 12:33:07 +0000 Subject: [PATCH 6/8] Add frontend UI for canCreateChannel policy configuration Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com> --- .../frontend/src/pages/admin/roles.editor.vue | 20 +++++++++++++++++++ packages/frontend/src/pages/admin/roles.vue | 8 ++++++++ 2 files changed, 28 insertions(+) diff --git a/packages/frontend/src/pages/admin/roles.editor.vue b/packages/frontend/src/pages/admin/roles.editor.vue index 7de973a394..e8527b0761 100644 --- a/packages/frontend/src/pages/admin/roles.editor.vue +++ b/packages/frontend/src/pages/admin/roles.editor.vue @@ -387,6 +387,26 @@ SPDX-License-Identifier: AGPL-3.0-only + + + +
+ + + + + + + + + +
+
+