# `tests/pentest_client.py` Automatizovaný pentest/integration harness nad živým serverem s reálnými účty. ## Co test dělá 1. **Conversation Isolation (AuthZ)** - Účet `outsider` zkouší `get_messages`, `mark_read` a `send_message` do konverzace, kde není členem. - Očekávání: server vrátí `error` + `"Not a member"`. 2. **Malformed Header Rejection** - Platný člen konverzace pošle `send_message` s obřím `ratchet_header`. - Očekávání: server odmítne request (`Invalid ratchet_header format`), tj. funguje `_validate_header` limit. 3. **Session Reset Authorization** - `outsider` pošle `session_reset` na `peer_user_id`. - Očekávání: `error` + `"No shared conversation"`. - Pokud účty sdílenou konverzaci opravdu mají, test se označí jako `SKIP` (setup issue, ne nutně bezpečnostní chyba). 4. **Login Rate Limits (volitelné)** - Anonymní klient spamuje `login_start`: - stejný email v různých kombinacích velikosti písmen (test case-normalization bucketu), - potom rotace různých emailů ze stejné IP (test per-IP bucketu). - Očekávání: aktivuje se jak per-email limit, tak per-IP limit. ## Požadavky - Běžící server (`server.py`). - Existující lokální klíče pro účty v `~/.encrypted_chat//` (stejné jako pro běžného CLI klienta). - 3 různé účty: - `member` (A), - `peer` (B), - `outsider` (C). ## Spuštění ```bash python3 tests/pentest_client.py \ --server-host localhost \ --member-email alice@example.com \ --peer-email bob@example.com \ --outsider-email mallory@example.com ``` Skript si vyžádá hesla interaktivně. Lze je předat i argumenty: ```bash python3 tests/pentest_client.py \ --server-host localhost \ --member-email alice@example.com --member-password '***' \ --peer-email bob@example.com --peer-password '***' \ --outsider-email mallory@example.com --outsider-password '***' ``` Volby: - `--conversation-id `: použije konkrétní konverzaci místo auto member<->peer DM. - `--skip-login-rate-limit`: přeskočí test `login_start` limiteru. - `--server-host `: přepíše `SERVER_HOST` pro tento běh. - `--server-port `: přepíše `SERVER_PORT` pro tento běh. Poznámka k TLS: - Pokud máš v `.env` `SERVER_HOST=0.0.0.0`, je to správně pro server bind, ale klient na to nesmí přistupovat přes TLS. - Pro klienta použij `--server-host` s hodnotou, která je v certifikátu (SAN/CN), typicky `localhost` nebo konkrétní IP. ## Výstup Skript tiskne souhrn: - `[PASS]` test prošel, - `[FAIL]` test selhal (potenciální regrese), - `[SKIP]` test nelze vyhodnotit kvůli dataset/setup podmínkám. Návratový kód: - `0` = bez failu, - `1` = alespoň jeden fail, - `2` = chyba vstupních parametrů.