From 76d687e62d6f7c5b77d9e7986a2a617588c75544 Mon Sep 17 00:00:00 2001 From: alyral <59310749+alyral@users.noreply.github.com> Date: Mon, 2 May 2022 12:46:16 +0200 Subject: [PATCH] Add session type field (#1950) --- td/generate/scheme/td_api.tl | 57 ++++++++++++++++++++++++++- td/telegram/Account.cpp | 74 +++++++++++++++++++++++++++++++++++- 2 files changed, 128 insertions(+), 3 deletions(-) diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index 1c94aaf1a..f8013b6d0 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -3281,18 +3281,73 @@ userPrivacySettingAllowFindingByPhoneNumber = UserPrivacySetting; accountTtl days:int32 = AccountTtl; +//@class SessionType @description Represents the type of a session + +//@description This session is running on an Android device +sessionTypeAndroid = SessionType; + +//@description This session is running on a generic Apple device +sessionTypeApple = SessionType; + +//@description This session is running on the Brave browser +sessionTypeBrave = SessionType; + +//@description This session is running on the Chrome browser +sessionTypeChrome = SessionType; + +//@description This session is running on the Edge browser +sessionTypeEdge = SessionType; + +//@description This session is running on the Firefox browser +sessionTypeFirefox = SessionType; + +//@description This session is running on an iPad device +sessionTypeIpad = SessionType; + +//@description This session is running on an iPhone device +sessionTypeIphone = SessionType; + +//@description This session is running on a Linux device +sessionTypeLinux = SessionType; + +//@description This session is running on a Mac device +sessionTypeMac = SessionType; + +//@description This session is running on the Opera browser +sessionTypeOpera = SessionType; + +//@description This session is running on the Safari browser +sessionTypeSafari = SessionType; + +//@description This session is running on an Ubuntu device +sessionTypeUbuntu = SessionType; + +//@description This session is running on an unknown type of device +sessionTypeUnknown = SessionType; + +//@description This session is running on the Vivaldi browser +sessionTypeVivaldi = SessionType; + +//@description This session is running on a Windows device +sessionTypeWindows = SessionType; + +//@description This session is running on a Xbox console +sessionTypeXbox = SessionType; + + //@description Contains information about one session in a Telegram application used by the current user. Sessions must be shown to the user in the returned order //@id Session identifier @is_current True, if this session is the current session //@is_password_pending True, if a password is needed to complete authorization of the session //@can_accept_secret_chats True, if incoming secret chats can be accepted by the session //@can_accept_calls True, if incoming calls can be accepted by the session +//@type Session type based on the system and application version, which can be used to display a corresponding icon //@api_id Telegram API identifier, as provided by the application @application_name Name of the application, as provided by the application //@application_version The version of the application, as provided by the application @is_official_application True, if the application is an official application or uses the api_id of an official application //@device_model Model of the device the application has been run or is running on, as provided by the application @platform Operating system the application has been run or is running on, as provided by the application //@system_version Version of the operating system the application has been run or is running on, as provided by the application @log_in_date Point in time (Unix timestamp) when the user has logged in //@last_active_date Point in time (Unix timestamp) when the session was last used @ip IP address from which the session was created, in human-readable format //@country A two-letter country code for the country from which the session was created, based on the IP address @region Region code from which the session was created, based on the IP address -session id:int64 is_current:Bool is_password_pending:Bool can_accept_secret_chats:Bool can_accept_calls:Bool api_id:int32 application_name:string application_version:string is_official_application:Bool device_model:string platform:string system_version:string log_in_date:int32 last_active_date:int32 ip:string country:string region:string = Session; +session id:int64 is_current:Bool is_password_pending:Bool can_accept_secret_chats:Bool can_accept_calls:Bool type:SessionType api_id:int32 application_name:string application_version:string is_official_application:Bool device_model:string platform:string system_version:string log_in_date:int32 last_active_date:int32 ip:string country:string region:string = Session; //@description Contains a list of sessions @sessions List of sessions @inactive_session_ttl_days Number of days of inactivity before sessions will automatically be terminated; 1-366 days sessions sessions:vector inactive_session_ttl_days:int32 = Sessions; diff --git a/td/telegram/Account.cpp b/td/telegram/Account.cpp index 24d657ecf..4b44347cb 100644 --- a/td/telegram/Account.cpp +++ b/td/telegram/Account.cpp @@ -28,13 +28,83 @@ namespace td { +static td_api::object_ptr get_session_type( + const tl_object_ptr &authorization) { + auto contains = [](const string &str, const char *substr) { + return str.find(substr) != string::npos; + }; + + const string &app_name = authorization->app_name_; + auto device_model = to_lower(authorization->device_model_); + auto platform = to_lower(authorization->platform_); + auto system_version = to_lower(authorization->system_version_); + + if (device_model.find("xbox") != string::npos) { + return td_api::make_object(); + } + + bool web = [&] { + Slice web_name("Web"); + auto pos = app_name.find(web_name.c_str()); + if (pos == string::npos) { + return false; + } + + auto next_character = app_name[pos + web_name.size()]; + return !('a' <= next_character && next_character <= 'z'); + }(); + + if (web) { + if (contains(device_model, "brave")) { + return td_api::make_object(); + } else if (contains(device_model, "vivaldi")) { + return td_api::make_object(); + } else if (contains(device_model, "opera") || contains(device_model, "opr")) { + return td_api::make_object(); + } else if (contains(device_model, "edg")) { + return td_api::make_object(); + } else if (contains(device_model, "chrome")) { + return td_api::make_object(); + } else if (contains(device_model, "firefox") || contains(device_model, "fxios")) { + return td_api::make_object(); + } else if (contains(device_model, "safari")) { + return td_api::make_object(); + } + } + + if (begins_with(platform, "android") || contains(system_version, "android")) { + return td_api::make_object(); + } else if (begins_with(platform, "windows") || contains(system_version, "windows")) { + return td_api::make_object(); + } else if (begins_with(platform, "ubuntu") || contains(system_version, "ubuntu")) { + return td_api::make_object(); + } else if (begins_with(platform, "linux") || contains(system_version, "linux")) { + return td_api::make_object(); + } + + auto ios = begins_with(platform, "ios") || contains(system_version, "ios"); + auto macos = begins_with(platform, "macos") || contains(system_version, "macos"); + if (ios && contains(device_model, "iphone")) { + return td_api::make_object(); + } else if (ios && contains(device_model, "ipad")) { + return td_api::make_object(); + } else if (macos && contains(device_model, "mac")) { + return td_api::make_object(); + } else if (ios || macos) { + return td_api::make_object(); + } + + return td_api::make_object(); +} + static td_api::object_ptr convert_authorization_object( tl_object_ptr &&authorization) { CHECK(authorization != nullptr); return td_api::make_object( authorization->hash_, authorization->current_, authorization->password_pending_, - !authorization->encrypted_requests_disabled_, !authorization->call_requests_disabled_, authorization->api_id_, - authorization->app_name_, authorization->app_version_, authorization->official_app_, authorization->device_model_, + !authorization->encrypted_requests_disabled_, !authorization->call_requests_disabled_, + get_session_type(authorization), authorization->api_id_, authorization->app_name_, + authorization->app_version_, authorization->official_app_, authorization->device_model_, authorization->platform_, authorization->system_version_, authorization->date_created_, authorization->date_active_, authorization->ip_, authorization->country_, authorization->region_); }