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( void ShareGameScoreByHash(
not_null<Main::Session*> session, not_null<Window::SessionController*> controller,
const QString &hash) { const QString &hash) {
auto &session = controller->session();
auto key128Size = 0x10; auto key128Size = 0x10;
auto hashEncrypted = QByteArray::fromBase64(hash.toLatin1(), QByteArray::Base64UrlEncoding | QByteArray::OmitTrailingEquals); auto hashEncrypted = QByteArray::fromBase64(hash.toLatin1(), QByteArray::Base64UrlEncoding | QByteArray::OmitTrailingEquals);
if (hashEncrypted.size() <= key128Size || (hashEncrypted.size() != key128Size + 0x20)) { if (hashEncrypted.size() <= key128Size || (hashEncrypted.size() != key128Size + 0x20)) {
Ui::show(Box<Ui::InformBox>( controller->show(
tr::lng_confirm_phone_link_invalid(tr::now))); Box<Ui::InformBox>(tr::lng_confirm_phone_link_invalid(tr::now)),
Ui::LayerOption::CloseOther);
return; return;
} }
// Decrypt data. // Decrypt data.
auto hashData = QByteArray(hashEncrypted.size() - key128Size, Qt::Uninitialized); 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; return;
} }
@ -1282,13 +1284,17 @@ void ShareGameScoreByHash(
// Check 128 bits of SHA1() of data. // Check 128 bits of SHA1() of data.
if (memcmp(dataSha1, hashEncrypted.constData(), key128Size) != 0) { 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; return;
} }
auto hashDataInts = reinterpret_cast<uint64*>(hashData.data()); auto hashDataInts = reinterpret_cast<uint64*>(hashData.data());
if (hashDataInts[0] != session->userId().bare) { if (hashDataInts[0] != session.userId().bare) {
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; return;
} }
@ -1296,33 +1302,43 @@ void ShareGameScoreByHash(
const auto channelAccessHash = hashDataInts[3]; const auto channelAccessHash = hashDataInts[3];
if (!peerIsChannel(peerId) && channelAccessHash) { if (!peerIsChannel(peerId) && channelAccessHash) {
// If there is no channel id, there should be no channel access_hash. // 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; return;
} }
const auto msgId = MsgId(int64(hashDataInts[2])); 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); FastShareMessage(item);
} else { } else {
auto resolveMessageAndShareScore = [=](PeerData *peer) { const auto weak = base::make_weak(controller.get());
session->api().requestMessageData(peer, msgId, [=] { const auto resolveMessageAndShareScore = crl::guard(weak, [=](
const auto item = session->data().message(peerId, msgId); PeerData *peer) {
auto done = crl::guard(weak, [=] {
const auto item = weak->session().data().message(
peerId,
msgId);
if (item) { if (item) {
FastShareMessage(item); FastShareMessage(item);
} else { } else {
Ui::show(Box<Ui::InformBox>( weak->show(
tr::lng_edit_deleted(tr::now))); 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) const auto peer = peerIsChannel(peerId)
? session->data().peerLoaded(peerId) ? controller->session().data().peerLoaded(peerId)
: nullptr; : nullptr;
if (peer || !peerIsChannel(peerId)) { if (peer || !peerIsChannel(peerId)) {
resolveMessageAndShareScore(peer); resolveMessageAndShareScore(peer);
} else { } else {
session->api().request(MTPchannels_GetChannels( const auto owner = &controller->session().data();
controller->session().api().request(MTPchannels_GetChannels(
MTP_vector<MTPInputChannel>( MTP_vector<MTPInputChannel>(
1, 1,
MTP_inputChannel( MTP_inputChannel(
@ -1330,9 +1346,9 @@ void ShareGameScoreByHash(
MTP_long(channelAccessHash))) MTP_long(channelAccessHash)))
)).done([=](const MTPmessages_Chats &result) { )).done([=](const MTPmessages_Chats &result) {
result.match([&](const auto &data) { 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); resolveMessageAndShareScore(peer);
} }
}).send(); }).send();

View File

@ -26,6 +26,7 @@ enum class Type;
} // namespace SendMenu } // namespace SendMenu
namespace Window { namespace Window {
class SessionController;
class SessionNavigation; class SessionNavigation;
} // namespace Window } // namespace Window
@ -60,7 +61,7 @@ QString AppendShareGameScoreUrl(
const QString &url, const QString &url,
const FullMsgId &fullId); const FullMsgId &fullId);
void ShareGameScoreByHash( void ShareGameScoreByHash(
not_null<Main::Session*> session, not_null<Window::SessionController*> controller,
const QString &hash); const QString &hash);
class ShareBox final : public Ui::BoxContent { class ShareBox final : public Ui::BoxContent {

View File

@ -163,7 +163,7 @@ bool ShareGameScore(
const auto params = url_parse_params( const auto params = url_parse_params(
match->captured(1), match->captured(1),
qthelp::UrlParamNameTransform::ToLower); qthelp::UrlParamNameTransform::ToLower);
ShareGameScoreByHash(&controller->session(), params.value(qsl("hash"))); ShareGameScoreByHash(controller, params.value(qsl("hash")));
return true; return true;
} }