Hide username and logout on LAN clients in control header.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -86,15 +86,20 @@ async def login(
|
|||||||
|
|
||||||
@router.get("/me")
|
@router.get("/me")
|
||||||
async def me(
|
async def me(
|
||||||
|
request: Request,
|
||||||
username: Annotated[str, Depends(require_control_user)],
|
username: Annotated[str, Depends(require_control_user)],
|
||||||
settings: Annotated[ControlSettings, Depends(get_control_settings)],
|
settings: Annotated[ControlSettings, Depends(get_control_settings)],
|
||||||
) -> dict:
|
) -> dict:
|
||||||
|
ip = client_ip(request)
|
||||||
|
lan = is_lan_ip(ip)
|
||||||
return {
|
return {
|
||||||
"username": username,
|
"username": username,
|
||||||
"poll_interval_sec": settings.control_poll_interval_sec,
|
"poll_interval_sec": settings.control_poll_interval_sec,
|
||||||
"sse_interval_sec": settings.control_sse_interval_sec,
|
"sse_interval_sec": settings.control_sse_interval_sec,
|
||||||
"show_default_hint": settings.is_default_credentials,
|
"show_default_hint": settings.is_default_credentials,
|
||||||
"lan_bypass_enabled": settings.lan_auth_bypass,
|
"lan_bypass_enabled": settings.lan_auth_bypass,
|
||||||
|
"lan_client": lan,
|
||||||
|
"client_ip": ip or None,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { type ReactNode } from "react";
|
import { type ReactNode, useEffect, useState } from "react";
|
||||||
import {
|
import {
|
||||||
NavLink,
|
NavLink,
|
||||||
Navigate,
|
Navigate,
|
||||||
@@ -6,13 +6,21 @@ import {
|
|||||||
Routes,
|
Routes,
|
||||||
useLocation,
|
useLocation,
|
||||||
} from "react-router-dom";
|
} from "react-router-dom";
|
||||||
import { clearSession, getToken, getUsername } from "./api";
|
import { apiFetch, clearSession, getToken, getUsername } from "./api";
|
||||||
import LoginPage from "./pages/Login";
|
import LoginPage from "./pages/Login";
|
||||||
import MonitorPage from "./pages/Monitor";
|
import MonitorPage from "./pages/Monitor";
|
||||||
import SettingsPage from "./pages/Settings";
|
import SettingsPage from "./pages/Settings";
|
||||||
|
|
||||||
function Shell({ children }: { children: ReactNode }) {
|
function Shell({ children }: { children: ReactNode }) {
|
||||||
const user = getUsername();
|
const user = getUsername();
|
||||||
|
const [lanClient, setLanClient] = useState(false);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
apiFetch<{ lan_client?: boolean }>("/api/auth/me")
|
||||||
|
.then((m) => setLanClient(!!m.lan_client))
|
||||||
|
.catch(() => setLanClient(false));
|
||||||
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="shell">
|
<div className="shell">
|
||||||
<header className="header">
|
<header className="header">
|
||||||
@@ -25,6 +33,7 @@ function Shell({ children }: { children: ReactNode }) {
|
|||||||
系统设置
|
系统设置
|
||||||
</NavLink>
|
</NavLink>
|
||||||
</nav>
|
</nav>
|
||||||
|
{!lanClient ? (
|
||||||
<div className="header-right">
|
<div className="header-right">
|
||||||
<span className="meta">{user}</span>
|
<span className="meta">{user}</span>
|
||||||
<button
|
<button
|
||||||
@@ -38,6 +47,7 @@ function Shell({ children }: { children: ReactNode }) {
|
|||||||
退出
|
退出
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
) : null}
|
||||||
</header>
|
</header>
|
||||||
<main className="main">{children}</main>
|
<main className="main">{children}</main>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user