fix(security): comprehensive security hardening — TLS, HMAC WS auth, rate limiting, IP leak prevention
CRITICAL fixes: - Auto-generated self-signed TLS certs (HTTPS/WSS by default) - Removed session_key from /srp/verify response (was sent in plaintext) - Replaced with HMAC-SHA256 ws_token for WebSocket authentication HIGH fixes: - WebSocket auth now validates ws_token via hmac.compare_digest() - /clear endpoint requires Bearer admin_token (printed at server start) - Password no longer required as CLI arg — supports env var + getpass prompt - Removed user_ip from Message model (no longer broadcast to clients) MEDIUM fixes: - Rate limiter on /srp/init and /srp/verify (10 req/min/IP) - MessageStore capped at 1000 messages (prevents RAM DoS) - access_log disabled (was leaking request metadata) LOW fixes: - Username sanitization against rich markup injection - Dead code removed from helpers.py All 79 tests passing. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -3,11 +3,14 @@ from .models import Message, UserSession
|
||||
|
||||
|
||||
class MessageStore:
|
||||
def __init__(self):
|
||||
def __init__(self, max_messages: int = 1000):
|
||||
self._messages: list[Message] = []
|
||||
self._max = max_messages
|
||||
|
||||
def add(self, message: Message) -> None:
|
||||
self._messages.append(message)
|
||||
if len(self._messages) > self._max:
|
||||
self._messages = self._messages[-self._max:]
|
||||
|
||||
def get_all(self) -> list[Message]:
|
||||
return self._messages.copy()
|
||||
|
||||
Reference in New Issue
Block a user