diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index e071b4bdab..c2a71d148b 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -778,6 +778,13 @@ middle: "中"
low: "低"
emailNotConfiguredWarning: "メールアドレスの設定がされていません。"
ratio: "比率"
+secureMode: "セキュアモード (Authorized Fetch)"
+instanceSecurity: "インスタンスのセキュリティー"
+secureModeInfo: "他のインスタンスからリクエストするときに、証明を付けなければ返送しません。他のインスタンスの設定ファイルでsignToActivityPubGetはtrueにしてください。"
+privateMode: "非公開モード"
+privateModeInfo: "有効にして、許可されているインスタンスのみがリクエストできます。すべてのノートが公開に非表示にします。"
+allowedInstances: "許可されたインスタンス"
+allowedInstancesDescription: "許可したいインスタンスのホストを改行で区切って設定します。非公開モードだけで有効です。"
previewNoteText: "本文をプレビュー"
customCss: "カスタムCSS"
customCssWarn: "この設定は必ず知識のある方が行ってください。不適切な設定を行うとクライアントが正常に使用できなくなる恐れがあります。"
diff --git a/packages/backend/src/server/api/endpoints/admin/meta.ts b/packages/backend/src/server/api/endpoints/admin/meta.ts
index 8746119687..8a11baf90f 100644
--- a/packages/backend/src/server/api/endpoints/admin/meta.ts
+++ b/packages/backend/src/server/api/endpoints/admin/meta.ts
@@ -187,6 +187,22 @@ export const meta = {
optional: false, nullable: false,
},
},
+ allowedHosts: {
+ type: 'array',
+ optional: true, nullable: false,
+ items: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ },
+ privateMode: {
+ type: 'boolean',
+ optional: false, nullable: false,
+ },
+ secureMode: {
+ type: 'boolean',
+ optional: false, nullable: false,
+ },
hcaptchaSecretKey: {
type: 'string',
optional: true, nullable: true,
@@ -388,6 +404,9 @@ export default define(meta, paramDef, async (ps, me) => {
pinnedUsers: instance.pinnedUsers,
hiddenTags: instance.hiddenTags,
blockedHosts: instance.blockedHosts,
+ allowedHosts: instance.allowedHosts,
+ privateMode: instance.privateMode,
+ secureMode: instance.secureMode,
hcaptchaSecretKey: instance.hcaptchaSecretKey,
recaptchaSecretKey: instance.recaptchaSecretKey,
sensitiveMediaDetection: instance.sensitiveMediaDetection,
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 f14aa41050..1fe68f261e 100644
--- a/packages/backend/src/server/api/endpoints/admin/update-meta.ts
+++ b/packages/backend/src/server/api/endpoints/admin/update-meta.ts
@@ -27,6 +27,11 @@ export const paramDef = {
blockedHosts: { type: 'array', nullable: true, items: {
type: 'string',
} },
+ allowedHosts: { type: 'array', nullable: true, items: {
+ type: 'string',
+ } },
+ secureMode: { type: 'boolean', nullable: true },
+ privateMode: { type: 'boolean', nullable: true },
themeColor: { type: 'string', nullable: true, pattern: '^#[0-9a-fA-F]{6}$' },
mascotImageUrl: { type: 'string', nullable: true },
bannerUrl: { type: 'string', nullable: true },
@@ -142,6 +147,18 @@ export default define(meta, paramDef, async (ps, me) => {
set.themeColor = ps.themeColor;
}
+ if (Array.isArray(ps.allowedHosts)) {
+ set.allowedHosts = ps.allowedHosts.filter(Boolean);
+ }
+
+ if (typeof ps.privateMode === 'boolean') {
+ set.privateMode = ps.privateMode;
+ }
+
+ if (typeof ps.secureMode === 'boolean') {
+ set.secureMode = ps.secureMode;
+ }
+
if (ps.mascotImageUrl !== undefined) {
set.mascotImageUrl = ps.mascotImageUrl;
}
diff --git a/packages/client/src/pages/admin/security.vue b/packages/client/src/pages/admin/security.vue
index 07ee412f3e..2ccd9be6c3 100644
--- a/packages/client/src/pages/admin/security.vue
+++ b/packages/client/src/pages/admin/security.vue
@@ -94,6 +94,26 @@
{{ i18n.ts.save }}
+
+
+ {{ i18n.ts.instanceSecurity }}
+
+
+
+ {{ i18n.ts.secureMode }}
+ {{ i18n.ts.secureModeInfo }}
+
+
+ {{ i18n.ts.privateMode }}
+ {{ i18n.ts.privateModeInfo }}
+
+
+ {{ i18n.ts.allowedInstances }}
+ {{ i18n.ts.allowedInstancesDescription }}
+
+ {{ i18n.ts.save }}
+
+
@@ -112,6 +132,7 @@ import FormSuspense from '@/components/form/suspense.vue';
import FormRange from '@/components/form/range.vue';
import FormInput from '@/components/form/input.vue';
import FormButton from '@/components/ui/button.vue';
+import FormTextarea from '@/components/form/textarea.vue';
import * as os from '@/os';
import { fetchInstance } from '@/instance';
import { i18n } from '@/i18n';
@@ -127,6 +148,10 @@ let enableSensitiveMediaDetectionForVideos: boolean = $ref(false);
let enableIpLogging: boolean = $ref(false);
let enableActiveEmailValidation: boolean = $ref(false);
+let secureMode: boolean = $ref(false);
+let privateMode: boolean = $ref(false);
+let allowedHosts: string = $ref('');
+
async function init() {
const meta = await os.api('admin/meta');
summalyProxy = meta.summalyProxy;
@@ -143,6 +168,10 @@ async function init() {
enableSensitiveMediaDetectionForVideos = meta.enableSensitiveMediaDetectionForVideos;
enableIpLogging = meta.enableIpLogging;
enableActiveEmailValidation = meta.enableActiveEmailValidation;
+
+ secureMode = meta.secureMode;
+ privateMode = meta.privateMode;
+ allowedHosts = meta.allowedHosts.join('\n');
}
function save() {
@@ -165,6 +194,16 @@ function save() {
});
}
+function saveInstance() {
+ os.apiWithDialog('admin/update-meta', {
+ secureMode,
+ privateMode,
+ allowedHosts: allowedHosts.split('\n'),
+ }).then(() => {
+ fetchInstance();
+ });
+}
+
const headerActions = $computed(() => []);
const headerTabs = $computed(() => []);