initial commit

This commit is contained in:
Filip
2026-03-11 16:06:00 +01:00
parent b3c69053f6
commit 5fd80e6dd6
127 changed files with 39684 additions and 0 deletions

79
tests/PENTEST_CLIENT.md Normal file
View File

@@ -0,0 +1,79 @@
# `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ů.