From e60bed97de1f4fc08b4168a535842dd26c0586cf Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Sun, 4 May 2025 18:55:45 +0900 Subject: [PATCH 01/14] wip --- packages/frontend/src/pages/welcome.setup.vue | 44 ++++++++++++++++++- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/packages/frontend/src/pages/welcome.setup.vue b/packages/frontend/src/pages/welcome.setup.vue index 69a654595a..f8d9d7a5e8 100644 --- a/packages/frontend/src/pages/welcome.setup.vue +++ b/packages/frontend/src/pages/welcome.setup.vue @@ -7,6 +7,42 @@ SPDX-License-Identifier: AGPL-3.0-only
+ + + + + + + + + + + + + + + + + +
Welcome to Misskey!
v{{ version }}
@@ -104,12 +140,16 @@ function submit() { } .title { + position: absolute; + top: 16px; + left: 0; + right: 0; + z-index: 1; margin: 0; font-size: 1.5em; text-align: center; padding: 32px; - background: var(--MI_THEME-accentedBg); - color: var(--MI_THEME-accent); + color: #fff; font-weight: bold; } From 202b440d50cc891f09fd8d429b974163b027de79 Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Sun, 4 May 2025 20:31:00 +0900 Subject: [PATCH 02/14] wip --- locales/index.d.ts | 18 +++- locales/ja-JP.yml | 6 +- packages/frontend/src/pages/welcome.setup.vue | 83 +++++++++++++------ 3 files changed, 76 insertions(+), 31 deletions(-) diff --git a/locales/index.d.ts b/locales/index.d.ts index e564b47270..b94150113a 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -1022,10 +1022,6 @@ export interface Locale extends ILocale { * これ以上ピン留めできません */ "pinLimitExceeded": string; - /** - * Misskeyのインストールが完了しました!管理者アカウントを作成しましょう。 - */ - "intro": string; /** * 完了 */ @@ -11616,6 +11612,20 @@ export interface Locale extends ILocale { */ "serverHostPlaceholder": string; }; + "_serverSetupWizard": { + /** + * Misskeyのインストールが完了しました! + */ + "installCompleted": string; + /** + * まずは、管理者アカウントを作成しましょう。 + */ + "firstCreateAccount": string; + /** + * 管理者アカウントが作成されました! + */ + "accountCreated": string; + }; } declare const locales: { [lang: string]: Locale; diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 7d2edf7194..d857264b92 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -251,7 +251,6 @@ noUsers: "ユーザーはいません" editProfile: "プロフィールを編集" noteDeleteConfirm: "このノートを削除しますか?" pinLimitExceeded: "これ以上ピン留めできません" -intro: "Misskeyのインストールが完了しました!管理者アカウントを作成しましょう。" done: "完了" processing: "処理中" preview: "プレビュー" @@ -3106,3 +3105,8 @@ _search: pleaseEnterServerHost: "サーバーのホストを入力してください" pleaseSelectUser: "ユーザーを選択してください" serverHostPlaceholder: "例: misskey.example.com" + +_serverSetupWizard: + installCompleted: "Misskeyのインストールが完了しました!" + firstCreateAccount: "まずは、管理者アカウントを作成しましょう。" + accountCreated: "管理者アカウントが作成されました!" diff --git a/packages/frontend/src/pages/welcome.setup.vue b/packages/frontend/src/pages/welcome.setup.vue index f8d9d7a5e8..3e43896d73 100644 --- a/packages/frontend/src/pages/welcome.setup.vue +++ b/packages/frontend/src/pages/welcome.setup.vue @@ -6,7 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-only @@ -82,24 +107,30 @@ import * as os from '@/os.js'; import { misskeyApi } from '@/utility/misskey-api.js'; import { i18n } from '@/i18n.js'; import { login } from '@/accounts.js'; +import MkLink from '@/components/MkLink.vue'; const username = ref(''); const password = ref(''); const setupPassword = ref(''); -const submitting = ref(false); +const accountCreating = ref(false); +const accountCreated = ref(true); +const step = ref(0); -function submit() { - if (submitting.value) return; - submitting.value = true; +let token; + +function createAccount() { + if (accountCreating.value) return; + accountCreating.value = true; misskeyApi('admin/accounts/create', { username: username.value, password: password.value, setupPassword: setupPassword.value === '' ? null : setupPassword.value, }).then(res => { - return login(res.token); + token = res.token; + accountCreated.value = true; }).catch((err) => { - submitting.value = false; + accountCreating.value = false; let title = i18n.ts.somethingHappened; let text = err.message + '\n' + err.id; From 129c1e7db00f1f78cbab555e2f1f85d1d8456a15 Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Mon, 5 May 2025 07:41:54 +0900 Subject: [PATCH 03/14] Update welcome.setup.vue --- packages/frontend/src/pages/welcome.setup.vue | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/frontend/src/pages/welcome.setup.vue b/packages/frontend/src/pages/welcome.setup.vue index 3e43896d73..b0dfd086c8 100644 --- a/packages/frontend/src/pages/welcome.setup.vue +++ b/packages/frontend/src/pages/welcome.setup.vue @@ -47,8 +47,8 @@ SPDX-License-Identifier: AGPL-3.0-only
Welcome to Misskey!
v{{ version }}
-
- + diff --git a/packages/frontend/src/pages/welcome.setup.vue b/packages/frontend/src/pages/welcome.setup.vue index c728b02a37..675e82a71d 100644 --- a/packages/frontend/src/pages/welcome.setup.vue +++ b/packages/frontend/src/pages/welcome.setup.vue @@ -99,88 +99,7 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ i18n.ts._serverSetupWizard.settingsYouMakeHereCanBeChangedLater }}
- - - - - - - - -
- - - - - - - {{ i18n.ts._serverSetupWizard._use.one_youCanCreateMultipleAccounts }} - {{ i18n.ts.advice }}: {{ i18n.ts._serverSetupWizard.openServerAdvice }} -
-
- - - - - -
- - - - - - - {{ i18n.ts.advice }}: {{ i18n.ts._serverSetupWizard.largeScaleServerAdvice }} -
-
- - - - - -
-
{{ i18n.ts._serverSetupWizard.doYouConnectToFediverse_description1 }}
{{ i18n.ts._serverSetupWizard.doYouConnectToFediverse_description2 }}
- - - - - - - {{ i18n.ts._serverSetupWizard.youCanConfigureMoreFederationSettingsLater }} -
-
- - - - - -
-
-
{{ i18n.ts._serverSettings.openRegistration }}:
-
{{ !serverSettings.disableRegistration ? i18n.ts.yes : i18n.ts.no }}
-
-
-
{{ i18n.ts.emailRequiredForSignup }}:
-
{{ serverSettings.emailRequiredForSignup ? i18n.ts.yes : i18n.ts.no }}
-
-
-
{{ i18n.ts.federation }}:
-
{{ serverSettings.federation === 'none' ? i18n.ts.no : i18n.ts.all }}
-
- - {{ i18n.ts._serverSetupWizard.applyTheseSettings }} - -
-
+ {{ i18n.ts._serverSetupWizard.skipSettings }} @@ -190,6 +109,7 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ i18n.ts._serverSetupWizard.settingsCompleted }}
{{ i18n.ts._serverSetupWizard.settingsCompleted_description }}
+
{{ i18n.ts._serverSetupWizard.settingsCompleted_description2 }}
@@ -207,7 +127,6 @@ SPDX-License-Identifier: AGPL-3.0-only import { computed, ref } from 'vue'; import * as Misskey from 'misskey-js'; import { host, version } from '@@/js/config.js'; -import { ROLE_POLICIES } from '@@/js/const.js'; import MkButton from '@/components/MkButton.vue'; import MkInput from '@/components/MkInput.vue'; import * as os from '@/os.js'; @@ -215,9 +134,7 @@ import { misskeyApi } from '@/utility/misskey-api.js'; import { i18n } from '@/i18n.js'; import { login } from '@/accounts.js'; import MkLink from '@/components/MkLink.vue'; -import MkFolder from '@/components/MkFolder.vue'; -import MkRadios from '@/components/MkRadios.vue'; -import MkInfo from '@/components/MkInfo.vue'; +import MkServerSetupWizard from '@/components/MkServerSetupWizard.vue'; const username = ref(''); const password = ref(''); @@ -225,49 +142,6 @@ const setupPassword = ref(''); const accountCreating = ref(false); const accountCreated = ref(false); const step = ref(0); -const q_name = ref(''); -const q_use = ref('one'); -const q_scale = ref('small'); -const q_federation = ref('yes'); - -const serverSettings = computed(() => { - return { - disableRegistration: q_use.value !== 'open', - emailRequiredForSignup: q_use.value === 'open', - federation: q_federation.value === 'yes' ? 'all' : 'none', - }; -}); - -const defaultPolicies = computed(() => { - let driveCapacityMb; - if (q_use.value === 'one') { - driveCapacityMb = 8192; - } else if (q_use.value === 'group') { - driveCapacityMb = 1000; - } else if (q_use.value === 'open') { - driveCapacityMb = 100; - } - - let rateLimitFactor; - if (q_use.value === 'one') { - rateLimitFactor = 0.3; - } else if (q_use.value === 'group') { - rateLimitFactor = 0.7; - } else if (q_use.value === 'open') { - if (q_scale.value === 'small') { - rateLimitFactor = 1; - } else if (q_scale.value === 'medium') { - rateLimitFactor = 1.25; - } else if (q_scale.value === 'large') { - rateLimitFactor = 1.5; - } - } - - return { - rateLimitFactor, - driveCapacityMb, - } satisfies Partial>; -}); let token; @@ -308,27 +182,8 @@ function createAccount() { }); } -function applySettings() { - const _close = os.waiting(); - Promise.all([ - misskeyApi('admin/update-meta', { - ...serverSettings.value, - name: q_name.value === '' ? undefined : q_name.value, - }, token), - misskeyApi('admin/roles/update-default-policies', { - policies: defaultPolicies.value, - }, token), - ]).then(() => { - step.value++; - }).catch((err) => { - os.alert({ - type: 'error', - title: err.code, - text: err.message, - }); - }).finally(() => { - _close(); - }); +function onWizardFinished() { + step.value++; } function skipSettings() { From ffbcd8c3732516338922c574d694de043dedf022 Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Mon, 5 May 2025 13:47:55 +0900 Subject: [PATCH 08/14] Update MkServerSetupWizard.vue --- .../src/components/MkServerSetupWizard.vue | 61 ++++++++++++++++++- 1 file changed, 58 insertions(+), 3 deletions(-) diff --git a/packages/frontend/src/components/MkServerSetupWizard.vue b/packages/frontend/src/components/MkServerSetupWizard.vue index fed25ca53d..807ae1de1a 100644 --- a/packages/frontend/src/components/MkServerSetupWizard.vue +++ b/packages/frontend/src/components/MkServerSetupWizard.vue @@ -102,9 +102,34 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ serverSettings.federation === 'none' ? i18n.ts.no : i18n.ts.all }}
-
{{ i18n.ts.baseRole }}/{{ i18n.ts._role._options.rateLimitFactor }}:
+
FTT:
+
{{ serverSettings.enableFanoutTimeline ? i18n.ts.yes : i18n.ts.no }}
+
+
+
FTT/{{ i18n.ts._serverSettings.fanoutTimelineDbFallback }}:
+
{{ serverSettings.enableFanoutTimelineDbFallback ? i18n.ts.yes : i18n.ts.no }}
+
+
+
RBT:
+
{{ serverSettings.enableReactionsBuffering ? i18n.ts.yes : i18n.ts.no }}
+
+ +
+
{{ i18n.ts._role.baseRole }}/{{ i18n.ts._role._options.rateLimitFactor }}:
{{ defaultPolicies.rateLimitFactor }}
+
+
{{ i18n.ts._role.baseRole }}/{{ i18n.ts._role._options.driveCapacity }}:
+
{{ defaultPolicies.driveCapacityMb }} MB
+
+
+
{{ i18n.ts._role.baseRole }}/{{ i18n.ts._role._options.antennaMax }}:
+
{{ defaultPolicies.antennaLimit }}
+
+
+
{{ i18n.ts._role.baseRole }}/{{ i18n.ts._role._options.webhookMax }}:
+
{{ defaultPolicies.webhookLimit }}
+
{{ i18n.ts._serverSetupWizard.applyTheseSettings }} @@ -143,14 +168,24 @@ const q_adminName = ref(''); const q_adminEmail = ref(''); const serverSettings = computed(() => { + let enableReactionsBuffering; + if (q_use.value === 'one') { + enableReactionsBuffering = false; + } else { + enableReactionsBuffering = q_scale.value !== 'small'; + } + return { disableRegistration: q_use.value !== 'open', emailRequiredForSignup: q_use.value === 'open', federation: q_federation.value === 'yes' ? 'all' : 'none', + enableFanoutTimeline: true, + enableFanoutTimelineDbFallback: q_use.value === 'one', + enableReactionsBuffering, }; }); -const defaultPolicies = computed(() => { +const defaultPolicies = computed>>(() => { let driveCapacityMb; if (q_use.value === 'one') { driveCapacityMb = 8192; @@ -175,10 +210,30 @@ const defaultPolicies = computed>; + antennaLimit, + webhookLimit, + }; }); function applySettings() { From ce0297028361d7d046f1e2a2c7d9d4c76a9e7b5c Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Mon, 5 May 2025 14:00:56 +0900 Subject: [PATCH 09/14] Update MkServerSetupWizard.vue --- .../src/components/MkServerSetupWizard.vue | 86 ++++++++++++++++++- 1 file changed, 84 insertions(+), 2 deletions(-) diff --git a/packages/frontend/src/components/MkServerSetupWizard.vue b/packages/frontend/src/components/MkServerSetupWizard.vue index 807ae1de1a..694c8b4f3c 100644 --- a/packages/frontend/src/components/MkServerSetupWizard.vue +++ b/packages/frontend/src/components/MkServerSetupWizard.vue @@ -84,7 +84,7 @@ SPDX-License-Identifier: AGPL-3.0-only
- + @@ -97,6 +97,10 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ i18n.ts.emailRequiredForSignup }}:
{{ serverSettings.emailRequiredForSignup ? i18n.ts.yes : i18n.ts.no }}
+
+
Log IP:
+
{{ serverSettings.enableIpLogging ? i18n.ts.yes : i18n.ts.no }}
+
{{ i18n.ts.federation }}:
{{ serverSettings.federation === 'none' ? i18n.ts.no : i18n.ts.all }}
@@ -122,6 +126,10 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ i18n.ts._role.baseRole }}/{{ i18n.ts._role._options.driveCapacity }}:
{{ defaultPolicies.driveCapacityMb }} MB
+
+
{{ i18n.ts._role.baseRole }}/{{ i18n.ts._role._options.userListMax }}:
+
{{ defaultPolicies.userListLimit }}
+
{{ i18n.ts._role.baseRole }}/{{ i18n.ts._role._options.antennaMax }}:
{{ defaultPolicies.antennaLimit }}
@@ -130,10 +138,33 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ i18n.ts._role.baseRole }}/{{ i18n.ts._role._options.webhookMax }}:
{{ defaultPolicies.webhookLimit }}
+
+
{{ i18n.ts._role.baseRole }}/{{ i18n.ts._role._options.canImportFollowing }}:
+
{{ defaultPolicies.canImportFollowing ? i18n.ts.yes : i18n.ts.no }}
+
+
+
{{ i18n.ts._role.baseRole }}/{{ i18n.ts._role._options.canImportMuting }}:
+
{{ defaultPolicies.canImportMuting ? i18n.ts.yes : i18n.ts.no }}
+
+
+
{{ i18n.ts._role.baseRole }}/{{ i18n.ts._role._options.canImportBlocking }}:
+
{{ defaultPolicies.canImportBlocking ? i18n.ts.yes : i18n.ts.no }}
+
+
+
{{ i18n.ts._role.baseRole }}/{{ i18n.ts._role._options.canImportUserLists }}:
+
{{ defaultPolicies.canImportUserLists ? i18n.ts.yes : i18n.ts.no }}
+
+
+
{{ i18n.ts._role.baseRole }}/{{ i18n.ts._role._options.canImportAntennas }}:
+
{{ defaultPolicies.canImportAntennas ? i18n.ts.yes : i18n.ts.no }}
+
+ + +
@@ -178,6 +209,7 @@ const serverSettings = computed(() => { return { disableRegistration: q_use.value !== 'open', emailRequiredForSignup: q_use.value === 'open', + enableIpLogging: q_use.value === 'open', federation: q_federation.value === 'yes' ? 'all' : 'none', enableFanoutTimeline: true, enableFanoutTimelineDbFallback: q_use.value === 'one', @@ -210,6 +242,15 @@ const defaultPolicies = computed Date: Mon, 5 May 2025 14:06:28 +0900 Subject: [PATCH 10/14] wip --- locales/index.d.ts | 6 ++-- locales/ja-JP.yml | 6 ++-- .../src/components/MkServerSetupWizard.vue | 36 +++++++++---------- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/locales/index.d.ts b/locales/index.d.ts index 9762076ace..7baac6a376 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -11649,15 +11649,15 @@ export interface Locale extends ILocale { /** * お一人様サーバー */ - "one": string; + "single": string; /** * 自分専用のサーバーとして、一人で使う */ - "one_description": string; + "single_description": string; /** * お一人様サーバーとして運用する場合でも、アカウントは必要に応じて複数作成可能です。 */ - "one_youCanCreateMultipleAccounts": string; + "single_youCanCreateMultipleAccounts": string; /** * グループサーバー */ diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index a33ebad931..fbbaab022e 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -3116,9 +3116,9 @@ _serverSetupWizard: settingsYouMakeHereCanBeChangedLater: "ここでの設定は、あとからでも変更できます。" howWillYouUseMisskey: "Misskeyをどのように使いますか?" _use: - one: "お一人様サーバー" - one_description: "自分専用のサーバーとして、一人で使う" - one_youCanCreateMultipleAccounts: "お一人様サーバーとして運用する場合でも、アカウントは必要に応じて複数作成可能です。" + single: "お一人様サーバー" + single_description: "自分専用のサーバーとして、一人で使う" + single_youCanCreateMultipleAccounts: "お一人様サーバーとして運用する場合でも、アカウントは必要に応じて複数作成可能です。" group: "グループサーバー" group_description: "信頼できる他の利用者を招待して、複数人で使う" open: "オープンサーバー" diff --git a/packages/frontend/src/components/MkServerSetupWizard.vue b/packages/frontend/src/components/MkServerSetupWizard.vue index 694c8b4f3c..445d086f17 100644 --- a/packages/frontend/src/components/MkServerSetupWizard.vue +++ b/packages/frontend/src/components/MkServerSetupWizard.vue @@ -15,9 +15,9 @@ SPDX-License-Identifier: AGPL-3.0-only
- - {{ i18n.ts._serverSetupWizard._use.one_youCanCreateMultipleAccounts }} + {{ i18n.ts._serverSetupWizard._use.single_youCanCreateMultipleAccounts }} {{ i18n.ts.advice }}: {{ i18n.ts._serverSetupWizard.openServerAdvice }}
- + @@ -192,7 +192,7 @@ const props = withDefaults(defineProps<{ }); const q_name = ref(''); -const q_use = ref('one'); +const q_use = ref('single'); const q_scale = ref('small'); const q_federation = ref('yes'); const q_adminName = ref(''); @@ -200,7 +200,7 @@ const q_adminEmail = ref(''); const serverSettings = computed(() => { let enableReactionsBuffering; - if (q_use.value === 'one') { + if (q_use.value === 'single') { enableReactionsBuffering = false; } else { enableReactionsBuffering = q_scale.value !== 'small'; @@ -212,14 +212,14 @@ const serverSettings = computed(() => { enableIpLogging: q_use.value === 'open', federation: q_federation.value === 'yes' ? 'all' : 'none', enableFanoutTimeline: true, - enableFanoutTimelineDbFallback: q_use.value === 'one', + enableFanoutTimelineDbFallback: q_use.value === 'single', enableReactionsBuffering, }; }); const defaultPolicies = computed>>(() => { let driveCapacityMb; - if (q_use.value === 'one') { + if (q_use.value === 'single') { driveCapacityMb = 8192; } else if (q_use.value === 'group') { driveCapacityMb = 1000; @@ -228,7 +228,7 @@ const defaultPolicies = computed Date: Mon, 5 May 2025 14:24:42 +0900 Subject: [PATCH 11/14] wip --- locales/index.d.ts | 8 ++++++++ locales/ja-JP.yml | 2 ++ .../migration/1746422049376-singleUserMode.js | 16 ++++++++++++++++ packages/backend/src/models/Meta.ts | 5 +++++ .../src/server/api/endpoints/admin/meta.ts | 5 +++++ .../server/api/endpoints/admin/update-meta.ts | 5 +++++ .../src/components/MkServerSetupWizard.vue | 5 +++++ packages/misskey-js/src/autogen/types.ts | 2 ++ 8 files changed, 48 insertions(+) create mode 100644 packages/backend/migration/1746422049376-singleUserMode.js diff --git a/locales/index.d.ts b/locales/index.d.ts index 7baac6a376..9932ceb421 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -6384,6 +6384,14 @@ export interface Locale extends ILocale { * 脆弱性などの理由で、サーバーのソフトウェアの名前及びバージョンの範囲を指定して配信を停止できます。このバージョン情報はサーバーが提供したものであり、信頼性は保証されません。バージョン指定には semver の範囲指定が使用できますが、>= 2024.3.1 と指定すると 2024.3.1-custom.0 のようなカスタムバージョンが含まれないため、>= 2024.3.1-0 のように prerelease の指定を行うことを推奨します。 */ "deliverSuspendedSoftwareDescription": string; + /** + * お一人様モード + */ + "singleUserMode": string; + /** + * このサーバーを利用するのが自分だけの場合、このモードを有効にすることで動作が最適化されます。 + */ + "singleUserMode_description": string; }; "_accountMigration": { /** diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index fbbaab022e..7a3ba99b6e 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1622,6 +1622,8 @@ _serverSettings: thisSettingWillAutomaticallyOffWhenModeratorsInactive: "一定期間モデレーターのアクティビティが検出されなかった場合、スパム防止のためこの設定は自動でオフになります。" deliverSuspendedSoftware: "配信停止中のソフトウェア" deliverSuspendedSoftwareDescription: "脆弱性などの理由で、サーバーのソフトウェアの名前及びバージョンの範囲を指定して配信を停止できます。このバージョン情報はサーバーが提供したものであり、信頼性は保証されません。バージョン指定には semver の範囲指定が使用できますが、>= 2024.3.1 と指定すると 2024.3.1-custom.0 のようなカスタムバージョンが含まれないため、>= 2024.3.1-0 のように prerelease の指定を行うことを推奨します。" + singleUserMode: "お一人様モード" + singleUserMode_description: "このサーバーを利用するのが自分だけの場合、このモードを有効にすることで動作が最適化されます。" _accountMigration: moveFrom: "別のアカウントからこのアカウントに移行" diff --git a/packages/backend/migration/1746422049376-singleUserMode.js b/packages/backend/migration/1746422049376-singleUserMode.js new file mode 100644 index 0000000000..9a79d46d5b --- /dev/null +++ b/packages/backend/migration/1746422049376-singleUserMode.js @@ -0,0 +1,16 @@ +/* + * SPDX-FileCopyrightText: syuilo and misskey-project + * SPDX-License-Identifier: AGPL-3.0-only + */ + +export class SingleUserMode1746422049376 { + name = 'SingleUserMode1746422049376' + + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "meta" ADD "singleUserMode" boolean NOT NULL DEFAULT false`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "singleUserMode"`); + } +} diff --git a/packages/backend/src/models/Meta.ts b/packages/backend/src/models/Meta.ts index 46f3b2e3c0..f8aa9d1f4e 100644 --- a/packages/backend/src/models/Meta.ts +++ b/packages/backend/src/models/Meta.ts @@ -669,6 +669,11 @@ export class MiMeta { default: [], }) public deliverSuspendedSoftware: SoftwareSuspension[]; + + @Column('boolean', { + default: false, + }) + public singleUserMode: boolean; } export type SoftwareSuspension = { diff --git a/packages/backend/src/server/api/endpoints/admin/meta.ts b/packages/backend/src/server/api/endpoints/admin/meta.ts index 4a106e7175..8c4d4adf05 100644 --- a/packages/backend/src/server/api/endpoints/admin/meta.ts +++ b/packages/backend/src/server/api/endpoints/admin/meta.ts @@ -546,6 +546,10 @@ export const meta = { }, }, }, + singleUserMode: { + type: 'boolean', + optional: false, nullable: false, + }, }, }, } as const; @@ -691,6 +695,7 @@ export default class extends Endpoint { // eslint- federation: instance.federation, federationHosts: instance.federationHosts, deliverSuspendedSoftware: instance.deliverSuspendedSoftware, + singleUserMode: instance.singleUserMode, }; }); } diff --git a/packages/backend/src/server/api/endpoints/admin/update-meta.ts b/packages/backend/src/server/api/endpoints/admin/update-meta.ts index 31eeaa5e38..33060e3524 100644 --- a/packages/backend/src/server/api/endpoints/admin/update-meta.ts +++ b/packages/backend/src/server/api/endpoints/admin/update-meta.ts @@ -196,6 +196,7 @@ export const paramDef = { required: ['software', 'versionRange'], }, }, + singleUserMode: { type: 'boolean' }, }, required: [], } as const; @@ -690,6 +691,10 @@ export default class extends Endpoint { // eslint- set.federationHosts = ps.federationHosts.filter(Boolean).map(x => x.toLowerCase()); } + if (ps.singleUserMode !== undefined) { + set.singleUserMode = ps.singleUserMode; + } + 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 445d086f17..f30a6ab5a1 100644 --- a/packages/frontend/src/components/MkServerSetupWizard.vue +++ b/packages/frontend/src/components/MkServerSetupWizard.vue @@ -89,6 +89,10 @@ SPDX-License-Identifier: AGPL-3.0-only
+
+
{{ i18n.ts._serverSettings.singleUserMode }}:
+
{{ serverSettings.singleUserMode ? i18n.ts.yes : i18n.ts.no }}
+
{{ i18n.ts._serverSettings.openRegistration }}:
{{ !serverSettings.disableRegistration ? i18n.ts.yes : i18n.ts.no }}
@@ -207,6 +211,7 @@ const serverSettings = computed(() => { } return { + singleUserMode: q_use.value === 'single', disableRegistration: q_use.value !== 'open', emailRequiredForSignup: q_use.value === 'open', enableIpLogging: q_use.value === 'open', diff --git a/packages/misskey-js/src/autogen/types.ts b/packages/misskey-js/src/autogen/types.ts index c83e1f1fbe..4704766f66 100644 --- a/packages/misskey-js/src/autogen/types.ts +++ b/packages/misskey-js/src/autogen/types.ts @@ -8769,6 +8769,7 @@ export type operations = { software: string; versionRange: string; }[]; + singleUserMode: boolean; }; }; }; @@ -11439,6 +11440,7 @@ export type operations = { software: string; versionRange: string; }[]; + singleUserMode?: boolean; }; }; }; From fc793fed7917e610794a14983cf89ac49c939728 Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Tue, 6 May 2025 12:54:03 +0900 Subject: [PATCH 12/14] wip --- locales/index.d.ts | 4 ++++ locales/ja-JP.yml | 1 + packages/frontend/src/components/MkServerSetupWizard.vue | 1 + 3 files changed, 6 insertions(+) diff --git a/locales/index.d.ts b/locales/index.d.ts index 9932ceb421..22d9254c20 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -11687,6 +11687,10 @@ export interface Locale extends ILocale { * 不特定多数の利用者を受け入れることはリスクが伴います。トラブルに対処できるよう、確実なモデレーション体制で運営することを推奨します。 */ "openServerAdvice": string; + /** + * 自サーバーがスパムの踏み台にならないように、reCAPTCHAといったアンチボット機能を有効にするなど、セキュリティについても細心の注意が必要です。 + */ + "openServerAntiSpamAdvice": string; /** * どれくらいの人数を想定していますか? */ diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 7a3ba99b6e..27391a69aa 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -3126,6 +3126,7 @@ _serverSetupWizard: open: "オープンサーバー" open_description: "不特定多数の利用者を受け入れる運営を行う" openServerAdvice: "不特定多数の利用者を受け入れることはリスクが伴います。トラブルに対処できるよう、確実なモデレーション体制で運営することを推奨します。" + openServerAntiSpamAdvice: "自サーバーがスパムの踏み台にならないように、reCAPTCHAといったアンチボット機能を有効にするなど、セキュリティについても細心の注意が必要です。" howManyUsersDoYouExpect: "どれくらいの人数を想定していますか?" _scale: small: "100人以下 (小規模)" diff --git a/packages/frontend/src/components/MkServerSetupWizard.vue b/packages/frontend/src/components/MkServerSetupWizard.vue index f30a6ab5a1..46770cef39 100644 --- a/packages/frontend/src/components/MkServerSetupWizard.vue +++ b/packages/frontend/src/components/MkServerSetupWizard.vue @@ -31,6 +31,7 @@ SPDX-License-Identifier: AGPL-3.0-only {{ i18n.ts._serverSetupWizard._use.single_youCanCreateMultipleAccounts }} {{ i18n.ts.advice }}: {{ i18n.ts._serverSetupWizard.openServerAdvice }} + {{ i18n.ts.advice }}: {{ i18n.ts._serverSetupWizard.openServerAntiSpamAdvice }}
From ac753667f0acd397188af3069d59434bf8501817 Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Fri, 9 May 2025 17:56:15 +0900 Subject: [PATCH 13/14] Update types.ts --- packages/misskey-js/src/autogen/types.ts | 66 ++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/packages/misskey-js/src/autogen/types.ts b/packages/misskey-js/src/autogen/types.ts index dd12d3acdd..b2543587cc 100644 --- a/packages/misskey-js/src/autogen/types.ts +++ b/packages/misskey-js/src/autogen/types.ts @@ -3247,6 +3247,15 @@ export type paths = { */ post: operations['notes___show']; }; + '/notes/show-partial-bulk': { + /** + * notes/show-partial-bulk + * @description No description provided. + * + * **Credential required**: *No* + */ + post: operations['notes___show-partial-bulk']; + }; '/notes/state': { /** * notes/state @@ -8772,6 +8781,8 @@ export type operations = { versionRange: string; }[]; singleUserMode: boolean; + /** @enum {string} */ + ugcVisibilityForVisitor: 'all' | 'local' | 'none'; }; }; }; @@ -11443,6 +11454,8 @@ export type operations = { versionRange: string; }[]; singleUserMode?: boolean; + /** @enum {string} */ + ugcVisibilityForVisitor?: 'all' | 'local' | 'none'; }; }; }; @@ -25740,6 +25753,59 @@ export type operations = { }; }; }; + /** + * notes/show-partial-bulk + * @description No description provided. + * + * **Credential required**: *No* + */ + 'notes___show-partial-bulk': { + requestBody: { + content: { + 'application/json': { + noteIds: string[]; + }; + }; + }; + responses: { + /** @description OK (with results) */ + 200: { + content: { + 'application/json': Record[]; + }; + }; + /** @description Client error */ + 400: { + content: { + 'application/json': components['schemas']['Error']; + }; + }; + /** @description Authentication error */ + 401: { + content: { + 'application/json': components['schemas']['Error']; + }; + }; + /** @description Forbidden error */ + 403: { + content: { + 'application/json': components['schemas']['Error']; + }; + }; + /** @description I'm Ai */ + 418: { + content: { + 'application/json': components['schemas']['Error']; + }; + }; + /** @description Internal server error */ + 500: { + content: { + 'application/json': components['schemas']['Error']; + }; + }; + }; + }; /** * notes/state * @description No description provided. From feb8b54b2fb93c52fd9a1f63bea50242cd825d24 Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Fri, 9 May 2025 18:11:27 +0900 Subject: [PATCH 14/14] wip --- cypress.config.ts | 5 ----- cypress/plugins/index.js | 22 ---------------------- package.json | 2 +- 3 files changed, 1 insertion(+), 28 deletions(-) delete mode 100644 cypress/plugins/index.js diff --git a/cypress.config.ts b/cypress.config.ts index e390c41a54..361acaf6e5 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -2,11 +2,6 @@ import { defineConfig } from 'cypress' export default defineConfig({ e2e: { - // We've imported your old cypress plugins here. - // You may want to clean this up later by importing these. - setupNodeEvents(on, config) { - return require('./cypress/plugins/index.js')(on, config) - }, baseUrl: 'http://localhost:61812', }, }) diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js deleted file mode 100644 index 59b2bab6e4..0000000000 --- a/cypress/plugins/index.js +++ /dev/null @@ -1,22 +0,0 @@ -/// -// *********************************************************** -// This example plugins/index.js can be used to load plugins -// -// You can change the location of this file or turn off loading -// the plugins file with the 'pluginsFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/plugins-guide -// *********************************************************** - -// This function is called when a project is opened or re-opened (e.g. due to -// the project's config changing) - -/** - * @type {Cypress.PluginConfig} - */ -// eslint-disable-next-line no-unused-vars -module.exports = (on, config) => { - // `on` is used to hook into various events Cypress emits - // `config` is the resolved Cypress config -} diff --git a/package.json b/package.json index ff08cbe97b..ff5f685d3f 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "watch": "pnpm dev", "dev": "node scripts/dev.mjs", "lint": "pnpm -r lint", - "cy:open": "pnpm cypress open --browser --e2e --config-file=cypress.config.ts", + "cy:open": "pnpm cypress open --config-file=cypress.config.ts", "cy:run": "pnpm cypress run", "e2e": "pnpm start-server-and-test start:test http://localhost:61812 cy:run", "e2e-dev-container": "ncp ./.config/cypress-devcontainer.yml ./.config/test.yml && pnpm start-server-and-test start:test http://localhost:61812 cy:run",