0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-11-25 08:12:37 +01:00

ircd:Ⓜ️ Abort the experimental id::node.

This commit is contained in:
Jason Volk 2019-05-26 17:44:12 -07:00
parent 44cf572ee5
commit eec6c40653
13 changed files with 103 additions and 177 deletions

View file

@ -45,7 +45,6 @@ struct ircd::m::id
struct room;
struct room_alias;
struct group;
struct node;
struct device;
enum sigil :char;
@ -119,7 +118,6 @@ enum ircd::m::id::sigil
ROOM_ALIAS = '#', ///< Room alias (4.2.3)
GROUP = '+', ///< Group ID (experimental)
DEVICE = '%', ///< Device ID (experimental)
NODE = ':', ///< Node ID (experimental)
};
/// (Appendix 4.2.1) User Identifiers
@ -246,30 +244,6 @@ struct ircd::m::id::device
device() = default;
};
/// Node ID (EXPERIMENTAL)
///
struct ircd::m::id::node
:ircd::m::id
{
using buf = m::id::buf<node>;
IRCD_OVERLOAD(domain)
node(const mutable_buffer &mb, domain_t, const string_view &domain_, const string_view &origin_)
:m::id{NODE, mb, domain_, origin_}
{}
IRCD_OVERLOAD(origin)
node(const mutable_buffer &mb, origin_t, const string_view &origin_)
:m::id{NODE, mb, string_view{}, origin_}
{}
node(const string_view &id)
:m::id{NODE, id}
{}
node() = default;
};
/// ID object backed by an internal buffer of default worst-case size.
///
template<class T>

View file

@ -18,8 +18,8 @@ namespace ircd::m
extern room nodes;
bool my(const node &);
bool exists(const id::node &);
node create(const id::node &, const json::members &args = {});
bool exists(const node &);
node create(const node &, const json::members &args = {});
}
/// A node is an entity (lay: a server) participating in the matrix system. The
@ -37,13 +37,10 @@ namespace ircd::m
struct ircd::m::node
{
struct room;
using id = m::id::node;
using key_closure = std::function<void (const string_view &)>; // remember to unquote()!!!
using ed25519_closure = std::function<void (const ed25519::pk &)>;
id node_id;
operator const id &() const;
string_view node_id;
id::room room_id(const mutable_buffer &) const;
id::room::buf room_id() const;
@ -51,9 +48,11 @@ struct ircd::m::node
void key(const string_view &key_id, const ed25519_closure &) const;
void key(const string_view &key_id, const key_closure &) const;
node(const id &node_id)
node(const string_view &node_id)
:node_id{node_id}
{}
{
rfc3986::valid_remote(node_id);
}
node() = default;
};
@ -68,15 +67,8 @@ struct ircd::m::node::room
id::room::buf room_id;
room(const m::node &node);
room(const m::node::id &node_id);
room(const string_view &node_id);
room() = default;
room(const room &) = delete;
room &operator=(const room &) = delete;
};
inline ircd::m::node::operator
const ircd::m::node::id &()
const
{
return node_id;
}

View file

@ -26,7 +26,7 @@ struct ircd::m::v1::groups::publicised
return json::object{in.content};
}
publicised(const id::node &, const vector_view<const id::user> &, const mutable_buffer &, opts);
publicised(const string_view &, const vector_view<const id::user> &, const mutable_buffer &, opts);
publicised() = default;
};

View file

@ -335,10 +335,10 @@ ircd::m::my_room
// my node
//
ircd::m::node::id::buf
std::array<char, ircd::rfc3986::DOMAIN_BUFSIZE>
ircd_node_id
{
ircd::m::node::id::origin, "localhost" // replaced after conf init
"localhost" // replaced after conf init
};
ircd::m::node
@ -402,15 +402,17 @@ ircd::m::self::init::init(const string_view &origin,
self::origin = origin;
self::servername = 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};
ircd_node_id = {node::id::origin, origin};
m::my_node = {ircd_node_id};
users_room_id = {"users", origin};
m::user::users = {users_room_id};
@ -2270,37 +2272,36 @@ ircd::m::nodes
};
ircd::m::node
ircd::m::create(const id::node &node_id,
ircd::m::create(const node &node,
const json::members &args)
{
using prototype = node (const id::node &, const json::members &);
using prototype = m::node (const m::node &, const json::members &);
static mods::import<prototype> function
{
"s_node", "create_node"
};
assert(node_id);
return function(node_id, args);
return function(node, args);
}
bool
ircd::m::exists(const node::id &node_id)
ircd::m::exists(const node &node)
{
using prototype = bool (const node::id &);
using prototype = bool (const string_view &);
static mods::import<prototype> function
{
"s_node", "exists__nodeid"
};
return function(node_id);
return function(node.node_id);
}
bool
ircd::m::my(const node &node)
{
return my(node.node_id);
return my_host(node.node_id);
}
//
@ -2332,12 +2333,7 @@ ircd::m::node::key(const string_view &key_id,
const key_closure &closure)
const
{
const auto &server_name
{
node_id.hostname()
};
m::keys::get(server_name, key_id, [&closure, &key_id]
m::keys::get(node_id, key_id, [&closure, &key_id]
(const json::object &keys)
{
const json::object &vks
@ -2376,16 +2372,32 @@ ircd::m::id::room
ircd::m::node::room_id(const mutable_buffer &buf)
const
{
assert(!empty(node_id));
assert(!empty(this->node_id));
// for compatibility with hashing legacy node_id's
thread_local char node_id_buf[m::id::MAX_SIZE];
mutable_buffer mb{node_id_buf};
consume(mb, copy(mb, "::"_sv));
consume(mb, copy(mb, this->node_id));
const string_view &node_id
{
node_id_buf, data(mb)
};
const sha256::buf hash
{
sha256{node_id}
};
char b58[size(hash) * 2];
return
thread_local char b58_buf[b58encode_size(size(hash))];
const string_view b58
{
buf, b58encode(b58, hash), my_host()
b58encode(b58_buf, hash)
};
return id::room
{
buf, b58, my_host()
};
}
@ -2393,7 +2405,7 @@ const
// node::room
//
ircd::m::node::room::room(const m::node::id &node_id)
ircd::m::node::room::room(const string_view &node_id)
:room{m::node{node_id}}
{}
@ -4690,14 +4702,14 @@ const
}
};
const m::node::id::buf node_id
const json::string &origin
{
m::node::id::origin, unquote(at<"origin"_>(*this))
at<"origin"_>(*this)
};
const m::node node
{
node_id
origin
};
bool verified{false};

View file

@ -3389,14 +3389,9 @@ ircd::m::verify(const event &event,
const string_view &keyid)
try
{
const m::node::id::buf node_id
{
m::node::id::origin, origin
};
const m::node node
{
node_id
origin
};
bool ret{false};

View file

@ -28,7 +28,6 @@ struct ircd::m::id::input
const rule<id::sigil> room_id_sigil { lit(char(id::ROOM)) ,"room_id sigil" };
const rule<id::sigil> room_alias_sigil { lit(char(id::ROOM_ALIAS)) ,"room_alias sigil" };
const rule<id::sigil> group_id_sigil { lit(char(id::GROUP)) ,"group_id sigil" };
const rule<id::sigil> node_sigil { lit(char(id::NODE)) ,"node sigil" };
const rule<id::sigil> device_sigil { lit(char(id::DEVICE)) ,"device sigil" };
const rule<id::sigil> sigil
{
@ -37,7 +36,6 @@ struct ircd::m::id::input
room_id_sigil |
room_alias_sigil |
group_id_sigil |
node_sigil |
device_sigil
,"sigil"
};
@ -756,7 +754,6 @@ ircd::m::reflect(const id::sigil &c)
case id::ROOM: return "ROOM"_sv;
case id::ROOM_ALIAS: return "ROOM_ALIAS"_sv;
case id::GROUP: return "GROUP"_sv;
case id::NODE: return "NODE"_sv;
case id::DEVICE: return "DEVICE"_sv;
}

View file

@ -13,20 +13,20 @@
// v1/groups.h
//
ircd::m::v1::groups::publicised::publicised(const id::node &node,
ircd::m::v1::groups::publicised::publicised(const string_view &node,
const vector_view<const id::user> &user_ids,
const mutable_buffer &buf_,
opts opts)
:server::request{[&]
{
if(!opts.remote)
opts.remote = node.host();
opts.remote = node;
if(!defined(json::get<"origin"_>(opts.request)))
json::get<"origin"_>(opts.request) = my_host();
if(!defined(json::get<"destination"_>(opts.request)))
json::get<"destination"_>(opts.request) = node.host();
json::get<"destination"_>(opts.request) = node;
if(!defined(json::get<"uri"_>(opts.request)))
json::get<"uri"_>(opts.request) = "/_matrix/federation/v1/get_groups_publicised";

View file

@ -351,7 +351,6 @@ console_cmd__time(opt &out, const string_view &line)
int console_command_numeric(opt &, const string_view &line);
bool console_id__user(opt &, const m::user::id &id, const string_view &line);
bool console_id__node(opt &, const m::node::id &id, const string_view &line);
bool console_id__room(opt &, const m::room::id &id, const string_view &line);
bool console_id__event(opt &, const m::event::id &id, const string_view &line);
bool console_json(const json::object &);
@ -378,9 +377,6 @@ console_command_derived(opt &out, const string_view &line)
case m::id::ROOM:
return console_id__room(out, id, line);
case m::id::NODE:
return console_id__node(out, id, line);
case m::id::USER:
return console_id__user(out, id, line);
@ -9481,18 +9477,19 @@ console_cmd__room__id(opt &out, const string_view &id)
{
case m::id::USER:
out << m::user{id}.room_id() << std::endl;
break;
case m::id::NODE:
out << m::node{id}.room_id() << std::endl;
break;
return true;
case m::id::ROOM_ALIAS:
out << m::room_id(m::room::alias(id)) << std::endl;
break;
return true;
default:
break;
return true;
}
else if(rfc3986::valid_remote(std::nothrow, id))
{
out << m::node{id}.room_id() << std::endl;
return true;
}
return true;
@ -10651,15 +10648,6 @@ console_cmd__typing(opt &out, const string_view &line)
// node
//
//TODO: XXX
bool
console_id__node(opt &out,
const m::node::id &id,
const string_view &args)
{
return true;
}
bool
console_cmd__node__keys(opt &out, const string_view &line)
{
@ -10668,14 +10656,9 @@ console_cmd__node__keys(opt &out, const string_view &line)
"node_id", "[limit]"
}};
const m::node::id::buf node_id
{
m::node::id::origin, param.at(0)
};
const m::node &node
{
node_id
param.at("node_id")
};
auto limit
@ -10708,14 +10691,9 @@ console_cmd__node__key(opt &out, const string_view &line)
"node_id", "key_id"
}};
const m::node::id::buf node_id
{
m::node::id::origin, param.at(0)
};
const m::node &node
{
node_id
param.at("node_id")
};
const auto &key_id
@ -11279,7 +11257,7 @@ console_cmd__feds__resend(opt &out, const string_view &line)
bool
console_cmd__fed__groups(opt &out, const string_view &line)
{
const m::id::node &node
const string_view node
{
token(line, ' ', 0)
};

View file

@ -245,7 +245,7 @@ try
}
m::v1::send::opts opts;
opts.remote = origin();
opts.remote = remote;
opts.sopts = &sopts;
const vector_view<const json::value> pduv
@ -274,7 +274,7 @@ catch(const std::exception &e)
{
log::error
{
"flush error to %s :%s", string_view{id}, e.what()
"flush error to %s :%s", remote, e.what()
};
err = true;
@ -372,7 +372,7 @@ try
"%u %s from %s for %s",
ushort(code),
http::status(code),
string_view{node.id},
node.remote,
txn.txnid
};
@ -385,7 +385,7 @@ try
log::derror
{
"Error from %s in %s for %s :%s",
string_view{node.id},
node.remote,
txn.txnid,
string_view{event_id},
string_view{error}
@ -401,7 +401,7 @@ catch(const http::error &e)
"%u %s from %s for %s :%s",
ushort(e.code),
http::status(e.code),
string_view{node.id},
node.remote,
txn.txnid,
e.what()
};
@ -414,7 +414,7 @@ catch(const std::exception &e)
log::derror
{
"Error from %s for %s :%s",
string_view{node.id},
node.remote,
txn.txnid,
e.what()
};
@ -451,7 +451,7 @@ recv_timeout(txn &txn,
log::dwarning
{
"Timeout to %s for txn %s",
string_view{node.id},
node.remote,
txn.txnid
};
@ -464,7 +464,7 @@ remove_node(const node &node)
{
const auto it
{
nodes.find(node.origin())
nodes.find(node.remote)
};
assert(it != end(nodes));

View file

@ -74,23 +74,19 @@ struct txndata
struct node
{
std::deque<std::shared_ptr<unit>> q;
m::node::id::buf id;
std::array<char, rfc3986::DOMAIN_BUFSIZE> rembuf;
string_view remote;
m::node::room room;
server::request::opts sopts;
txn *curtxn {nullptr};
bool err {false};
string_view origin() const
{
return id.host();
};
bool flush();
void push(std::shared_ptr<unit>);
node(const string_view &origin)
:id{m::node::id::origin, origin}
,room{id}
node(const string_view &remote)
:remote{strlcpy{rembuf, remote}}
,room{this->remote}
{}
};

View file

@ -17,10 +17,10 @@ IRCD_MODULE
};
static bool
_visible_(const m::event &event,
const m::user::id &user_id,
const m::room &room,
const string_view &history_visibility)
_visible_to_user(const m::event &event,
const m::user::id &user_id,
const m::room &room,
const string_view &history_visibility)
{
char membership_buf[m::MEMBERSHIP_MAX_SIZE];
string_view membership
@ -54,10 +54,10 @@ _visible_(const m::event &event,
}
static bool
_visible_(const m::event &event,
const m::node::id &node_id,
const m::room &room,
const string_view &history_visibility)
_visible_to_node(const m::event &event,
const string_view &node_id,
const m::room &room,
const string_view &history_visibility)
{
const m::room::origins origins
{
@ -65,7 +65,7 @@ _visible_(const m::event &event,
};
// Allow joined servers
if(origins.has(node_id.host()))
if(origins.has(node_id))
return true;
// Allow auth chain events XXX: this is too broad
@ -75,7 +75,7 @@ _visible_(const m::event &event,
// Allow any event where the state_key string is a user mxid and the server
// is the host of that user. Note that applies to any type of event.
if(m::valid(m::id::USER, json::get<"state_key"_>(event)))
if(m::user::id(at<"state_key"_>(event)).host() == node_id.host())
if(m::user::id(at<"state_key"_>(event)).host() == node_id)
return true;
return false;
@ -93,20 +93,16 @@ _visible(const m::event &event,
if(empty(mxid))
return false;
switch(m::sigil(mxid))
if(m::valid(m::id::USER, mxid))
return _visible_to_user(event, mxid, room, history_visibility);
if(rfc3986::valid_remote(std::nothrow, mxid))
return _visible_to_node(event, mxid, room, history_visibility);
throw m::UNSUPPORTED
{
case m::id::USER:
return _visible_(event, m::user::id{mxid}, room, history_visibility);
case m::id::NODE:
return _visible_(event, m::node::id{mxid}, room, history_visibility);
default: throw m::UNSUPPORTED
{
"Cannot determine visibility for '%s' mxids",
reflect(m::sigil(mxid))
};
}
"Cannot determine visibility for '%s'", mxid
};
}
bool

View file

@ -639,19 +639,14 @@ ircd::m::create_my_key()
size_t
ircd::m::keys_cache_set(const json::object &keys)
{
const auto &server_name
const json::string &server_name
{
unquote(keys.at("server_name"))
};
const m::node::id::buf node_id
{
m::node::id::origin, server_name
keys.at("server_name")
};
const m::node::room node_room
{
node_id
server_name
};
if(!exists(node_room.room_id))
@ -681,14 +676,9 @@ ircd::m::keys_cache_get(const string_view &server_name,
const string_view &key_id,
const keys::closure &closure)
{
const m::node::id::buf node_id
{
m::node::id::origin, server_name
};
const m::node::room node_room
{
node_id
server_name
};
const auto reclosure{[&closure]

View file

@ -23,14 +23,10 @@ nodes_room
};
extern "C" m::node
create_node(const m::node::id &node_id,
create_node(const m::node &node,
const json::members &args)
{
const m::node node
{
node_id
};
assert(node.node_id);
const m::room::id::buf room_id
{
node.room_id()
@ -38,12 +34,12 @@ create_node(const m::node::id &node_id,
//TODO: ABA
create(room_id, m::me.user_id);
send(nodes_room, m::me.user_id, "ircd.node", node_id, args);
send(nodes_room, m::me.user_id, "ircd.node", node.node_id, args);
return node;
}
extern "C" bool
exists__nodeid(const m::node::id &node_id)
exists__nodeid(const string_view &node_id)
{
return nodes_room.has("ircd.node", node_id);
}