Carried over from the old Kecalek_python master (214da18).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
80 lines
2.8 KiB
Markdown
80 lines
2.8 KiB
Markdown
# `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ů.
|