90 lines
3.7 KiB
HTML
90 lines
3.7 KiB
HTML
{{define "settings"}}{{template "header" .}}
|
|
<div class="row g-4" style="max-width: 900px;">
|
|
<div class="col-md-6">
|
|
<div class="card">
|
|
<div class="card-body">
|
|
<h2 class="h6">Change password</h2>
|
|
<form method="post" action="/settings/password">
|
|
{{template "csrf_field" .CSRFToken}}
|
|
<div class="mb-2">
|
|
<label class="form-label">Current password</label>
|
|
<input type="password" class="form-control" name="current_password" required>
|
|
</div>
|
|
<div class="mb-3">
|
|
<label class="form-label">New password</label>
|
|
<input type="password" class="form-control" name="new_password" minlength="8" required>
|
|
</div>
|
|
<button type="submit" class="btn btn-primary btn-sm">Update password</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card mt-3">
|
|
<div class="card-body">
|
|
<h2 class="h6" id="api-keys">API keys</h2>
|
|
<p class="text-secondary small">Used by OpenSubsonic clients via <code>apiKey=</code> authentication, in place of your password.</p>
|
|
<form method="post" action="/settings/api-keys" class="row g-2 mb-3">
|
|
{{template "csrf_field" .CSRFToken}}
|
|
<div class="col-5"><input type="text" name="name" class="form-control form-control-sm" placeholder="Key name" required></div>
|
|
<div class="col-5"><input type="text" name="client_description" class="form-control form-control-sm" placeholder="Client (optional)"></div>
|
|
<div class="col-2"><button type="submit" class="btn btn-outline-primary btn-sm w-100">New key</button></div>
|
|
</form>
|
|
{{if .Data.NewAPIKey}}
|
|
<div class="alert alert-warning small">
|
|
Copy this key now — it won't be shown again:<br>
|
|
<code>{{.Data.NewAPIKey}}</code>
|
|
</div>
|
|
{{end}}
|
|
<table class="table table-sm vs-table mb-0">
|
|
<tbody>
|
|
{{range .Data.APIKeys}}
|
|
<tr>
|
|
<td>{{.Name}}{{if .ClientDescription}} <span class="text-secondary small">({{.ClientDescription}})</span>{{end}}</td>
|
|
<td class="text-secondary small">
|
|
{{fmtTime .CreatedAt}}
|
|
{{if .LastUsedAt.Valid}}· last used {{fmtTime .LastUsedAt.Time}}{{else}}· never used{{end}}
|
|
</td>
|
|
<td class="text-end">
|
|
{{if .RevokedAt.Valid}}<span class="text-danger small">Revoked</span>{{else}}
|
|
<form method="post" action="/settings/api-keys/{{.ID}}/revoke">
|
|
{{template "csrf_field" $.CSRFToken}}
|
|
<button type="submit" class="btn btn-sm btn-outline-danger">Revoke</button>
|
|
</form>
|
|
{{end}}
|
|
</td>
|
|
</tr>
|
|
{{end}}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-md-6">
|
|
<div class="card">
|
|
<div class="card-body">
|
|
<h2 class="h6">Active sessions</h2>
|
|
<table class="table table-sm vs-table mb-0">
|
|
<tbody>
|
|
{{range .Data.Sessions}}
|
|
<tr>
|
|
<td>
|
|
<div class="small">{{.UserAgent}}</div>
|
|
<div class="text-secondary small">{{.IPAddress}} · since {{fmtTime .CreatedAt}}</div>
|
|
</td>
|
|
<td class="text-end">
|
|
<form method="post" action="/settings/sessions/{{.ID}}/revoke">
|
|
{{template "csrf_field" $.CSRFToken}}
|
|
<button type="submit" class="btn btn-sm btn-outline-danger">Revoke</button>
|
|
</form>
|
|
</td>
|
|
</tr>
|
|
{{end}}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{{template "footer" .}}{{end}}
|