/* This file is part of Telegram Desktop, the official desktop application for the Telegram messaging service. For license and copyright information please follow this link: https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once namespace MTP { class Config; class AuthKey; using AuthKeyPtr = std::shared_ptr; } // namespace MTP namespace Main { class Account; class Domain; } // namespace Main namespace Storage { enum class StartResult : uchar { Success, IncorrectPasscode, IncorrectPasscodeLegacy, }; class Domain final { public: Domain(not_null owner, const QString &dataName); ~Domain(); [[nodiscard]] StartResult start(const QByteArray &passcode); void startAdded( not_null account, std::unique_ptr config); void writeAccounts(); void startFromScratch(); [[nodiscard]] bool checkPasscode(const QByteArray &passcode) const; void setPasscode(const QByteArray &passcode); [[nodiscard]] int oldVersion() const; void clearOldVersion(); private: enum class StartModernResult { Success, IncorrectPasscode, Failed, Empty, }; [[nodiscard]] StartModernResult startModern(const QByteArray &passcode); void startWithSingleAccount( const QByteArray &passcode, std::unique_ptr account); void generateLocalKey(); void encryptLocalKey(const QByteArray &passcode); const not_null _owner; const QString _dataName; MTP::AuthKeyPtr _localKey; MTP::AuthKeyPtr _passcodeKey; QByteArray _passcodeKeySalt; QByteArray _passcodeKeyEncrypted; int _oldVersion = 0; }; } // namespace Storage