Self-contained HTTP/HTTPS/TCP/UDP reverse proxy manager written in Go, with SQLite storage, a Bootstrap 5 admin UI (Go templates, no JS framework), and a REST API under /api/v1. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QTXFrNP1imCW7jtfL5SZrw
73 lines
3.8 KiB
HTML
73 lines
3.8 KiB
HTML
{{define "access_list_form"}}{{template "header" .}}
|
|
{{$d := .Data}}{{$l := $d.List}}
|
|
<div class="card"><div class="card-body">
|
|
<form method="post" action="{{if $d.IsNew}}/access-lists/new{{else}}/access-lists/{{$l.ID}}/edit{{end}}">
|
|
{{template "csrf_field" .CSRFToken}}
|
|
<div class="row g-3 mb-3">
|
|
<div class="col-md-6">
|
|
<label class="form-label">Name</label>
|
|
<input class="form-control" name="name" value="{{$l.Name}}" required>
|
|
</div>
|
|
<div class="col-md-3 d-flex align-items-end">
|
|
<div class="form-check form-switch">
|
|
<input class="form-check-input" type="checkbox" name="default_allow" id="da" {{if $l.DefaultAllow}}checked{{end}}>
|
|
<label class="form-check-label" for="da">Default allow (unmatched IPs are allowed)</label>
|
|
</div>
|
|
</div>
|
|
<div class="col-12">
|
|
<label class="form-label">Comments</label>
|
|
<input class="form-control" name="comments" value="{{$l.Comments}}">
|
|
</div>
|
|
</div>
|
|
|
|
<h6>CIDR Rules</h6>
|
|
<table class="table table-sm align-middle" id="rulesTable">
|
|
<thead><tr><th style="width:10rem">Action</th><th>CIDR</th><th></th></tr></thead>
|
|
<tbody>
|
|
{{range $l.Rules}}
|
|
<tr>
|
|
<td><select class="form-select form-select-sm" name="rule_action">
|
|
<option value="allow" {{if eq .Action "allow"}}selected{{end}}>Allow</option>
|
|
<option value="deny" {{if eq .Action "deny"}}selected{{end}}>Deny</option>
|
|
</select></td>
|
|
<td><input class="form-control form-control-sm" name="rule_cidr" value="{{.CIDR}}" placeholder="10.0.0.0/8"></td>
|
|
<td><button type="button" class="btn btn-sm btn-outline-danger" data-remove-row><i class="bi bi-x"></i></button></td>
|
|
</tr>
|
|
{{end}}
|
|
</tbody>
|
|
</table>
|
|
<button type="button" class="btn btn-sm btn-outline-primary mb-4" data-add-row="rulesTable"><i class="bi bi-plus-lg"></i> Add Rule</button>
|
|
<template id="rulesTableRowTemplate"><tr>
|
|
<td><select class="form-select form-select-sm" name="rule_action"><option value="allow" selected>Allow</option><option value="deny">Deny</option></select></td>
|
|
<td><input class="form-control form-control-sm" name="rule_cidr" placeholder="10.0.0.0/8"></td>
|
|
<td><button type="button" class="btn btn-sm btn-outline-danger" data-remove-row><i class="bi bi-x"></i></button></td>
|
|
</tr></template>
|
|
|
|
<h6>HTTP Basic Auth Users <span class="text-secondary small">(optional — leave off for IP-only lists)</span></h6>
|
|
<table class="table table-sm align-middle" id="usersTable">
|
|
<thead><tr><th>Username</th><th>Password <span class="text-secondary">(leave blank to keep existing)</span></th><th></th></tr></thead>
|
|
<tbody>
|
|
{{range $l.BasicAuthUsers}}
|
|
<tr>
|
|
<td><input class="form-control form-control-sm" name="auth_username" value="{{.Username}}"></td>
|
|
<td><input class="form-control form-control-sm" type="password" name="auth_password" placeholder="••••••••"></td>
|
|
<td><button type="button" class="btn btn-sm btn-outline-danger" data-remove-row><i class="bi bi-x"></i></button></td>
|
|
</tr>
|
|
{{end}}
|
|
</tbody>
|
|
</table>
|
|
<button type="button" class="btn btn-sm btn-outline-primary mb-4" data-add-row="usersTable"><i class="bi bi-plus-lg"></i> Add User</button>
|
|
<template id="usersTableRowTemplate"><tr>
|
|
<td><input class="form-control form-control-sm" name="auth_username"></td>
|
|
<td><input class="form-control form-control-sm" type="password" name="auth_password" placeholder="••••••••"></td>
|
|
<td><button type="button" class="btn btn-sm btn-outline-danger" data-remove-row><i class="bi bi-x"></i></button></td>
|
|
</tr></template>
|
|
|
|
<div>
|
|
<button type="submit" class="btn btn-primary"><i class="bi bi-check-lg"></i> Save</button>
|
|
<a href="/access-lists" class="btn btn-outline-secondary">Cancel</a>
|
|
</div>
|
|
</form>
|
|
</div></div>
|
|
{{template "footer" .}}{{end}}
|