From 0addba0d6397a264ae343d8a8310d300361ef308 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sun, 19 Jul 2026 07:55:06 -0700 Subject: [PATCH] Enhancement: handle OMV v8 auth response (#6886) --- src/widgets/openmediavault/proxy.js | 2 +- src/widgets/openmediavault/proxy.test.js | 33 ++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/widgets/openmediavault/proxy.js b/src/widgets/openmediavault/proxy.js index ef089a043..b762a2f48 100644 --- a/src/widgets/openmediavault/proxy.js +++ b/src/widgets/openmediavault/proxy.js @@ -73,7 +73,7 @@ async function tryLogin(widget) { } const json = JSON.parse(resp.data.toString()); - if (json.response.authenticated !== true) { + if (json.response.authenticated !== true && json.response.status !== "authenticated") { logger.error("Login error in OpenMediaVault. Data: %s", resp.data); resp.status = 401; return [false, resp]; diff --git a/src/widgets/openmediavault/proxy.test.js b/src/widgets/openmediavault/proxy.test.js index 78266e843..de1f48344 100644 --- a/src/widgets/openmediavault/proxy.test.js +++ b/src/widgets/openmediavault/proxy.test.js @@ -145,6 +145,39 @@ describe("widgets/openmediavault/proxy", () => { expect(res.body).toEqual(Buffer.from(JSON.stringify({ response: { ok: true } }))); }); + it("accepts the OpenMediaVault 8 authenticated status after login", async () => { + getServiceWidget.mockResolvedValue({ + type: "openmediavault", + url: "http://omv", + username: "u", + password: "p", + method: "foo.bar", + }); + + httpProxy + // initial rpc unauthorized + .mockResolvedValueOnce([401, "application/json", Buffer.from(JSON.stringify({ response: {} })), {}]) + // OMV 8 login rpc + .mockResolvedValueOnce([ + 200, + "application/json", + Buffer.from(JSON.stringify({ response: { status: "authenticated" } })), + { "set-cookie": ["sid=1"] }, + ]) + // retry rpc + .mockResolvedValueOnce([200, "application/json", Buffer.from(JSON.stringify({ response: { ok: true } })), {}]); + + const req = { query: { group: "g", service: "svc", index: "0" } }; + const res = createMockRes(); + + await openmediavaultProxyHandler(req, res); + + expect(cookieJar.addCookieToJar).toHaveBeenCalled(); + expect(httpProxy).toHaveBeenCalledTimes(3); + expect(res.statusCode).toBe(200); + expect(res.body).toEqual(Buffer.from(JSON.stringify({ response: { ok: true } }))); + }); + it("returns after a failed login attempt (non-200 response)", async () => { getServiceWidget.mockResolvedValue({ type: "openmediavault",