mirror of
https://github.com/matrix-construct/construct
synced 2024-11-25 16:22:35 +01:00
ircd:Ⓜ️ Generate conf room id on the fly; various static linting.
This commit is contained in:
parent
183e44e0b6
commit
91beed59bd
4 changed files with 232 additions and 217 deletions
|
@ -57,6 +57,7 @@ libircd_matrix_la_SOURCES =#
|
|||
libircd_matrix_la_SOURCES += name.cc
|
||||
libircd_matrix_la_SOURCES += id.cc
|
||||
libircd_matrix_la_SOURCES += dbs.cc
|
||||
libircd_matrix_la_SOURCES += self.cc
|
||||
libircd_matrix_la_SOURCES += matrix.cc
|
||||
libircd_matrix_la_SOURCES += event.cc
|
||||
libircd_matrix_la_SOURCES += room.cc
|
||||
|
|
|
@ -8,6 +8,11 @@
|
|||
// copyright notice and this permission notice is present in all copies. The
|
||||
// full license for this software is available in the LICENSE file.
|
||||
|
||||
namespace ircd::m
|
||||
{
|
||||
struct conf_room;
|
||||
}
|
||||
|
||||
using namespace ircd;
|
||||
|
||||
extern "C" void default_conf(const string_view &prefix);
|
||||
|
@ -16,6 +21,24 @@ extern "C" void reload_conf();
|
|||
extern "C" void refresh_conf();
|
||||
static void init_conf_item(conf::item<> &);
|
||||
|
||||
struct ircd::m::conf_room
|
||||
{
|
||||
m::room::id::buf room_id
|
||||
{
|
||||
"conf", my_host()
|
||||
};
|
||||
|
||||
m::room room
|
||||
{
|
||||
room_id
|
||||
};
|
||||
|
||||
operator const m::room &() const
|
||||
{
|
||||
return room;
|
||||
}
|
||||
};
|
||||
|
||||
// This module registers with conf::on_init to be called back
|
||||
// when a conf item is initialized; when this module is unloaded
|
||||
// we have to unregister that listener using this state.
|
||||
|
@ -44,18 +67,6 @@ item_error_log
|
|||
true
|
||||
};
|
||||
|
||||
const m::room::id::buf
|
||||
conf_room_id
|
||||
{
|
||||
"conf", ircd::my_host()
|
||||
};
|
||||
|
||||
const m::room
|
||||
conf_room
|
||||
{
|
||||
conf_room_id
|
||||
};
|
||||
|
||||
extern "C" m::event::id::buf
|
||||
set_conf_item(const m::user::id &sender,
|
||||
const string_view &key,
|
||||
|
@ -67,6 +78,7 @@ set_conf_item(const m::user::id &sender,
|
|||
return {};
|
||||
}
|
||||
|
||||
const m::conf_room conf_room;
|
||||
return send(conf_room, sender, "ircd.conf.item", key,
|
||||
{
|
||||
{ "value", val }
|
||||
|
@ -82,6 +94,7 @@ get_conf_item(const string_view &key,
|
|||
m::event::keys::include { "content" }
|
||||
};
|
||||
|
||||
const m::conf_room conf_room;
|
||||
const m::room::state state
|
||||
{
|
||||
conf_room, &fopts
|
||||
|
@ -197,6 +210,7 @@ init_conf_items()
|
|||
m::event::keys::include { "content", "state_key" }
|
||||
};
|
||||
|
||||
const m::conf_room conf_room;
|
||||
const m::room::state state
|
||||
{
|
||||
conf_room, &fopts
|
||||
|
@ -217,6 +231,7 @@ init_conf_items()
|
|||
static void
|
||||
init_conf_item(conf::item<> &item)
|
||||
{
|
||||
const m::conf_room conf_room;
|
||||
const m::room::state state
|
||||
{
|
||||
conf_room
|
||||
|
@ -282,7 +297,8 @@ static void
|
|||
create_conf_room(const m::event &,
|
||||
m::vm::eval &)
|
||||
{
|
||||
m::create(conf_room_id, m::me.user_id);
|
||||
const m::conf_room conf_room;
|
||||
m::create(conf_room.room_id, m::me.user_id);
|
||||
//rehash_conf({}, true);
|
||||
}
|
||||
|
||||
|
@ -301,6 +317,7 @@ void
|
|||
rehash_conf(const string_view &prefix,
|
||||
const bool &existing)
|
||||
{
|
||||
const m::conf_room conf_room;
|
||||
const m::room::state state
|
||||
{
|
||||
conf_room
|
||||
|
|
222
matrix/matrix.cc
222
matrix/matrix.cc
|
@ -10,7 +10,6 @@
|
|||
|
||||
namespace ircd::m
|
||||
{
|
||||
std::unique_ptr<self::init> _self;
|
||||
std::unique_ptr<dbs::init> _dbs;
|
||||
std::unique_ptr<init::modules> _modules;
|
||||
|
||||
|
@ -55,7 +54,9 @@ void
|
|||
ircd::m::on_load()
|
||||
try
|
||||
{
|
||||
_self = std::make_unique<self::init>();
|
||||
assert(ircd::run::level == run::level::START);
|
||||
m::self::init::keys();
|
||||
|
||||
_dbs = std::make_unique<dbs::init>(ircd::server_name, std::string{});
|
||||
_modules = std::make_unique<init::modules>();
|
||||
|
||||
|
@ -99,7 +100,6 @@ noexcept try
|
|||
|
||||
_modules.reset(nullptr);
|
||||
_dbs.reset(nullptr);
|
||||
_self.reset(nullptr);
|
||||
|
||||
//TODO: remove this for non-interfering shutdown
|
||||
server::interrupt_all();
|
||||
|
@ -326,183 +326,6 @@ ircd::m::module_names_optional
|
|||
"web_hook",
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// m/self.h
|
||||
//
|
||||
|
||||
std::string
|
||||
ircd::m::self::origin
|
||||
{};
|
||||
|
||||
std::string
|
||||
ircd::m::self::servername
|
||||
{};
|
||||
|
||||
ircd::ed25519::sk
|
||||
ircd::m::self::secret_key
|
||||
{};
|
||||
|
||||
ircd::ed25519::pk
|
||||
ircd::m::self::public_key
|
||||
{};
|
||||
|
||||
std::string
|
||||
ircd::m::self::public_key_b64
|
||||
{};
|
||||
|
||||
std::string
|
||||
ircd::m::self::public_key_id
|
||||
{};
|
||||
|
||||
std::string
|
||||
ircd::m::self::tls_cert_der
|
||||
{};
|
||||
|
||||
std::string
|
||||
ircd::m::self::tls_cert_der_sha256_b64
|
||||
{};
|
||||
|
||||
//
|
||||
// my user
|
||||
//
|
||||
|
||||
ircd::m::user::id::buf
|
||||
ircd_user_id
|
||||
{
|
||||
"ircd", "localhost" // gets replaced after conf init
|
||||
};
|
||||
|
||||
ircd::m::user
|
||||
ircd::m::me
|
||||
{
|
||||
ircd_user_id
|
||||
};
|
||||
|
||||
//
|
||||
// my room
|
||||
//
|
||||
|
||||
ircd::m::room::id::buf
|
||||
ircd_room_id
|
||||
{
|
||||
"ircd", "localhost" // replaced after conf init
|
||||
};
|
||||
|
||||
ircd::m::room
|
||||
ircd::m::my_room
|
||||
{
|
||||
ircd_room_id
|
||||
};
|
||||
|
||||
//
|
||||
// my node
|
||||
//
|
||||
|
||||
std::array<char, ircd::rfc3986::DOMAIN_BUFSIZE>
|
||||
ircd_node_id
|
||||
{
|
||||
"localhost" // replaced after conf init
|
||||
};
|
||||
|
||||
ircd::m::node
|
||||
ircd::m::my_node
|
||||
{
|
||||
ircd_node_id
|
||||
};
|
||||
|
||||
bool
|
||||
ircd::m::self::host(const string_view &other)
|
||||
{
|
||||
// port() is 0 when the origin has no port (and implies 8448)
|
||||
const auto port
|
||||
{
|
||||
net::port(hostport(origin))
|
||||
};
|
||||
|
||||
// If my_host has a port number, then the argument must also have the
|
||||
// same port number.
|
||||
if(port)
|
||||
return host() == other;
|
||||
|
||||
/// If my_host has no port number, then the argument can have port
|
||||
/// 8448 or no port number, which will initialize net::hostport.port to
|
||||
/// the "canon_port" of 8448.
|
||||
assert(net::canon_port == 8448);
|
||||
const net::hostport _other{other};
|
||||
if(net::port(_other) != net::canon_port)
|
||||
return false;
|
||||
|
||||
if(host() != host(_other))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
ircd::string_view
|
||||
ircd::m::self::host()
|
||||
{
|
||||
return m::self::origin;
|
||||
}
|
||||
|
||||
//
|
||||
// init
|
||||
//
|
||||
|
||||
//TODO: XXX
|
||||
extern ircd::m::room::id::buf users_room_id;
|
||||
extern ircd::m::room::id::buf tokens_room_id;
|
||||
|
||||
ircd::m::self::init::init()
|
||||
try
|
||||
{
|
||||
self::origin = string_view{ircd::network_name};
|
||||
self::servername = string_view{ircd::server_name};
|
||||
|
||||
// Sanity check that these are valid hostname strings. This was likely
|
||||
// already checked, so these validators will simply throw without very
|
||||
// useful error messages if invalid strings ever make it this far.
|
||||
rfc3986::valid_host(origin);
|
||||
rfc3986::valid_host(servername);
|
||||
|
||||
m::my_node = string_view{strlcpy
|
||||
{
|
||||
ircd_node_id, origin
|
||||
}};
|
||||
|
||||
ircd_user_id = {"ircd", origin};
|
||||
m::me = {ircd_user_id};
|
||||
|
||||
ircd_room_id = {"ircd", origin};
|
||||
m::my_room = {ircd_room_id};
|
||||
|
||||
tokens_room_id = {"tokens", origin};
|
||||
m::user::tokens = {tokens_room_id};
|
||||
|
||||
if(origin == "localhost")
|
||||
log::warning
|
||||
{
|
||||
"The origin is configured or has defaulted to 'localhost'"
|
||||
};
|
||||
|
||||
// Loading the keys module in runlevel::START will do further
|
||||
// inits of m::self::globals. Calling the inits directly from
|
||||
// here makes the module dependent on libircd and unloadable.
|
||||
assert(ircd::run::level == run::level::START);
|
||||
m::self::init::keys();
|
||||
}
|
||||
catch(const std::exception &e)
|
||||
{
|
||||
log::critical
|
||||
{
|
||||
m::log, "Failed to init self origin[%s] servername[%s]",
|
||||
origin,
|
||||
servername,
|
||||
};
|
||||
|
||||
throw;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// m/sync.h
|
||||
|
@ -1866,14 +1689,24 @@ const
|
|||
//
|
||||
|
||||
ircd::m::node::room::room(const string_view &node_id)
|
||||
:room{m::node{node_id}}
|
||||
{}
|
||||
:room
|
||||
{
|
||||
m::node{node_id}
|
||||
}
|
||||
{
|
||||
}
|
||||
|
||||
ircd::m::node::room::room(const m::node &node)
|
||||
:node{node}
|
||||
,room_id{node.room_id()}
|
||||
:node
|
||||
{
|
||||
static_cast<m::room &>(*this) = room_id;
|
||||
node
|
||||
}
|
||||
,room_id
|
||||
{
|
||||
node.room_id()
|
||||
}
|
||||
{
|
||||
this->m::room::room_id = this->room_id;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -2203,25 +2036,6 @@ ircd::m::membership(const event &event)
|
|||
// m/user.h
|
||||
//
|
||||
|
||||
/// ID of the room which stores ephemeral tokens (an instance of the room is
|
||||
/// provided below).
|
||||
ircd::m::room::id::buf
|
||||
tokens_room_id
|
||||
{
|
||||
"tokens", ircd::my_host()
|
||||
};
|
||||
|
||||
/// The tokens room serves as a key-value lookup for various tokens to
|
||||
/// users, etc. It primarily serves to store access tokens for users. This
|
||||
/// is a separate room from the users room because in the future it may
|
||||
/// have an optimized configuration as well as being more easily cleared.
|
||||
///
|
||||
ircd::m::room
|
||||
ircd::m::user::tokens
|
||||
{
|
||||
tokens_room_id
|
||||
};
|
||||
|
||||
bool
|
||||
ircd::m::exists(const user::id &user_id)
|
||||
{
|
||||
|
|
183
matrix/self.cc
Normal file
183
matrix/self.cc
Normal file
|
@ -0,0 +1,183 @@
|
|||
// Matrix Construct
|
||||
//
|
||||
// Copyright (C) Matrix Construct Developers, Authors & Contributors
|
||||
// Copyright (C) 2016-2018 Jason Volk <jason@zemos.net>
|
||||
//
|
||||
// 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.
|
||||
|
||||
std::string
|
||||
ircd::m::self::origin
|
||||
{
|
||||
ircd::string_view{ircd::network_name}
|
||||
};
|
||||
|
||||
std::string
|
||||
ircd::m::self::servername
|
||||
{
|
||||
ircd::string_view{ircd::server_name}
|
||||
};
|
||||
|
||||
ircd::ed25519::sk
|
||||
ircd::m::self::secret_key
|
||||
{};
|
||||
|
||||
ircd::ed25519::pk
|
||||
ircd::m::self::public_key
|
||||
{};
|
||||
|
||||
std::string
|
||||
ircd::m::self::public_key_b64
|
||||
{};
|
||||
|
||||
std::string
|
||||
ircd::m::self::public_key_id
|
||||
{};
|
||||
|
||||
std::string
|
||||
ircd::m::self::tls_cert_der
|
||||
{};
|
||||
|
||||
std::string
|
||||
ircd::m::self::tls_cert_der_sha256_b64
|
||||
{};
|
||||
|
||||
//
|
||||
// my user
|
||||
//
|
||||
|
||||
ircd::m::user::id::buf
|
||||
ircd_user_id
|
||||
{
|
||||
"ircd", ircd::my_host()
|
||||
};
|
||||
|
||||
ircd::m::user
|
||||
ircd::m::me
|
||||
{
|
||||
ircd_user_id
|
||||
};
|
||||
|
||||
//
|
||||
// my room
|
||||
//
|
||||
|
||||
ircd::m::room::id::buf
|
||||
ircd_room_id
|
||||
{
|
||||
"ircd", ircd::my_host()
|
||||
};
|
||||
|
||||
ircd::m::room
|
||||
ircd::m::my_room
|
||||
{
|
||||
ircd_room_id
|
||||
};
|
||||
|
||||
//
|
||||
// my node
|
||||
//
|
||||
|
||||
ircd::m::node
|
||||
ircd::m::my_node
|
||||
{
|
||||
ircd::my_host()
|
||||
};
|
||||
|
||||
bool
|
||||
ircd::m::self::host(const string_view &other)
|
||||
{
|
||||
// port() is 0 when the origin has no port (and implies 8448)
|
||||
const auto port
|
||||
{
|
||||
net::port(hostport(origin))
|
||||
};
|
||||
|
||||
// If my_host has a port number, then the argument must also have the
|
||||
// same port number.
|
||||
if(port)
|
||||
return host() == other;
|
||||
|
||||
/// If my_host has no port number, then the argument can have port
|
||||
/// 8448 or no port number, which will initialize net::hostport.port to
|
||||
/// the "canon_port" of 8448.
|
||||
assert(net::canon_port == 8448);
|
||||
const net::hostport _other{other};
|
||||
if(net::port(_other) != net::canon_port)
|
||||
return false;
|
||||
|
||||
if(host() != host(_other))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
ircd::string_view
|
||||
ircd::m::self::host()
|
||||
{
|
||||
return m::self::origin;
|
||||
}
|
||||
|
||||
//
|
||||
// init
|
||||
//
|
||||
|
||||
/// ID of the room which stores ephemeral tokens (an instance of the room is
|
||||
/// provided below).
|
||||
ircd::m::room::id::buf
|
||||
tokens_room_id
|
||||
{
|
||||
"tokens", ircd::my_host()
|
||||
};
|
||||
|
||||
/// The tokens room serves as a key-value lookup for various tokens to
|
||||
/// users, etc. It primarily serves to store access tokens for users. This
|
||||
/// is a separate room from the users room because in the future it may
|
||||
/// have an optimized configuration as well as being more easily cleared.
|
||||
///
|
||||
ircd::m::room
|
||||
ircd::m::user::tokens
|
||||
{
|
||||
tokens_room_id
|
||||
};
|
||||
|
||||
ircd::m::self::init::init()
|
||||
try
|
||||
{
|
||||
// Sanity check that these are valid hostname strings. This was likely
|
||||
// already checked, so these validators will simply throw without very
|
||||
// useful error messages if invalid strings ever make it this far.
|
||||
rfc3986::valid_host(origin);
|
||||
rfc3986::valid_host(servername);
|
||||
|
||||
ircd_user_id = {"ircd", origin};
|
||||
m::me = {ircd_user_id};
|
||||
|
||||
ircd_room_id = {"ircd", origin};
|
||||
m::my_room = {ircd_room_id};
|
||||
|
||||
if(origin == "localhost")
|
||||
log::warning
|
||||
{
|
||||
"The origin is configured or has defaulted to 'localhost'"
|
||||
};
|
||||
}
|
||||
catch(const std::exception &e)
|
||||
{
|
||||
log::critical
|
||||
{
|
||||
m::log, "Failed to init self origin[%s] servername[%s]",
|
||||
origin,
|
||||
servername,
|
||||
};
|
||||
|
||||
throw;
|
||||
}
|
||||
|
||||
static const auto self_init{[]
|
||||
{
|
||||
ircd::m::self::init();
|
||||
return true;
|
||||
}()};
|
Loading…
Reference in a new issue