feat: 在安全设置中配置客户端 IP 模式

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
Jlypx
2026-07-19 21:42:12 +08:00
co-authored by Sisyphus
parent 93717394b2
commit 5da3325a30
4 changed files with 32 additions and 3 deletions
+1 -1
View File
@@ -8393,7 +8393,7 @@ const form = reactive<SettingsForm>({
turnstile_site_key: "",
turnstile_secret_key: "",
turnstile_secret_key_configured: false,
api_key_acl_trust_forwarded_ip: false,
api_key_acl_trust_forwarded_ip: true,
// LinuxDo Connect OAuth 登录
linuxdo_connect_enabled: false,
linuxdo_connect_client_id: "",
@@ -367,6 +367,7 @@ const baseSettingsResponse = {
turnstile_enabled: false,
turnstile_site_key: "",
turnstile_secret_key_configured: false,
api_key_acl_trust_forwarded_ip: true,
linuxdo_connect_enabled: false,
linuxdo_connect_client_id: "",
linuxdo_connect_client_secret_configured: false,
@@ -652,6 +653,34 @@ describe("admin SettingsView payment visible method controls", () => {
expect(wrapper.text()).not.toContain("支付来源");
});
it("loads and saves the forwarded client IP takeover switch", async () => {
getSettings.mockResolvedValueOnce({
...baseSettingsResponse,
api_key_acl_trust_forwarded_ip: false,
});
const wrapper = mountView();
await flushPromises();
await openSecurityTab(wrapper);
const card = wrapper
.findAll(".card")
.find((node) => node.text().includes("admin.settings.apiKeyAcl.title"));
expect(card).toBeDefined();
const toggle = card!.get('input[type="checkbox"]');
expect((toggle.element as HTMLInputElement).checked).toBe(false);
await toggle.setValue(true);
await wrapper.find("form").trigger("submit.prevent");
await flushPromises();
expect(updateSettings).toHaveBeenCalledWith(
expect.objectContaining({
api_key_acl_trust_forwarded_ip: true,
}),
);
});
it("links payment guidance to README sections instead of removed payment docs", async () => {
const wrapper = mountView();