From e7e1c9aa5af97af9e6b4c98fea66941b526a21a2 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 19 Nov 2019 14:55:39 +0300 Subject: [PATCH] Don't handle 'msg_resend_req'. --- Telegram/SourceFiles/mtproto/connection.cpp | 70 ++++++--------------- Telegram/SourceFiles/mtproto/connection.h | 6 +- Telegram/SourceFiles/mtproto/session.cpp | 29 ++------- Telegram/SourceFiles/mtproto/session.h | 9 +-- 4 files changed, 30 insertions(+), 84 deletions(-) diff --git a/Telegram/SourceFiles/mtproto/connection.cpp b/Telegram/SourceFiles/mtproto/connection.cpp index 64a766075..6cef04aed 100644 --- a/Telegram/SourceFiles/mtproto/connection.cpp +++ b/Telegram/SourceFiles/mtproto/connection.cpp @@ -311,6 +311,8 @@ bool ConnectionPrivate::setState(int32 state, int32 ifState) { void ConnectionPrivate::resetSession() { // recreate all msg_id and msg_seqno _needSessionReset = false; + MTP_LOG(_shiftedDcId, ("Resetting session!")); + QWriteLocker locker1(_sessionData->haveSentMutex()); QWriteLocker locker2(_sessionData->toResendMutex()); QWriteLocker locker3(_sessionData->toSendMutex()); @@ -329,16 +331,10 @@ void ConnectionPrivate::resetSession() { // recreate all msg_id and msg_seqno mtpMsgId id = i.key(); if (id > newId) { - while (true) { - if (toResend.constFind(newId) == toResend.cend() - && wereAcked.constFind(newId) == wereAcked.cend() - && haveSent.constFind(newId) == haveSent.cend()) { - break; - } - const auto m = base::unixtime::mtproto_msg_id(); - if (m <= newId) break; // wtf - - newId = m; + while (toResend.constFind(newId) != toResend.cend() + || wereAcked.constFind(newId) != wereAcked.cend() + || haveSent.constFind(newId) != haveSent.cend()) { + newId = base::unixtime::mtproto_msg_id(); } MTP_LOG(_shiftedDcId, ("Replacing msgId %1 to %2!" @@ -361,16 +357,10 @@ void ConnectionPrivate::resetSession() { // recreate all msg_id and msg_seqno mtpMsgId id = i.key(); if (id > newId) { - while (true) { - if (toResend.constFind(newId) == toResend.cend() - && wereAcked.constFind(newId) == wereAcked.cend() - && haveSent.constFind(newId) == haveSent.cend()) { - break; - } - const auto m = base::unixtime::mtproto_msg_id(); - if (m <= newId) break; // wtf - - newId = m; + while (toResend.constFind(newId) != toResend.cend() + || wereAcked.constFind(newId) != wereAcked.cend() + || haveSent.constFind(newId) != haveSent.cend()) { + newId = base::unixtime::mtproto_msg_id(); } MTP_LOG(_shiftedDcId, ("Replacing msgId %1 to %2!" @@ -884,6 +874,7 @@ void ConnectionPrivate::tryToSend() { *(toSendRequest->data() + reqNeedsLayer + 3) += initSize; added = true; } + Assert(!haveSent.contains(msgId)); haveSent.insert(msgId, req); needAnyResponse = true; @@ -900,6 +891,7 @@ void ConnectionPrivate::tryToSend() { if (stateRequest) { mtpMsgId msgId = placeToContainer(toSendRequest, bigMsgId, haveSentArr, stateRequest); stateRequest->msDate = 0; // 0 for state request, do not request state of it + Assert(!haveSent.contains(msgId)); haveSent.insert(msgId, stateRequest); } if (resendRequest) placeToContainer(toSendRequest, bigMsgId, haveSentArr, resendRequest); @@ -910,6 +902,7 @@ void ConnectionPrivate::tryToSend() { mtpMsgId contMsgId = prepareToSend(toSendRequest, bigMsgId); *(mtpMsgId*)(haveSentIdsWrap->data() + 4) = contMsgId; (*haveSentIdsWrap)[6] = 0; // for container, msDate = 0, seqNo = 0 + Assert(!haveSent.contains(contMsgId)); haveSent.insert(contMsgId, haveSentIdsWrap); toSend.clear(); } @@ -1847,24 +1840,6 @@ ConnectionPrivate::HandleResult ConnectionPrivate::handleOneReceived(const mtpPr } } return HandleResult::Success; - case mtpc_msg_resend_req: { - MTPMsgResendReq msg; - if (!msg.read(from, end)) { - return HandleResult::ParseError; - } - auto &ids = msg.c_msg_resend_req().vmsg_ids().v; - - auto idsCount = ids.size(); - DEBUG_LOG(("Message Info: resend of msgs requested, ids: %1").arg(LogIdsVector(ids))); - if (!idsCount) return (badTime ? HandleResult::Ignored : HandleResult::Success); - - QVector toResend(ids.size()); - for (int32 i = 0, l = ids.size(); i < l; ++i) { - toResend[i] = ids.at(i).v; - } - resendMany(toResend, 0, false, true); - } return HandleResult::Success; - case mtpc_rpc_result: { if (from + 3 > end) { return HandleResult::ParseError; @@ -2261,23 +2236,17 @@ void ConnectionPrivate::handleMsgsStates(const QVector &ids, const QByt void ConnectionPrivate::resend( mtpMsgId msgId, crl::time msCanWait, - bool forceContainer, - bool sendMsgStateInfo) { + bool forceContainer) { if (msgId == _pingMsgId) { return; } - _sessionData->queueResend( - msgId, - msCanWait, - forceContainer, - sendMsgStateInfo); + _sessionData->queueResend(msgId, msCanWait, forceContainer); } void ConnectionPrivate::resendMany( QVector msgIds, crl::time msCanWait, - bool forceContainer, - bool sendMsgStateInfo) { + bool forceContainer) { for (int32 i = 0, l = msgIds.size(); i < l; ++i) { if (msgIds.at(i) == _pingMsgId) { msgIds.remove(i); @@ -2287,8 +2256,7 @@ void ConnectionPrivate::resendMany( _sessionData->queueResendMany( std::move(msgIds), msCanWait, - forceContainer, - sendMsgStateInfo); + forceContainer); } void ConnectionPrivate::onConnected( @@ -2448,7 +2416,9 @@ void ConnectionPrivate::createDcKey() { ).arg(result->persistentServerSalt)); _sessionData->setSalt(result->temporaryServerSalt); - _sessionData->clearForNewKey(_instance); + if (result->persistentKey) { + _sessionData->clearForNewKey(_instance); + } auto key = result->persistentKey ? std::move(result->persistentKey) diff --git a/Telegram/SourceFiles/mtproto/connection.h b/Telegram/SourceFiles/mtproto/connection.h index ed6950adf..1aa3ae376 100644 --- a/Telegram/SourceFiles/mtproto/connection.h +++ b/Telegram/SourceFiles/mtproto/connection.h @@ -169,13 +169,11 @@ private: void resend( mtpMsgId msgId, crl::time msCanWait = 0, - bool forceContainer = false, - bool sendMsgStateInfo = false); + bool forceContainer = false); void resendMany( QVector msgIds, crl::time msCanWait = 0, - bool forceContainer = false, - bool sendMsgStateInfo = false); + bool forceContainer = false); void createDcKey(); void resetSession(); diff --git a/Telegram/SourceFiles/mtproto/session.cpp b/Telegram/SourceFiles/mtproto/session.cpp index f1ee15fcb..38f3586c8 100644 --- a/Telegram/SourceFiles/mtproto/session.cpp +++ b/Telegram/SourceFiles/mtproto/session.cpp @@ -193,25 +193,19 @@ void SessionData::queueSendMsgsStateInfo(quint64 msgId, QByteArray data) { void SessionData::queueResend( mtpMsgId msgId, crl::time msCanWait, - bool forceContainer, - bool sendMsgStateInfo) { + bool forceContainer) { withSession([=](not_null session) { - session->resend(msgId, msCanWait, forceContainer, sendMsgStateInfo); + session->resend(msgId, msCanWait, forceContainer); }); } void SessionData::queueResendMany( QVector msgIds, crl::time msCanWait, - bool forceContainer, - bool sendMsgStateInfo) { + bool forceContainer) { withSession([=](not_null session) { for (const auto msgId : msgIds) { - session->resend( - msgId, - msCanWait, - forceContainer, - sendMsgStateInfo); + session->resend(msgId, msCanWait, forceContainer); } }); } @@ -595,8 +589,7 @@ QString Session::transport() const { mtpRequestId Session::resend( mtpMsgId msgId, crl::time msCanWait, - bool forceContainer, - bool sendMsgStateInfo) { + bool forceContainer) { SecureRequest request; { QWriteLocker locker(_data->haveSentMutex()); @@ -604,18 +597,6 @@ mtpRequestId Session::resend( auto i = haveSent.find(msgId); if (i == haveSent.end()) { - if (sendMsgStateInfo) { - char cantResend[2] = {1, 0}; - DEBUG_LOG(("Message Info: cant resend %1, request not found").arg(msgId)); - - auto info = std::string(cantResend, cantResend + 1); - return _instance->sendProtocolMessage( - _shiftedDcId, - MTPMsgsStateInfo( - MTP_msgs_state_info( - MTP_long(msgId), - MTP_string(std::move(info))))); - } return 0; } diff --git a/Telegram/SourceFiles/mtproto/session.h b/Telegram/SourceFiles/mtproto/session.h index 1eb307e40..7432bec33 100644 --- a/Telegram/SourceFiles/mtproto/session.h +++ b/Telegram/SourceFiles/mtproto/session.h @@ -274,13 +274,11 @@ public: void queueResend( mtpMsgId msgId, crl::time msCanWait, - bool forceContainer, - bool sendMsgStateInfo); + bool forceContainer); void queueResendMany( QVector msgIds, crl::time msCanWait, - bool forceContainer, - bool sendMsgStateInfo); + bool forceContainer); [[nodiscard]] bool connectionInited() const; [[nodiscard]] AuthKeyPtr getPersistentKey() const; @@ -392,8 +390,7 @@ public: mtpRequestId resend( mtpMsgId msgId, crl::time msCanWait = 0, - bool forceContainer = false, - bool sendMsgStateInfo = false); + bool forceContainer = false); signals: void authKeyChanged();