93 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			93 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
 | 
