139 lines
8.1 KiB
HTML
139 lines
8.1 KiB
HTML
|
|
{{ define "admin/security.html" }}
|
||
|
|
<!DOCTYPE html>
|
||
|
|
<html lang="en">
|
||
|
|
<head>
|
||
|
|
<meta charset="UTF-8">
|
||
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
|
|
<title>WarpBox Admin Security</title>
|
||
|
|
<link rel="icon" type="image/png" href="/static/WarpBoxLogo.png">
|
||
|
|
<link rel="stylesheet" href="/static/css/app.css">
|
||
|
|
<link rel="stylesheet" href="/static/css/window.css">
|
||
|
|
<link rel="stylesheet" href="/static/css/components/buttons.css">
|
||
|
|
<link rel="stylesheet" href="/static/css/components/toast.css">
|
||
|
|
<link rel="stylesheet" href="/static/css/admin.css">
|
||
|
|
<link rel="stylesheet" href="/static/css/security.css">
|
||
|
|
</head>
|
||
|
|
<body>
|
||
|
|
<div class="admin-shell">
|
||
|
|
<div class="admin-frame">
|
||
|
|
{{ template "admin/header.html" . }}
|
||
|
|
<div class="win98-window admin-workspace-window" role="main">
|
||
|
|
<div class="win98-titlebar">
|
||
|
|
<div class="win98-titlebar-label">
|
||
|
|
<img class="win98-titlebar-icon" src="/static/WarpBoxLogo.png" alt="" aria-hidden="true">
|
||
|
|
<h1>WarpBox Security</h1>
|
||
|
|
</div>
|
||
|
|
<div class="win98-window-controls" aria-hidden="true">
|
||
|
|
<button class="win98-control" type="button">_</button>
|
||
|
|
<button class="win98-control" type="button">□</button>
|
||
|
|
<button class="win98-control" type="button">x</button>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<nav class="menu-bar" aria-label="Security toolbar">
|
||
|
|
<div class="menu-item">
|
||
|
|
<button class="menu-button" type="button" aria-expanded="false">Security</button>
|
||
|
|
<div class="menu-popup">
|
||
|
|
<button class="menu-action" type="button" data-command="ban-ip"><span>B</span><span>Ban IP now</span><span></span></button>
|
||
|
|
<button class="menu-action" type="button" data-command="ban-until"><span>T</span><span>Set ban expiration</span><span></span></button>
|
||
|
|
<button class="menu-action" type="button" data-command="unban-ip"><span>U</span><span>Unban selected IP</span><span></span></button>
|
||
|
|
<button class="menu-action" type="button" data-command="refresh"><span>R</span><span>Refresh data</span><span>F5</span></button>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</nav>
|
||
|
|
|
||
|
|
<div class="admin-workspace-body security-page-body">
|
||
|
|
<section class="security-grid">
|
||
|
|
<section class="security-panel">
|
||
|
|
<div class="security-panel-header"><strong>Manual controls</strong><span>basic first version</span></div>
|
||
|
|
<div class="security-panel-body">
|
||
|
|
<label class="security-field">IP address
|
||
|
|
<input class="security-input" id="security-ip-input" type="text" placeholder="203.0.113.12">
|
||
|
|
</label>
|
||
|
|
<button class="win98-button security-button" type="button" data-command="ban-ip">Ban IP (temporary)</button>
|
||
|
|
<label class="security-field">Ban expires (UTC)
|
||
|
|
<input class="security-input" id="security-ban-until" type="datetime-local">
|
||
|
|
</label>
|
||
|
|
<button class="win98-button security-button" type="button" data-command="ban-until">Set ban expiration</button>
|
||
|
|
<button class="win98-button security-button" type="button" data-command="unban-ip">Unban selected IP</button>
|
||
|
|
<div class="security-note">Ban duration and auto-ban thresholds come from Settings -> Security.</div>
|
||
|
|
</div>
|
||
|
|
</section>
|
||
|
|
|
||
|
|
<section class="security-panel">
|
||
|
|
<div class="security-panel-header"><strong>Recent alerts</strong><span>{{ len .Alerts }} total</span></div>
|
||
|
|
<div class="security-panel-body">
|
||
|
|
<ul class="security-list" id="security-alert-list"></ul>
|
||
|
|
</div>
|
||
|
|
</section>
|
||
|
|
</section>
|
||
|
|
|
||
|
|
<section class="security-panel">
|
||
|
|
<div class="security-panel-header"><strong>IP addresses</strong><span id="security-bans-count">{{ len .Bans }} active bans</span></div>
|
||
|
|
<div class="security-panel-body security-ban-grid">
|
||
|
|
<div class="security-table-wrap security-bans-wrap">
|
||
|
|
<table class="security-table">
|
||
|
|
<thead>
|
||
|
|
<tr>
|
||
|
|
<th>IP</th>
|
||
|
|
<th>Status</th>
|
||
|
|
<th>Ban expires (UTC)</th>
|
||
|
|
</tr>
|
||
|
|
</thead>
|
||
|
|
<tbody id="security-bans-body"></tbody>
|
||
|
|
</table>
|
||
|
|
</div>
|
||
|
|
<div class="security-ip-detail">
|
||
|
|
<h3 id="security-detail-ip">No IP selected</h3>
|
||
|
|
<ul>
|
||
|
|
<li><strong>Risk:</strong> <span id="security-detail-risk">-</span></li>
|
||
|
|
<li><strong>Threat:</strong> <span id="security-detail-threat">-</span></li>
|
||
|
|
<li><strong>Geo:</strong> <span id="security-detail-geo">Placeholder (geoipfast later)</span></li>
|
||
|
|
<li><strong>ASN:</strong> <span id="security-detail-asn">Placeholder</span></li>
|
||
|
|
<li><strong>Ban until:</strong> <span id="security-detail-until">-</span></li>
|
||
|
|
</ul>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</section>
|
||
|
|
|
||
|
|
<section class="security-panel">
|
||
|
|
<div class="security-panel-header"><strong>Recent security activity</strong><span>{{ len .Events }} rows</span></div>
|
||
|
|
<div class="security-panel-body">
|
||
|
|
<div class="security-table-wrap">
|
||
|
|
<table class="security-table">
|
||
|
|
<thead>
|
||
|
|
<tr>
|
||
|
|
<th>Time</th>
|
||
|
|
<th>Kind</th>
|
||
|
|
<th>Severity</th>
|
||
|
|
<th>IP</th>
|
||
|
|
<th>Path</th>
|
||
|
|
<th>Message</th>
|
||
|
|
</tr>
|
||
|
|
</thead>
|
||
|
|
<tbody id="security-activity-body"></tbody>
|
||
|
|
</table>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</section>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<footer class="status-bar admin-dashboard-statusbar">
|
||
|
|
<span id="security-status-left">Security controls active</span>
|
||
|
|
<span id="security-status-middle">alerts + activity linked</span>
|
||
|
|
<span id="security-status-right">admin only</span>
|
||
|
|
</footer>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<div class="toast" id="toast" role="status" aria-live="polite"></div>
|
||
|
|
<script id="security-events-data" type="application/json">{{ toJSON .Events }}</script>
|
||
|
|
<script id="security-alerts-data" type="application/json">{{ toJSON .Alerts }}</script>
|
||
|
|
<script id="security-bans-data" type="application/json">{{ toJSON .Bans }}</script>
|
||
|
|
<script src="/static/js/warpbox-ui.js"></script>
|
||
|
|
<script src="/static/js/admin/security.js"></script>
|
||
|
|
</body>
|
||
|
|
</html>
|
||
|
|
{{ end }}
|