mirror of
https://github.com/openmax-server/server.git
synced 2026-05-22 19:41:41 +03:00
* implement ip rate limiting
* fix: secure генерация кода для входа
* fix: possible slowloris and dos attacks
* fix: убрать лишний импорт, не давать сообщения из чата незнакомцам, географически верные названия в дб...
* fix device name не использовался
* refactor: убрал лишние импорты
* refactor: вернул dotenv
* убрал импорт после c642434
71 lines
3.1 KiB
Python
71 lines
3.1 KiB
Python
import asyncio, logging, json
|
||
from websockets.asyncio.server import serve
|
||
from tamtam_ws.models import *
|
||
from pydantic import ValidationError
|
||
from tamtam_ws.proto import Proto
|
||
from tamtam_ws.processors import Processors
|
||
|
||
class TTWSServer:
|
||
def __init__(self, host, port, db_pool=None, clients={}, send_event=None):
|
||
self.host = host
|
||
self.port = port
|
||
self.proto = Proto()
|
||
self.processors = Processors(db_pool=db_pool, clients=clients, send_event=send_event)
|
||
self.logger = logging.getLogger(__name__)
|
||
|
||
async def handle_client(self, websocket):
|
||
deviceType = None
|
||
deviceName = None
|
||
|
||
async for message in websocket:
|
||
# Распаковываем пакет
|
||
packet = self.proto.unpack_packet(message)
|
||
|
||
if not packet:
|
||
self.logger.warning("Невалидный пакет от ws клиента")
|
||
continue
|
||
|
||
# Валидируем структуру пакета
|
||
try:
|
||
MessageModel.model_validate(packet)
|
||
except ValidationError as e:
|
||
self.logger.warning(f"Ошибка валидации пакета: {e}")
|
||
continue
|
||
|
||
# Извлекаем данные из пакета
|
||
seq = packet['seq']
|
||
opcode = packet['opcode']
|
||
payload = packet['payload']
|
||
|
||
match opcode:
|
||
case self.proto.SESSION_INIT:
|
||
# ПРИВЕТ АНДРЕЙ МАЛАХОВ
|
||
# не не удаляй этот коммент. пусть останется на релизе аххахаха
|
||
deviceType, deviceName = await self.processors.process_hello(payload, seq, websocket)
|
||
case self.proto.PING:
|
||
await self.processors.process_ping(payload, seq, websocket)
|
||
case self.proto.LOG:
|
||
# телеметрия аааа слежка цру фсб фбр
|
||
# УДАЛЯЕМ MYTRACKER ИЗ TAMTAM ТАМ ВИРУС
|
||
# майтрекер отправляет все ваши сообщения на сервер барака обамы. немедленно удаляем!!!
|
||
await self.processors.process_telemetry(payload, seq, websocket)
|
||
# case self.proto.AUTH_REQUEST:
|
||
# await self.processors.process_auth_request(payload, seq, websocket)
|
||
# case self.proto.VERIFY_CODE:
|
||
# await self.processors.process_verify_code(payload, seq, websocket)
|
||
# case self.proto.FINAL_AUTH:
|
||
# await self.processors.process_final_auth(payload, seq, websocket, deviceType, deviceName)
|
||
|
||
# лан я пойду. пока
|
||
# а ок
|
||
|
||
async def start(self):
|
||
self.logger.info(f"Вебсокет запущен на порту {self.port}")
|
||
|
||
async with serve(
|
||
self.handle_client, self.host, self.port,
|
||
max_size=65536,
|
||
open_timeout=10,
|
||
close_timeout=10,
|
||
):
|
||
await asyncio.Future() |