feat(discord-bridge): dashboard fara token (DASHBOARD_AUTH=off)

Cerut explicit: tokenul nu se retine. Cu DASHBOARD_AUTH=off nu mai exista login,
/login.html duce inapoi la panou, iar butonul "Iesi" dispare.

Se sprijina pe doua lucruri si nu are sens fara ele: serviciul e legat de
127.0.0.1, deci din retea ajunge la el doar tailscaled; iar tailscale serve il
publica tainet only, unde accesul e deja autentificat de Tailscale.

Compensatie partiala pentru ce se pierde: fiecare start/stop/restart se scrie in
logs/dashboard.log cu identitatea din antetul Tailscale-User-Login pus de
tailscale serve (verificat: ajunge pana la noi). Antetul e DOAR pentru jurnal —
nu decide accesul, fiindca un proces local l-ar putea fabrica.

Implicitul ramane cu token: doar off/none/0/false scot login-ul, orice alta
valoare il pastreaza (are test).

Sase teste noi, 41 pe dashboard.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B29CApsP1JkSdjYaGaHpE7
This commit is contained in:
Claude Agent
2026-08-30 14:16:20 +00:00
parent e203ee021d
commit b14e7bc50a
6 changed files with 126 additions and 11 deletions

View File

@@ -407,3 +407,53 @@ def test_paginile_nu_se_pun_in_cache(server_cu_prefix):
server_cu_prefix.login()
_, _, resp = server_cu_prefix.call("/")
assert resp.headers.get("Cache-Control") == "no-store"
# --- mod fara autentificare (DASHBOARD_AUTH=off) ----------------------------
@pytest.fixture()
def server_fara_auth(server, state_dir):
(state_dir / "env").write_text(
"DASHBOARD_TOKEN=secret-de-test\nDASHBOARD_AUTH=off\n", encoding="utf-8")
config.reload(state_dir)
return server
def test_fara_auth_apiul_raspunde_fara_cookie(server_fara_auth):
status, data, _ = server_fara_auth.call("/api/status")
assert status == 200 and data["auth"] is False
def test_fara_auth_pagina_se_serveste_direct(server_fara_auth):
status, data, resp = server_fara_auth.call("/")
assert status == 200
assert "Punte Discord" in data["_html"]
assert not resp.url.endswith("login.html")
def test_fara_auth_login_html_duce_inapoi_la_panou(server_fara_auth):
_, _, resp = server_fara_auth.call("/login.html")
assert not resp.url.endswith("login.html")
def test_fara_auth_se_poate_actiona_pe_serviciu(server_fara_auth, systemctl_fals):
assert server_fara_auth.call("/api/service", {"action": "restart"})[0] == 200
assert ("restart", api.SERVICE) in systemctl_fals.apeluri
def test_valoare_necunoscuta_pentru_auth_nu_deschide_panoul(server, state_dir):
"""Doar off/none/0/false scot login-ul; orice altceva il pastreaza."""
(state_dir / "env").write_text(
"DASHBOARD_TOKEN=secret-de-test\nDASHBOARD_AUTH=da\n", encoding="utf-8")
config.reload(state_dir)
assert not api.auth_disabled()
assert server.call("/api/status")[0] == 401
def test_identitatea_tailscale_e_doar_pentru_jurnal(server_fara_auth):
"""Antetul pus de `tailscale serve` se raporteaza, dar nu decide accesul:
pe localhost lipseste, si totusi cererea trece."""
assert api.tailnet_user({"Tailscale-User-Login": " ana@example.com "}) == "ana@example.com"
assert api.tailnet_user({}) == ""
_, data, _ = server_fara_auth.call("/api/status")
assert data["user"] == ""