diff --git a/src/oneme/processors/auth.py b/src/oneme/processors/auth.py index ec6fc29..c418daa 100644 --- a/src/oneme/processors/auth.py +++ b/src/oneme/processors/auth.py @@ -16,7 +16,6 @@ from oneme.models import ( VerifyCodePayloadModel, ) - class AuthProcessors(BaseProcessor): def __init__( self, @@ -30,6 +29,23 @@ class AuthProcessors(BaseProcessor): self.server_config = OnemeConfig().SERVER_CONFIG self.telegram_bot = telegram_bot + def _check_legacy_version(self, app_version): + """ + Функция определения легаси версий клиентов, + для которых потребуются некоторые корректировки ответов сервера + + Сейчас данная функция используется для форматирования ответов + под версии ниже 25.8.0 + + Функция вернет True, если версия слишком старая, + или False в противном случае + + [fun fact] С 25.8.0, похоже, начали корректировать протокол, поскольку это + самая старая версия, которая работала без всяких корректировок сервера + """ + + return tuple(int(v) for v in app_version.split(".")) < (25, 8, 0) + async def _send_banners(self, writer): """Функция отправки баннеров клиенту""" # Итоговый список баннеров для отдачи клиенту @@ -181,7 +197,7 @@ class AuthProcessors(BaseProcessor): await self._send(writer, packet) self.logger.debug(f"Код для {phone}: {code} (существующий={user_exists})") - async def auth(self, payload, seq, writer, deviceType, deviceName): + async def auth(self, payload, seq, writer, deviceType, deviceName, appVersion): """Обработчик проверки кода""" try: VerifyCodePayloadModel.model_validate(payload) @@ -284,6 +300,11 @@ class AuthProcessors(BaseProcessor): None if not account.get("description") else account.get("description") ) + if self._check_legacy_version(appVersion): + include_profile_options = False + else: + include_profile_options = True + # Собираем данные пакета payload = { "tokenAttrs": {"LOGIN": {"token": login}}, @@ -299,7 +320,7 @@ class AuthProcessors(BaseProcessor): description=description, accountStatus=int(account.get("accountstatus")), profileOptions=json.loads(account.get("profileoptions")), - includeProfileOptions=True, + includeProfileOptions=include_profile_options, username=account.get("username"), ), } @@ -312,7 +333,7 @@ class AuthProcessors(BaseProcessor): # Отправляем await self._send(writer, packet) - async def auth_confirm(self, payload, seq, writer, deviceType, deviceName): + async def auth_confirm(self, payload, seq, writer, deviceType, deviceName, appVersion): """Обработчик подтверждения регистрации нового пользователя""" # Валидируем данные пакета try: @@ -441,6 +462,11 @@ class AuthProcessors(BaseProcessor): ), ) + if self._check_legacy_version(appVersion): + include_profile_options = False + else: + include_profile_options = True + # Генерируем профиль profile = self.tools.generate_profile( id=user_id, @@ -454,7 +480,7 @@ class AuthProcessors(BaseProcessor): description=None, accountStatus=0, profileOptions=[], - includeProfileOptions=True, + includeProfileOptions=include_profile_options, username=None, ) @@ -480,7 +506,7 @@ class AuthProcessors(BaseProcessor): f"Новый пользователь зарегистрирован: phone={phone} id={user_id} name={first_name} {last_name}" ) - async def login(self, payload, seq, writer): + async def login(self, payload, seq, writer, appVersion): """Обработчик авторизации клиента на сервере""" # Валидируем данные пакета try: @@ -550,6 +576,11 @@ class AuthProcessors(BaseProcessor): avatar_url = None if not photoId else self.config.avatar_base_url + photoId description = None if not user.get("description") else user.get("description") + if self._check_legacy_version(appVersion): + include_profile_options = False + else: + include_profile_options = True + # Генерируем профиль profile = self.tools.generate_profile( id=user.get("id"), @@ -563,7 +594,7 @@ class AuthProcessors(BaseProcessor): description=description, accountStatus=int(user.get("accountstatus")), profileOptions=json.loads(user.get("profileoptions")), - includeProfileOptions=True, + includeProfileOptions=include_profile_options, username=user.get("username"), ) diff --git a/src/oneme/processors/main.py b/src/oneme/processors/main.py index d0960de..c4e42fa 100644 --- a/src/oneme/processors/main.py +++ b/src/oneme/processors/main.py @@ -20,11 +20,13 @@ class MainProcessors(BaseProcessor): except pydantic.ValidationError as error: self.logger.error(f"Возникли ошибки при валидации пакета: {error}") await self._send_error(seq, self.opcodes.SESSION_INIT, self.error_types.INVALID_PAYLOAD, writer) - return None, None + return None, None, None # Получаем данные из пакета - deviceType = payload.get("userAgent").get("deviceType") - deviceName = payload.get("userAgent").get("deviceName") + userAgent = payload.get("userAgent") + deviceType = userAgent.get("deviceType") + deviceName = userAgent.get("deviceName") + appVersion = userAgent.get("appVersion") # Данные пакета payload = { @@ -43,7 +45,7 @@ class MainProcessors(BaseProcessor): # Отправляем await self._send(writer, packet) - return deviceType, deviceName + return deviceType, deviceName, appVersion async def ping(self, payload, seq, writer): """Обработчик пинга""" diff --git a/src/oneme/socket.py b/src/oneme/socket.py index 46d9868..151fb00 100644 --- a/src/oneme/socket.py +++ b/src/oneme/socket.py @@ -45,6 +45,7 @@ class OnemeMobile: deviceType = None deviceName = None + appVersion = None userPhone = None userId = None @@ -89,7 +90,7 @@ class OnemeMobile: match opcode: case self.opcodes.SESSION_INIT: - deviceType, deviceName = await self.processors.session_init( + deviceType, deviceName, appVersion = await self.processors.session_init( payload, seq, writer ) case self.opcodes.AUTH_REQUEST: @@ -112,7 +113,7 @@ class OnemeMobile: ) else: await self.processors.auth( - payload, seq, writer, deviceType, deviceName + payload, seq, writer, deviceType, deviceName, appVersion ) case self.opcodes.AUTH_CONFIRM: if not self.auth_rate_limiter.is_allowed(address[0]): @@ -124,7 +125,7 @@ class OnemeMobile: ) elif payload and payload.get("tokenType") == "REGISTER": await self.processors.auth_confirm( - payload, seq, writer, deviceType, deviceName + payload, seq, writer, deviceType, deviceName, appVersion ) else: self.logger.warning( @@ -143,7 +144,7 @@ class OnemeMobile: userPhone, userId, hashedToken, - ) = await self.processors.login(payload, seq, writer) + ) = await self.processors.login(payload, seq, writer, appVersion) if userPhone: await self._finish_auth( diff --git a/src/oneme/websocket.py b/src/oneme/websocket.py index c5dd566..bdd4519 100644 --- a/src/oneme/websocket.py +++ b/src/oneme/websocket.py @@ -37,6 +37,7 @@ class OnemeWS: deviceType = None deviceName = None + appVersion = None userPhone = None userId = None @@ -63,7 +64,7 @@ class OnemeWS: match opcode: case self.opcodes.SESSION_INIT: - deviceType, deviceName = await self.processors.session_init( + deviceType, deviceName, appVersion = await self.processors.session_init( payload, seq, websocket ) case self.opcodes.AUTH_REQUEST: @@ -86,7 +87,7 @@ class OnemeWS: ) else: await self.processors.auth( - payload, seq, websocket, deviceType, deviceName + payload, seq, websocket, deviceType, deviceName, appVersion ) case self.opcodes.AUTH_CONFIRM: if not self.auth_rate_limiter.is_allowed(address[0]): @@ -98,7 +99,7 @@ class OnemeWS: ) elif payload and payload.get("tokenType") == "REGISTER": await self.processors.auth_confirm( - payload, seq, websocket, deviceType, deviceName + payload, seq, websocket, deviceType, deviceName, appVersion ) else: self.logger.warning( @@ -117,7 +118,7 @@ class OnemeWS: userPhone, userId, hashedToken, - ) = await self.processors.login(payload, seq, websocket) + ) = await self.processors.login(payload, seq, websocket, deviceType, appVersion) if userPhone: await self._finish_auth(