{ // eslint-
set.allowExternalApRedirect = ps.allowExternalApRedirect;
}
+ if (ps.enableRemoteNotesCleaning !== undefined) {
+ set.enableRemoteNotesCleaning = ps.enableRemoteNotesCleaning;
+ }
+
+ if (ps.remoteNotesCleaningExpiryDaysForEachNotes !== undefined) {
+ set.remoteNotesCleaningExpiryDaysForEachNotes = ps.remoteNotesCleaningExpiryDaysForEachNotes;
+ }
+
+ if (ps.remoteNotesCleaningMaxProcessingDurationInMinutes !== undefined) {
+ set.remoteNotesCleaningMaxProcessingDurationInMinutes = ps.remoteNotesCleaningMaxProcessingDurationInMinutes;
+ }
+
const before = await this.metaService.fetch(true);
await this.metaService.update(set);
diff --git a/packages/frontend/src/components/MkServerSetupWizard.vue b/packages/frontend/src/components/MkServerSetupWizard.vue
index e5614d63d7..23e0e85bc9 100644
--- a/packages/frontend/src/components/MkServerSetupWizard.vue
+++ b/packages/frontend/src/components/MkServerSetupWizard.vue
@@ -55,7 +55,7 @@ SPDX-License-Identifier: AGPL-3.0-only
-
{{ i18n.ts._serverSetupWizard.doYouConnectToFediverse_description1 }}
{{ i18n.ts._serverSetupWizard.doYouConnectToFediverse_description2 }}
+
{{ i18n.ts._serverSetupWizard.doYouConnectToFediverse_description1 }}
{{ i18n.ts._serverSetupWizard.doYouConnectToFediverse_description2 }}
{{ i18n.ts.learnMore }}
@@ -63,6 +63,11 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ i18n.ts._serverSetupWizard.youCanConfigureMoreFederationSettingsLater }}
+
+
+ {{ i18n.ts._serverSetupWizard.remoteContentsCleaning }}
+ {{ i18n.ts._serverSetupWizard.remoteContentsCleaning_description }}
+
@@ -110,6 +115,10 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ i18n.ts.federation }}:
{{ serverSettings.federation === 'none' ? i18n.ts.no : i18n.ts.all }}
+
+
{{ i18n.ts._serverSettings.remoteNotesCleaning }}:
+
{{ serverSettings.enableRemoteNotesCleaning ? i18n.ts.yes : i18n.ts.no }}
+
FTT:
{{ serverSettings.enableFanoutTimeline ? i18n.ts.yes : i18n.ts.no }}
@@ -185,7 +194,9 @@ import { misskeyApi } from '@/utility/misskey-api.js';
import { i18n } from '@/i18n.js';
import MkFolder from '@/components/MkFolder.vue';
import MkRadios from '@/components/MkRadios.vue';
+import MkSwitch from '@/components/MkSwitch.vue';
import MkInfo from '@/components/MkInfo.vue';
+import MkLink from '@/components/MkLink.vue';
const emit = defineEmits<{
(ev: 'finished'): void;
@@ -202,6 +213,7 @@ const q_name = ref(currentMeta.name ?? '');
const q_use = ref('single');
const q_scale = ref('small');
const q_federation = ref(currentMeta.federation === 'none' ? 'no' : 'yes');
+const q_remoteContentsCleaning = ref(currentMeta.enableRemoteNotesCleaning);
const q_adminName = ref(currentMeta.maintainerName ?? '');
const q_adminEmail = ref(currentMeta.maintainerEmail ?? '');
@@ -219,6 +231,7 @@ const serverSettings = computed
(() => {
emailRequiredForSignup: q_use.value === 'open',
enableIpLogging: q_use.value === 'open',
federation: q_federation.value === 'yes' ? 'all' : 'none',
+ enableRemoteNotesCleaning: q_remoteContentsCleaning.value,
enableFanoutTimeline: true,
enableFanoutTimelineDbFallback: q_use.value === 'single',
enableReactionsBuffering,
diff --git a/packages/frontend/src/pages/admin/job-queue.job.vue b/packages/frontend/src/pages/admin/job-queue.job.vue
index 659aa02b50..4ecdb74199 100644
--- a/packages/frontend/src/pages/admin/job-queue.job.vue
+++ b/packages/frontend/src/pages/admin/job-queue.job.vue
@@ -98,7 +98,7 @@ SPDX-License-Identifier: AGPL-3.0-only
Progress
- {{ Math.floor(job.progress * 100) }}%
+ {{ Math.floor(job.progress) }}%
@@ -150,7 +150,7 @@ SPDX-License-Identifier: AGPL-3.0-only
Update
-
+
diff --git a/packages/frontend/src/pages/admin/performance.vue b/packages/frontend/src/pages/admin/performance.vue
index c28621b11e..ff3a5b9d7f 100644
--- a/packages/frontend/src/pages/admin/performance.vue
+++ b/packages/frontend/src/pages/admin/performance.vue
@@ -101,6 +101,35 @@ SPDX-License-Identifier: AGPL-3.0-only
+
+
+
+ Remote Notes Cleaning (仮)
+ Enabled
+ Disabled
+
+
+
+
+
+
+ {{ i18n.ts.enable }}{{ i18n.ts.modified }}
+ {{ i18n.ts._serverSettings.remoteNotesCleaning_description }}
+
+
+
+
+ {{ i18n.ts._serverSettings.remoteNotesCleaningExpiryDaysForEachNotes }} ({{ i18n.ts.inDays }}){{ i18n.ts.modified }}
+ {{ i18n.ts._time.day }}
+
+
+
+ {{ i18n.ts._serverSettings.remoteNotesCleaningMaxProcessingDuration }} ({{ i18n.ts.inMinutes }}){{ i18n.ts.modified }}
+ {{ i18n.ts._time.minute }}
+
+
+
+
@@ -196,6 +225,19 @@ const rbtForm = useForm({
fetchInstance(true);
});
+const remoteNotesCleaningForm = useForm({
+ enableRemoteNotesCleaning: meta.enableRemoteNotesCleaning,
+ remoteNotesCleaningExpiryDaysForEachNotes: meta.remoteNotesCleaningExpiryDaysForEachNotes,
+ remoteNotesCleaningMaxProcessingDurationInMinutes: meta.remoteNotesCleaningMaxProcessingDurationInMinutes,
+}, async (state) => {
+ await os.apiWithDialog('admin/update-meta', {
+ enableRemoteNotesCleaning: state.enableRemoteNotesCleaning,
+ remoteNotesCleaningExpiryDaysForEachNotes: state.remoteNotesCleaningExpiryDaysForEachNotes,
+ remoteNotesCleaningMaxProcessingDurationInMinutes: state.remoteNotesCleaningMaxProcessingDurationInMinutes,
+ });
+ fetchInstance(true);
+});
+
const headerActions = computed(() => []);
const headerTabs = computed(() => []);
diff --git a/packages/misskey-js/src/autogen/types.ts b/packages/misskey-js/src/autogen/types.ts
index 7594117deb..c0a6dca67e 100644
--- a/packages/misskey-js/src/autogen/types.ts
+++ b/packages/misskey-js/src/autogen/types.ts
@@ -9370,6 +9370,9 @@ export interface operations {
proxyRemoteFiles: boolean;
signToActivityPubGet: boolean;
allowExternalApRedirect: boolean;
+ enableRemoteNotesCleaning: boolean;
+ remoteNotesCleaningExpiryDaysForEachNotes: number;
+ remoteNotesCleaningMaxProcessingDurationInMinutes: number;
};
};
};
@@ -12599,6 +12602,9 @@ export interface operations {
proxyRemoteFiles?: boolean;
signToActivityPubGet?: boolean;
allowExternalApRedirect?: boolean;
+ enableRemoteNotesCleaning?: boolean;
+ remoteNotesCleaningExpiryDaysForEachNotes?: number;
+ remoteNotesCleaningMaxProcessingDurationInMinutes?: number;
};
};
};
--
cgit v1.2.3-freya
From b2b07e5f21f10faa59ce60bec788306438415b65 Mon Sep 17 00:00:00 2001
From: syuilo <4439005+syuilo@users.noreply.github.com>
Date: Fri, 1 Aug 2025 12:36:25 +0900
Subject: enhance(backend):
連合関係のサーバー設定のデフォルト値をウィザード側に移動
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- サーバー初期設定ウィザードでデフォルト値を設定できるため、データベース上のデフォルト値でオンにしておく必要がない
- 連合は初期設定が終わるまで閉じられている方が安全
---
CHANGELOG.md | 2 +-
.../1754019326356-tweakDefaultFederationSettings.js | 18 ++++++++++++++++++
packages/backend/src/models/Meta.ts | 4 ++--
.../frontend/src/components/MkServerSetupWizard.vue | 12 +++++-------
4 files changed, 26 insertions(+), 10 deletions(-)
create mode 100644 packages/backend/migration/1754019326356-tweakDefaultFederationSettings.js
(limited to 'packages/backend/src/models')
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8ddad2ec2f..ab8a93d873 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,7 +7,7 @@
- ノートを削除した際、関連するノートが同時に削除されないようになりました
- APIで、「replyIdが存在しているのにreplyがnull」や「renoteIdが存在しているのにrenoteがnull」であるという、今までにはなかったパターンが表れることになります
- 定期的に参照されていない古いリモートの投稿を削除する機能が実装されました(コントロールパネル→パフォーマンス→Remote Notes Cleaning)
- - **デフォルトでオン**になっています
+ - 既存のサーバーでは**デフォルトでオフ**、新規サーバーでは**デフォルトでオン**になります
- データベースの肥大化を防止することが可能です
### Client
diff --git a/packages/backend/migration/1754019326356-tweakDefaultFederationSettings.js b/packages/backend/migration/1754019326356-tweakDefaultFederationSettings.js
new file mode 100644
index 0000000000..12c723f80d
--- /dev/null
+++ b/packages/backend/migration/1754019326356-tweakDefaultFederationSettings.js
@@ -0,0 +1,18 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+export class TweakDefaultFederationSettings1754019326356 {
+ name = 'TweakDefaultFederationSettings1754019326356'
+
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "meta" ALTER COLUMN "federation" SET DEFAULT 'none'`);
+ await queryRunner.query(`ALTER TABLE "meta" ALTER COLUMN "enableRemoteNotesCleaning" SET DEFAULT false`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "meta" ALTER COLUMN "enableRemoteNotesCleaning" SET DEFAULT true`);
+ await queryRunner.query(`ALTER TABLE "meta" ALTER COLUMN "federation" SET DEFAULT 'all'`);
+ }
+}
diff --git a/packages/backend/src/models/Meta.ts b/packages/backend/src/models/Meta.ts
index c97fcd8dfc..1fc50cbd07 100644
--- a/packages/backend/src/models/Meta.ts
+++ b/packages/backend/src/models/Meta.ts
@@ -654,7 +654,7 @@ export class MiMeta {
@Column('varchar', {
length: 128,
- default: 'all',
+ default: 'none',
})
public federation: 'all' | 'specified' | 'none';
@@ -703,7 +703,7 @@ export class MiMeta {
public allowExternalApRedirect: boolean;
@Column('boolean', {
- default: true,
+ default: false,
})
public enableRemoteNotesCleaning: boolean;
diff --git a/packages/frontend/src/components/MkServerSetupWizard.vue b/packages/frontend/src/components/MkServerSetupWizard.vue
index 23e0e85bc9..d2f56b55c4 100644
--- a/packages/frontend/src/components/MkServerSetupWizard.vue
+++ b/packages/frontend/src/components/MkServerSetupWizard.vue
@@ -207,15 +207,13 @@ const props = withDefaults(defineProps<{
}>(), {
});
-const currentMeta = await misskeyApi('admin/meta');
-
-const q_name = ref(currentMeta.name ?? '');
+const q_name = ref('');
const q_use = ref('single');
const q_scale = ref('small');
-const q_federation = ref(currentMeta.federation === 'none' ? 'no' : 'yes');
-const q_remoteContentsCleaning = ref(currentMeta.enableRemoteNotesCleaning);
-const q_adminName = ref(currentMeta.maintainerName ?? '');
-const q_adminEmail = ref(currentMeta.maintainerEmail ?? '');
+const q_federation = ref('yes');
+const q_remoteContentsCleaning = ref(true);
+const q_adminName = ref('');
+const q_adminEmail = ref('');
const serverSettings = computed(() => {
let enableReactionsBuffering;
--
cgit v1.2.3-freya
From b5b79140733a7fe46c446616d03060587cf4919c Mon Sep 17 00:00:00 2001
From: かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>
Date: Sat, 9 Aug 2025 14:41:11 +0900
Subject: enhance: ユーザー検索を制限できるように (#16380)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* enhance: ユーザー検索を制限できるように
* Update Changelog
---
CHANGELOG.md | 1 +
locales/index.d.ts | 8 ++++++++
locales/ja-JP.yml | 2 ++
packages/backend/src/core/RoleService.ts | 3 +++
packages/backend/src/models/json-schema/role.ts | 4 ++++
.../backend/src/server/api/endpoints/users/search.ts | 1 +
packages/frontend/src/pages/admin/roles.editor.vue | 20 ++++++++++++++++++++
packages/frontend/src/pages/admin/roles.vue | 8 ++++++++
packages/frontend/src/pages/search.vue | 10 ++++++++--
packages/frontend/src/utility/check-permissions.ts | 8 ++++++++
packages/misskey-js/src/autogen/types.ts | 1 +
11 files changed, 64 insertions(+), 2 deletions(-)
(limited to 'packages/backend/src/models')
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e5b171f4ae..2702189568 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -17,6 +17,7 @@
- Enhance: Unicode 15.1 および 16.0 に収録されている絵文字に対応
- Enhance: acctに `.` が入っているユーザーのメンションに対応
- Fix: Unicode絵文字に隣接する異体字セレクタ(`U+FE0F`)が絵文字として認識される問題を修正
+- Enhance: ユーザー検索をロールポリシーで制限できるように
### Client
- Feat: AiScriptが1.0に更新されました
diff --git a/locales/index.d.ts b/locales/index.d.ts
index b2906cf48e..028db4043f 100644
--- a/locales/index.d.ts
+++ b/locales/index.d.ts
@@ -4386,6 +4386,10 @@ export interface Locale extends ILocale {
* ノート検索は利用できません。
*/
"notesSearchNotAvailable": string;
+ /**
+ * ユーザー検索は利用できません。
+ */
+ "usersSearchNotAvailable": string;
/**
* ライセンス
*/
@@ -7799,6 +7803,10 @@ export interface Locale extends ILocale {
* ノート検索の利用
*/
"canSearchNotes": string;
+ /**
+ * ユーザー検索の利用
+ */
+ "canSearchUsers": string;
/**
* 翻訳機能の利用
*/
diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index d45aa7bb86..7aa88f399d 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -1092,6 +1092,7 @@ prohibitedWordsDescription2: "スペースで区切るとAND指定になり、
hiddenTags: "非表示ハッシュタグ"
hiddenTagsDescription: "設定したタグをトレンドに表示させないようにします。改行で区切って複数設定できます。"
notesSearchNotAvailable: "ノート検索は利用できません。"
+usersSearchNotAvailable: "ユーザー検索は利用できません。"
license: "ライセンス"
unfavoriteConfirm: "お気に入り解除しますか?"
myClips: "自分のクリップ"
@@ -2020,6 +2021,7 @@ _role:
descriptionOfRateLimitFactor: "小さいほど制限が緩和され、大きいほど制限が強化されます。"
canHideAds: "広告の非表示"
canSearchNotes: "ノート検索の利用"
+ canSearchUsers: "ユーザー検索の利用"
canUseTranslator: "翻訳機能の利用"
avatarDecorationLimit: "アイコンデコレーションの最大取付個数"
canImportAntennas: "アンテナのインポートを許可"
diff --git a/packages/backend/src/core/RoleService.ts b/packages/backend/src/core/RoleService.ts
index cddfc0094e..3df7ee69ee 100644
--- a/packages/backend/src/core/RoleService.ts
+++ b/packages/backend/src/core/RoleService.ts
@@ -43,6 +43,7 @@ export type RolePolicies = {
canManageCustomEmojis: boolean;
canManageAvatarDecorations: boolean;
canSearchNotes: boolean;
+ canSearchUsers: boolean;
canUseTranslator: boolean;
canHideAds: boolean;
driveCapacityMb: number;
@@ -82,6 +83,7 @@ export const DEFAULT_POLICIES: RolePolicies = {
canManageCustomEmojis: false,
canManageAvatarDecorations: false,
canSearchNotes: false,
+ canSearchUsers: true,
canUseTranslator: true,
canHideAds: false,
driveCapacityMb: 100,
@@ -402,6 +404,7 @@ export class RoleService implements OnApplicationShutdown, OnModuleInit {
canManageCustomEmojis: calc('canManageCustomEmojis', vs => vs.some(v => v === true)),
canManageAvatarDecorations: calc('canManageAvatarDecorations', vs => vs.some(v => v === true)),
canSearchNotes: calc('canSearchNotes', vs => vs.some(v => v === true)),
+ 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)),
driveCapacityMb: calc('driveCapacityMb', 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 c9cdbd5d89..0b9234cb81 100644
--- a/packages/backend/src/models/json-schema/role.ts
+++ b/packages/backend/src/models/json-schema/role.ts
@@ -212,6 +212,10 @@ export const packedRolePoliciesSchema = {
type: 'boolean',
optional: false, nullable: false,
},
+ canSearchUsers: {
+ type: 'boolean',
+ optional: false, nullable: false,
+ },
canUseTranslator: {
type: 'boolean',
optional: false, nullable: false,
diff --git a/packages/backend/src/server/api/endpoints/users/search.ts b/packages/backend/src/server/api/endpoints/users/search.ts
index 5d36847e03..c422286152 100644
--- a/packages/backend/src/server/api/endpoints/users/search.ts
+++ b/packages/backend/src/server/api/endpoints/users/search.ts
@@ -13,6 +13,7 @@ export const meta = {
tags: ['users'],
requireCredential: false,
+ requiredRolePolicy: 'canSearchUsers',
description: 'Search for users.',
diff --git a/packages/frontend/src/pages/admin/roles.editor.vue b/packages/frontend/src/pages/admin/roles.editor.vue
index c172e22688..bb96a1cde1 100644
--- a/packages/frontend/src/pages/admin/roles.editor.vue
+++ b/packages/frontend/src/pages/admin/roles.editor.vue
@@ -346,6 +346,26 @@ SPDX-License-Identifier: AGPL-3.0-only
+
+ {{ i18n.ts._role._options.canSearchUsers }}
+
+ {{ i18n.ts._role.useBaseValue }}
+ {{ role.policies.canSearchUsers.value ? i18n.ts.yes : i18n.ts.no }}
+
+
+
+
+ {{ i18n.ts._role.useBaseValue }}
+
+
+ {{ i18n.ts.enable }}
+
+
+ {{ i18n.ts._role.priority }}
+
+
+
+
{{ i18n.ts._role._options.canUseTranslator }}
diff --git a/packages/frontend/src/pages/admin/roles.vue b/packages/frontend/src/pages/admin/roles.vue
index e78a4bbc11..efdf8620ef 100644
--- a/packages/frontend/src/pages/admin/roles.vue
+++ b/packages/frontend/src/pages/admin/roles.vue
@@ -122,6 +122,14 @@ SPDX-License-Identifier: AGPL-3.0-only
+
+ {{ i18n.ts._role._options.canSearchUsers }}
+ {{ policies.canSearchUsers ? i18n.ts.yes : i18n.ts.no }}
+
+ {{ i18n.ts.enable }}
+
+
+
{{ i18n.ts._role._options.canUseTranslator }}
{{ policies.canUseTranslator ? i18n.ts.yes : i18n.ts.no }}
diff --git a/packages/frontend/src/pages/search.vue b/packages/frontend/src/pages/search.vue
index b6d21a4616..8d2bf9eb42 100644
--- a/packages/frontend/src/pages/search.vue
+++ b/packages/frontend/src/pages/search.vue
@@ -15,16 +15,22 @@ SPDX-License-Identifier: AGPL-3.0-only
-
+
+
+
+
+ {{ i18n.ts.usersSearchNotAvailable }}
+
-
-
diff --git a/packages/frontend/src/pages/welcome.entrance.classic.vue b/packages/frontend/src/pages/welcome.entrance.classic.vue
new file mode 100644
index 0000000000..c2cf937c71
--- /dev/null
+++ b/packages/frontend/src/pages/welcome.entrance.classic.vue
@@ -0,0 +1,184 @@
+
+
+
+
+
+
+
+
+
+
Powered by
+
![]()
+
+
+
+
+
+
+
+
+
+ {{ instance.host }}
+
+
+
+
+
+
+
+
+
diff --git a/packages/frontend/src/pages/welcome.entrance.simple.vue b/packages/frontend/src/pages/welcome.entrance.simple.vue
new file mode 100644
index 0000000000..c2a2420e50
--- /dev/null
+++ b/packages/frontend/src/pages/welcome.entrance.simple.vue
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
Powered by
+
![]()
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/frontend/src/pages/welcome.vue b/packages/frontend/src/pages/welcome.vue
index d3e571c053..2b70996252 100644
--- a/packages/frontend/src/pages/welcome.vue
+++ b/packages/frontend/src/pages/welcome.vue
@@ -6,16 +6,18 @@ SPDX-License-Identifier: AGPL-3.0-only
-
+
+