From 50911da57fca0dbdaf440376d2ddf9a01383a1c3 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Tue, 3 Apr 2018 17:08:29 -0700 Subject: [PATCH] modules/federation: Add state endpoint handler. --- modules/Makefile.am | 2 + modules/federation/state.cc | 85 +++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 modules/federation/state.cc diff --git a/modules/Makefile.am b/modules/Makefile.am index 8c4357633..a6f933781 100644 --- a/modules/Makefile.am +++ b/modules/Makefile.am @@ -246,6 +246,7 @@ federation_federation_invite_la_SOURCES = federation/invite.cc federation_federation_make_join_la_SOURCES = federation/make_join.cc federation_federation_send_join_la_SOURCES = federation/send_join.cc federation_federation_state_ids_la_SOURCES = federation/state_ids.cc +federation_federation_state_la_SOURCES = federation/state.cc federation_module_LTLIBRARIES = \ federation/federation_send.la \ @@ -259,6 +260,7 @@ federation_module_LTLIBRARIES = \ federation/federation_make_join.la \ federation/federation_send_join.la \ federation/federation_state_ids.la \ + federation/federation_state.la \ ### ############################################################################### diff --git a/modules/federation/state.cc b/modules/federation/state.cc new file mode 100644 index 000000000..9707755f7 --- /dev/null +++ b/modules/federation/state.cc @@ -0,0 +1,85 @@ +// Matrix Construct +// +// Copyright (C) Matrix Construct Developers, Authors & Contributors +// Copyright (C) 2016-2018 Jason Volk +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice is present in all copies. The +// full license for this software is available in the LICENSE file. + +using namespace ircd; + +mapi::header +IRCD_MODULE +{ + "federation state" +}; + +resource +state_resource +{ + "/_matrix/federation/v1/state/", + { + "federation state", + resource::DIRECTORY, + } +}; + +resource::response +get__state(client &client, + const resource::request &request) +{ + m::room::id::buf room_id + { + url::decode(request.parv[0], room_id) + }; + + m::event::id::buf event_id; + if(request.query["event_id"]) + url::decode(request.query.at("event_id"), event_id); + + //TODO: direct to socket + const unique_buffer buf{4_MiB}; //TODO: XXX + json::stack out{buf}; + { + json::stack::object top{out}; + json::stack::member pdus_m + { + top, "pdus" + }; + + json::stack::array pdus + { + pdus_m + }; + + const m::room::state state + { + m::room + { + room_id, event_id + } + }; + + state.for_each([&pdus] + (const m::event &event) + { + pdus.append(event); + }); + } + + return resource::response + { + client, json::object{out.completed()} + }; +} + +resource::method +method_get +{ + state_resource, "GET", get__state, + { + method_get.VERIFY_ORIGIN + } +};