docs: expand configuration docs for admin and BadgerDB
Update README to explain startup config precedence (defaults/env/admin overrides), document admin/bootstrap and feature toggles, and clarify storage locations under WARPBOX_DATA_DIR including BadgerDB metadata. Also refresh project layout to include new config and metastore packages.docs: expand configuration docs for admin and BadgerDB Update README to explain startup config precedence (defaults/env/admin overrides), document admin/bootstrap and feature toggles, and clarify storage locations under WARPBOX_DATA_DIR including BadgerDB metadata. Also refresh project layout to include new config and metastore packages.
This commit is contained in:
39
templates/admin.html
Normal file
39
templates/admin.html
Normal file
@@ -0,0 +1,39 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>WarpBox Admin</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/admin.css">
|
||||
</head>
|
||||
<body>
|
||||
<main>
|
||||
<section class="win98-window admin-window" aria-labelledby="admin-title">
|
||||
<header class="win98-titlebar">
|
||||
<div class="win98-titlebar-label">
|
||||
<img class="win98-titlebar-icon" src="/static/WarpBoxLogo.png" alt="" aria-hidden="true">
|
||||
<h1 id="admin-title">WarpBox Admin</h1>
|
||||
</div>
|
||||
</header>
|
||||
<div class="win98-panel admin-panel">
|
||||
<nav class="admin-nav">
|
||||
<span>Signed in as {{ .CurrentUser }}</span>
|
||||
<span class="admin-spacer"></span>
|
||||
<form action="/admin/logout" method="post">
|
||||
<button class="win98-button" type="submit">Logout</button>
|
||||
</form>
|
||||
</nav>
|
||||
<div class="admin-grid">
|
||||
<a class="win98-panel admin-link" href="/admin/boxes"><strong>Boxes</strong></a>
|
||||
<a class="win98-panel admin-link" href="/admin/users"><strong>Users</strong></a>
|
||||
<a class="win98-panel admin-link" href="/admin/tags"><strong>Tags</strong></a>
|
||||
<a class="win98-panel admin-link" href="/admin/settings"><strong>Settings</strong></a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
69
templates/admin_boxes.html
Normal file
69
templates/admin_boxes.html
Normal file
@@ -0,0 +1,69 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>WarpBox Admin Boxes</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/admin.css">
|
||||
</head>
|
||||
<body>
|
||||
<main>
|
||||
<section class="win98-window admin-window" aria-labelledby="admin-boxes-title">
|
||||
<header class="win98-titlebar">
|
||||
<div class="win98-titlebar-label">
|
||||
<img class="win98-titlebar-icon" src="/static/WarpBoxLogo.png" alt="" aria-hidden="true">
|
||||
<h1 id="admin-boxes-title">Boxes</h1>
|
||||
</div>
|
||||
</header>
|
||||
<div class="win98-panel admin-panel">
|
||||
<nav class="admin-nav">
|
||||
<a class="win98-button" href="/admin">Admin</a>
|
||||
<a class="win98-button" href="/admin/users">Users</a>
|
||||
<a class="win98-button" href="/admin/tags">Tags</a>
|
||||
<a class="win98-button" href="/admin/settings">Settings</a>
|
||||
<span class="admin-spacer"></span>
|
||||
<span>{{ .CurrentUser }}</span>
|
||||
</nav>
|
||||
<div class="admin-summary">
|
||||
<span class="win98-panel">Boxes: {{ .TotalBoxes }}</span>
|
||||
<span class="win98-panel">Storage: {{ .TotalStorage }}</span>
|
||||
<span class="win98-panel">Expired: {{ .ExpiredBoxes }}</span>
|
||||
</div>
|
||||
<table class="admin-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Box ID</th>
|
||||
<th>Files</th>
|
||||
<th>Size</th>
|
||||
<th>Created</th>
|
||||
<th>Expires</th>
|
||||
<th>Flags</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{ range .Boxes }}
|
||||
<tr>
|
||||
<td><a href="/box/{{ .ID }}">{{ .ID }}</a></td>
|
||||
<td>{{ .FileCount }}</td>
|
||||
<td>{{ .TotalSizeLabel }}</td>
|
||||
<td>{{ .CreatedAt }}</td>
|
||||
<td>{{ .ExpiresAt }}</td>
|
||||
<td>
|
||||
{{ if .Expired }}expired {{ end }}
|
||||
{{ if .OneTimeDownload }}one-time {{ end }}
|
||||
{{ if .PasswordProtected }}password {{ end }}
|
||||
</td>
|
||||
</tr>
|
||||
{{ else }}
|
||||
<tr><td colspan="6">No boxes found.</td></tr>
|
||||
{{ end }}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
44
templates/admin_login.html
Normal file
44
templates/admin_login.html
Normal file
@@ -0,0 +1,44 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>WarpBox Admin Login</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/admin.css">
|
||||
</head>
|
||||
<body>
|
||||
<main>
|
||||
<section class="win98-window admin-window" aria-labelledby="admin-login-title">
|
||||
<header class="win98-titlebar">
|
||||
<div class="win98-titlebar-label">
|
||||
<img class="win98-titlebar-icon" src="/static/WarpBoxLogo.png" alt="" aria-hidden="true">
|
||||
<h1 id="admin-login-title">WarpBox Admin</h1>
|
||||
</div>
|
||||
</header>
|
||||
<div class="win98-panel admin-panel">
|
||||
{{ if .Error }}
|
||||
<p class="admin-error">{{ .Error }}</p>
|
||||
{{ end }}
|
||||
{{ if .AdminLoginEnabled }}
|
||||
<form class="admin-form" action="/admin/login" method="post">
|
||||
<label class="admin-form-row">
|
||||
<span>Username</span>
|
||||
<input name="username" autocomplete="username" required>
|
||||
</label>
|
||||
<label class="admin-form-row">
|
||||
<span>Password</span>
|
||||
<input name="password" type="password" autocomplete="current-password" required>
|
||||
</label>
|
||||
<button class="win98-button" type="submit">Login</button>
|
||||
</form>
|
||||
{{ else }}
|
||||
<p>Administrator login is disabled. Set WARPBOX_ADMIN_PASSWORD and restart to bootstrap the first admin user.</p>
|
||||
{{ end }}
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
72
templates/admin_settings.html
Normal file
72
templates/admin_settings.html
Normal file
@@ -0,0 +1,72 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>WarpBox Admin Settings</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/admin.css">
|
||||
</head>
|
||||
<body>
|
||||
<main>
|
||||
<section class="win98-window admin-window" aria-labelledby="admin-settings-title">
|
||||
<header class="win98-titlebar">
|
||||
<div class="win98-titlebar-label">
|
||||
<img class="win98-titlebar-icon" src="/static/WarpBoxLogo.png" alt="" aria-hidden="true">
|
||||
<h1 id="admin-settings-title">Settings</h1>
|
||||
</div>
|
||||
</header>
|
||||
<div class="win98-panel admin-panel">
|
||||
<nav class="admin-nav">
|
||||
<a class="win98-button" href="/admin">Admin</a>
|
||||
<a class="win98-button" href="/admin/boxes">Boxes</a>
|
||||
<a class="win98-button" href="/admin/users">Users</a>
|
||||
<a class="win98-button" href="/admin/tags">Tags</a>
|
||||
<span class="admin-spacer"></span>
|
||||
<span>{{ .CurrentUser }}</span>
|
||||
</nav>
|
||||
{{ if .Error }}
|
||||
<p class="admin-error">{{ .Error }}</p>
|
||||
{{ end }}
|
||||
<form class="admin-form" action="/admin/settings" method="post">
|
||||
<table class="admin-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Setting</th>
|
||||
<th>Value</th>
|
||||
<th>Source</th>
|
||||
<th>Env</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{ range .Rows }}
|
||||
<tr>
|
||||
<td>{{ .Definition.Label }}{{ if .Definition.HardLimit }} (hard){{ end }}</td>
|
||||
<td>
|
||||
{{ if and $.OverridesAllowed .Definition.Editable }}
|
||||
{{ if eq .Definition.Type "bool" }}
|
||||
<input type="checkbox" name="{{ .Definition.Key }}" value="true" {{ if eq .Value "true" }}checked{{ end }}>
|
||||
{{ else }}
|
||||
<input name="{{ .Definition.Key }}" value="{{ .Value }}" inputmode="numeric">
|
||||
{{ end }}
|
||||
{{ else }}
|
||||
{{ .Value }}
|
||||
{{ end }}
|
||||
</td>
|
||||
<td>{{ .Source }}</td>
|
||||
<td>{{ .Definition.EnvName }}</td>
|
||||
</tr>
|
||||
{{ end }}
|
||||
</tbody>
|
||||
</table>
|
||||
{{ if .OverridesAllowed }}
|
||||
<button class="win98-button" type="submit">Save Settings</button>
|
||||
{{ end }}
|
||||
</form>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
102
templates/admin_tags.html
Normal file
102
templates/admin_tags.html
Normal file
@@ -0,0 +1,102 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>WarpBox Admin Tags</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/admin.css">
|
||||
</head>
|
||||
<body>
|
||||
<main>
|
||||
<section class="win98-window admin-window" aria-labelledby="admin-tags-title">
|
||||
<header class="win98-titlebar">
|
||||
<div class="win98-titlebar-label">
|
||||
<img class="win98-titlebar-icon" src="/static/WarpBoxLogo.png" alt="" aria-hidden="true">
|
||||
<h1 id="admin-tags-title">Tags</h1>
|
||||
</div>
|
||||
</header>
|
||||
<div class="win98-panel admin-panel">
|
||||
<nav class="admin-nav">
|
||||
<a class="win98-button" href="/admin">Admin</a>
|
||||
<a class="win98-button" href="/admin/boxes">Boxes</a>
|
||||
<a class="win98-button" href="/admin/users">Users</a>
|
||||
<a class="win98-button" href="/admin/settings">Settings</a>
|
||||
<span class="admin-spacer"></span>
|
||||
<span>{{ .CurrentUser }}</span>
|
||||
</nav>
|
||||
{{ if .Error }}
|
||||
<p class="admin-error">{{ .Error }}</p>
|
||||
{{ end }}
|
||||
<form class="admin-form win98-panel" action="/admin/tags" method="post">
|
||||
<label class="admin-form-row">
|
||||
<span>Name</span>
|
||||
<input name="name" required>
|
||||
</label>
|
||||
<label class="admin-form-row">
|
||||
<span>Description</span>
|
||||
<textarea name="description" rows="2"></textarea>
|
||||
</label>
|
||||
<div class="admin-checks">
|
||||
<label><input type="checkbox" name="admin_access" value="true"><span>Admin access</span></label>
|
||||
<label><input type="checkbox" name="admin_users_manage" value="true"><span>Manage users</span></label>
|
||||
<label><input type="checkbox" name="admin_settings_manage" value="true"><span>Manage settings</span></label>
|
||||
<label><input type="checkbox" name="admin_boxes_view" value="true"><span>View boxes</span></label>
|
||||
<label><input type="checkbox" name="upload_allowed" value="true"><span>Upload allowed</span></label>
|
||||
<label><input type="checkbox" name="zip_download_allowed" value="true"><span>ZIP allowed</span></label>
|
||||
<label><input type="checkbox" name="one_time_download_allowed" value="true"><span>One-time allowed</span></label>
|
||||
<label><input type="checkbox" name="renewable_allowed" value="true"><span>Renewable allowed</span></label>
|
||||
</div>
|
||||
<label class="admin-form-row">
|
||||
<span>Max file size bytes</span>
|
||||
<input name="max_file_size_bytes" inputmode="numeric">
|
||||
</label>
|
||||
<label class="admin-form-row">
|
||||
<span>Max box size bytes</span>
|
||||
<input name="max_box_size_bytes" inputmode="numeric">
|
||||
</label>
|
||||
<label class="admin-form-row">
|
||||
<span>Allowed expiry seconds</span>
|
||||
<input name="allowed_expiry_seconds" placeholder="600, 3600, 86400">
|
||||
</label>
|
||||
<button class="win98-button" type="submit">Create Tag</button>
|
||||
</form>
|
||||
<table class="admin-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Description</th>
|
||||
<th>Flags</th>
|
||||
<th>Max file</th>
|
||||
<th>Max box</th>
|
||||
<th>Expiry seconds</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{ range .Tags }}
|
||||
<tr>
|
||||
<td>{{ .Name }} {{ if .Protected }}(protected){{ end }}</td>
|
||||
<td>{{ .Description }}</td>
|
||||
<td>
|
||||
{{ if .AdminAccess }}admin {{ end }}
|
||||
{{ if .UploadAllowed }}upload {{ end }}
|
||||
{{ if .ZipDownloadAllowed }}zip {{ end }}
|
||||
{{ if .OneTimeDownloadAllowed }}one-time {{ end }}
|
||||
{{ if .RenewableAllowed }}renew {{ end }}
|
||||
</td>
|
||||
<td>{{ .MaxFileSizeBytes }}</td>
|
||||
<td>{{ .MaxBoxSizeBytes }}</td>
|
||||
<td>{{ .AllowedExpirySeconds }}</td>
|
||||
</tr>
|
||||
{{ else }}
|
||||
<tr><td colspan="6">No tags found.</td></tr>
|
||||
{{ end }}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
92
templates/admin_users.html
Normal file
92
templates/admin_users.html
Normal file
@@ -0,0 +1,92 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>WarpBox Admin Users</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/admin.css">
|
||||
</head>
|
||||
<body>
|
||||
<main>
|
||||
<section class="win98-window admin-window" aria-labelledby="admin-users-title">
|
||||
<header class="win98-titlebar">
|
||||
<div class="win98-titlebar-label">
|
||||
<img class="win98-titlebar-icon" src="/static/WarpBoxLogo.png" alt="" aria-hidden="true">
|
||||
<h1 id="admin-users-title">Users</h1>
|
||||
</div>
|
||||
</header>
|
||||
<div class="win98-panel admin-panel">
|
||||
<nav class="admin-nav">
|
||||
<a class="win98-button" href="/admin">Admin</a>
|
||||
<a class="win98-button" href="/admin/boxes">Boxes</a>
|
||||
<a class="win98-button" href="/admin/tags">Tags</a>
|
||||
<a class="win98-button" href="/admin/settings">Settings</a>
|
||||
<span class="admin-spacer"></span>
|
||||
<span>{{ .CurrentUser }}</span>
|
||||
</nav>
|
||||
{{ if .Error }}
|
||||
<p class="admin-error">{{ .Error }}</p>
|
||||
{{ end }}
|
||||
<form class="admin-form win98-panel" action="/admin/users" method="post">
|
||||
<label class="admin-form-row">
|
||||
<span>Username</span>
|
||||
<input name="username" required>
|
||||
</label>
|
||||
<label class="admin-form-row">
|
||||
<span>Email</span>
|
||||
<input name="email" type="email">
|
||||
</label>
|
||||
<label class="admin-form-row">
|
||||
<span>Password</span>
|
||||
<input name="password" type="password" autocomplete="new-password" required>
|
||||
</label>
|
||||
<div class="admin-checks">
|
||||
{{ range .Tags }}
|
||||
<label>
|
||||
<input type="checkbox" name="tag_ids" value="{{ .ID }}">
|
||||
<span>{{ .Name }}</span>
|
||||
</label>
|
||||
{{ end }}
|
||||
</div>
|
||||
<button class="win98-button" type="submit">Create User</button>
|
||||
</form>
|
||||
<table class="admin-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Username</th>
|
||||
<th>Email</th>
|
||||
<th>Tags</th>
|
||||
<th>Created</th>
|
||||
<th>Status</th>
|
||||
<th>Action</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{ range .Users }}
|
||||
<tr>
|
||||
<td>{{ .Username }}</td>
|
||||
<td>{{ .Email }}</td>
|
||||
<td>{{ .Tags }}</td>
|
||||
<td>{{ .CreatedAt }}</td>
|
||||
<td>{{ if .Disabled }}Disabled{{ else }}Active{{ end }}</td>
|
||||
<td>
|
||||
<form action="/admin/users" method="post">
|
||||
<input type="hidden" name="action" value="toggle_disabled">
|
||||
<input type="hidden" name="user_id" value="{{ .ID }}">
|
||||
<button class="win98-button" type="submit" {{ if .IsCurrent }}disabled{{ end }}>{{ if .Disabled }}Enable{{ else }}Disable{{ end }}</button>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
{{ else }}
|
||||
<tr><td colspan="6">No users found.</td></tr>
|
||||
{{ end }}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
@@ -26,7 +26,7 @@
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<form class="upload-form" action="/upload" method="post" enctype="multipart/form-data">
|
||||
<form class="upload-form" action="/upload" method="post" enctype="multipart/form-data" data-uploads-enabled="{{ if .UploadsEnabled }}true{{ else }}false{{ end }}">
|
||||
<div class="win98-menu upload-menu" aria-hidden="true">
|
||||
<span class="win98-menu-option">File</span>
|
||||
<span class="win98-menu-option">Edit</span>
|
||||
@@ -41,7 +41,7 @@
|
||||
<span class="upload-secondary">or click Browse to choose one</span>
|
||||
</label>
|
||||
|
||||
<input id="file-upload" class="upload-input" type="file" name="files" multiple>
|
||||
<input id="file-upload" class="upload-input" type="file" name="files" multiple {{ if not .UploadsEnabled }}disabled{{ end }}>
|
||||
|
||||
<fieldset class="upload-options">
|
||||
<legend>Box options</legend>
|
||||
@@ -76,13 +76,17 @@
|
||||
</div>
|
||||
|
||||
<div class="upload-file-list" aria-live="polite" aria-label="Selected files">
|
||||
<p class="upload-empty-state">No files selected</p>
|
||||
{{ if .UploadsEnabled }}
|
||||
<p class="upload-empty-state">No files selected</p>
|
||||
{{ else }}
|
||||
<p class="upload-empty-state">Guest uploads are disabled.</p>
|
||||
{{ end }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<footer class="upload-actions">
|
||||
<label class="win98-button" for="file-upload">Browse...</label>
|
||||
<button class="win98-button" type="submit">Upload</button>
|
||||
<button class="win98-button" type="submit" {{ if not .UploadsEnabled }}disabled{{ end }}>Upload</button>
|
||||
</footer>
|
||||
|
||||
<div class="upload-overall" aria-live="polite">
|
||||
|
||||
Reference in New Issue
Block a user