From 694b208829fb333beeb961af59797fffb621025f Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Fri, 3 Mar 2023 12:10:52 -0800 Subject: [PATCH] ircd::m::user::tokens: Add method to delete access tokens by device_id. --- include/ircd/m/user/tokens.h | 1 + matrix/user_tokens.cc | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/include/ircd/m/user/tokens.h b/include/ircd/m/user/tokens.h index 3c9f455c9..0413eaacd 100644 --- a/include/ircd/m/user/tokens.h +++ b/include/ircd/m/user/tokens.h @@ -27,6 +27,7 @@ struct ircd::m::user::tokens bool for_each(const closure_bool &) const; bool check(const string_view &token) const; bool del(const string_view &token, const string_view &reason) const; + size_t del_by_device(const string_view &device_id, const string_view &reason = {}) const; size_t del(const string_view &reason) const; m::event::id::buf add(const string_view &, const json::object & = {}) const; string_view create(const mutable_buffer &, const json::object & = {}) const; diff --git a/matrix/user_tokens.cc b/matrix/user_tokens.cc index 5ebfc3c48..216c14948 100644 --- a/matrix/user_tokens.cc +++ b/matrix/user_tokens.cc @@ -59,6 +59,32 @@ const return ret; } +size_t +ircd::m::user::tokens::del_by_device(const string_view &device_id, + const string_view &reason) +const +{ + size_t ret(0); + for_each([this, &ret, &device_id, &reason] + (const event::idx &event_idx, const string_view &token) + { + const auto match + { + [&device_id](const json::object &content) + { + return json::string{content["device_id"]} == device_id; + } + }; + + if(m::query(std::nothrow, event_idx, "content", false, match)) + ret += del(token, reason); + + return true; + }); + + return ret; +} + bool ircd::m::user::tokens::del(const string_view &token, const string_view &reason)