Final notes
This commit is contained in:
parent
5cbe355660
commit
0756aab53f
|
|
@ -48,7 +48,6 @@ class Client:
|
|||
self.console.print(f"[cyan]• {message}[/]")
|
||||
|
||||
def srp_authenticate(self) -> None:
|
||||
"""SRP authentication flow"""
|
||||
with self.console.status("[cyan]Starting SRP handshake...[/]", spinner="dots"):
|
||||
|
||||
usr = srp.User(b"chat", self.password, hash_alg=srp.SHA256)
|
||||
|
|
|
|||
|
|
@ -1,24 +1,21 @@
|
|||
from dataclasses import asdict
|
||||
from uuid import uuid4
|
||||
|
||||
import json
|
||||
import base64
|
||||
|
||||
from sanic import Sanic, Request, response, Websocket
|
||||
from sanic.response import HTTPResponse, json as json_response
|
||||
from cryptography.fernet import Fernet
|
||||
|
||||
from .models import Message, UserSession
|
||||
from .logger import logger
|
||||
from .helpers import (
|
||||
get_client_ip,
|
||||
get_param,
|
||||
send_state,
|
||||
utcnow,
|
||||
)
|
||||
|
||||
|
||||
async def srp_init(request: Request, app: Sanic) -> HTTPResponse:
|
||||
"""SRP Step 1: клиент отправляет username + A"""
|
||||
try:
|
||||
data = request.json or {}
|
||||
username = data.get("username", "unknown")
|
||||
|
|
@ -50,7 +47,6 @@ async def srp_init(request: Request, app: Sanic) -> HTTPResponse:
|
|||
|
||||
|
||||
async def srp_verify(request: Request, app: Sanic) -> HTTPResponse:
|
||||
"""SRP Step 2: клиент отправляет proof M"""
|
||||
try:
|
||||
data = request.json or {}
|
||||
user_id = data.get("user_id")
|
||||
|
|
@ -104,7 +100,7 @@ async def chat_ws(request: Request, ws: Websocket, app: Sanic) -> None:
|
|||
return
|
||||
|
||||
manager = app.ctx.connection_manager
|
||||
await manager.connect(user_id, ws) # await добавлен
|
||||
await manager.connect(user_id, ws)
|
||||
|
||||
try:
|
||||
await send_state(ws, app)
|
||||
|
|
@ -134,7 +130,7 @@ async def chat_ws(request: Request, ws: Websocket, app: Sanic) -> None:
|
|||
except Exception:
|
||||
logger.exception(f"WebSocket error for {user_id}")
|
||||
finally:
|
||||
await manager.disconnect(user_id) # await добавлен
|
||||
await manager.disconnect(user_id)
|
||||
await manager.broadcast(
|
||||
json.dumps(
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,12 +1,9 @@
|
|||
# tests/test_health.py
|
||||
import pytest
|
||||
|
||||
|
||||
|
||||
class TestHealth:
|
||||
"""Тесты health endpoint"""
|
||||
|
||||
def test_health_ok(self, test_client):
|
||||
"""GET /health возвращает статус"""
|
||||
_, response = test_client.get("/health")
|
||||
|
||||
assert response.status == 200
|
||||
|
|
|
|||
|
|
@ -1,14 +1,9 @@
|
|||
# tests/test_srp.py
|
||||
import base64
|
||||
import pytest
|
||||
import srp
|
||||
|
||||
|
||||
class TestSRPFlow:
|
||||
"""Тесты SRP аутентификации"""
|
||||
|
||||
def test_srp_init_success(self, test_client):
|
||||
"""POST /srp/init возвращает user_id, B, salt"""
|
||||
usr = srp.User(b"chat", b"testpassword")
|
||||
_, A = usr.start_authentication()
|
||||
|
||||
|
|
@ -27,7 +22,6 @@ class TestSRPFlow:
|
|||
assert "salt" in data
|
||||
|
||||
def test_srp_init_missing_a(self, test_client):
|
||||
"""POST /srp/init без A возвращает 400"""
|
||||
_, response = test_client.post(
|
||||
"/srp/init",
|
||||
json={"username": "testuser"},
|
||||
|
|
@ -36,7 +30,6 @@ class TestSRPFlow:
|
|||
assert response.status == 400
|
||||
|
||||
def test_srp_verify_invalid_session(self, test_client):
|
||||
"""Verify с несуществующим user_id возвращает 401"""
|
||||
_, response = test_client.post(
|
||||
"/srp/verify",
|
||||
json={
|
||||
|
|
|
|||
|
|
@ -1,17 +1,12 @@
|
|||
# tests/test_websocket.py
|
||||
import pytest
|
||||
|
||||
|
||||
class TestWebSocket:
|
||||
"""Тесты WebSocket подключения"""
|
||||
|
||||
def test_ws_connect_no_user_id(self, test_client):
|
||||
"""WebSocket без user_id отклоняется"""
|
||||
_, ws = test_client.websocket("/ws/chat")
|
||||
# Проверяем что соединение закрыто или вернулась ошибка
|
||||
assert ws is not None
|
||||
|
||||
def test_ws_connect_invalid_session(self, test_client):
|
||||
"""WebSocket с невалидным user_id отклоняется"""
|
||||
|
||||
_, ws = test_client.websocket("/ws/chat?user_id=invalid123")
|
||||
assert ws is not None
|
||||
Loading…
Reference in New Issue
Block a user