from datetime import date from conftest import login_ready, new_user def test_users_are_isolated(admin): # Admin legt ein Konto an. acc = admin.post("/api/accounts", json={"name": "AdminKonto", "currency": "EUR"}).json() # Frischen Nutzer anlegen und getrennt einloggen. username, password = new_user(admin) other, _ = login_ready(username, password) # Sieht keine fremden Konten/Buchungen. assert other.get("/api/accounts").json() == [] assert other.get("/api/transactions").json() == [] # Zugriff auf fremdes Konto -> 404 (nicht 403: existiert für ihn schlicht nicht). assert other.get(f"/api/accounts/{acc['id']}").status_code == 404 # Buchung auf fremdes Konto -> 404. r = other.post("/api/transactions", json={ "type": "expense", "date": str(date.today()), "account_id": acc["id"], "amount_cents": 100, }) assert r.status_code == 404 # Eigene Startkategorien sind vorhanden. assert len(other.get("/api/categories").json()) >= 6 # Kein Admin: darf keine Nutzer listen. assert other.get("/api/users").status_code == 403 def test_kein_pfadwechsel_aus_dem_auslieferungs_ordner(client, tmp_path): """Diese Route liegt VOR jeder Anmeldepruefung. Ohne Begrenzung liefert "/../../etc/passwd" genau das aus – der Pfad kommt roh aus der Adresse, und "Path / '../x'" verlaesst den Ordner klaglos.""" from app import main if not main.DIST_DIR.exists(): import pytest pytest.skip("kein gebautes Frontend vorhanden") geheim = main.DIST_DIR.parent.parent / "PRUEF-GEHEIM.txt" geheim.write_text("streng geheim", encoding="utf-8") try: for pfad in ("/../../PRUEF-GEHEIM.txt", "/%2e%2e%2f%2e%2e%2fPRUEF-GEHEIM.txt", "/../../backend/app/config.py"): r = client.get(pfad) assert "streng geheim" not in r.text, f"{pfad} gab die Datei heraus" assert "APP_DATA_DIR" not in r.text, f"{pfad} gab Quelltext heraus" finally: geheim.unlink(missing_ok=True) def test_echte_dateien_werden_weiterhin_ausgeliefert(client): """Die Begrenzung darf die Auslieferung nicht kaputtmachen.""" from app import main if not (main.DIST_DIR / "index.html").exists(): import pytest pytest.skip("kein gebautes Frontend vorhanden") assert client.get("/").status_code == 200 assert "