- TLS через подключаемый overlay docker-compose.tls.yml + Caddyfile:
Caddy сам получает и продлевает сертификат Let's Encrypt, HSTS
добавляется на уровне прокси — намеренно там, а не в nginx.conf,
иначе установки без TLS заперли бы сами себя;
- проверка заголовка Host против DNS rebinding: AURUM_ALLOWED_HOSTS,
по умолчанию localhost и 127.0.0.1, чужой Host получает 421 с
подсказкой, какую переменную поправить;
- «запомнить меня на 7 дней» вернулось в безопасном виде: пароль
шифруется AES-GCM ключом с extractable: false в IndexedDB, вместо
прежнего base64 в localStorage, который разворачивался обратно в
пароль одним atob. Требует secure context, поэтому по обычному HTTP
к LAN-адресу чекбокс не показывается, а не притворяется рабочим;
- аудит-лог необратимых операций (восстановление бэкапа, массовое
создание транзакций, удаление счёта) в лог контейнера. Не в БД
сознательно: таблица аудита исчезла бы ровно в том событии, которое
должна объяснять;
- README: раздел про TLS и таблица двух переменных, решающих, кто
может достучаться до инстанса.
Default stays sessionStorage (signed out on tab close). Checking the box
instead stores the credential in localStorage with an explicit 30-day
expiry checked on every page load, so staying logged in has a hard ceiling
rather than lasting forever.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01855PiW5Wd8n4aRW4n9kByY
The browser's native Basic Auth prompt can't be restyled — it's chrome UI,
not part of the page. Replace it with Aurum's own login screen: nginx keeps
auth_basic on /api/* (the actual protection, unchanged), but drops it from
the SPA shell (just HTML/JS/CSS, no data) so the app can render its own
branded form instead. On submit the app validates the credentials against a
real protected endpoint, then attaches the resulting Authorization header to
every request itself — sessionStorage-backed, so closing the tab signs out.
Instances with Basic Auth left off (the default) never see this screen.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01855PiW5Wd8n4aRW4n9kByY