0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-11-15 14:31:11 +01:00
construct/modules/widget/register.cc

114 lines
2.2 KiB
C++

// The Construct
//
// Copyright (C) The Construct Developers, Authors & Contributors
// Copyright (C) 2016-2020 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.
namespace ircd::m::widget
{
static resource::response handle_post(client &, const resource::request &);
extern resource::method register_post;
extern resource register_resource;
}
ircd::mapi::header
IRCD_MODULE
{
"Widget 1.0 :Register",
};
decltype(ircd::m::widget::register_resource)
ircd::m::widget::register_resource
{
"/_matrix/widget/rest/v1/register",
{
"(undocumented) register"
}
};
decltype(ircd::m::widget::register_post)
ircd::m::widget::register_post
{
register_resource, "POST", handle_post,
{
//register_post.REQUIRES_AUTH
}
};
ircd::m::resource::response
ircd::m::widget::handle_post(client &client,
const resource::request &request)
{
const string_view version
{
request.query["v"]
};
const json::string token_type
{
request["token_type"]
};
const json::string matrix_server_name
{
request["matrix_server_name"]
};
const json::string &access_token
{
request["access_token"]
};
const seconds expires_in
{
request.get("expires_in", seconds(0))
};
const bool can_verify
{
iequals(token_type, "Bearer")
&& my_host(matrix_server_name)
};
if(!can_verify)
throw m::error
{
http::UNAUTHORIZED, "M_MISSING_TOKEN",
"Credentials for this method are required but missing."
};
const m::room::id::buf tokens
{
"tokens", matrix_server_name
};
const event::idx event_idx
{
m::room(tokens).get(std::nothrow, "ircd.access_token", access_token)
};
if(!event_idx)
throw m::error
{
http::UNAUTHORIZED, "M_UNKNOWN_TOKEN",
"Credentials for this method are required but invalid."
};
m::user::id::buf user_id_buf;
const string_view user_id
{
m::get(std::nothrow, event_idx, "sender", user_id_buf)
};
return resource::response
{
client, http::OK, json::members
{
{ "scalar_token", access_token }
}
};
}