Provided Window::SessionController to ShareGameScoreByHash.

This commit is contained in:
23rd 2022-02-23 09:59:51 +03:00 committed by John Preston
parent ca7f4ffed9
commit c0ae4b86a6
3 changed files with 38 additions and 21 deletions

View File

@ -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();

View File

@ -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 {

View File

@ -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;
}