mirror of
https://github.com/matrix-construct/construct
synced 2024-09-30 04:38:52 +02:00
ircd:Ⓜ️:keys: Add mass fetcher to interface.
This commit is contained in:
parent
2dbef7763e
commit
f1e3a9c53b
2 changed files with 84 additions and 0 deletions
|
@ -60,6 +60,7 @@ struct ircd::m::keys
|
|||
using closure = std::function<void (const json::object &)>;
|
||||
using closure_bool = std::function<bool (const json::object &)>;
|
||||
|
||||
static bool get(const queries &, const closure_bool &);
|
||||
static void get(const string_view &server_name, const closure &);
|
||||
static void get(const string_view &server_name, const string_view &key_id, const closure &);
|
||||
static void query(const string_view &query_server, const queries &, const closure_bool &);
|
||||
|
|
|
@ -374,6 +374,89 @@ catch(const ctx::timeout &e)
|
|||
};
|
||||
}
|
||||
|
||||
bool
|
||||
IRCD_MODULE_EXPORT
|
||||
ircd::m::keys::get(const queries &queries,
|
||||
const closure_bool &closure)
|
||||
{
|
||||
bool ret{true};
|
||||
std::vector<m::feds::opts> opts;
|
||||
opts.reserve(queries.size());
|
||||
for(const auto &[server_name, key_id] : queries)
|
||||
{
|
||||
const bool cached
|
||||
{
|
||||
cache::get(server_name, key_id, [&ret, &closure]
|
||||
(const auto &object)
|
||||
{
|
||||
ret = closure(object);
|
||||
})
|
||||
};
|
||||
|
||||
if(!ret)
|
||||
return ret;
|
||||
|
||||
if(cached)
|
||||
continue;
|
||||
|
||||
if(server_name == my_host())
|
||||
{
|
||||
log::derror
|
||||
{
|
||||
m::log, "key '%s' for '%s' (that's myself) not found.",
|
||||
key_id,
|
||||
server_name,
|
||||
};
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
log::debug
|
||||
{
|
||||
m::log, "Key '%s' for %s not cached; querying network...",
|
||||
key_id,
|
||||
server_name,
|
||||
};
|
||||
|
||||
opts.emplace_back();
|
||||
opts.back().op = feds::op::keys;
|
||||
opts.back().arg[0] = server_name;
|
||||
opts.back().arg[1] = key_id;
|
||||
}
|
||||
|
||||
assert(opts.size() <= queries.size());
|
||||
m::feds::acquire(opts, [&ret, &closure]
|
||||
(const auto &result)
|
||||
{
|
||||
if(empty(result.object))
|
||||
return true;
|
||||
|
||||
const m::keys keys
|
||||
{
|
||||
result.object
|
||||
};
|
||||
|
||||
if(!verify(keys, std::nothrow))
|
||||
{
|
||||
log::derror
|
||||
{
|
||||
m::log, "Failed to verify key '%s' for '%s' from '%s'",
|
||||
result.request->arg[0],
|
||||
result.request->arg[1],
|
||||
result.origin,
|
||||
};
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
cache::set(result.object);
|
||||
ret = closure(result.object);
|
||||
return ret;
|
||||
});
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
//
|
||||
// m::keys::cache
|
||||
//
|
||||
|
|
Loading…
Reference in a new issue