mirror of
https://github.com/gethomepage/homepage.git
synced 2026-05-19 03:49:14 +08:00
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
71 lines
2.1 KiB
JavaScript
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"),
|
|
});
|