mirror of
https://github.com/matrix-construct/construct
synced 2025-01-14 00:34:18 +01:00
modules/m_room_member: Eval foreign invites; committer in modules/client/rooms/invite.
This commit is contained in:
parent
e78f08e8ff
commit
ad9a5f731a
2 changed files with 143 additions and 0 deletions
|
@ -17,6 +17,9 @@ invite__room_user(const m::room &,
|
||||||
const m::user::id &target,
|
const m::user::id &target,
|
||||||
const m::user::id &sender);
|
const m::user::id &sender);
|
||||||
|
|
||||||
|
extern "C" m::event::id::buf
|
||||||
|
invite__foreign(const m::event &);
|
||||||
|
|
||||||
resource::response
|
resource::response
|
||||||
post__invite(client &client,
|
post__invite(client &client,
|
||||||
const resource::request &request,
|
const resource::request &request,
|
||||||
|
@ -68,3 +71,92 @@ invite__room_user(const m::room &room,
|
||||||
|
|
||||||
return commit(room, event, content);
|
return commit(room, event, content);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m::event::id::buf
|
||||||
|
invite__foreign(const m::event &event)
|
||||||
|
{
|
||||||
|
const auto &event_id
|
||||||
|
{
|
||||||
|
at<"event_id"_>(event)
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto &room_id
|
||||||
|
{
|
||||||
|
at<"room_id"_>(event)
|
||||||
|
};
|
||||||
|
|
||||||
|
const m::user::id &target
|
||||||
|
{
|
||||||
|
at<"state_key"_>(event)
|
||||||
|
};
|
||||||
|
|
||||||
|
const unique_buffer<mutable_buffer> bufs
|
||||||
|
{
|
||||||
|
148_KiB
|
||||||
|
};
|
||||||
|
|
||||||
|
mutable_buffer buf{bufs};
|
||||||
|
const auto proto
|
||||||
|
{
|
||||||
|
json::stringify(buf, event)
|
||||||
|
};
|
||||||
|
|
||||||
|
m::v1::invite::opts opts;
|
||||||
|
opts.remote = target.host();
|
||||||
|
m::v1::invite request
|
||||||
|
{
|
||||||
|
room_id, event_id, proto, buf, std::move(opts)
|
||||||
|
};
|
||||||
|
|
||||||
|
request.wait(seconds(10)); //TODO: conf
|
||||||
|
request.get();
|
||||||
|
|
||||||
|
const json::array &response
|
||||||
|
{
|
||||||
|
request.in.content
|
||||||
|
};
|
||||||
|
|
||||||
|
const http::code &rcode
|
||||||
|
{
|
||||||
|
http::code(lex_cast<ushort>(response.at(0)))
|
||||||
|
};
|
||||||
|
|
||||||
|
if(rcode != http::OK)
|
||||||
|
throw http::error
|
||||||
|
{
|
||||||
|
rcode
|
||||||
|
};
|
||||||
|
|
||||||
|
const json::object &robject
|
||||||
|
{
|
||||||
|
response.at(1)
|
||||||
|
};
|
||||||
|
|
||||||
|
const m::event &revent
|
||||||
|
{
|
||||||
|
robject.at("event")
|
||||||
|
};
|
||||||
|
|
||||||
|
if(!verify(revent, target.host()))
|
||||||
|
throw m::error
|
||||||
|
{
|
||||||
|
http::UNAUTHORIZED, "M_INVITE_UNSIGNED",
|
||||||
|
"Invitee's host '%s' did not sign the invite.",
|
||||||
|
target.host()
|
||||||
|
};
|
||||||
|
|
||||||
|
if(!verify(revent, my_host()))
|
||||||
|
throw m::error
|
||||||
|
{
|
||||||
|
http::FORBIDDEN, "M_INVITE_MODIFIED",
|
||||||
|
"Invite event no longer verified by our signature.",
|
||||||
|
target.host()
|
||||||
|
};
|
||||||
|
|
||||||
|
m::vm::opts vmopts;
|
||||||
|
vmopts.non_conform.set(m::event::conforms::MISSING_PREV_STATE);
|
||||||
|
vmopts.infolog_accept = true;
|
||||||
|
|
||||||
|
m::vm::eval(revent, vmopts);
|
||||||
|
return at<"event_id"_>(revent);
|
||||||
|
}
|
||||||
|
|
|
@ -49,3 +49,54 @@ _join_room_hookfn
|
||||||
},
|
},
|
||||||
_join_room
|
_join_room
|
||||||
};
|
};
|
||||||
|
|
||||||
|
using invite_foreign_proto = m::event::id::buf (const m::event &);
|
||||||
|
m::import<invite_foreign_proto>
|
||||||
|
invite__foreign
|
||||||
|
{
|
||||||
|
"client_rooms", "invite__foreign"
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
invite_foreign(const m::event &event)
|
||||||
|
{
|
||||||
|
const m::room::id &room_id
|
||||||
|
{
|
||||||
|
at<"room_id"_>(event)
|
||||||
|
};
|
||||||
|
|
||||||
|
const m::user::id &target
|
||||||
|
{
|
||||||
|
at<"state_key"_>(event)
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto target_host
|
||||||
|
{
|
||||||
|
target.host()
|
||||||
|
};
|
||||||
|
|
||||||
|
const m::room::origins origins
|
||||||
|
{
|
||||||
|
room_id
|
||||||
|
};
|
||||||
|
|
||||||
|
if(origins.has(target_host))
|
||||||
|
return;
|
||||||
|
|
||||||
|
const auto eid
|
||||||
|
{
|
||||||
|
invite__foreign(event)
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
const m::hook
|
||||||
|
invite_foreign_hookfn
|
||||||
|
{
|
||||||
|
{
|
||||||
|
{ "_site", "vm.commit" },
|
||||||
|
{ "type", "m.room.member" },
|
||||||
|
{ "membership", "invite" },
|
||||||
|
},
|
||||||
|
invite_foreign
|
||||||
|
};
|
||||||
|
|
Loading…
Reference in a new issue