Security page, admin quick controls, and whitelist reload self-healing

- RCON client retries once on a fresh connection after stale-socket
  timeouts (panel idle overnight held dead sockets, so 'whitelist
  reload' silently failed and approvals needed a server restart)
- Auth watcher verifies pending players against the LIVE whitelist every
  5s and re-writes/reloads if the server missed it, refunding lost
  window time
- Log watcher records blocked join attempts (name + IP) with rate-
  limited notifications — scanner bots are now visible in the panel
- New Security page: blocked-attempt log with one-click IP ban, banned
  players/IPs management, kick-everyone lockdown
- Player detail modal: ban, op/deop, gamemode switching
- Overview quick controls: time/weather/difficulty, gamerule toggles
  (keepInventory, mobGriefing, PvP...), broadcast box
- Settings toggles for blocked-attempt notifications (panel + Discord)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Aryan SinghandClaude Fable 5 committed 2026-07-11 11:50:27 -05:00
1 parent 4fe304c5af
commit deeeaf0042
13 files changed
+809 -3

No files matched your search

+13
View File
@@ -6,6 +6,7 @@ import { Play, Square, RotateCw, HardDrive, Globe2, Cuboid } from "lucide-react"
import { api, useApi, useSSE, toast } from "@/lib/api";
import { Card, StatTile, Button, Badge, EmptyState } from "@/components/ui";
import { Sparkline, UsageBar, type Point } from "@/components/charts";
import { QuickControls } from "@/components/quickcontrols";
import { fmtBytes, fmtDuration, timeAgo, fmtCountdown } from "@/lib/format";
type ServerData = {
@@ -50,6 +51,15 @@ const ACTIVITY_LABELS: Record<string, { label: string; color: "good" | "warn" |
power: { label: "power", color: "muted" },
console: { label: "console", color: "muted" },
world_reset: { label: "world reset", color: "crit" },
blocked: { label: "blocked", color: "crit" },
ban: { label: "banned", color: "crit" },
ban_ip: { label: "IP banned", color: "crit" },
pardon: { label: "unbanned", color: "info" },
pardon_ip: { label: "IP unbanned", color: "info" },
kick_all: { label: "kicked all", color: "warn" },
admin: { label: "admin", color: "info" },
whitelist_heal: { label: "whitelist re-synced", color: "warn" },
password_reset: { label: "password reset", color: "info" },
};
export default function OverviewPage() {
@@ -218,6 +228,9 @@ export default function OverviewPage() {
</Card>
)}
{/* admin quick controls */}
<QuickControls running={running} />
{/* world + disk */}
<Card title="World & storage">
<div className="space-y-3">