From a2c38ad4e839264b080e0b8822cd7b16a72aad89 Mon Sep 17 00:00:00 2001 From: Cooldude2606 <25043174+Cooldude2606@users.noreply.github.com> Date: Wed, 21 Jan 2026 23:42:53 +0000 Subject: [PATCH 1/2] Add cluster name to login form --- packages/controller/src/routes.ts | 7 ++++++ packages/web_ui/src/components/LoginForm.tsx | 23 +++++++++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/packages/controller/src/routes.ts b/packages/controller/src/routes.ts index 5826f37c..adb1c716 100644 --- a/packages/controller/src/routes.ts +++ b/packages/controller/src/routes.ts @@ -134,6 +134,12 @@ function getPlugins(req: Request, res: Response) { res.send(plugins); } +function getClusterName(req: Request, res: Response) { + const controller: Controller = req.app.locals.controller; + const clusterName = controller.config.get("controller.name"); + res.json({ name: clusterName }); +} + function validateHostToken(req: Request, res: Response, next: any) { let token = req.header("x-access-token"); if (!token) { @@ -662,6 +668,7 @@ async function uploadMod(req: Request, res: Response) { export function addRouteHandlers(app: Application) { app.get("/metrics", (req:Request, res:Response, next:any) => getMetrics(req, res, next).catch(next)); app.get("/api/plugins", getPlugins); + app.get("/api/cluster-name", getClusterName); app.put("/api/upload-export", validateHostToken, (req:Request, res:Response, next:any) => uploadExport(req, res).catch(next) diff --git a/packages/web_ui/src/components/LoginForm.tsx b/packages/web_ui/src/components/LoginForm.tsx index e0d8ceb5..2fd64d3c 100644 --- a/packages/web_ui/src/components/LoginForm.tsx +++ b/packages/web_ui/src/components/LoginForm.tsx @@ -1,7 +1,8 @@ -import React, { Fragment, useContext } from "react"; +import React, { Fragment, useContext, useEffect, useState } from "react"; import { Button, Card, Divider, Form, Image, Input, Space, Typography } from "antd"; import LockOutlined from "@ant-design/icons/LockOutlined"; +import notify from "../util/notify"; import logo from "../images/logo.png"; import ControlContext from "./ControlContext"; @@ -36,6 +37,23 @@ function TokenAuth(props: SetTokenProps) { export default function LoginForm(props: SetTokenProps) { let plugins = useContext(ControlContext).plugins; + const [clusterName, setClusterName] = useState("Clusterio"); + + useEffect(() => { + (async () => { + try { + let response = await fetch(`${webRoot}api/cluster-name`); + if (response.ok) { + let data = await response.json(); + if (data.name) { + setClusterName(data.name); + } + } + } catch (err) { + notify("Failed to load cluster name"); + } + })(); + }, []); let loginForms = []; for (let plugin of plugins.values()) { @@ -50,7 +68,7 @@ export default function LoginForm(props: SetTokenProps) { return -

Clusterio

+

{clusterName}

Log in to the cluster using one of the methods below.
@@ -60,4 +78,3 @@ export default function LoginForm(props: SetTokenProps) { )}
; } - From 6b0dd4e9cf6c91e0bb7af4cdfddeb8878fc1bf49 Mon Sep 17 00:00:00 2001 From: Cooldude2606 <25043174+Cooldude2606@users.noreply.github.com> Date: Wed, 21 Jan 2026 23:47:47 +0000 Subject: [PATCH 2/2] Add tests for new api route --- test/controller/routes.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/controller/routes.js b/test/controller/routes.js index 06d605e6..ddccd692 100644 --- a/test/controller/routes.js +++ b/test/controller/routes.js @@ -74,6 +74,19 @@ describe("controller/src/routes", function() { assert.equal(await responses[1].text(), "test content"); }); }); + describe("/api/cluster-name", function() { + let endpoint; + beforeEach(function() { + endpoint = `http://localhost:${port}/api/cluster-name`; + }); + it("should return the cluster name from config", async function() { + controller.mockConfigEntries.set("controller.name", "Test Cluster"); + let response = await fetch(endpoint); + assert.equal(response.status, 200); + let data = await response.json(); + assert.deepEqual(data, { name: "Test Cluster" }); + }); + }); describe("/api/upload-save", function() { let endpoint; beforeEach(function() {