From 2f6384b068fb8bc0c7cf623159027b8db6a83da8 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Tue, 12 Feb 2019 11:03:59 -0800 Subject: [PATCH] ircd::m::room: Add room::auth interface w/ console cmd. --- include/ircd/m/room.h | 1 + include/ircd/m/room/auth.h | 30 ++++++++++++++++++ include/ircd/m/room/room.h | 1 + ircd/m_room.cc | 36 ++++++++++++++++++++++ modules/console.cc | 63 ++++++++++++++++++++++++++++++++++++++ modules/m_room.cc | 13 ++++++++ 6 files changed, 144 insertions(+) create mode 100644 include/ircd/m/room/auth.h diff --git a/include/ircd/m/room.h b/include/ircd/m/room.h index 54978de5d..0858353d1 100644 --- a/include/ircd/m/room.h +++ b/include/ircd/m/room.h @@ -81,4 +81,5 @@ namespace ircd::m #include "room/members.h" #include "room/origins.h" #include "room/head.h" +#include "room/auth.h" #include "room/power.h" diff --git a/include/ircd/m/room/auth.h b/include/ircd/m/room/auth.h new file mode 100644 index 000000000..edf0cdf94 --- /dev/null +++ b/include/ircd/m/room/auth.h @@ -0,0 +1,30 @@ +// 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. + +#pragma once +#define HAVE_IRCD_M_ROOM_AUTH_H + +/// Interface to the auth_chain / auth_dag. +/// +struct ircd::m::room::auth +{ + using closure_bool = std::function; + using closure = std::function; + + m::room room; + + static bool for_each(const auth &, const closure_bool &); + bool for_each(const closure_bool &) const; + void for_each(const closure &) const; + + auth(const m::room &room) + :room{room} + {} +}; diff --git a/include/ircd/m/room/room.h b/include/ircd/m/room/room.h index 5ddc2e84f..682a280b3 100644 --- a/include/ircd/m/room/room.h +++ b/include/ircd/m/room/room.h @@ -35,6 +35,7 @@ struct ircd::m::room struct members; struct origins; struct head; + struct auth; struct power; using id = m::id::room; diff --git a/ircd/m_room.cc b/ircd/m_room.cc index 00599dce1..6da71fde2 100644 --- a/ircd/m_room.cc +++ b/ircd/m_room.cc @@ -2050,6 +2050,42 @@ const return true; } +// +// room::auth +// + +void +ircd::m::room::auth::for_each(const closure &c) +const +{ + for_each(closure_bool{[this, &c] + (const auto &a, const auto &b) + { + c(a, b); + return true; + }}); +} + +bool +ircd::m::room::auth::for_each(const closure_bool &c) +const +{ + return for_each(*this, c); +} + +bool +ircd::m::room::auth::for_each(const auth &a, const closure_bool &c) +{ + using prototype = bool (const auth &, const closure_bool &); + + static mods::import call + { + "m_room", "ircd::m::room::auth::for_each" + }; + + return call(a, c); +} + // // room::power // diff --git a/modules/console.cc b/modules/console.cc index 2e0fbeb90..9e6eaf624 100644 --- a/modules/console.cc +++ b/modules/console.cc @@ -8157,6 +8157,69 @@ console_cmd__room__dagree(opt &out, const string_view &line) return true; } +bool +console_cmd__room__auth(opt &out, const string_view &line) +{ + const params param{line, " ", + { + "event_id|room_id", "event_id" + }}; + + const string_view &p0 + { + param.at("event_id|room_id") + }; + + const m::room::id::buf room_id{[&p0] + () -> m::room::id::buf + { + switch(m::sigil(p0)) + { + case m::id::ROOM: + return p0; + + case m::id::ROOM_ALIAS: + return m::room_id(p0); + + case m::id::EVENT: + return m::get(m::event::id(p0), "room_id"); + + default: throw params::invalid + { + "%s is the wrong kind of MXID for this argument", + reflect(m::sigil(p0)) + }; + } + }()}; + + const m::event::id &event_id + { + m::sigil(p0) != m::id::EVENT? + param.at("event_id"): + p0 + }; + + const m::room room + { + room_id, event_id + }; + + const m::room::auth auth + { + room + }; + + auth.for_each([&out] + (const m::event::idx &idx, const m::event &event) + { + out << idx + << " " << pretty_oneline(event) + << std::endl; + }); + + return true; +} + // // user // diff --git a/modules/m_room.cc b/modules/m_room.cc index 41b331ed7..83d535b22 100644 --- a/modules/m_room.cc +++ b/modules/m_room.cc @@ -845,3 +845,16 @@ room_herd(const m::room &room, ctx::sleep(seconds(2)); } } + +bool +IRCD_MODULE_EXPORT +ircd::m::room::auth::for_each(const auth &a, + const closure_bool &closure) +{ + const m::room &room{a.room}; + const auto &event_id{room.event_id}; + if(!event_id) + return false; + + return true; +}