1 /* 2 This file is part of Telegram Desktop, 3 the official desktop application for the Telegram messaging service. 4 5 For license and copyright information please follow this link: 6 https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL 7 */ 8 #pragma once 9 10 #include "mtproto/details/mtproto_domain_resolver.h" 11 #include "base/bytes.h" 12 #include "base/weak_ptr.h" 13 14 #include <QtCore/QPointer> 15 #include <QtNetwork/QNetworkReply> 16 #include <QtNetwork/QNetworkAccessManager> 17 18 namespace MTP::details { 19 20 class SpecialConfigRequest : public QObject { 21 public: 22 SpecialConfigRequest( 23 Fn<void( 24 DcId dcId, 25 const std::string &ip, 26 int port, 27 bytes::const_span secret)> callback, 28 const QString &domainString, 29 const QString &phone); 30 SpecialConfigRequest( 31 Fn<void()> timeDoneCallback, 32 const QString &domainString); 33 34 private: 35 enum class Type { 36 Mozilla, 37 Google, 38 RemoteConfig, 39 Realtime, 40 FireStore, 41 }; 42 struct Attempt { 43 Type type; 44 QString data; 45 QString host; 46 }; 47 48 SpecialConfigRequest( 49 Fn<void( 50 DcId dcId, 51 const std::string &ip, 52 int port, 53 bytes::const_span secret)> callback, 54 Fn<void()> timeDoneCallback, 55 const QString &domainString, 56 const QString &phone); 57 58 void sendNextRequest(); 59 void performRequest(const Attempt &attempt); 60 void requestFinished(Type type, not_null<QNetworkReply*> reply); 61 void handleHeaderUnixtime(not_null<QNetworkReply*> reply); 62 QByteArray finalizeRequest(not_null<QNetworkReply*> reply); 63 void handleResponse(const QByteArray &bytes); 64 bool decryptSimpleConfig(const QByteArray &bytes); 65 66 Fn<void( 67 DcId dcId, 68 const std::string &ip, 69 int port, 70 bytes::const_span secret)> _callback; 71 Fn<void()> _timeDoneCallback; 72 QString _domainString; 73 QString _phone; 74 MTPhelp_ConfigSimple _simpleConfig; 75 76 QNetworkAccessManager _manager; 77 std::vector<Attempt> _attempts; 78 std::vector<ServiceWebRequest> _requests; 79 80 }; 81 82 } // namespace MTP::details 83