diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index e071b4bda..c2a71d148 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 874611968..8a11baf90 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 f14aa4105..1fe68f261 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 07ee412f3..2ccd9be6c 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(() => []);