storage_domain.h 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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. namespace MTP {
  9. class Config;
  10. class AuthKey;
  11. using AuthKeyPtr = std::shared_ptr<AuthKey>;
  12. } // namespace MTP
  13. namespace Main {
  14. class Account;
  15. class Domain;
  16. } // namespace Main
  17. namespace Storage {
  18. enum class StartResult : uchar {
  19. Success,
  20. IncorrectPasscode,
  21. IncorrectPasscodeLegacy,
  22. };
  23. class Domain final {
  24. public:
  25. Domain(not_null<Main::Domain*> owner, const QString &dataName);
  26. ~Domain();
  27. [[nodiscard]] StartResult start(const QByteArray &passcode);
  28. void startAdded(
  29. not_null<Main::Account*> account,
  30. std::unique_ptr<MTP::Config> config);
  31. void writeAccounts();
  32. void startFromScratch();
  33. [[nodiscard]] bool checkPasscode(const QByteArray &passcode) const;
  34. void setPasscode(const QByteArray &passcode);
  35. [[nodiscard]] int oldVersion() const;
  36. void clearOldVersion();
  37. [[nodiscard]] rpl::producer<> localPasscodeChanged() const;
  38. [[nodiscard]] bool hasLocalPasscode() const;
  39. private:
  40. enum class StartModernResult {
  41. Success,
  42. IncorrectPasscode,
  43. Failed,
  44. Empty,
  45. };
  46. [[nodiscard]] StartModernResult startModern(const QByteArray &passcode);
  47. void startWithSingleAccount(
  48. const QByteArray &passcode,
  49. std::unique_ptr<Main::Account> account);
  50. void generateLocalKey();
  51. void encryptLocalKey(const QByteArray &passcode);
  52. const not_null<Main::Domain*> _owner;
  53. const QString _dataName;
  54. MTP::AuthKeyPtr _localKey;
  55. MTP::AuthKeyPtr _passcodeKey;
  56. QByteArray _passcodeKeySalt;
  57. QByteArray _passcodeKeyEncrypted;
  58. int _oldVersion = 0;
  59. bool _hasLocalPasscode = false;
  60. rpl::event_stream<> _passcodeKeyChanged;
  61. };
  62. } // namespace Storage