mirror of https://github.com/procxx/kepka.git
94 lines
2.2 KiB
C++
94 lines
2.2 KiB
C++
/*
|
|
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
|
|
*/
|
|
#include "mtproto/details/mtproto_bound_key_creator.h"
|
|
|
|
#include "mtproto/details/mtproto_serialized_request.h"
|
|
|
|
namespace MTP::details {
|
|
|
|
BoundKeyCreator::BoundKeyCreator(DcKeyRequest request, Delegate delegate)
|
|
: _request(request)
|
|
, _delegate(std::move(delegate)) {
|
|
}
|
|
|
|
void BoundKeyCreator::start(
|
|
DcId dcId,
|
|
int16 protocolDcId,
|
|
not_null<AbstractConnection*> connection,
|
|
not_null<DcOptions*> dcOptions) {
|
|
Expects(!_creator.has_value());
|
|
|
|
auto delegate = DcKeyCreator::Delegate();
|
|
delegate.done = _delegate.unboundReady;
|
|
delegate.sentSome = _delegate.sentSome;
|
|
delegate.receivedSome = _delegate.receivedSome;
|
|
|
|
_creator.emplace(
|
|
dcId,
|
|
protocolDcId,
|
|
connection,
|
|
dcOptions,
|
|
std::move(delegate),
|
|
_request);
|
|
}
|
|
|
|
void BoundKeyCreator::stop() {
|
|
_creator = std::nullopt;
|
|
}
|
|
|
|
void BoundKeyCreator::bind(AuthKeyPtr &&persistentKey) {
|
|
stop();
|
|
_binder.emplace(std::move(persistentKey));
|
|
}
|
|
|
|
void BoundKeyCreator::restartBinder() {
|
|
if (_binder) {
|
|
_binder.emplace(_binder->persistentKey());
|
|
}
|
|
}
|
|
|
|
bool BoundKeyCreator::readyToBind() const {
|
|
return _binder.has_value();
|
|
}
|
|
|
|
SerializedRequest BoundKeyCreator::prepareBindRequest(
|
|
const AuthKeyPtr &temporaryKey,
|
|
uint64 sessionId) {
|
|
Expects(_binder.has_value());
|
|
|
|
return _binder->prepareRequest(temporaryKey, sessionId);
|
|
}
|
|
|
|
DcKeyBindState BoundKeyCreator::handleBindResponse(
|
|
const mtpBuffer &response) {
|
|
Expects(_binder.has_value());
|
|
|
|
return _binder->handleResponse(response);
|
|
}
|
|
|
|
AuthKeyPtr BoundKeyCreator::bindPersistentKey() const {
|
|
Expects(_binder.has_value());
|
|
|
|
return _binder->persistentKey();
|
|
}
|
|
|
|
bool IsDestroyedTemporaryKeyError(const mtpBuffer &buffer) {
|
|
auto from = buffer.data();
|
|
const auto end = from + buffer.size();
|
|
auto error = MTPRpcError();
|
|
if (!error.read(from, from + buffer.size())) {
|
|
return false;
|
|
}
|
|
return error.match([&](const MTPDrpc_error &data) {
|
|
return (data.verror_code().v == 401)
|
|
&& (data.verror_message().v == "AUTH_KEY_PERM_EMPTY");
|
|
});
|
|
}
|
|
|
|
} // namespace MTP::details
|