From ef93dda3ac960b6743ebf0772b2fa0b04b9d498e Mon Sep 17 00:00:00 2001 From: Wizou Date: Fri, 27 Aug 2021 14:14:24 +0200 Subject: [PATCH] Validate preexisting logged-in user. Force reauthorization after AUTH_RESTART --- src/Client.cs | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/Client.cs b/src/Client.cs index 454b7e9..9f91ef6 100644 --- a/src/Client.cs +++ b/src/Client.cs @@ -499,6 +499,11 @@ namespace WTelegram goto retry; } } + else if (rpcError.error_code == 500 && rpcError.error_message == "AUTH_RESTART") + { + _session.User = null; // force a full login authorization flow, next time + _session.Save(); + } throw new RpcException(rpcError.error_code, rpcError.error_message); default: throw new ApplicationException($"{request.GetType().Name} call got a result of type {result.GetType().Name} instead of {typeof(X).Name}"); @@ -633,16 +638,22 @@ namespace WTelegram /// Detail about the logged bot public async Task LoginBotIfNeeded() { + string botToken = Config("bot_token"); if (_session.User != null) + { try { - return Schema.Deserialize(_session.User); + var prevUser = Schema.Deserialize(_session.User); + if (prevUser?.id == int.Parse(botToken.Split(':')[0])) + return prevUser; } catch (Exception ex) { Helpers.Log(4, $"Error deserializing User! ({ex.Message}) Proceeding to login..."); } - var authorization = await Auth_ImportBotAuthorization(0, _apiId, _apiHash, Config("bot_token")); + await Auth_LogOut(); + } + var authorization = await Auth_ImportBotAuthorization(0, _apiId, _apiHash, botToken); if (authorization is not Auth_Authorization { user: User user }) throw new ApplicationException("Failed to get Authorization: " + authorization.GetType().Name); _session.User = user.Serialize(); @@ -659,16 +670,21 @@ namespace WTelegram /// Detail about the logged user public async Task LoginUserIfNeeded(CodeSettings settings = null) { + string phone_number = Config("phone_number"); if (_session.User != null) + { try { - return Schema.Deserialize(_session.User); + var prevUser = Schema.Deserialize(_session.User); + if (prevUser?.phone == string.Concat(phone_number.Where(char.IsDigit))) + return prevUser; } catch (Exception ex) { Helpers.Log(4, $"Error deserializing User! ({ex.Message}) Proceeding to login..."); } - string phone_number = Config("phone_number"); + await Auth_LogOut(); + } var sentCode = await Auth_SendCode(phone_number, _apiId, _apiHash, settings ?? new()); Helpers.Log(3, $"A verification code has been sent via {sentCode.type.GetType().Name[17..]}"); var verification_code = Config("verification_code"); @@ -697,6 +713,7 @@ namespace WTelegram } if (authorization is not Auth_Authorization { user: User user }) throw new ApplicationException("Failed to get Authorization: " + authorization.GetType().Name); + //TODO: find better serialization for User not subject to TL changes? _session.User = user.Serialize(); _session.Save(); return user;