# `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/<email>/` (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 <uuid>`: použije konkrétní konverzaci místo auto member<->peer DM.
- `--skip-login-rate-limit`: přeskočí test `login_start` limiteru.
- `--server-host <host>`: přepíše `SERVER_HOST` pro tento běh.
- `--server-port <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ů.
