From 9301980f9d57a2b071ba733e2c5c00e9fbea97fe Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Thu, 27 Apr 2023 14:15:45 -0700 Subject: [PATCH] ircd::m::user::keys: Implement m.signing_key_update broadcast interface. --- include/ircd/m/user/keys.h | 8 ++++ matrix/user_keys.cc | 79 ++++++++++++++++++++++++++++++++++++++ modules/console.cc | 37 ++++++++++++++++++ 3 files changed, 124 insertions(+) diff --git a/include/ircd/m/user/keys.h b/include/ircd/m/user/keys.h index 77796c008..a714a6da0 100644 --- a/include/ircd/m/user/keys.h +++ b/include/ircd/m/user/keys.h @@ -13,6 +13,8 @@ struct ircd::m::user::keys { + struct send; + static string_view make_sigs_state_key(const mutable_buffer &, const string_view &tgt, const string_view &src); static std::tuple unmake_sigs_state_key(const string_view &) noexcept; @@ -39,6 +41,12 @@ struct ircd::m::user::keys {} }; +struct ircd::m::user::keys::send +{ + send(const m::user::keys &, + const string_view = {}); +}; + inline void ircd::m::user::keys::cross_user(json::stack::object &out) const diff --git a/matrix/user_keys.cc b/matrix/user_keys.cc index 481b3fa25..7bb6e846d 100644 --- a/matrix/user_keys.cc +++ b/matrix/user_keys.cc @@ -8,6 +8,85 @@ // copyright notice and this permission notice is present in all copies. The // full license for this software is available in the LICENSE file. +ircd::m::user::keys::send::send(const m::user::keys &user_keys, + const string_view room_id) +try +{ + const auto &user_id + { + user_keys.user_room.user.user_id + }; + + const unique_mutable_buffer keys_buf[2] + { + { 4_KiB }, + { 4_KiB }, + }; + + json::stack keys[2] + { + { keys_buf[0] }, + { keys_buf[1] }, + }; + + // master + { + json::stack::object object{keys[0]}; + user_keys.cross_master(object); + } + + // self + { + json::stack::object object{keys[1]}; + user_keys.cross_self(object); + } + + json::iov event, content; + const json::iov::push push[] + { + { event, { "type", "m.signing_key_update" } }, + { event, { "sender", user_id } }, + { content, { "master_key", keys[0].completed() } }, + { content, { "self_signing_key", keys[1].completed() } }, + { content, { "user_id", user_id } }, + }; + + // For diagnostic purposes; usually not defined. + const json::iov::push push_room_id + { + event, m::valid(m::id::ROOM, room_id), + { + "room_id", [&room_id] + { + return room_id; + } + } + }; + + m::vm::copts opts; + opts.edu = true; + opts.prop_mask.reset(); + opts.prop_mask.set("origin"); + opts.notify_clients = false; + m::vm::eval + { + event, content, opts + }; +} +catch(const ctx::interrupted &) +{ + throw; +} +catch(const std::exception &e) +{ + log::error + { + m::log, "Sending m.signing_key_update for %s :%s", + string_view{user_keys.user_room.user.user_id}, + e.what(), + }; +} + void ircd::m::user::keys::device(json::stack::object &out, const string_view &device_id) diff --git a/modules/console.cc b/modules/console.cc index 4767d62f1..d63511cbb 100644 --- a/modules/console.cc +++ b/modules/console.cc @@ -14515,6 +14515,43 @@ console_id__device(opt &out, return true; } +bool +console_cmd__user__keys__update(opt &out, const string_view &line) +{ + const params param{line, " ", + { + "user_id", "room_id" + }}; + + const m::user::id &user_id + { + param.at("user_id") + }; + + const m::room::id::buf room_id + { + m::valid(m::id::ROOM, param["room_id"])? + m::room_id(param["room_id"]): + m::room::id::buf{} + }; + + const m::user::keys keys + { + user_id + }; + + m::user::keys::send + { + keys, room_id + }; + + out + << "broadcast: " + << user_id + << std::endl; + return true; +} + bool console_cmd__user__ignores(opt &out, const string_view &line) {