147 lines
6.3 KiB
HTML
147 lines
6.3 KiB
HTML
{{define "title"}}Domain — {{.Domain.Name}}{{end}}
|
|
{{define "content"}}
|
|
<div class="flex items-center gap-3 mb-6">
|
|
<a href="/admin/domains" class="text-gray-400 text-sm hover:text-white">Domains</a>
|
|
<span class="text-gray-600">/</span>
|
|
<h1 class="text-xl font-bold text-white">{{.Domain.Name}}</h1>
|
|
{{if .Domain.Enabled}}<span class="badge badge-green">enabled</span>{{else}}<span class="badge badge-red">disabled</span>{{end}}
|
|
</div>
|
|
|
|
<div style="display:grid;grid-template-columns:1fr 1fr;gap:1.5rem">
|
|
|
|
<!-- Left column -->
|
|
<div>
|
|
<!-- Toggle enable -->
|
|
<div class="card">
|
|
<div class="text-sm font-semibold text-gray-300 mb-3">Enable / Disable</div>
|
|
<form method="POST" action="/admin/domains/{{.Domain.ID}}/enable">
|
|
<input type="hidden" name="_csrf" value="{{.CSRF}}">
|
|
{{if .Domain.Enabled}}
|
|
<input type="hidden" name="enabled" value="0">
|
|
<button type="submit" class="btn btn-danger">Disable domain</button>
|
|
{{else}}
|
|
<input type="hidden" name="enabled" value="1">
|
|
<button type="submit" class="btn btn-primary">Enable domain</button>
|
|
{{end}}
|
|
</form>
|
|
</div>
|
|
|
|
<!-- Limits -->
|
|
<div class="card">
|
|
<div class="text-sm font-semibold text-gray-300 mb-3">Limits</div>
|
|
<form method="POST" action="/admin/domains/{{.Domain.ID}}/limits">
|
|
<input type="hidden" name="_csrf" value="{{.CSRF}}">
|
|
<div class="field">
|
|
<label>Max users (0 = unlimited)</label>
|
|
<input type="number" name="max_users" value="{{.Domain.MaxUsers}}" min="0" max="100000">
|
|
</div>
|
|
<div class="field">
|
|
<label>Max quota per user (MB, 0 = unlimited)</label>
|
|
<input type="number" name="max_quota_mb" value="{{mb .Domain.MaxQuotaBytes}}" min="0" max="1048576">
|
|
</div>
|
|
<button type="submit" class="btn btn-primary btn-sm">Save limits</button>
|
|
</form>
|
|
</div>
|
|
|
|
<!-- Delete -->
|
|
<div class="card" style="border:1px solid #7f1d1d">
|
|
<div class="text-sm font-semibold text-red-400 mb-2">Delete domain</div>
|
|
<div class="text-xs text-gray-400 mb-3">Permanently deletes the domain and ALL users and messages within it. This cannot be undone.</div>
|
|
<form method="POST" action="/admin/domains/{{.Domain.ID}}/delete"
|
|
onsubmit="return confirm('Delete domain {{.Domain.Name}} and all its data?')">
|
|
<input type="hidden" name="_csrf" value="{{.CSRF}}">
|
|
<button type="submit" class="btn btn-danger btn-sm">Delete domain</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Right column -->
|
|
<div>
|
|
<!-- DKIM -->
|
|
<div class="card">
|
|
<div class="text-sm font-semibold text-gray-300 mb-3">DKIM key</div>
|
|
{{if .Domain.DKIMPublic}}
|
|
<div class="text-xs text-gray-400 mb-1">
|
|
Selector: <span class="text-white">{{.Domain.DKIMSelector}}</span> /
|
|
Algorithm: <span class="text-white">{{.Domain.DKIMAlgo}}</span>
|
|
</div>
|
|
<div class="text-xs text-gray-300 mb-3 font-semibold">DNS TXT record:</div>
|
|
<div style="background:#111827;border-radius:.375rem;padding:.625rem;font-size:.7rem;color:#6ee7b7;word-break:break-all;margin-bottom:.875rem;line-height:1.6">{{.DKIMRecord}}</div>
|
|
{{else}}
|
|
<div class="text-xs text-yellow-400 mb-3">No DKIM key generated yet.</div>
|
|
{{end}}
|
|
<form method="POST" action="/admin/domains/{{.Domain.ID}}/dkim">
|
|
<input type="hidden" name="_csrf" value="{{.CSRF}}">
|
|
<div class="field">
|
|
<label>Algorithm for new key</label>
|
|
<select name="algo">
|
|
<option value="rsa2048" {{if eq .Domain.DKIMAlgo "rsa2048"}}selected{{end}}>RSA-2048</option>
|
|
<option value="ed25519" {{if eq .Domain.DKIMAlgo "ed25519"}}selected{{end}}>Ed25519</option>
|
|
</select>
|
|
</div>
|
|
<button type="submit" class="btn btn-primary btn-sm"
|
|
onclick="return !{{if .Domain.DKIMPublic}}confirm('Regenerate DKIM key? Old signatures become invalid.'){{else}}false{{end}}">
|
|
{{if .Domain.DKIMPublic}}Regenerate DKIM key{{else}}Generate DKIM key{{end}}
|
|
</button>
|
|
</form>
|
|
</div>
|
|
|
|
<!-- DNS hints -->
|
|
<div class="card">
|
|
<div class="text-sm font-semibold text-gray-300 mb-3">Recommended DNS records</div>
|
|
<div class="text-xs text-gray-400 mb-1">SPF</div>
|
|
<div style="background:#111827;border-radius:.375rem;padding:.5rem;font-size:.7rem;color:#93c5fd;word-break:break-all;margin-bottom:.75rem">{{.SPFHint}}</div>
|
|
<div class="text-xs text-gray-400 mb-1">DMARC</div>
|
|
<div style="background:#111827;border-radius:.375rem;padding:.5rem;font-size:.7rem;color:#93c5fd;word-break:break-all">{{.DMARCHint}}</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Users -->
|
|
<div class="mt-4">
|
|
<div class="flex items-center justify-between mb-2">
|
|
<h2 class="text-sm font-semibold text-gray-300">Users ({{len .Users}})</h2>
|
|
<a href="/admin/users" class="btn btn-primary btn-sm">Add user</a>
|
|
</div>
|
|
<div class="card" style="padding:0;overflow:hidden">
|
|
{{if .Users}}
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Email</th>
|
|
<th>Display name</th>
|
|
<th>Status</th>
|
|
<th>Role</th>
|
|
<th>Quota used</th>
|
|
<th>Last login</th>
|
|
<th></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{{range .Users}}
|
|
<tr>
|
|
<td><a href="/admin/users/{{.ID}}" class="text-blue-400 hover:underline">{{.Email}}</a></td>
|
|
<td class="text-gray-300">{{.DisplayName}}</td>
|
|
<td>
|
|
{{if .Enabled}}<span class="badge badge-green">active</span>
|
|
{{else}}<span class="badge badge-red">disabled</span>{{end}}
|
|
</td>
|
|
<td>
|
|
{{if .Admin}}<span class="badge badge-yellow">admin</span>
|
|
{{else if .DomainAdmin}}<span class="badge badge-gray">domain admin</span>
|
|
{{else}}<span class="badge badge-gray">user</span>{{end}}
|
|
</td>
|
|
<td class="text-gray-400 text-xs">{{humanBytes .UsedBytes}} / {{if .QuotaBytes}}{{humanBytes .QuotaBytes}}{{else}}unlimited{{end}}</td>
|
|
<td class="text-gray-400 text-xs">{{if isZero .LastLogin}}never{{else}}{{shortTime .LastLogin}}{{end}}</td>
|
|
<td><a href="/admin/users/{{.ID}}" class="btn btn-primary btn-sm">Edit</a></td>
|
|
</tr>
|
|
{{end}}
|
|
</tbody>
|
|
</table>
|
|
{{else}}
|
|
<div class="p-6 text-center text-gray-500 text-sm">No users in this domain.</div>
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
{{end}}
|