From ab7eec976cfa366011220ccfe5dced4bbf8fe7f3 Mon Sep 17 00:00:00 2001 From: Alexey Polyakov Date: Tue, 10 Mar 2026 19:38:53 +0300 Subject: [PATCH] =?UTF-8?q?=D0=90=D0=B2=D1=82=D0=BE=D1=80=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D1=8F=D0=B5=D1=82=D1=81?= =?UTF-8?q?=D1=8F=20=D0=B4=D0=BB=D1=8F=20=D0=BD=D0=B5=D0=BA=D0=BE=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D1=8B=D1=85=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/tools.py | 6 ++++- src/oneme_tcp/server.py | 47 +++++++++++++++++++++++++++--------- src/tamtam_tcp/processors.py | 10 +++----- src/tamtam_ws/proto.py | 2 +- src/tamtam_ws/server.py | 5 ++++ 5 files changed, 51 insertions(+), 19 deletions(-) diff --git a/src/common/tools.py b/src/common/tools.py index 70843c4..4b45cd9 100644 --- a/src/common/tools.py +++ b/src/common/tools.py @@ -182,4 +182,8 @@ class Tools: } # Возвращаем - return message, int(row.get("time")) \ No newline at end of file + return message, int(row.get("time")) + + async def auth_required(self, userPhone, coro, *args): + if userPhone: + await coro(*args) diff --git a/src/oneme_tcp/server.py b/src/oneme_tcp/server.py index 524e3b7..c49ab8d 100644 --- a/src/oneme_tcp/server.py +++ b/src/oneme_tcp/server.py @@ -1,6 +1,7 @@ import asyncio, logging, traceback from oneme_tcp.proto import Proto from oneme_tcp.processors import Processors +from common.tools import Tools class OnemeMobileServer: def __init__(self, host="0.0.0.0", port=443, ssl_context=None, db_pool=None, clients={}, send_event=None, telegram_bot=None): @@ -13,6 +14,7 @@ class OnemeMobileServer: self.clients = clients self.proto = Proto() + self.auth_required = Tools().auth_required self.processors = Processors(db_pool=db_pool, clients=clients, send_event=send_event, telegram_bot=telegram_bot) async def handle_client(self, reader, writer): @@ -54,6 +56,7 @@ class OnemeMobileServer: case self.proto.LOGIN: userPhone, userId, hashedToken = await self.processors.process_login(payload, seq, writer) + # Если авторизация на сервере успешная - можем завершить авторизацию if userPhone: await self._finish_auth(writer, address, userPhone, userId) case self.proto.LOGOUT: @@ -64,27 +67,49 @@ class OnemeMobileServer: case self.proto.LOG: await self.processors.process_telemetry(payload, seq, writer) case self.proto.ASSETS_UPDATE: - await self.processors.process_get_assets(payload, seq, writer) + await self.auth_required( + userPhone, self.processors.process_get_assets, payload, seq, writer + ) case self.proto.VIDEO_CHAT_HISTORY: - await self.processors.process_get_call_history(payload, seq, writer) + await self.auth_required( + userPhone, self.processors.process_get_call_history, payload, seq, writer + ) case self.proto.MSG_SEND: - await self.processors.process_send_message(payload, seq, writer, senderId=userId, db_pool=self.db_pool) + await self.auth_required( + userPhone, self.processors.process_send_message, payload, seq, writer, senderId=userId, db_pool=self.db_pool + ) case self.proto.FOLDERS_GET: - await self.processors.process_get_folders(payload, seq, writer, senderPhone=userPhone) + await self.auth_required( + userPhone, self.processors.process_get_folders, payload, seq, writer, senderPhone=userPhone + ) case self.proto.SESSIONS_INFO: - await self.processors.process_get_sessions(payload, seq, writer, senderPhone=userPhone, hashedToken=hashedToken) + await self.auth_required( + userPhone, self.processors.process_get_sessions, payload, seq, writer, senderPhone=userPhone, hashedToken=hashedToken + ) case self.proto.CHAT_INFO: - await self.processors.process_search_chats(payload, seq, writer, senderId=userId) + await self.auth_required( + userPhone, self.processors.process_search_chats, payload, seq, writer, senderId=userId + ) case self.proto.CONTACT_INFO_BY_PHONE: - await self.processors.process_search_by_phone(payload, seq, writer, senderId=userId) + await self.auth_required( + userPhone, self.processors.process_search_by_phone, payload, seq, writer, senderId=userId + ) case self.proto.OK_TOKEN: - await self.processors.process_get_call_token(payload, seq, writer) + await self.auth_required( + userPhone, self.processors.process_get_call_token, payload, seq, writer + ) case self.proto.MSG_TYPING: - await self.processors.process_typing(payload, seq, writer, senderId=userId) + await self.auth_required( + userPhone, self.processors.process_typing, payload, seq, writer, senderId=userId + ) case self.proto.CONTACT_INFO: - await self.processors.process_search_users(payload, seq, writer) + await self.auth_required( + userPhone, self.processors.process_search_users, payload, seq, writer + ) case self.proto.COMPLAIN_REASONS_GET: - await self.processors.process_complain_reasons_get(payload, seq, writer) + await self.auth_required( + userPhone, self.processors.process_complain_reasons_get, payload, seq, writer + ) case _: self.logger.warning(f"Неизвестный опкод {opcode}") except Exception as e: diff --git a/src/tamtam_tcp/processors.py b/src/tamtam_tcp/processors.py index 5faa5e7..80bd05f 100644 --- a/src/tamtam_tcp/processors.py +++ b/src/tamtam_tcp/processors.py @@ -95,12 +95,10 @@ class Processors: await cursor.execute("SELECT * FROM users WHERE phone = %s", (phone,)) user = await cursor.fetchone() - if user is None: - await self._send_error(seq, self.proto.REQUEST_CODE, self.error_types.USER_NOT_FOUND, writer) - return - - # Сохраняем токен - await cursor.execute("INSERT INTO auth_tokens (phone, token_hash, code_hash, expires, state) VALUES (%s, %s, %s, %s, %s)", (phone, token_hash, code_hash, expires, "started",)) + # Если пользователь существует, сохраняем токен + if user: + # Сохраняем токен + await cursor.execute("INSERT INTO auth_tokens (phone, token_hash, code_hash, expires, state) VALUES (%s, %s, %s, %s, %s)", (phone, token_hash, code_hash, expires, "started",)) # Данные пакета payload = { diff --git a/src/tamtam_ws/proto.py b/src/tamtam_ws/proto.py index 0fa504a..e9b88b0 100644 --- a/src/tamtam_ws/proto.py +++ b/src/tamtam_ws/proto.py @@ -18,7 +18,7 @@ class Proto: try: parsed_packet = json.loads(packet) except: - return {} + return None return parsed_packet # мне кажется долго вручную всё писать diff --git a/src/tamtam_ws/server.py b/src/tamtam_ws/server.py index 444b673..729982b 100644 --- a/src/tamtam_ws/server.py +++ b/src/tamtam_ws/server.py @@ -21,6 +21,11 @@ class TTWSServer: # Распаковываем пакет packet = self.proto.unpack_packet(message) + # Если ничего не извлекли + if packet is None: + self.logger.error(f"Не удалось распаковать пакет - {message}") + return + # Валидируем структуру пакета try: MessageModel.model_validate(packet)