// // Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2019 // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "td/telegram/SendCodeHelper.h" namespace td { void SendCodeHelper::on_sent_code(telegram_api::object_ptr sent_code) { phone_registered_ = (sent_code->flags_ & SENT_CODE_FLAG_IS_USER_REGISTERED) != 0; phone_code_hash_ = sent_code->phone_code_hash_; sent_code_info_ = get_authentication_code_info(std::move(sent_code->type_)); next_code_info_ = get_authentication_code_info(std::move(sent_code->next_type_)); next_code_timestamp_ = Timestamp::in((sent_code->flags_ & SENT_CODE_FLAG_HAS_TIMEOUT) != 0 ? sent_code->timeout_ : 0); } td_api::object_ptr SendCodeHelper::get_authorization_state_wait_code( const TermsOfService &terms_of_service) const { return make_tl_object( phone_registered_, terms_of_service.get_terms_of_service_object(), get_authentication_code_info_object()); } td_api::object_ptr SendCodeHelper::get_authentication_code_info_object() const { return make_tl_object( phone_number_, get_authentication_code_type_object(sent_code_info_), get_authentication_code_type_object(next_code_info_), max(static_cast(next_code_timestamp_.in() + 1 - 1e-9), 0)); } Result SendCodeHelper::resend_code() { if (next_code_info_.type == AuthenticationCodeInfo::Type::None) { return Status::Error(8, "Authentication code can't be resend"); } sent_code_info_ = next_code_info_; next_code_info_ = {}; next_code_timestamp_ = {}; return telegram_api::auth_resendCode(phone_number_, phone_code_hash_); } Result SendCodeHelper::send_code(Slice phone_number, bool allow_flash_call, bool is_current_phone_number, int32 api_id, const string &api_hash) { if (!phone_number_.empty()) { return Status::Error(8, "Can't change phone"); } phone_number_ = phone_number.str(); int32 flags = 0; if (allow_flash_call) { flags |= AUTH_SEND_CODE_FLAG_ALLOW_FLASH_CALL; } return telegram_api::auth_sendCode(flags, false /*ignored*/, phone_number_, is_current_phone_number, api_id, api_hash); } Result SendCodeHelper::send_change_phone_code(Slice phone_number, bool allow_flash_call, bool is_current_phone_number) { phone_number_ = phone_number.str(); int32 flags = 0; if (allow_flash_call) { flags |= AUTH_SEND_CODE_FLAG_ALLOW_FLASH_CALL; } return telegram_api::account_sendChangePhoneCode(flags, false /*ignored*/, phone_number_, is_current_phone_number); } Result SendCodeHelper::send_verify_phone_code(const string &hash, Slice phone_number, bool allow_flash_call, bool is_current_phone_number) { phone_number_ = phone_number.str(); int32 flags = 0; if (allow_flash_call) { flags |= AUTH_SEND_CODE_FLAG_ALLOW_FLASH_CALL; } return telegram_api::account_sendVerifyPhoneCode(flags, false /*ignored*/, hash, is_current_phone_number); } Result SendCodeHelper::send_confirm_phone_code( Slice phone_number, bool allow_flash_call, bool is_current_phone_number) { phone_number_ = phone_number.str(); int32 flags = 0; if (allow_flash_call) { flags |= AUTH_SEND_CODE_FLAG_ALLOW_FLASH_CALL; } return telegram_api::account_sendConfirmPhoneCode(flags, false /*ignored*/, phone_number_, is_current_phone_number); } SendCodeHelper::AuthenticationCodeInfo SendCodeHelper::get_authentication_code_info( tl_object_ptr &&code_type_ptr) { if (code_type_ptr == nullptr) { return AuthenticationCodeInfo(); } switch (code_type_ptr->get_id()) { case telegram_api::auth_codeTypeSms::ID: return {AuthenticationCodeInfo::Type::Sms, 0, ""}; case telegram_api::auth_codeTypeCall::ID: return {AuthenticationCodeInfo::Type::Call, 0, ""}; case telegram_api::auth_codeTypeFlashCall::ID: return {AuthenticationCodeInfo::Type::FlashCall, 0, ""}; default: UNREACHABLE(); return AuthenticationCodeInfo(); } } SendCodeHelper::AuthenticationCodeInfo SendCodeHelper::get_authentication_code_info( tl_object_ptr &&sent_code_type_ptr) { CHECK(sent_code_type_ptr != nullptr); switch (sent_code_type_ptr->get_id()) { case telegram_api::auth_sentCodeTypeApp::ID: { auto code_type = move_tl_object_as(sent_code_type_ptr); return AuthenticationCodeInfo{AuthenticationCodeInfo::Type::Message, code_type->length_, ""}; } case telegram_api::auth_sentCodeTypeSms::ID: { auto code_type = move_tl_object_as(sent_code_type_ptr); return AuthenticationCodeInfo{AuthenticationCodeInfo::Type::Sms, code_type->length_, ""}; } case telegram_api::auth_sentCodeTypeCall::ID: { auto code_type = move_tl_object_as(sent_code_type_ptr); return AuthenticationCodeInfo{AuthenticationCodeInfo::Type::Call, code_type->length_, ""}; } case telegram_api::auth_sentCodeTypeFlashCall::ID: { auto code_type = move_tl_object_as(sent_code_type_ptr); return AuthenticationCodeInfo{AuthenticationCodeInfo::Type::FlashCall, 0, code_type->pattern_}; } default: UNREACHABLE(); return AuthenticationCodeInfo(); } } tl_object_ptr SendCodeHelper::get_authentication_code_type_object( const AuthenticationCodeInfo &authentication_code_info) { switch (authentication_code_info.type) { case AuthenticationCodeInfo::Type::None: return nullptr; case AuthenticationCodeInfo::Type::Message: return make_tl_object(authentication_code_info.length); case AuthenticationCodeInfo::Type::Sms: return make_tl_object(authentication_code_info.length); case AuthenticationCodeInfo::Type::Call: return make_tl_object(authentication_code_info.length); case AuthenticationCodeInfo::Type::FlashCall: return make_tl_object(authentication_code_info.pattern); default: UNREACHABLE(); return nullptr; } } } // namespace td