umbau 1.0

This commit is contained in:
2026-09-02 20:30:44 +02:00
parent afe6719f51
commit 5c95b21be7
77 changed files with 10733 additions and 1914 deletions

View File

@ -190,9 +190,36 @@ async def test_password_change_invalidates_old_session_everywhere(client):
# Altes Cookie (vor dem Passwortwechsel ausgestellt) erneut einspielen --
# muss durch die session_version-Pruefung invalidiert sein (Konzept 6.2).
client.cookies.set("jh_session", old_cookie)
resp = await client.get("/auth/me")
assert resp.status_code == 401
#
# Bewusst NICHT ueber client.cookies.set(...)/cookies=<...> auf dem
# GETEILTEN `client`-Fixture: dessen Jar traegt an dieser Stelle bereits
# die NEUE, gueltige Sitzung aus der change-password-Antwort oben.
# client.cookies.set() kann je nach httpx-Version einen zweiten,
# mehrdeutigen Jar-Eintrag statt eines Ersatzes erzeugen: der Request
# wuerde dann weiterhin (auch) die noch gueltige NEUE Sitzung
# mitschicken. Der per-Request-Parameter `cookies=` ist fuer genau
# diesen Fall (Ueberschreiben einer bereits im Jar vorhandenen Cookie)
# KEINE zuverlaessige Abhilfe: httpx warnt selbst per
# DeprecationWarning, dass das Zusammenspiel mit einem bereits
# gesetzten Jar-Eintrag "ambiguous" ist -- ein eigener Testlauf hat das
# bestaetigt (der alte Cookie wurde NICHT wirksam, der Request nutzte
# weiterhin die neue Sitzung aus dem Jar, Test schlug trotz korrektem
# Server faelschlich fehl). Ein voellig frischer, jar-loser Client hat
# dagegen zuverlaessig funktioniert (siehe FORTSETZUNG_Teil_C.md
# Abschnitt 3 Punkt 6 fuer die vollstaendige Untersuchung) -- deshalb
# hier bewusst ein zweiter, eigener AsyncClient nur fuer diesen einen
# Replay-Request, unabhaengig vom Jar-Zustand des Fixture-Clients.
from httpx import ASGITransport, AsyncClient
from app.main import app as fastapi_app
async with AsyncClient(transport=ASGITransport(app=fastapi_app), base_url="https://testserver") as replay_client:
# .set() auf dem LEEREN Jar dieses frischen Clients ist eindeutig
# (kein vorhandener Eintrag, der ueberschrieben werden muesste) --
# folgt damit auch httpx' eigener Empfehlung in der oben erklaerten
# DeprecationWarning ("Set cookies directly on the client instance").
replay_client.cookies.set("jh_session", old_cookie)
resp = await replay_client.get("/auth/me")
assert resp.status_code == 401, resp.text
@pytest.mark.asyncio
@ -266,10 +293,15 @@ async def test_user_cannot_access_host_outside_granted_hostgroup(client):
"INSERT INTO hosts (id, host_group_id, hostname, address, protocol, port, os_type, "
"file_transfer_enabled) VALUES (2, 2, 'b01', '10.0.0.2', 'ssh', 22, 'linux', 1)"
)
# judy bekommt file_transfer NUR auf Hostgruppe 1 (role_id 3 = file_transfer, siehe Migration 0001).
# judy bekommt file_transfer NUR auf Hostgruppe 1 (role_id 3 = file_transfer,
# siehe Migration 0001) -- seit Teil D Schritt 4 ausschliesslich ueber
# eine Benutzergruppe moeglich (direkte Vergabe an einzelne Benutzer ist
# entfallen, siehe app/rbac.py-Modul-Docstring).
await conn.execute("INSERT INTO user_groups (id, name) VALUES (101, 'judy-team')")
await conn.execute("INSERT INTO user_group_members (user_group_id, user_id) VALUES (101, ?)", (user_id,))
await conn.execute(
"INSERT INTO user_hostgroup_roles (user_id, host_group_id, role_id, granted_by) VALUES (?, 1, 3, ?)",
(user_id, admin_id),
"INSERT INTO group_hostgroup_roles (user_group_id, host_group_id, role_id, granted_by) VALUES (101, 1, 3, ?)",
(admin_id,),
)
await conn.commit()
@ -308,10 +340,15 @@ async def test_role_on_one_hostgroup_does_not_grant_different_permission_type(cl
"INSERT INTO hosts (id, host_group_id, hostname, address, protocol, port, os_type, "
"file_transfer_enabled) VALUES (1, 1, 'c01', '10.0.0.3', 'ssh', 22, 'linux', 1)"
)
# role_id 1 = ssh_connect (siehe Migration 0001) -- explizit KEIN file_transfer.
# role_id 1 = ssh_connect (siehe Migration 0001) -- explizit KEIN
# file_transfer. Seit Teil D Schritt 4 ausschliesslich ueber eine
# Benutzergruppe moeglich (siehe Kommentar in
# test_user_cannot_access_host_outside_granted_hostgroup oben).
await conn.execute("INSERT INTO user_groups (id, name) VALUES (102, 'mallory-team')")
await conn.execute("INSERT INTO user_group_members (user_group_id, user_id) VALUES (102, ?)", (user_id,))
await conn.execute(
"INSERT INTO user_hostgroup_roles (user_id, host_group_id, role_id, granted_by) VALUES (?, 1, 1, ?)",
(user_id, admin_id),
"INSERT INTO group_hostgroup_roles (user_group_id, host_group_id, role_id, granted_by) VALUES (102, 1, 1, ?)",
(admin_id,),
)
await conn.commit()