special_config_request.h 1.9 KB

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