Files
homepage/src/widgets/unifi/proxy.js
shamoon ff4eaa2cd9
Some checks failed
Docker CI / Linting Checks (push) Has been cancelled
Docker CI / Docker Build & Push (push) Has been cancelled
Release Drafter / Update Release Draft (push) Has been cancelled
Release Drafter / Auto Label PR (push) Has been cancelled
Tests / vitest (1) (push) Has been cancelled
Tests / vitest (2) (push) Has been cancelled
Tests / vitest (3) (push) Has been cancelled
Tests / vitest (4) (push) Has been cancelled
Crowdin Action / Crowdin Sync (push) Has been cancelled
Repository Maintenance / Stale (push) Has been cancelled
Repository Maintenance / Lock Old Threads (push) Has been cancelled
Repository Maintenance / Close Answered Discussions (push) Has been cancelled
Repository Maintenance / Close Outdated Discussions (push) Has been cancelled
Repository Maintenance / Close Unsupported Feature Requests (push) Has been cancelled
Chore: make unifi proxy more generic (#6469)
2026-03-27 14:39:27 -07:00

71 lines
2.1 KiB
JavaScript

import getServiceWidget from "utils/config/service-helpers";
import { getPrivateWidgetOptions } from "utils/config/widget-helpers";
import createUnifiProxyHandler from "utils/proxy/handlers/unifi";
import { httpProxy } from "utils/proxy/http";
const udmpPrefix = "/proxy/network";
async function getWidget(req, logger) {
const { group, service, index } = req.query;
let widget = null;
if (group === "unifi_console" && service === "unifi_console") {
// info widget
const infowidgetIndex = req.query?.query ? JSON.parse(req.query.query).index : undefined;
widget = await getPrivateWidgetOptions("unifi_console", infowidgetIndex);
if (!widget) {
logger.debug("Error retrieving settings for this Unifi widget");
return null;
}
widget.type = "unifi";
} else {
if (!group || !service) {
logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
return null;
}
widget = await getServiceWidget(group, service, index);
if (!widget) {
logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
return null;
}
}
return widget;
}
async function resolveRequestContext({ cachedPrefix, widget }) {
const headers = {};
if (widget.key) {
headers["X-API-KEY"] = widget.key;
headers.Accept = "application/json";
return { headers, prefix: udmpPrefix };
}
if (cachedPrefix !== null) {
return { headers, prefix: cachedPrefix };
}
const [, , , responseHeaders] = await httpProxy(widget.url);
let prefix = "";
let csrfToken;
if (responseHeaders?.["x-csrf-token"]) {
prefix = udmpPrefix;
csrfToken = responseHeaders["x-csrf-token"];
} else if (responseHeaders?.["access-control-expose-headers"] || responseHeaders?.["Access-Control-Expose-Headers"]) {
prefix = udmpPrefix;
}
return { csrfToken, headers, prefix };
}
export default createUnifiProxyHandler({
proxyName: "unifiProxyHandler",
resolveWidget: getWidget,
resolveRequestContext,
getLoginEndpoint: ({ prefix }) => (prefix === udmpPrefix ? "auth/login" : "login"),
});