modules/client/keys/signatures: Re-schematize signatures uploaded for keys and devices.

This commit is contained in:
Jason Volk 2023-04-24 12:32:59 -07:00
parent 8eb4de920c
commit 8b0cf48578
3 changed files with 68 additions and 36 deletions

View File

@ -43,6 +43,11 @@ ircd::m::resource::response
ircd::m::post_keys_signatures_upload(client &client,
const resource::request &request)
{
const auto src_device
{
m::user::tokens::device(std::nothrow, request.access_token)
};
for(const auto &[_user_id, devices_keys_] : request)
{
if(!valid(m::id::USER, _user_id))
@ -58,27 +63,22 @@ ircd::m::post_keys_signatures_upload(client &client,
user_id
};
const m::user::devices devices
for(const auto &[target_id, device_keys] : json::object(devices_keys_))
{
user_id
};
const json::object &devices_keys
{
devices_keys_
};
for(const auto &[_device_id, device_keys_] : devices_keys)
{
const m::device_keys device_keys
char buf[512];
const string_view state_key{fmt::sprintf
{
device_keys_
};
buf, "%s%s",
string_view{target_id},
target_id != src_device && src_device?
string_view{src_device}:
string_view{},
}};
const bool set
send(user_room, user_id, "ircd.keys.signatures", state_key, json::object
{
devices.set(_device_id, "signatures", device_keys_)
};
device_keys
});
}
}

View File

@ -38,13 +38,21 @@ ircd::m::sync::device_lists_linear(data &data)
assert(data.event);
const m::event &event{*data.event};
if(!startswith(json::get<"type"_>(event), "ircd.device"))
return false;
if(startswith(json::get<"type"_>(event), "ircd.device.signing"))
return false;
const bool including
{
false
|| startswith(json::get<"type"_>(event), "ircd.device")
|| startswith(json::get<"type"_>(event), "ircd.keys.signatures")
};
if(startswith(json::get<"type"_>(event), "ircd.device.one_time_key"))
const bool excluding
{
false
|| startswith(json::get<"type"_>(event), "ircd.device.one_time_key")
};
if(!including || excluding)
return false;
const m::user sender

View File

@ -272,17 +272,22 @@ _query_user_device(client &client,
if(!devices.has(device_id, "keys"))
return;
const m::user::room user_room
{
devices.user.user_id
};
json::stack::object object
{
out, device_id
};
devices.get(std::nothrow, device_id, "keys", [&devices, &device_id, &object]
(const auto &event_idx, const json::object &device_keys)
devices.get(std::nothrow, device_id, "keys", [&user_room, &device_id, &object]
(const auto &, const json::object &device_keys)
{
const auto &user_id
{
devices.user.user_id
user_room.user.user_id
};
for(const auto &member : device_keys)
@ -318,24 +323,43 @@ _query_user_device(client &client,
user_sigs, member
};
devices.get(std::nothrow, device_id, "signatures", [&user_id, &user_sigs]
(const auto &event_idx, const json::object &device_sigs)
const m::room::state state
{
const json::object device_sigs_sigs
user_room
};
state.for_each("ircd.keys.signatures", [&user_id, &user_sigs, &device_id]
(const string_view &, const string_view &state_key, const auto &event_idx)
{
const auto &[target, source]
{
device_sigs["signatures"]
rsplit(state_key, '%')
};
const json::object device_sigs_user_sigs
{
device_sigs_sigs[user_id]
};
if(target && target != device_id)
return true;
for(const auto &member : device_sigs_user_sigs)
json::stack::member
m::get(std::nothrow, event_idx, "content", [&user_id, &user_sigs]
(const json::object &device_sigs)
{
const json::object device_sigs_sigs
{
user_sigs, member
device_sigs["signatures"]
};
const json::object device_sigs_user_sigs
{
device_sigs_sigs[user_id]
};
for(const auto &member : device_sigs_user_sigs)
json::stack::member
{
user_sigs, member
};
});
return true;
});
});