Provided Window::SessionController to ShareGameScoreByHash.
This commit is contained in:
parent
ca7f4ffed9
commit
c0ae4b86a6
|
@ -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();
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue