diff --git a/Telegram/SourceFiles/data/components/passkeys.cpp b/Telegram/SourceFiles/data/components/passkeys.cpp index 724479a235..d5956c6b5a 100644 --- a/Telegram/SourceFiles/data/components/passkeys.cpp +++ b/Telegram/SourceFiles/data/components/passkeys.cpp @@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_passkey_deserialize.h" #include "main/main_app_config.h" #include "main/main_session.h" +#include "mtproto/mtproto_auth_key.h" #include "platform/platform_webauthn.h" namespace Data { @@ -165,10 +166,14 @@ void FinishPasskeyLogin( Fn fail) { const auto userHandleStr = QString::fromUtf8(result.userHandle); const auto parts = userHandleStr.split(':'); - if (parts.size() != 2) { + auto userDcOk = false; + const auto userDc = (parts.size() == 2) + ? parts[0].toInt(&userDcOk) + : 0; + if (!userDcOk || userDc <= 0 || userDc >= MTP::kDcShift) { + fail(u"PASSKEY_HANDLE_INVALID"_q); return; } - const auto userDc = parts[0].toInt(); const auto credentialIdBase64 = result.credentialId.toBase64( QByteArray::Base64UrlEncoding | QByteArray::OmitTrailingEquals); const auto credential = MTP_inputPasskeyCredentialPublicKey( @@ -181,14 +186,19 @@ void FinishPasskeyLogin( MTP_string(userHandleStr.toStdString()) ) ); - const auto flags = (userDc != initialDc) - ? MTPauth_finishPasskeyLogin::Flag::f_from_dc_id - : MTPauth_finishPasskeyLogin::Flags(0); + auto fromAuthKeyId = uint64(0); + for (const auto &key : api.instance().getKeysForWrite()) { + if (key && key->dcId() == MTP::BareDcId(initialDc)) { + fromAuthKeyId = key->keyId(); + break; + } + } + api.instance().setMainDcId(userDc); api.request(MTPauth_FinishPasskeyLogin( - MTP_flags(flags), + MTP_flags(MTPauth_finishPasskeyLogin::Flag::f_from_dc_id), credential, MTP_int(initialDc), - MTP_long(0) + MTP_long(int64(fromAuthKeyId)) )).toDC( userDc ).done(done).fail([=](const MTP::Error &error) { diff --git a/Telegram/SourceFiles/intro/intro_qr.cpp b/Telegram/SourceFiles/intro/intro_qr.cpp index 5aecd2e825..2a8091db4b 100644 --- a/Telegram/SourceFiles/intro/intro_qr.cpp +++ b/Telegram/SourceFiles/intro/intro_qr.cpp @@ -377,9 +377,9 @@ void QrWidget::setupPasskeyLink() { }, _passkey->lifetime()); _passkey->setClickedCallback([=] { - const auto initialDc = api().instance().mainDcId(); const auto attempt = [=]( const ::Data::Passkey::LoginData &loginData) { + const auto initialDc = _passkeyLoginDc; Platform::WebAuthn::Login(loginData, [=]( Platform::WebAuthn::LoginResult result) { if (result.userHandle.isEmpty()) { @@ -411,10 +411,12 @@ void QrWidget::setupPasskeyLink() { attempt(*_passkeyLoginData); } else { _passkeyLoginData = std::nullopt; + const auto initedDc = api().instance().mainDcId(); ::Data::InitPasskeyLogin(api(), [=]( const ::Data::Passkey::LoginData &loginData) { _passkeyLoginData = loginData; _passkeyLoginTime = crl::now(); + _passkeyLoginDc = initedDc; attempt(loginData); }); } diff --git a/Telegram/SourceFiles/intro/intro_qr.h b/Telegram/SourceFiles/intro/intro_qr.h index 98769f03f4..c1a0aef80b 100644 --- a/Telegram/SourceFiles/intro/intro_qr.h +++ b/Telegram/SourceFiles/intro/intro_qr.h @@ -62,6 +62,7 @@ private: bool _forceRefresh = false; std::optional<::Data::Passkey::LoginData> _passkeyLoginData; crl::time _passkeyLoginTime = 0; + int _passkeyLoginDc = 0; };