Added initial api support to request of passkeys for account.
This commit is contained in:
@@ -13,6 +13,21 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
#include "platform/platform_webauthn.h"
|
||||
|
||||
namespace Data {
|
||||
namespace {
|
||||
|
||||
constexpr auto kTimeoutMs = 5000;
|
||||
|
||||
[[nodiscard]] PasskeyEntry FromTL(const MTPDpasskey &data) {
|
||||
return PasskeyEntry{
|
||||
.id = qs(data.vid()),
|
||||
.name = qs(data.vname()),
|
||||
.date = data.vdate().v,
|
||||
.softwareEmojiId = data.vsoftware_emoji_id().value_or(0),
|
||||
.lastUsageDate = data.vlast_usage_date().value_or(0),
|
||||
};
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
Passkeys::Passkeys(not_null<Main::Session*> session)
|
||||
: _session(session) {
|
||||
@@ -45,8 +60,47 @@ void Passkeys::registerPasskey(
|
||||
MTP_dataJSON(MTP_bytes(result.clientDataJSON)),
|
||||
MTP_bytes(result.attestationObject)))
|
||||
)).done([=](const MTPPasskey &result) {
|
||||
_passkeys.emplace_back(FromTL(result.data()));
|
||||
_listUpdated.fire({});
|
||||
done();
|
||||
}).send();
|
||||
}
|
||||
|
||||
rpl::producer<> Passkeys::requestList() {
|
||||
if (crl::now() - _lastRequestTime > kTimeoutMs) {
|
||||
if (!_listRequestId) {
|
||||
loadList();
|
||||
}
|
||||
return _listUpdated.events();
|
||||
} else {
|
||||
return _listUpdated.events_starting_with(rpl::empty_value());
|
||||
}
|
||||
}
|
||||
|
||||
const std::vector<PasskeyEntry> &Passkeys::list() const {
|
||||
return _passkeys;
|
||||
}
|
||||
|
||||
bool Passkeys::listKnown() const {
|
||||
return _listKnown;
|
||||
}
|
||||
|
||||
void Passkeys::loadList() {
|
||||
_lastRequestTime = crl::now();
|
||||
_listRequestId = _session->api().request(MTPaccount_GetPasskeys(
|
||||
)).done([=](const MTPaccount_Passkeys &result) {
|
||||
_listRequestId = 0;
|
||||
_listKnown = true;
|
||||
const auto &data = result.data();
|
||||
_passkeys.clear();
|
||||
_passkeys.reserve(data.vpasskeys().v.size());
|
||||
for (const auto &passkey : data.vpasskeys().v) {
|
||||
_passkeys.emplace_back(FromTL(passkey.data()));
|
||||
}
|
||||
_listUpdated.fire({});
|
||||
}).fail([=] {
|
||||
_listRequestId = 0;
|
||||
}).send();
|
||||
}
|
||||
|
||||
} // namespace Data
|
||||
|
||||
@@ -20,6 +20,14 @@ class Session;
|
||||
|
||||
namespace Data {
|
||||
|
||||
struct PasskeyEntry {
|
||||
QString id;
|
||||
QString name;
|
||||
TimeId date = 0;
|
||||
DocumentId softwareEmojiId = 0;
|
||||
TimeId lastUsageDate = 0;
|
||||
};
|
||||
|
||||
class Passkeys final {
|
||||
public:
|
||||
explicit Passkeys(not_null<Main::Session*> session);
|
||||
@@ -29,9 +37,19 @@ public:
|
||||
void registerPasskey(
|
||||
const Platform::WebAuthn::RegisterResult &result,
|
||||
Fn<void()> done);
|
||||
[[nodiscard]] rpl::producer<> requestList();
|
||||
[[nodiscard]] const std::vector<PasskeyEntry> &list() const;
|
||||
[[nodiscard]] bool listKnown() const;
|
||||
|
||||
private:
|
||||
void loadList();
|
||||
|
||||
const not_null<Main::Session*> _session;
|
||||
std::vector<PasskeyEntry> _passkeys;
|
||||
rpl::event_stream<> _listUpdated;
|
||||
crl::time _lastRequestTime = 0;
|
||||
mtpRequestId _listRequestId = 0;
|
||||
bool _listKnown = false;
|
||||
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user