Provided Window::SessionController to ShareGameScoreByHash.
This commit is contained in:
		
							parent
							
								
									ca7f4ffed9
								
							
						
					
					
						commit
						c0ae4b86a6
					
				
					 3 changed files with 38 additions and 21 deletions
				
			
		| 
						 | 
				
			
			@ -1249,20 +1249,22 @@ QString AppendShareGameScoreUrl(
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
void ShareGameScoreByHash(
 | 
			
		||||
		not_null<Main::Session*> session,
 | 
			
		||||
		not_null<Window::SessionController*> controller,
 | 
			
		||||
		const QString &hash) {
 | 
			
		||||
	auto &session = controller->session();
 | 
			
		||||
	auto key128Size = 0x10;
 | 
			
		||||
 | 
			
		||||
	auto hashEncrypted = QByteArray::fromBase64(hash.toLatin1(), QByteArray::Base64UrlEncoding | QByteArray::OmitTrailingEquals);
 | 
			
		||||
	if (hashEncrypted.size() <= key128Size || (hashEncrypted.size() != key128Size + 0x20)) {
 | 
			
		||||
		Ui::show(Box<Ui::InformBox>(
 | 
			
		||||
			tr::lng_confirm_phone_link_invalid(tr::now)));
 | 
			
		||||
		controller->show(
 | 
			
		||||
			Box<Ui::InformBox>(tr::lng_confirm_phone_link_invalid(tr::now)),
 | 
			
		||||
			Ui::LayerOption::CloseOther);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Decrypt data.
 | 
			
		||||
	auto hashData = QByteArray(hashEncrypted.size() - key128Size, Qt::Uninitialized);
 | 
			
		||||
	if (!session->local().decrypt(hashEncrypted.constData() + key128Size, hashData.data(), hashEncrypted.size() - key128Size, hashEncrypted.constData())) {
 | 
			
		||||
	if (!session.local().decrypt(hashEncrypted.constData() + key128Size, hashData.data(), hashEncrypted.size() - key128Size, hashEncrypted.constData())) {
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1282,13 +1284,17 @@ void ShareGameScoreByHash(
 | 
			
		|||
 | 
			
		||||
	// Check 128 bits of SHA1() of data.
 | 
			
		||||
	if (memcmp(dataSha1, hashEncrypted.constData(), key128Size) != 0) {
 | 
			
		||||
		Ui::show(Box<Ui::InformBox>(tr::lng_share_wrong_user(tr::now)));
 | 
			
		||||
		controller->show(
 | 
			
		||||
			Box<Ui::InformBox>(tr::lng_share_wrong_user(tr::now)),
 | 
			
		||||
			Ui::LayerOption::CloseOther);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	auto hashDataInts = reinterpret_cast<uint64*>(hashData.data());
 | 
			
		||||
	if (hashDataInts[0] != session->userId().bare) {
 | 
			
		||||
		Ui::show(Box<Ui::InformBox>(tr::lng_share_wrong_user(tr::now)));
 | 
			
		||||
	if (hashDataInts[0] != session.userId().bare) {
 | 
			
		||||
		controller->show(
 | 
			
		||||
			Box<Ui::InformBox>(tr::lng_share_wrong_user(tr::now)),
 | 
			
		||||
			Ui::LayerOption::CloseOther);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1296,33 +1302,43 @@ void ShareGameScoreByHash(
 | 
			
		|||
	const auto channelAccessHash = hashDataInts[3];
 | 
			
		||||
	if (!peerIsChannel(peerId) && channelAccessHash) {
 | 
			
		||||
		// If there is no channel id, there should be no channel access_hash.
 | 
			
		||||
		Ui::show(Box<Ui::InformBox>(tr::lng_share_wrong_user(tr::now)));
 | 
			
		||||
		controller->show(
 | 
			
		||||
			Box<Ui::InformBox>(tr::lng_share_wrong_user(tr::now)),
 | 
			
		||||
			Ui::LayerOption::CloseOther);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	const auto msgId = MsgId(int64(hashDataInts[2]));
 | 
			
		||||
	if (const auto item = session->data().message(peerId, msgId)) {
 | 
			
		||||
	if (const auto item = session.data().message(peerId, msgId)) {
 | 
			
		||||
		FastShareMessage(item);
 | 
			
		||||
	} else {
 | 
			
		||||
		auto resolveMessageAndShareScore = [=](PeerData *peer) {
 | 
			
		||||
			session->api().requestMessageData(peer, msgId, [=] {
 | 
			
		||||
				const auto item = session->data().message(peerId, msgId);
 | 
			
		||||
		const auto weak = base::make_weak(controller.get());
 | 
			
		||||
		const auto resolveMessageAndShareScore = crl::guard(weak, [=](
 | 
			
		||||
				PeerData *peer) {
 | 
			
		||||
			auto done = crl::guard(weak, [=] {
 | 
			
		||||
				const auto item = weak->session().data().message(
 | 
			
		||||
					peerId,
 | 
			
		||||
					msgId);
 | 
			
		||||
				if (item) {
 | 
			
		||||
					FastShareMessage(item);
 | 
			
		||||
				} else {
 | 
			
		||||
					Ui::show(Box<Ui::InformBox>(
 | 
			
		||||
						tr::lng_edit_deleted(tr::now)));
 | 
			
		||||
					weak->show(
 | 
			
		||||
						Box<Ui::InformBox>(tr::lng_edit_deleted(tr::now)),
 | 
			
		||||
						Ui::LayerOption::CloseOther);
 | 
			
		||||
				}
 | 
			
		||||
			});
 | 
			
		||||
		};
 | 
			
		||||
			auto &api = weak->session().api();
 | 
			
		||||
			api.requestMessageData(peer, msgId, std::move(done));
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
		const auto peer = peerIsChannel(peerId)
 | 
			
		||||
			? session->data().peerLoaded(peerId)
 | 
			
		||||
			? controller->session().data().peerLoaded(peerId)
 | 
			
		||||
			: nullptr;
 | 
			
		||||
		if (peer || !peerIsChannel(peerId)) {
 | 
			
		||||
			resolveMessageAndShareScore(peer);
 | 
			
		||||
		} else {
 | 
			
		||||
			session->api().request(MTPchannels_GetChannels(
 | 
			
		||||
			const auto owner = &controller->session().data();
 | 
			
		||||
			controller->session().api().request(MTPchannels_GetChannels(
 | 
			
		||||
				MTP_vector<MTPInputChannel>(
 | 
			
		||||
					1,
 | 
			
		||||
					MTP_inputChannel(
 | 
			
		||||
| 
						 | 
				
			
			@ -1330,9 +1346,9 @@ void ShareGameScoreByHash(
 | 
			
		|||
						MTP_long(channelAccessHash)))
 | 
			
		||||
			)).done([=](const MTPmessages_Chats &result) {
 | 
			
		||||
				result.match([&](const auto &data) {
 | 
			
		||||
					session->data().processChats(data.vchats());
 | 
			
		||||
					owner->processChats(data.vchats());
 | 
			
		||||
				});
 | 
			
		||||
				if (const auto peer = session->data().peerLoaded(peerId)) {
 | 
			
		||||
				if (const auto peer = owner->peerLoaded(peerId)) {
 | 
			
		||||
					resolveMessageAndShareScore(peer);
 | 
			
		||||
				}
 | 
			
		||||
			}).send();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,6 +26,7 @@ enum class Type;
 | 
			
		|||
} // namespace SendMenu
 | 
			
		||||
 | 
			
		||||
namespace Window {
 | 
			
		||||
class SessionController;
 | 
			
		||||
class SessionNavigation;
 | 
			
		||||
} // namespace Window
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -60,7 +61,7 @@ QString AppendShareGameScoreUrl(
 | 
			
		|||
	const QString &url,
 | 
			
		||||
	const FullMsgId &fullId);
 | 
			
		||||
void ShareGameScoreByHash(
 | 
			
		||||
	not_null<Main::Session*> session,
 | 
			
		||||
	not_null<Window::SessionController*> controller,
 | 
			
		||||
	const QString &hash);
 | 
			
		||||
 | 
			
		||||
class ShareBox final : public Ui::BoxContent {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -163,7 +163,7 @@ bool ShareGameScore(
 | 
			
		|||
	const auto params = url_parse_params(
 | 
			
		||||
		match->captured(1),
 | 
			
		||||
		qthelp::UrlParamNameTransform::ToLower);
 | 
			
		||||
	ShareGameScoreByHash(&controller->session(), params.value(qsl("hash")));
 | 
			
		||||
	ShareGameScoreByHash(controller, params.value(qsl("hash")));
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue