2018-02-04 03:22:01 +01:00
|
|
|
// 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.
|
2017-08-23 23:10:28 +02:00
|
|
|
|
2017-08-18 20:19:13 +02:00
|
|
|
#pragma once
|
2017-09-25 03:05:42 +02:00
|
|
|
#define HAVE_IRCD_M_USER_H
|
2017-08-23 23:10:28 +02:00
|
|
|
|
2017-09-25 03:05:42 +02:00
|
|
|
namespace ircd::m
|
|
|
|
{
|
|
|
|
struct user;
|
2018-02-15 22:11:51 +01:00
|
|
|
|
2018-02-25 09:19:03 +01:00
|
|
|
bool my(const user &);
|
2018-03-09 18:00:28 +01:00
|
|
|
bool exists(const user &);
|
2018-02-15 22:11:51 +01:00
|
|
|
bool exists(const id::user &);
|
2018-03-09 18:00:28 +01:00
|
|
|
user create(const id::user &, const json::members &args = {});
|
2017-09-25 03:05:42 +02:00
|
|
|
}
|
2017-08-18 20:19:13 +02:00
|
|
|
|
2017-09-25 03:05:42 +02:00
|
|
|
struct ircd::m::user
|
2017-08-23 23:10:28 +02:00
|
|
|
{
|
2018-02-15 22:08:10 +01:00
|
|
|
struct room;
|
2018-04-12 00:28:00 +02:00
|
|
|
struct rooms;
|
2018-04-12 01:12:26 +02:00
|
|
|
struct mitsein;
|
2018-08-24 22:56:52 +02:00
|
|
|
struct events;
|
2019-02-21 19:45:37 +01:00
|
|
|
struct profile;
|
2019-02-21 20:53:59 +01:00
|
|
|
struct account_data;
|
|
|
|
struct room_account_data;
|
2019-03-06 02:10:22 +01:00
|
|
|
struct room_tags;
|
2019-03-03 01:45:13 +01:00
|
|
|
struct filter;
|
2019-02-21 20:53:59 +01:00
|
|
|
|
2017-09-25 03:05:42 +02:00
|
|
|
using id = m::id::user;
|
2018-04-12 00:04:04 +02:00
|
|
|
using closure = std::function<void (const user &)>;
|
|
|
|
using closure_bool = std::function<bool (const user &)>;
|
2017-09-25 03:05:42 +02:00
|
|
|
|
2018-04-20 06:45:39 +02:00
|
|
|
static m::room users;
|
|
|
|
static m::room tokens;
|
|
|
|
|
2017-09-25 03:05:42 +02:00
|
|
|
id user_id;
|
2017-09-08 11:32:49 +02:00
|
|
|
|
2018-03-06 08:39:44 +01:00
|
|
|
operator const id &() const;
|
2017-08-18 20:19:13 +02:00
|
|
|
|
2018-02-15 22:05:00 +01:00
|
|
|
static string_view gen_access_token(const mutable_buffer &out);
|
2019-02-21 03:58:49 +01:00
|
|
|
static id::device::buf get_device_from_access_token(const string_view &token);
|
2018-02-15 22:05:00 +01:00
|
|
|
|
2018-02-15 22:08:10 +01:00
|
|
|
id::room room_id(const mutable_buffer &) const;
|
|
|
|
id::room::buf room_id() const;
|
|
|
|
|
2018-02-20 04:38:09 +01:00
|
|
|
bool is_password(const string_view &password) const noexcept;
|
2018-03-05 13:00:17 +01:00
|
|
|
event::id::buf password(const string_view &password);
|
2018-03-05 12:42:41 +01:00
|
|
|
|
|
|
|
bool is_active() const;
|
2018-03-09 18:00:28 +01:00
|
|
|
event::id::buf deactivate();
|
|
|
|
event::id::buf activate();
|
2017-09-25 05:47:13 +02:00
|
|
|
|
|
|
|
user(const id &user_id)
|
|
|
|
:user_id{user_id}
|
|
|
|
{}
|
2018-02-15 21:11:28 +01:00
|
|
|
|
|
|
|
user() = default;
|
2017-09-25 05:47:13 +02:00
|
|
|
};
|
2018-02-15 22:08:10 +01:00
|
|
|
|
|
|
|
struct ircd::m::user::room
|
|
|
|
:m::room
|
|
|
|
{
|
|
|
|
m::user user;
|
|
|
|
id::room::buf room_id;
|
|
|
|
|
2019-01-08 23:49:42 +01:00
|
|
|
explicit
|
2018-05-24 01:44:16 +02:00
|
|
|
room(const m::user &user,
|
|
|
|
const vm::copts *const & = nullptr,
|
|
|
|
const event::fetch::opts *const & = nullptr);
|
|
|
|
|
|
|
|
room(const m::user::id &user_id,
|
|
|
|
const vm::copts *const & = nullptr,
|
|
|
|
const event::fetch::opts *const & = nullptr);
|
|
|
|
|
2018-02-15 22:08:10 +01:00
|
|
|
room() = default;
|
|
|
|
room(const room &) = delete;
|
|
|
|
room &operator=(const room &) = delete;
|
|
|
|
};
|
2018-03-06 08:39:44 +01:00
|
|
|
|
2018-04-12 00:28:00 +02:00
|
|
|
/// Interface to the rooms for a user.
|
|
|
|
struct ircd::m::user::rooms
|
|
|
|
{
|
2018-04-24 04:39:50 +02:00
|
|
|
struct origins;
|
|
|
|
|
2018-04-12 00:28:00 +02:00
|
|
|
using closure = std::function<void (const m::room &, const string_view &)>;
|
|
|
|
using closure_bool = std::function<bool (const m::room &, const string_view &)>;
|
|
|
|
|
|
|
|
m::user::room user_room;
|
|
|
|
|
|
|
|
public:
|
|
|
|
// All rooms with specific membership
|
2018-08-24 22:55:33 +02:00
|
|
|
bool for_each(const string_view &membership, const closure_bool &) const;
|
2018-04-12 00:28:00 +02:00
|
|
|
void for_each(const string_view &membership, const closure &) const;
|
|
|
|
|
|
|
|
// All rooms with any membership
|
2018-08-24 22:55:33 +02:00
|
|
|
bool for_each(const closure_bool &) const;
|
2018-04-12 00:28:00 +02:00
|
|
|
void for_each(const closure &) const;
|
|
|
|
|
2018-04-12 00:47:51 +02:00
|
|
|
size_t count(const string_view &membership) const;
|
|
|
|
size_t count() const;
|
|
|
|
|
2018-04-12 00:28:00 +02:00
|
|
|
rooms(const m::user &user);
|
|
|
|
};
|
|
|
|
|
2018-04-24 04:39:50 +02:00
|
|
|
/// Interface to the other servers visible to a user from all their rooms
|
|
|
|
struct ircd::m::user::rooms::origins
|
|
|
|
{
|
|
|
|
using closure = m::room::origins::closure;
|
|
|
|
using closure_bool = m::room::origins::closure_bool;
|
|
|
|
|
|
|
|
m::user user;
|
|
|
|
|
|
|
|
public:
|
2018-08-24 22:55:33 +02:00
|
|
|
bool for_each(const string_view &membership, const closure_bool &) const;
|
2018-04-24 04:39:50 +02:00
|
|
|
void for_each(const string_view &membership, const closure &) const;
|
2018-08-24 22:55:33 +02:00
|
|
|
bool for_each(const closure_bool &) const;
|
2018-04-24 04:39:50 +02:00
|
|
|
void for_each(const closure &) const;
|
|
|
|
|
|
|
|
origins(const m::user &user);
|
|
|
|
};
|
|
|
|
|
2018-04-12 01:12:26 +02:00
|
|
|
/// Interface to the other users visible to a user from common rooms.
|
|
|
|
struct ircd::m::user::mitsein
|
|
|
|
{
|
|
|
|
m::user user;
|
|
|
|
|
|
|
|
public:
|
|
|
|
// All common rooms with user
|
2018-08-24 22:55:33 +02:00
|
|
|
bool for_each(const m::user &, const string_view &membership, const rooms::closure_bool &) const;
|
2018-04-12 01:12:26 +02:00
|
|
|
void for_each(const m::user &, const string_view &membership, const rooms::closure &) const;
|
2018-08-24 22:55:33 +02:00
|
|
|
bool for_each(const m::user &, const rooms::closure_bool &) const;
|
2018-04-12 01:12:26 +02:00
|
|
|
void for_each(const m::user &, const rooms::closure &) const;
|
|
|
|
|
|
|
|
// All common users in all rooms
|
2018-08-24 22:55:33 +02:00
|
|
|
bool for_each(const string_view &membership, const closure_bool &) const;
|
2018-04-12 01:12:26 +02:00
|
|
|
void for_each(const string_view &membership, const closure &) const;
|
2018-08-24 22:55:33 +02:00
|
|
|
bool for_each(const closure_bool &) const;
|
2018-04-12 01:12:26 +02:00
|
|
|
void for_each(const closure &) const;
|
|
|
|
|
2019-01-04 23:47:46 +01:00
|
|
|
// Counting convenience
|
2018-05-08 09:44:23 +02:00
|
|
|
size_t count(const m::user &, const string_view &membership = {}) const;
|
|
|
|
size_t count(const string_view &membership = {}) const;
|
|
|
|
|
2019-01-04 23:47:46 +01:00
|
|
|
// Existential convenience (does `user` and `other` share any common room).
|
|
|
|
bool has(const m::user &other, const string_view &membership = {}) const;
|
|
|
|
|
2018-04-12 01:12:26 +02:00
|
|
|
mitsein(const m::user &user);
|
|
|
|
};
|
|
|
|
|
2018-08-24 22:56:52 +02:00
|
|
|
/// Interface to all events from a user (sender)
|
|
|
|
struct ircd::m::user::events
|
|
|
|
{
|
|
|
|
using idx_closure_bool = std::function<bool (const event::idx &)>;
|
|
|
|
using closure_bool = std::function<bool (const event &)>;
|
|
|
|
|
|
|
|
m::user user;
|
|
|
|
|
|
|
|
public:
|
|
|
|
bool for_each(const idx_closure_bool &) const;
|
|
|
|
bool for_each(const closure_bool &) const;
|
|
|
|
size_t count() const;
|
|
|
|
|
|
|
|
events(const m::user &user);
|
|
|
|
};
|
|
|
|
|
2019-02-21 19:45:37 +01:00
|
|
|
/// Interface to the user profile
|
|
|
|
struct ircd::m::user::profile
|
|
|
|
{
|
|
|
|
using closure_bool = std::function<bool (const string_view &, const string_view &)>;
|
|
|
|
using closure = std::function<void (const string_view &, const string_view &)>;
|
|
|
|
|
|
|
|
m::user user;
|
|
|
|
|
2019-03-06 05:50:32 +01:00
|
|
|
static void fetch(const m::user &, const net::hostport &, const string_view &key = {});
|
2019-02-21 19:45:37 +01:00
|
|
|
static bool for_each(const m::user &, const closure_bool &);
|
|
|
|
static bool get(std::nothrow_t, const m::user &, const string_view &key, const closure &);
|
|
|
|
static event::id::buf set(const m::user &, const string_view &key, const string_view &value);
|
|
|
|
|
|
|
|
public:
|
|
|
|
bool for_each(const closure_bool &) const;
|
|
|
|
bool get(std::nothrow_t, const string_view &key, const closure &) const;
|
|
|
|
void get(const string_view &key, const closure &) const;
|
|
|
|
string_view get(const mutable_buffer &out, const string_view &key) const; // nothrow
|
|
|
|
event::id::buf set(const string_view &key, const string_view &val) const;
|
|
|
|
|
|
|
|
profile(const m::user &user)
|
|
|
|
:user{user}
|
|
|
|
{}
|
|
|
|
};
|
|
|
|
|
2019-02-21 20:53:59 +01:00
|
|
|
struct ircd::m::user::account_data
|
|
|
|
{
|
|
|
|
using closure_bool = std::function<bool (const string_view &key, const json::object &)>;
|
|
|
|
using closure = std::function<void (const string_view &key, const json::object &)>;
|
|
|
|
|
|
|
|
m::user user;
|
|
|
|
|
|
|
|
static bool for_each(const m::user &, const closure_bool &);
|
|
|
|
static bool get(std::nothrow_t, const m::user &, const string_view &type, const closure &);
|
|
|
|
static event::id::buf set(const m::user &, const string_view &type, const json::object &value);
|
|
|
|
|
|
|
|
public:
|
|
|
|
bool for_each(const closure_bool &) const;
|
|
|
|
bool get(std::nothrow_t, const string_view &type, const closure &) const;
|
|
|
|
void get(const string_view &type, const closure &) const;
|
|
|
|
json::object get(const mutable_buffer &out, const string_view &type) const; //nothrow
|
|
|
|
event::id::buf set(const string_view &type, const json::object &value) const;
|
|
|
|
|
|
|
|
account_data(const m::user &user)
|
|
|
|
:user{user}
|
|
|
|
{}
|
|
|
|
};
|
|
|
|
|
|
|
|
struct ircd::m::user::room_account_data
|
|
|
|
{
|
|
|
|
using closure_bool = std::function<bool (const string_view &key, const json::object &)>;
|
|
|
|
using closure = std::function<void (const string_view &key, const json::object &)>;
|
|
|
|
|
2019-03-01 21:57:04 +01:00
|
|
|
static constexpr const string_view &type_prefix
|
|
|
|
{
|
|
|
|
"ircd.account_data"
|
|
|
|
};
|
|
|
|
|
|
|
|
static constexpr const size_t &typebuf_size
|
|
|
|
{
|
|
|
|
m::room::id::MAX_SIZE + size(type_prefix)
|
|
|
|
};
|
|
|
|
|
2019-02-21 20:53:59 +01:00
|
|
|
m::user user;
|
|
|
|
m::room room;
|
|
|
|
|
|
|
|
static string_view _type(const mutable_buffer &out, const m::room::id &);
|
|
|
|
static bool for_each(const m::user &, const m::room &, const closure_bool &);
|
|
|
|
static bool get(std::nothrow_t, const m::user &, const m::room &, const string_view &type, const closure &);
|
|
|
|
static event::id::buf set(const m::user &, const m::room &, const string_view &type, const json::object &value);
|
|
|
|
|
|
|
|
public:
|
|
|
|
bool for_each(const closure_bool &) const;
|
|
|
|
bool get(std::nothrow_t, const string_view &type, const closure &) const;
|
|
|
|
void get(const string_view &type, const closure &) const;
|
|
|
|
json::object get(const mutable_buffer &out, const string_view &type) const; //nothrow
|
|
|
|
event::id::buf set(const string_view &type, const json::object &value) const;
|
|
|
|
|
|
|
|
room_account_data(const m::user &user, const m::room &room)
|
|
|
|
:user{user}
|
|
|
|
,room{room}
|
|
|
|
{}
|
2019-03-06 02:10:22 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
struct ircd::m::user::room_tags
|
|
|
|
{
|
|
|
|
using closure_bool = std::function<bool (const string_view &key, const json::object &)>;
|
|
|
|
using closure = std::function<void (const string_view &key, const json::object &)>;
|
|
|
|
|
|
|
|
static constexpr const string_view &type_prefix
|
|
|
|
{
|
|
|
|
"ircd.room_tag"
|
|
|
|
};
|
|
|
|
|
|
|
|
static constexpr const size_t &typebuf_size
|
|
|
|
{
|
|
|
|
m::room::id::MAX_SIZE + size(type_prefix)
|
|
|
|
};
|
|
|
|
|
|
|
|
m::user user;
|
|
|
|
m::room room;
|
|
|
|
|
|
|
|
static string_view _type(const mutable_buffer &out, const m::room::id &);
|
|
|
|
static bool for_each(const m::user &, const m::room &, const closure_bool &);
|
|
|
|
static bool get(std::nothrow_t, const m::user &, const m::room &, const string_view &type, const closure &);
|
|
|
|
static event::id::buf set(const m::user &, const m::room &, const string_view &type, const json::object &value);
|
|
|
|
static bool del(const m::user &, const m::room &, const string_view &type);
|
|
|
|
|
|
|
|
public:
|
|
|
|
bool for_each(const closure_bool &) const;
|
|
|
|
bool get(std::nothrow_t, const string_view &type, const closure &) const;
|
|
|
|
void get(const string_view &type, const closure &) const;
|
|
|
|
json::object get(const mutable_buffer &out, const string_view &type) const; //nothrow
|
|
|
|
event::id::buf set(const string_view &type, const json::object &value) const;
|
|
|
|
bool del(const string_view &type) const;
|
|
|
|
|
|
|
|
room_tags(const m::user &user, const m::room &room)
|
|
|
|
:user{user}
|
|
|
|
,room{room}
|
|
|
|
{}
|
2019-02-21 20:53:59 +01:00
|
|
|
};
|
|
|
|
|
2019-03-03 01:45:13 +01:00
|
|
|
struct ircd::m::user::filter
|
|
|
|
{
|
|
|
|
using closure_bool = std::function<bool (const string_view &, const json::object &)>;
|
|
|
|
using closure = std::function<void (const string_view &, const json::object &)>;
|
|
|
|
|
|
|
|
m::user user;
|
|
|
|
|
|
|
|
static bool for_each(const m::user &, const closure_bool &);
|
|
|
|
static bool get(std::nothrow_t, const m::user &, const string_view &id, const closure &);
|
|
|
|
static string_view set(const mutable_buffer &idbuf, const m::user &, const json::object &);
|
|
|
|
|
|
|
|
public:
|
|
|
|
bool for_each(const closure_bool &) const;
|
|
|
|
bool get(std::nothrow_t, const string_view &filter_id, const closure &) const;
|
|
|
|
void get(const string_view &id, const closure &) const;
|
|
|
|
json::object get(const mutable_buffer &out, const string_view &id) const; // nothrow
|
|
|
|
std::string get(const string_view &id) const; // nothrow
|
|
|
|
string_view set(const mutable_buffer &idbuf, const json::object &filter) const;
|
|
|
|
|
|
|
|
filter(const m::user &user)
|
|
|
|
:user{user}
|
|
|
|
{}
|
|
|
|
};
|
|
|
|
|
2018-03-06 08:39:44 +01:00
|
|
|
inline ircd::m::user::operator
|
|
|
|
const ircd::m::user::id &()
|
|
|
|
const
|
|
|
|
{
|
|
|
|
return user_id;
|
|
|
|
}
|