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