ruma-identity-service-api: Refactor file structure and add docs

This commit is contained in:
Jonathan de Jong 2022-02-13 17:16:11 +01:00 committed by Jonas Platte
parent 5768f181ca
commit f0aad6cbe5
45 changed files with 1422 additions and 1310 deletions

View File

@ -1,3 +1,83 @@
//! `POST /_matrix/identity/*/3pid/bind`
//!
//! Endpoint to bind a session to a Matrix user ID.
pub mod v2;
pub mod v2 {
//! `/v2/` ([spec])
//!
//! [spec]: https://spec.matrix.org/v1.2/identity-service-api/#post_matrixidentityv23pidbind
use ruma_api::ruma_api;
use ruma_common::{thirdparty::Medium, MilliSecondsSinceUnixEpoch};
use ruma_identifiers::{ClientSecret, ServerSignatures, SessionId, UserId};
ruma_api! {
metadata: {
description: "Publish an association between a session and a Matrix user ID.",
method: POST,
name: "bind_3pid",
stable_path: "/_matrix/identity/v2/3pid/bind",
rate_limited: false,
authentication: AccessToken,
added: 1.0,
}
request: {
/// The session ID generated by the `requestToken` call.
pub sid: &'a SessionId,
/// The client secret passed to the `requestToken` call.
pub client_secret: &'a ClientSecret,
/// The Matrix user ID to associate with the 3PIDs.
pub mxid: &'a UserId,
}
response: {
/// The 3PID address of the user being looked up.
pub address: String,
/// The medium type of the 3PID.
pub medium: Medium,
/// The Matrix user ID associated with the 3PID.
pub mxid: Box<UserId>,
/// A UNIX timestamp before which the association is not known to be valid.
pub not_before: MilliSecondsSinceUnixEpoch,
/// A UNIX timestamp after which the association is not known to be valid.
pub not_after: MilliSecondsSinceUnixEpoch,
/// The UNIX timestamp at which the association was verified.
pub ts: MilliSecondsSinceUnixEpoch,
/// The signatures of the verifiying identity servers which show that the
/// association should be trusted, if you trust the verifying identity services.
pub signatures: ServerSignatures,
}
}
impl<'a> Request<'a> {
/// Creates a `Request` with the given session ID, client secret and Matrix user ID.
pub fn new(sid: &'a SessionId, client_secret: &'a ClientSecret, mxid: &'a UserId) -> Self {
Self { sid, client_secret, mxid }
}
}
impl Response {
/// Creates a `Response` with the given 3PID address, medium, Matrix user ID, timestamps and
/// signatures.
pub fn new(
address: String,
medium: Medium,
mxid: Box<UserId>,
not_before: MilliSecondsSinceUnixEpoch,
not_after: MilliSecondsSinceUnixEpoch,
ts: MilliSecondsSinceUnixEpoch,
signatures: ServerSignatures,
) -> Self {
Self { address, medium, mxid, not_before, not_after, ts, signatures }
}
}
}

View File

@ -1,75 +0,0 @@
//! [POST /_matrix/identity/v2/3pid/bind](https://matrix.org/docs/spec/identity_service/r0.3.0#post-matrix-identity-v2-3pid-bind)
use ruma_api::ruma_api;
use ruma_common::{thirdparty::Medium, MilliSecondsSinceUnixEpoch};
use ruma_identifiers::{ClientSecret, ServerSignatures, SessionId, UserId};
ruma_api! {
metadata: {
description: "Publish an association between a session and a Matrix user ID.",
method: POST,
name: "bind_3pid",
stable_path: "/_matrix/identity/v2/3pid/bind",
rate_limited: false,
authentication: AccessToken,
added: 1.0,
}
request: {
/// The session ID generated by the `requestToken` call.
pub sid: &'a SessionId,
/// The client secret passed to the `requestToken` call.
pub client_secret: &'a ClientSecret,
/// The Matrix user ID to associate with the 3PIDs.
pub mxid: &'a UserId,
}
response: {
/// The 3PID address of the user being looked up.
pub address: String,
/// The medium type of the 3PID.
pub medium: Medium,
/// The Matrix user ID associated with the 3PID.
pub mxid: Box<UserId>,
/// A UNIX timestamp before which the association is not known to be valid.
pub not_before: MilliSecondsSinceUnixEpoch,
/// A UNIX timestamp after which the association is not known to be valid.
pub not_after: MilliSecondsSinceUnixEpoch,
/// The UNIX timestamp at which the association was verified.
pub ts: MilliSecondsSinceUnixEpoch,
/// The signatures of the verifiying identity servers which show that the
/// association should be trusted, if you trust the verifying identity services.
pub signatures: ServerSignatures,
}
}
impl<'a> Request<'a> {
/// Creates a `Request` with the given session ID, client secret and Matrix user ID.
pub fn new(sid: &'a SessionId, client_secret: &'a ClientSecret, mxid: &'a UserId) -> Self {
Self { sid, client_secret, mxid }
}
}
impl Response {
/// Creates a `Response` with the given 3PID address, medium, Matrix user ID, timestamps and
/// signatures.
pub fn new(
address: String,
medium: Medium,
mxid: Box<UserId>,
not_before: MilliSecondsSinceUnixEpoch,
not_after: MilliSecondsSinceUnixEpoch,
ts: MilliSecondsSinceUnixEpoch,
signatures: ServerSignatures,
) -> Self {
Self { address, medium, mxid, not_before, not_after, ts, signatures }
}
}

View File

@ -1,3 +1,61 @@
//! `GET /_matrix/identity/*/3pid/getValidated3pid`
//!
//! Endpoint to determine the validity of a 3PID.
pub mod v2;
pub mod v2 {
//! `/v2/` ([spec])
//!
//! [spec]: https://spec.matrix.org/v1.2/identity-service-api/#get_matrixidentityv23pidgetvalidated3pid
use js_int::UInt;
use ruma_api::ruma_api;
use ruma_common::thirdparty::Medium;
use ruma_identifiers::{ClientSecret, SessionId};
ruma_api! {
metadata: {
description: "Determines if a given 3PID has been validated by a user.",
method: GET,
name: "check_3pid_validity",
stable_path: "/_matrix/identity/v2/3pid/getValidated3pid/",
rate_limited: false,
authentication: AccessToken,
added: 1.0,
}
request: {
/// The Session ID generated by the `requestToken` call.
#[ruma_api(query)]
pub sid: &'a SessionId,
/// The client secret passed to the `requestToken` call.
#[ruma_api(query)]
pub client_secret: &'a ClientSecret,
}
response: {
/// The medium type of the 3PID.
pub medium: Medium,
/// The address of the 3PID being looked up.
pub address: String,
/// Timestamp, in milliseconds, indicating the time that the 3PID was validated.
pub validated_at: UInt,
}
}
impl<'a> Request<'a> {
/// Creates a `Request` with the given Session ID and client secret.
pub fn new(sid: &'a SessionId, client_secret: &'a ClientSecret) -> Self {
Self { sid, client_secret }
}
}
impl Response {
/// Creates a `Response` with the given medium, address and validation timestamp.
pub fn new(medium: Medium, address: String, validated_at: UInt) -> Self {
Self { medium, address, validated_at }
}
}
}

View File

@ -1,53 +0,0 @@
//! [GET /_matrix/identity/v2/3pid/getValidated3pid](https://matrix.org/docs/spec/identity_service/r0.3.0#get-matrix-identity-v2-3pid-getvalidated3pid)
use js_int::UInt;
use ruma_api::ruma_api;
use ruma_common::thirdparty::Medium;
use ruma_identifiers::{ClientSecret, SessionId};
ruma_api! {
metadata: {
description: "Determines if a given 3PID has been validated by a user.",
method: GET,
name: "check_3pid_validity",
stable_path: "/_matrix/identity/v2/3pid/getValidated3pid/",
rate_limited: false,
authentication: AccessToken,
added: 1.0,
}
request: {
/// The Session ID generated by the `requestToken` call.
#[ruma_api(query)]
pub sid: &'a SessionId,
/// The client secret passed to the `requestToken` call.
#[ruma_api(query)]
pub client_secret: &'a ClientSecret,
}
response: {
/// The medium type of the 3PID.
pub medium: Medium,
/// The address of the 3PID being looked up.
pub address: String,
/// Timestamp, in milliseconds, indicating the time that the 3PID was validated.
pub validated_at: UInt,
}
}
impl<'a> Request<'a> {
/// Creates a `Request` with the given Session ID and client secret.
pub fn new(sid: &'a SessionId, client_secret: &'a ClientSecret) -> Self {
Self { sid, client_secret }
}
}
impl Response {
/// Creates a `Response` with the given medium, address and validation timestamp.
pub fn new(medium: Medium, address: String, validated_at: UInt) -> Self {
Self { medium, address, validated_at }
}
}

View File

@ -1,3 +1,69 @@
//! `POST /_matrix/identity/*/validate/email/requestToken`
//!
//! Create a session for verifying an email.
pub mod v2;
pub mod v2 {
//! `/v2/` ([spec])
//!
//! [spec]: https://spec.matrix.org/v1.2/identity-service-api/#post_matrixidentityv2validateemailrequesttoken
use js_int::UInt;
use ruma_api::ruma_api;
use ruma_identifiers::{ClientSecret, SessionId};
ruma_api! {
metadata: {
description: "Creates a session for validating an email address.",
method: POST,
name: "create_email_validation_session",
stable_path: "/_matrix/identity/v2/validate/email/requestToken",
authentication: AccessToken,
rate_limited: false,
added: 1.0,
}
request: {
/// A unique string generated by the client, and used to identify the validation attempt.
pub client_secret: &'a ClientSecret,
/// The email address to validate.
pub email: &'a str,
/// The server will only send an email if the send_attempt is a number greater than the
/// most recent one which it has seen, scoped to that email + client_secret pair.
pub send_attempt: UInt,
/// When the validation is completed, the identity server will redirect the user to this
/// URL.
#[serde(skip_serializing_if = "Option::is_none")]
pub next_link: Option<&'a str>,
}
response: {
/// The session ID.
///
/// Session IDs are opaque strings generated by the identity server.
pub sid: Box<SessionId>,
}
}
impl<'a> Request<'a> {
/// Create a new `Request` with the given client secret, email ID, `send_attempt` number,
/// and the link to redirect to after validation.
pub fn new(
client_secret: &'a ClientSecret,
email: &'a str,
send_attempt: UInt,
next_link: Option<&'a str>,
) -> Self {
Self { client_secret, email, send_attempt, next_link }
}
}
impl Response {
/// Create a new `Response` with the given session ID.
pub fn new(sid: Box<SessionId>) -> Self {
Self { sid }
}
}
}

View File

@ -1,61 +0,0 @@
//! [POST /_matrix/identity/v2/validate/email/requestToken](https://matrix.org/docs/spec/identity_service/r0.3.0#post-matrix-identity-v2-validate-email-requesttoken)
use js_int::UInt;
use ruma_api::ruma_api;
use ruma_identifiers::{ClientSecret, SessionId};
ruma_api! {
metadata: {
description: "Creates a session for validating an email address.",
method: POST,
name: "create_email_validation_session",
stable_path: "/_matrix/identity/v2/validate/email/requestToken",
authentication: AccessToken,
rate_limited: false,
added: 1.0,
}
request: {
/// A unique string generated by the client, and used to identify the validation attempt.
pub client_secret: &'a ClientSecret,
/// The email address to validate.
pub email: &'a str,
/// The server will only send an email if the send_attempt is a number greater than the
/// most recent one which it has seen, scoped to that email + client_secret pair.
pub send_attempt: UInt,
/// When the validation is completed, the identity server will redirect the user to this
/// URL.
#[serde(skip_serializing_if = "Option::is_none")]
pub next_link: Option<&'a str>,
}
response: {
/// The session ID.
///
/// Session IDs are opaque strings generated by the identity server.
pub sid: Box<SessionId>,
}
}
impl<'a> Request<'a> {
/// Create a new `Request` with the given client secret, email ID, `send_attempt` number, and
/// the link to redirect to after validation.
pub fn new(
client_secret: &'a ClientSecret,
email: &'a str,
send_attempt: UInt,
next_link: Option<&'a str>,
) -> Self {
Self { client_secret, email, send_attempt, next_link }
}
}
impl Response {
/// Create a new `Response` with the given session ID.
pub fn new(sid: Box<SessionId>) -> Self {
Self { sid }
}
}

View File

@ -1,3 +1,54 @@
//! `POST /_matrix/identity/*/validate/email/submitToken`
//!
//! Validate an email ID after creation of a session.
pub mod v2;
pub mod v2 {
//! `/v2/` ([spec])
//!
//! [spec]: https://spec.matrix.org/v1.2/identity-service-api/#post_matrixidentityv2validateemailsubmittoken
use ruma_api::ruma_api;
use ruma_identifiers::{ClientSecret, SessionId};
ruma_api! {
metadata: {
description: "Validate ownership of an email address.",
method: POST,
name: "validate_email",
stable_path: "/_matrix/identity/v2/validate/email/submitToken",
authentication: AccessToken,
rate_limited: false,
added: 1.0,
}
request: {
/// The session ID, generated by the `requestToken` call.
pub sid: &'a SessionId,
/// The client secret that was supplied to the `requestToken` call.
pub client_secret: &'a ClientSecret,
/// The token generated by the `requestToken` call and emailed to the user.
pub token: &'a str,
}
response: {
/// Whether the validation was successful or not.
pub success: bool,
}
}
impl<'a> Request<'a> {
/// Create a new `Request` with the given session ID, client secret and token.
pub fn new(sid: &'a SessionId, client_secret: &'a ClientSecret, token: &'a str) -> Self {
Self { sid, client_secret, token }
}
}
impl Response {
/// Create a new `Response` with the success status.
pub fn new(success: bool) -> Self {
Self { success }
}
}
}

View File

@ -1,46 +0,0 @@
//! [POST /_matrix/identity/v2/validate/email/submitToken](https://matrix.org/docs/spec/identity_service/r0.3.0#post-matrix-identity-v2-validate-email-submittoken)
use ruma_api::ruma_api;
use ruma_identifiers::{ClientSecret, SessionId};
ruma_api! {
metadata: {
description: "Validate ownership of an email address.",
method: POST,
name: "validate_email",
stable_path: "/_matrix/identity/v2/validate/email/submitToken",
authentication: AccessToken,
rate_limited: false,
added: 1.0,
}
request: {
/// The session ID, generated by the `requestToken` call.
pub sid: &'a SessionId,
/// The client secret that was supplied to the `requestToken` call.
pub client_secret: &'a ClientSecret,
/// The token generated by the `requestToken` call and emailed to the user.
pub token: &'a str,
}
response: {
/// Whether the validation was successful or not.
pub success: bool,
}
}
impl<'a> Request<'a> {
/// Create a new `Request` with the given session ID, client secret and token.
pub fn new(sid: &'a SessionId, client_secret: &'a ClientSecret, token: &'a str) -> Self {
Self { sid, client_secret, token }
}
}
impl Response {
/// Create a new `Response` with the success status.
pub fn new(success: bool) -> Self {
Self { success }
}
}

View File

@ -1,3 +1,55 @@
//! `GET /_matrix/identity/*/validate/email/submitToken`
//!
//! Endpoint for validation of an email ID by the end-user, after creation of a session.
pub mod v2;
pub mod v2 {
//! `/v2/` ([spec])
//!
//! [spec]: https://spec.matrix.org/v1.2/identity-service-api/#get_matrixidentityv2validateemailsubmittoken
use ruma_api::ruma_api;
use ruma_identifiers::{ClientSecret, SessionId};
ruma_api! {
metadata: {
description: "Validate ownership of an email address.",
method: GET,
name: "validate_email_by_end_user",
stable_path: "/_matrix/identity/v2/validate/email/submitToken",
authentication: AccessToken,
rate_limited: false,
added: 1.0,
}
request: {
/// The session ID, generated by the `requestToken` call.
#[ruma_api(query)]
pub sid: &'a SessionId,
/// The client secret that was supplied to the `requestToken` call.
#[ruma_api(query)]
pub client_secret: &'a ClientSecret,
/// The token generated by the `requestToken` call and emailed to the user.
#[ruma_api(query)]
pub token: &'a str,
}
#[derive(Default)]
response: {}
}
impl<'a> Request<'a> {
/// Create a new `Request` with the given session ID, client secret and token.
pub fn new(sid: &'a SessionId, client_secret: &'a ClientSecret, token: &'a str) -> Self {
Self { sid, client_secret, token }
}
}
impl Response {
/// Create a new empty `Response`.
pub fn new() -> Self {
Self {}
}
}
}

View File

@ -1,47 +0,0 @@
//! [GET /_matrix/identity/v2/validate/email/submitToken](https://matrix.org/docs/spec/identity_service/r0.3.0#get-matrix-identity-v2-validate-email-submittoken)
use ruma_api::ruma_api;
use ruma_identifiers::{ClientSecret, SessionId};
ruma_api! {
metadata: {
description: "Validate ownership of an email address.",
method: GET,
name: "validate_email_by_end_user",
stable_path: "/_matrix/identity/v2/validate/email/submitToken",
authentication: AccessToken,
rate_limited: false,
added: 1.0,
}
request: {
/// The session ID, generated by the `requestToken` call.
#[ruma_api(query)]
pub sid: &'a SessionId,
/// The client secret that was supplied to the `requestToken` call.
#[ruma_api(query)]
pub client_secret: &'a ClientSecret,
/// The token generated by the `requestToken` call and emailed to the user.
#[ruma_api(query)]
pub token: &'a str,
}
#[derive(Default)]
response: {}
}
impl<'a> Request<'a> {
/// Create a new `Request` with the given session ID, client secret and token.
pub fn new(sid: &'a SessionId, client_secret: &'a ClientSecret, token: &'a str) -> Self {
Self { sid, client_secret, token }
}
}
impl Response {
/// Create a new empty `Response`.
pub fn new() -> Self {
Self {}
}
}

View File

@ -1,3 +1,75 @@
//! `POST /_matrix/identity/*/validate/msisdn/requestToken`
//!
//! Create a session for validation of a phone number.
pub mod v2;
pub mod v2 {
//! `/v2/` ([spec])
//!
//! [spec]: https://spec.matrix.org/v1.2/identity-service-api/#post_matrixidentityv2validatemsisdnrequesttoken
use js_int::UInt;
use ruma_api::ruma_api;
use ruma_identifiers::{ClientSecret, SessionId};
ruma_api! {
metadata: {
description: "Creates a session for validating a phone number.",
method: POST,
name: "create_msisdn_validation_session",
stable_path: "/_matrix/identity/v2/validate/msisdn/requestToken",
authentication: AccessToken,
rate_limited: false,
added: 1.0,
}
request: {
/// A unique string generated by the client, and used to identify the validation attempt.
pub client_secret: &'a ClientSecret,
/// The two-letter uppercase ISO-3166-1 alpha-2 country code that the number in
/// `phone_number` should be parsed as if it were dialled from.
pub country: &'a str,
/// The phone number to validate.
pub phone_number: &'a str,
/// The server will only send an SMS if the send_attempt is a number greater than the most
/// recent one which it has seen, scoped to that `country` + `phone_number` +
/// `client_secret` triple.
pub send_attempt: UInt,
/// When the validation is completed, the identity server will redirect the user to this
/// URL.
#[serde(skip_serializing_if = "Option::is_none")]
pub next_link: Option<&'a str>,
}
response: {
/// The session ID.
///
/// Session IDs are opaque strings generated by the identity server.
pub sid: Box<SessionId>,
}
}
impl<'a> Request<'a> {
/// Create a new `Request` with the given client secret, country code, phone number, the
/// `send_attempt` number and the next link to go to after validation.
pub fn new(
client_secret: &'a ClientSecret,
country: &'a str,
phone_number: &'a str,
send_attempt: UInt,
next_link: Option<&'a str>,
) -> Self {
Self { client_secret, country, phone_number, send_attempt, next_link }
}
}
impl Response {
/// Create a new `Response` with the given session ID.
pub fn new(sid: Box<SessionId>) -> Self {
Self { sid }
}
}
}

View File

@ -1,67 +0,0 @@
//! [POST /_matrix/identity/v2/validate/msisdn/requestToken](https://matrix.org/docs/spec/identity_service/r0.3.0#post-matrix-identity-v2-validate-msisdn-requesttoken)
use js_int::UInt;
use ruma_api::ruma_api;
use ruma_identifiers::{ClientSecret, SessionId};
ruma_api! {
metadata: {
description: "Creates a session for validating a phone number.",
method: POST,
name: "create_msisdn_validation_session",
stable_path: "/_matrix/identity/v2/validate/msisdn/requestToken",
authentication: AccessToken,
rate_limited: false,
added: 1.0,
}
request: {
/// A unique string generated by the client, and used to identify the validation attempt.
pub client_secret: &'a ClientSecret,
/// The two-letter uppercase ISO-3166-1 alpha-2 country code that the number in
/// `phone_number` should be parsed as if it were dialled from.
pub country: &'a str,
/// The phone number to validate.
pub phone_number: &'a str,
/// The server will only send an SMS if the send_attempt is a number greater than the most
/// recent one which it has seen, scoped to that `country` + `phone_number` +
/// `client_secret` triple.
pub send_attempt: UInt,
/// When the validation is completed, the identity server will redirect the user to this
/// URL.
#[serde(skip_serializing_if = "Option::is_none")]
pub next_link: Option<&'a str>,
}
response: {
/// The session ID.
///
/// Session IDs are opaque strings generated by the identity server.
pub sid: Box<SessionId>,
}
}
impl<'a> Request<'a> {
/// Create a new `Request` with the given client secret, country code, phone number, the
/// `send_attempt` number and the next link to go to after validation.
pub fn new(
client_secret: &'a ClientSecret,
country: &'a str,
phone_number: &'a str,
send_attempt: UInt,
next_link: Option<&'a str>,
) -> Self {
Self { client_secret, country, phone_number, send_attempt, next_link }
}
}
impl Response {
/// Create a new `Response` with the given session ID.
pub fn new(sid: Box<SessionId>) -> Self {
Self { sid }
}
}

View File

@ -1,3 +1,54 @@
//! `POST /_matrix/identity/*/validate/msisdn/submitToken`
//!
//! Validate the ownership of a phone number.
pub mod v2;
pub mod v2 {
//! `/v2/` ([spec])
//!
//! [spec]: https://spec.matrix.org/v1.2/identity-service-api/#post_matrixidentityv2validatemsisdnsubmittoken
use ruma_api::ruma_api;
use ruma_identifiers::{ClientSecret, SessionId};
ruma_api! {
metadata: {
description: "Validate ownership of an phone number.",
method: POST,
name: "validate_msisdn",
stable_path: "/_matrix/identity/v2/validate/msisdn/submitToken",
authentication: AccessToken,
rate_limited: false,
added: 1.0,
}
request: {
/// The session ID, generated by the `requestToken` call.
pub sid: &'a SessionId,
/// The client secret that was supplied to the `requestToken` call.
pub client_secret: &'a ClientSecret,
/// The token generated by the `requestToken` call and sent to the user.
pub token: &'a str,
}
response: {
/// Whether the validation was successful or not.
pub success: bool,
}
}
impl<'a> Request<'a> {
/// Create a new `Request` with the given session ID, client secret and token.
pub fn new(sid: &'a SessionId, client_secret: &'a ClientSecret, token: &'a str) -> Self {
Self { sid, client_secret, token }
}
}
impl Response {
/// Create a new `Response` with the success status.
pub fn new(success: bool) -> Self {
Self { success }
}
}
}

View File

@ -1,46 +0,0 @@
//! [POST /_matrix/identity/v2/validate/msisdn/submitToken](https://matrix.org/docs/spec/identity_service/r0.3.0#post-matrix-identity-v2-validate-msisdn-submittoken)
use ruma_api::ruma_api;
use ruma_identifiers::{ClientSecret, SessionId};
ruma_api! {
metadata: {
description: "Validate ownership of an phone number.",
method: POST,
name: "validate_msisdn",
stable_path: "/_matrix/identity/v2/validate/msisdn/submitToken",
authentication: AccessToken,
rate_limited: false,
added: 1.0,
}
request: {
/// The session ID, generated by the `requestToken` call.
pub sid: &'a SessionId,
/// The client secret that was supplied to the `requestToken` call.
pub client_secret: &'a ClientSecret,
/// The token generated by the `requestToken` call and sent to the user.
pub token: &'a str,
}
response: {
/// Whether the validation was successful or not.
pub success: bool,
}
}
impl<'a> Request<'a> {
/// Create a new `Request` with the given session ID, client secret and token.
pub fn new(sid: &'a SessionId, client_secret: &'a ClientSecret, token: &'a str) -> Self {
Self { sid, client_secret, token }
}
}
impl Response {
/// Create a new `Response` with the success status.
pub fn new(success: bool) -> Self {
Self { success }
}
}

View File

@ -1,3 +1,55 @@
//! `GET /_matrix/identity/*/validate/msisdn/submitToken`
//!
//! Endpoint to validate the ownership of a phone number by the end user.
pub mod v2;
pub mod v2 {
//! `/v2/` ([spec])
//!
//! [spec]: https://spec.matrix.org/v1.2/identity-service-api/#get_matrixidentityv2validatemsisdnsubmittoken
use ruma_api::ruma_api;
use ruma_identifiers::{ClientSecret, SessionId};
ruma_api! {
metadata: {
description: "Validate ownership of an email address.",
method: GET,
name: "validate_email_by_end_user",
stable_path: "/_matrix/identity/v2/validate/msisdn/submitToken",
authentication: AccessToken,
rate_limited: false,
added: 1.0,
}
request: {
/// The session ID, generated by the `requestToken` call.
#[ruma_api(query)]
pub sid: &'a SessionId,
/// The client secret that was supplied to the `requestToken` call.
#[ruma_api(query)]
pub client_secret: &'a ClientSecret,
/// The token generated by the `requestToken` call and sent to the user.
#[ruma_api(query)]
pub token: &'a str,
}
#[derive(Default)]
response: {}
}
impl<'a> Request<'a> {
/// Create a new `Request` with the given session ID, client secret and token.
pub fn new(sid: &'a SessionId, client_secret: &'a ClientSecret, token: &'a str) -> Self {
Self { sid, client_secret, token }
}
}
impl Response {
/// Create a new empty `Response`.
pub fn new() -> Self {
Self {}
}
}
}

View File

@ -1,47 +0,0 @@
//! [GET /_matrix/identity/v2/validate/msisdn/submitToken](https://matrix.org/docs/spec/identity_service/r0.3.0#get-matrix-identity-v2-validate-msisdn-submittoken)
use ruma_api::ruma_api;
use ruma_identifiers::{ClientSecret, SessionId};
ruma_api! {
metadata: {
description: "Validate ownership of an email address.",
method: GET,
name: "validate_email_by_end_user",
stable_path: "/_matrix/identity/v2/validate/msisdn/submitToken",
authentication: AccessToken,
rate_limited: false,
added: 1.0,
}
request: {
/// The session ID, generated by the `requestToken` call.
#[ruma_api(query)]
pub sid: &'a SessionId,
/// The client secret that was supplied to the `requestToken` call.
#[ruma_api(query)]
pub client_secret: &'a ClientSecret,
/// The token generated by the `requestToken` call and sent to the user.
#[ruma_api(query)]
pub token: &'a str,
}
#[derive(Default)]
response: {}
}
impl<'a> Request<'a> {
/// Create a new `Request` with the given session ID, client secret and token.
pub fn new(sid: &'a SessionId, client_secret: &'a ClientSecret, token: &'a str) -> Self {
Self { sid, client_secret, token }
}
}
impl Response {
/// Create a new empty `Response`.
pub fn new() -> Self {
Self {}
}
}

View File

@ -1,3 +1,104 @@
//! `POST /_matrix/identity/*/3pid/unbind`
//!
//! Endpoint to remove an association between a session and a Matrix user ID.
pub mod v2;
pub mod v2 {
//! `/v2/` ([spec])
//!
//! [spec]: https://spec.matrix.org/v1.2/identity-service-api/#post_matrixidentityv23pidunbind
use ruma_api::ruma_api;
use ruma_common::thirdparty::Medium;
use ruma_identifiers::{user_id::UserId, ClientSecret, SessionId};
use serde::{Deserialize, Serialize};
ruma_api! {
metadata: {
description: "Remove an association between a session and a Matrix user ID.",
method: POST,
name: "unbind_3pid",
stable_path: "/_matrix/identity/v2/3pid/unbind",
rate_limited: false,
authentication: AccessToken,
added: 1.0,
}
request: {
/// The proof that the client owns the 3PID.
///
/// If this is not provided, the request must be signed by the homeserver which controls
/// the `mxid`.
#[serde(flatten, skip_serializing_if = "Option::is_none")]
pub threepid_ownership_proof: Option<&'a ThreePidOwnershipProof>,
/// The Matrix user ID to remove from the 3PIDs.
pub mxid: &'a UserId,
/// The 3PID to remove.
///
/// Must match the 3PID used to generate the session if using `sid` and `client_secret` to
/// authenticate this request.
pub threepid: &'a ThirdPartyId,
}
#[derive(Default)]
response: {}
}
impl<'a> Request<'a> {
/// Creates a `Request` with the given Session ID, client secret, Matrix user ID and 3PID.
pub fn new(
threepid_ownership_proof: Option<&'a ThreePidOwnershipProof>,
mxid: &'a UserId,
threepid: &'a ThirdPartyId,
) -> Self {
Self { threepid_ownership_proof, mxid, threepid }
}
}
impl Response {
/// Creates an empty `Response`.
pub fn new() -> Self {
Self {}
}
}
/// A 3PID to unbind.
#[derive(Clone, Debug, Serialize, Deserialize)]
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
pub struct ThirdPartyId {
/// A medium matching the medium of identifier to unbind.
pub medium: Medium,
/// The 3PID address to remove.
pub address: String,
}
impl ThirdPartyId {
/// Creates a new `ThirdPartyId` with the given medium and address.
pub fn new(medium: Medium, address: String) -> Self {
Self { medium, address }
}
}
/// A proof that the client owns the 3PID.
///
/// Must be constructed using the same session ID and client secret generated and passed by the
/// `requestToken` call for the given 3PID.
#[derive(Clone, Debug, Serialize, Deserialize)]
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
pub struct ThreePidOwnershipProof {
/// The Session ID generated by the `requestToken` call.
pub sid: Box<SessionId>,
/// The client secret passed to the `requestToken` call.
pub client_secret: Box<ClientSecret>,
}
impl ThreePidOwnershipProof {
/// Creates a new `ThreePidOwnershipProof` with the given session ID and client secret.
pub fn new(sid: Box<SessionId>, client_secret: Box<ClientSecret>) -> Self {
Self { sid, client_secret }
}
}
}

View File

@ -1,96 +0,0 @@
//! [POST /_matrix/identity/v2/3pid/unbind](https://matrix.org/docs/spec/identity_service/r0.3.0#post-matrix-identity-v2-3pid-unbind)
use ruma_api::ruma_api;
use ruma_common::thirdparty::Medium;
use ruma_identifiers::{user_id::UserId, ClientSecret, SessionId};
use serde::{Deserialize, Serialize};
ruma_api! {
metadata: {
description: "Remove an association between a session and a Matrix user ID.",
method: POST,
name: "unbind_3pid",
stable_path: "/_matrix/identity/v2/3pid/unbind",
rate_limited: false,
authentication: AccessToken,
added: 1.0,
}
request: {
/// The proof that the client owns the 3PID.
///
/// If this is not provided, the request must be signed by the homeserver which controls
/// the `mxid`.
#[serde(flatten, skip_serializing_if = "Option::is_none")]
pub threepid_ownership_proof: Option<&'a ThreePidOwnershipProof>,
/// The Matrix user ID to remove from the 3PIDs.
pub mxid: &'a UserId,
/// The 3PID to remove.
///
/// Must match the 3PID used to generate the session if using `sid` and `client_secret` to
/// authenticate this request.
pub threepid: &'a ThirdPartyId,
}
#[derive(Default)]
response: {}
}
impl<'a> Request<'a> {
/// Creates a `Request` with the given Session ID, client secret, Matrix user ID and 3PID.
pub fn new(
threepid_ownership_proof: Option<&'a ThreePidOwnershipProof>,
mxid: &'a UserId,
threepid: &'a ThirdPartyId,
) -> Self {
Self { threepid_ownership_proof, mxid, threepid }
}
}
impl Response {
/// Creates an empty `Response`.
pub fn new() -> Self {
Self {}
}
}
/// A 3PID to unbind.
#[derive(Clone, Debug, Serialize, Deserialize)]
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
pub struct ThirdPartyId {
/// A medium matching the medium of identifier to unbind.
pub medium: Medium,
/// The 3PID address to remove.
pub address: String,
}
impl ThirdPartyId {
/// Creates a new `ThirdPartyId` with the given medium and address.
pub fn new(medium: Medium, address: String) -> Self {
Self { medium, address }
}
}
/// A proof that the client owns the 3PID.
///
/// Must be constructed using the same session ID and client secret generated and passed by the
/// `requestToken` call for the given 3PID.
#[derive(Clone, Debug, Serialize, Deserialize)]
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
pub struct ThreePidOwnershipProof {
/// The Session ID generated by the `requestToken` call.
pub sid: Box<SessionId>,
/// The client secret passed to the `requestToken` call.
pub client_secret: Box<ClientSecret>,
}
impl ThreePidOwnershipProof {
/// Creates a new `ThreePidOwnershipProof` with the given session ID and client secret.
pub fn new(sid: Box<SessionId>, client_secret: Box<ClientSecret>) -> Self {
Self { sid, client_secret }
}
}

View File

@ -1,3 +1,46 @@
//! `GET /_matrix/identity/*/account`
//!
//! Gets information about what user owns the access token used in the request.
pub mod v2;
pub mod v2 {
//! `/v2/` ([spec])
//!
//! [spec]: https://spec.matrix.org/v1.2/identity-service-api/#get_matrixidentityv2account
use ruma_api::ruma_api;
use ruma_identifiers::UserId;
ruma_api! {
metadata: {
description: "Gets information about what user owns the access token used in the request.",
method: POST,
name: "get_account_information",
stable_path: "/_matrix/identity/v2/account",
authentication: AccessToken,
rate_limited: false,
added: 1.0,
}
#[derive(Default)]
request: {}
response: {
/// The user ID which registered the token.
pub user_id: Box<UserId>,
}
}
impl Request {
/// Creates an empty `Request`.
pub fn new() -> Self {
Self {}
}
}
impl Response {
/// Creates a new `Response` with the given `UserId`.
pub fn new(user_id: Box<UserId>) -> Self {
Self { user_id }
}
}
}

View File

@ -1,38 +0,0 @@
//! [GET /_matrix/identity/v2/account](https://matrix.org/docs/spec/identity_service/r0.3.0#get-matrix-identity-v2-account)
use ruma_api::ruma_api;
use ruma_identifiers::UserId;
ruma_api! {
metadata: {
description: "Gets information about what user owns the access token used in the request.",
method: POST,
name: "get_account_information",
stable_path: "/_matrix/identity/v2/account",
authentication: AccessToken,
rate_limited: false,
added: 1.0,
}
#[derive(Default)]
request: {}
response: {
/// The user ID which registered the token.
pub user_id: Box<UserId>,
}
}
impl Request {
/// Creates an empty `Request`.
pub fn new() -> Self {
Self {}
}
}
impl Response {
/// Creates a new `Response` with the given `UserId`.
pub fn new(user_id: Box<UserId>) -> Self {
Self { user_id }
}
}

View File

@ -1,4 +1,44 @@
//! `POST /_matrix/identity/*/account/logout`
//!
//! Logs out the access token, preventing it from being used to authenticate future requests to the
//! server.
pub mod v2;
pub mod v2 {
//! `/v2/` ([spec])
//!
//! [spec]: https://spec.matrix.org/v1.2/identity-service-api/#post_matrixidentityv2accountlogout
use ruma_api::ruma_api;
ruma_api! {
metadata: {
description: "Logs out the access token, preventing it from being used to authenticate future requests to the server.",
method: POST,
name: "logout",
stable_path: "/_matrix/identity/v2/account/logout",
authentication: AccessToken,
rate_limited: false,
added: 1.0,
}
#[derive(Default)]
request: {}
#[derive(Default)]
response: {}
}
impl Request {
/// Creates an empty `Request`.
pub fn new() -> Self {
Self {}
}
}
impl Response {
/// Creates an empty `Response`.
pub fn new() -> Self {
Self {}
}
}
}

View File

@ -1,35 +0,0 @@
//! [POST /_matrix/identity/v2/account/logout](https://matrix.org/docs/spec/identity_service/r0.3.0#post-matrix-identity-v2-account-logout)
use ruma_api::ruma_api;
ruma_api! {
metadata: {
description: "Logs out the access token, preventing it from being used to authenticate future requests to the server.",
method: POST,
name: "logout",
stable_path: "/_matrix/identity/v2/account/logout",
authentication: AccessToken,
rate_limited: false,
added: 1.0,
}
#[derive(Default)]
request: {}
#[derive(Default)]
response: {}
}
impl Request {
/// Creates an empty `Request`.
pub fn new() -> Self {
Self {}
}
}
impl Response {
/// Creates an empty `Response`.
pub fn new() -> Self {
Self {}
}
}

View File

@ -1,3 +1,72 @@
//! `POST /_matrix/identity/*/account/register`
//!
//! Exchanges an OpenID token from the homeserver for an access token to access the identity server.
pub mod v2;
pub mod v2 {
//! `/v2/` ([spec])
//!
//! [spec]: https://spec.matrix.org/v1.2/identity-service-api/#post_matrixidentityv2accountregister
use std::time::Duration;
use ruma_api::ruma_api;
use ruma_common::authentication::TokenType;
use ruma_identifiers::ServerName;
ruma_api! {
metadata: {
description: "Exchanges an OpenID token from the homeserver for an access token to access the identity server.",
method: POST,
name: "register_account",
stable_path: "/_matrix/identity/v2/account/register",
authentication: None,
rate_limited: false,
added: 1.0,
}
request: {
/// An access token the consumer may use to verify the identity of the person who generated
/// the token.
///
/// This is given to the federation API `GET /openid/userinfo` to verify the user's
/// identity.
pub access_token: &'a str,
/// The string `Bearer`.
pub token_type: TokenType,
/// The homeserver domain the consumer should use when attempting to verify the user's
/// identity.
pub matrix_server_name: &'a ServerName,
/// The number of seconds before this token expires and a new one must be generated.
#[serde(with = "ruma_serde::duration::secs")]
pub expires_in: Duration,
}
response: {
/// An opaque string representing the token to authenticate future requests to the identity
/// server with.
pub token: String,
}
}
impl<'a> Request<'a> {
/// Creates a new `Request` with the given parameters.
pub fn new(
access_token: &'a str,
token_type: TokenType,
matrix_server_name: &'a ServerName,
expires_in: Duration,
) -> Self {
Self { access_token, token_type, matrix_server_name, expires_in }
}
}
impl Response {
/// Creates an empty `Response`.
pub fn new(token: String) -> Self {
Self { token }
}
}
}

View File

@ -1,64 +0,0 @@
//! [POST /_matrix/identity/v2/account/register](https://matrix.org/docs/spec/identity_service/r0.3.0#post-matrix-identity-v2-account-register)
use std::time::Duration;
use ruma_api::ruma_api;
use ruma_common::authentication::TokenType;
use ruma_identifiers::ServerName;
ruma_api! {
metadata: {
description: "Exchanges an OpenID token from the homeserver for an access token to access the identity server.",
method: POST,
name: "register_account",
stable_path: "/_matrix/identity/v2/account/register",
authentication: None,
rate_limited: false,
added: 1.0,
}
request: {
/// An access token the consumer may use to verify the identity of the person who generated
/// the token.
///
/// This is given to the federation API `GET /openid/userinfo` to verify the user's
/// identity.
pub access_token: &'a str,
/// The string `Bearer`.
pub token_type: TokenType,
/// The homeserver domain the consumer should use when attempting to verify the user's
/// identity.
pub matrix_server_name: &'a ServerName,
/// The number of seconds before this token expires and a new one must be generated.
#[serde(with = "ruma_serde::duration::secs")]
pub expires_in: Duration,
}
response: {
/// An opaque string representing the token to authenticate future requests to the identity
/// server with.
pub token: String,
}
}
impl<'a> Request<'a> {
/// Creates a new `Request` with the given parameters.
pub fn new(
access_token: &'a str,
token_type: TokenType,
matrix_server_name: &'a ServerName,
expires_in: Duration,
) -> Self {
Self { access_token, token_type, matrix_server_name, expires_in }
}
}
impl Response {
/// Creates an empty `Response`.
pub fn new(token: String) -> Self {
Self { token }
}
}

View File

@ -1,2 +1,70 @@
//! `POST /_matrix/identity/*/sign-ed25519`
//!
//! Endpoint to sign invitation details.
pub mod v2;
pub mod v2 {
//! `/v2/` ([spec])
//!
//! [spec]: https://spec.matrix.org/v1.2/identity-service-api/#post_matrixidentityv2sign-ed25519
use ruma_api::ruma_api;
use ruma_identifiers::{ServerSignatures, UserId};
use ruma_serde::Base64;
ruma_api! {
metadata: {
description: "Sign invitation details.",
method: POST,
name: "sign_invitation_ed25519",
stable_path: "/_matrix/identity/v2/sign-ed25519",
authentication: AccessToken,
rate_limited: false,
added: 1.0,
}
request: {
/// The Matrix user ID of the user accepting the invitation.
pub mxid: &'a UserId,
/// The token from the call to store-invite.
pub token: &'a str,
/// The private key, encoded as unpadded base64.
pub private_key: &'a Base64,
}
response: {
/// The Matrix user ID of the user accepting the invitation.
pub mxid: Box<UserId>,
/// The Matrix user ID of the user who sent the invitation.
pub sender: Box<UserId>,
/// The signature of the mxid, sender and token.
pub signatures: ServerSignatures,
/// The token for the invitation.
pub token: String,
}
}
impl<'a> Request<'a> {
/// Creates a `Request` with the given Matrix user ID, token and private_key.
pub fn new(mxid: &'a UserId, token: &'a str, private_key: &'a Base64) -> Self {
Self { mxid, token, private_key }
}
}
impl Response {
/// Creates a `Response` with the given Matrix user ID, sender user ID, signatures and
/// token.
pub fn new(
mxid: Box<UserId>,
sender: Box<UserId>,
signatures: ServerSignatures,
token: String,
) -> Self {
Self { mxid, sender, signatures, token }
}
}
}

View File

@ -1,61 +0,0 @@
//![POST /_matrix/identity/v2/sign-ed25519](https://matrix.org/docs/spec/identity_service/r0.3.0#post-matrix-identity-v2-sign-ed25519)
use ruma_api::ruma_api;
use ruma_identifiers::{ServerSignatures, UserId};
use ruma_serde::Base64;
ruma_api! {
metadata: {
description: "Sign invitation details.",
method: POST,
name: "sign_invitation_ed25519",
stable_path: "/_matrix/identity/v2/sign-ed25519",
authentication: AccessToken,
rate_limited: false,
added: 1.0,
}
request: {
/// The Matrix user ID of the user accepting the invitation.
pub mxid: &'a UserId,
/// The token from the call to store-invite.
pub token: &'a str,
/// The private key, encoded as unpadded base64.
pub private_key: &'a Base64,
}
response: {
/// The Matrix user ID of the user accepting the invitation.
pub mxid: Box<UserId>,
/// The Matrix user ID of the user who sent the invitation.
pub sender: Box<UserId>,
/// The signature of the mxid, sender and token.
pub signatures: ServerSignatures,
/// The token for the invitation.
pub token: String,
}
}
impl<'a> Request<'a> {
/// Creates a `Request` with the given Matrix user ID, token and private_key.
pub fn new(mxid: &'a UserId, token: &'a str, private_key: &'a Base64) -> Self {
Self { mxid, token, private_key }
}
}
impl Response {
/// Creates a `Response` with the given Matrix user ID, sender user ID, signatures and token.
pub fn new(
mxid: Box<UserId>,
sender: Box<UserId>,
signatures: ServerSignatures,
token: String,
) -> Self {
Self { mxid, sender, signatures, token }
}
}

View File

@ -1,3 +1,161 @@
//! `POST /_matrix/identity/*/store-invite`
//!
//! Endpoint to store pending invitations to a user's 3PID.
pub mod v2;
pub mod v2 {
//! `/v2/` ([spec])
//!
//! [spec]: https://spec.matrix.org/v1.2/identity-service-api/#post_matrixidentityv2store-invite
use ruma_api::ruma_api;
use ruma_common::thirdparty::Medium;
use ruma_identifiers::{MxcUri, RoomAliasId, RoomId, RoomName, UserId};
use serde::{ser::SerializeSeq, Deserialize, Serialize};
ruma_api! {
metadata: {
description: "Store pending invitations to a user's 3PID.",
method: POST,
name: "store_invitation",
stable_path: "/_matrix/identity/v2/store-invite",
authentication: AccessToken,
rate_limited: false,
added: 1.0,
}
request: {
/// The type of the third party identifier for the invited user.
///
/// Currently, only `Medium::Email` is supported.
pub medium: &'a Medium,
/// The email address of the invited user.
pub address: &'a str,
/// The Matrix room ID to which the user is invited.
pub room_id: &'a RoomId,
/// The Matrix user ID of the inviting user.
pub sender: &'a UserId,
/// The Matrix room alias for the room to which the user is invited.
///
/// This should be retrieved from the `m.room.canonical` state event.
#[serde(skip_serializing_if = "Option::is_none")]
pub room_alias: Option<&'a RoomAliasId>,
/// The Content URI for the room to which the user is invited.
///
/// This should be retrieved from the `m.room.avatar` state event.
#[serde(skip_serializing_if = "Option::is_none")]
pub room_avatar_url: Option<&'a MxcUri>,
/// The `join_rule` for the room to which the user is invited.
///
/// This should be retrieved from the `m.room.join_rules` state event.
#[serde(skip_serializing_if = "Option::is_none")]
pub room_join_rules: Option<&'a str>,
/// The name of the room to which the user is invited.
///
/// This should be retrieved from the `m.room.name` state event.
#[serde(skip_serializing_if = "Option::is_none")]
pub room_name: Option<&'a RoomName>,
/// The display name of the user ID initiating the invite.
#[serde(skip_serializing_if = "Option::is_none")]
pub sender_display_name: Option<&'a str>,
/// The Content URI for the avater of the user ID initiating the invite.
#[serde(skip_serializing_if = "Option::is_none")]
pub sender_avatar_url: Option<&'a MxcUri>,
}
response: {
/// The generated token.
///
/// Must be a string consisting of the characters `[0-9a-zA-Z.=_-]`. Its length must not
/// exceed 255 characters and it must not be empty.
pub token: String,
/// A list of [server's long-term public key, generated ephemeral public key].
pub public_keys: PublicKeys,
/// The generated (redacted) display_name.
///
/// An example is `f...@b...`.
pub display_name: String,
}
}
impl<'a> Request<'a> {
/// Creates a new `Request with the given medium, email address, room ID and sender.
pub fn new(
medium: &'a Medium,
address: &'a str,
room_id: &'a RoomId,
sender: &'a UserId,
) -> Self {
Self {
medium,
address,
room_id,
sender,
room_alias: None,
room_avatar_url: None,
room_join_rules: None,
room_name: None,
sender_display_name: None,
sender_avatar_url: None,
}
}
/// Creates a new `Request` with the given email address, room ID and sender.
pub fn email(address: &'a str, room_id: &'a RoomId, sender: &'a UserId) -> Self {
Self::new(&Medium::Email, address, room_id, sender)
}
}
impl Response {
/// Creates a new `Response` with the given token, public keys and display name.
pub fn new(token: String, public_keys: PublicKeys, display_name: String) -> Self {
Self { token, public_keys, display_name }
}
}
/// The server's long-term public key and generated ephemeral public key.
#[derive(Debug, Clone)]
#[allow(clippy::exhaustive_structs)]
pub struct PublicKeys {
/// The server's long-term public key.
pub server_key: String,
/// The generated ephemeral public key.
pub ephemeral_key: String,
}
impl<'de> Deserialize<'de> for PublicKeys {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let [server_key, ephemeral_key] = <[String; 2]>::deserialize(deserializer)?;
Ok(Self { server_key, ephemeral_key })
}
}
impl Serialize for PublicKeys {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let mut seq = serializer.serialize_seq(Some(2))?;
seq.serialize_element(&self.server_key)?;
seq.serialize_element(&self.ephemeral_key)?;
seq.end()
}
}
}

View File

@ -1,153 +0,0 @@
//! [POST /_matrix/identity/v2/store-invite](https://matrix.org/docs/spec/identity_service/r0.3.0#post-matrix-identity-v2-store-invite)
use ruma_api::ruma_api;
use ruma_common::thirdparty::Medium;
use ruma_identifiers::{MxcUri, RoomAliasId, RoomId, RoomName, UserId};
use serde::{ser::SerializeSeq, Deserialize, Serialize};
ruma_api! {
metadata: {
description: "Store pending invitations to a user's 3PID.",
method: POST,
name: "store_invitation",
stable_path: "/_matrix/identity/v2/store-invite",
authentication: AccessToken,
rate_limited: false,
added: 1.0,
}
request: {
/// The type of the third party identifier for the invited user.
///
/// Currently, only `Medium::Email` is supported.
pub medium: &'a Medium,
/// The email address of the invited user.
pub address: &'a str,
/// The Matrix room ID to which the user is invited.
pub room_id: &'a RoomId,
/// The Matrix user ID of the inviting user.
pub sender: &'a UserId,
/// The Matrix room alias for the room to which the user is invited.
///
/// This should be retrieved from the `m.room.canonical` state event.
#[serde(skip_serializing_if = "Option::is_none")]
pub room_alias: Option<&'a RoomAliasId>,
/// The Content URI for the room to which the user is invited.
///
/// This should be retrieved from the `m.room.avatar` state event.
#[serde(skip_serializing_if = "Option::is_none")]
pub room_avatar_url: Option<&'a MxcUri>,
/// The `join_rule` for the room to which the user is invited.
///
/// This should be retrieved from the `m.room.join_rules` state event.
#[serde(skip_serializing_if = "Option::is_none")]
pub room_join_rules: Option<&'a str>,
/// The name of the room to which the user is invited.
///
/// This should be retrieved from the `m.room.name` state event.
#[serde(skip_serializing_if = "Option::is_none")]
pub room_name: Option<&'a RoomName>,
/// The display name of the user ID initiating the invite.
#[serde(skip_serializing_if = "Option::is_none")]
pub sender_display_name: Option<&'a str>,
/// The Content URI for the avater of the user ID initiating the invite.
#[serde(skip_serializing_if = "Option::is_none")]
pub sender_avatar_url: Option<&'a MxcUri>,
}
response: {
/// The generated token.
///
/// Must be a string consisting of the characters `[0-9a-zA-Z.=_-]`. Its length must not
/// exceed 255 characters and it must not be empty.
pub token: String,
/// A list of [server's long-term public key, generated ephemeral public key].
pub public_keys: PublicKeys,
/// The generated (redacted) display_name.
///
/// An example is `f...@b...`.
pub display_name: String,
}
}
impl<'a> Request<'a> {
/// Creates a new `Request with the given medium, email address, room ID and sender.
pub fn new(
medium: &'a Medium,
address: &'a str,
room_id: &'a RoomId,
sender: &'a UserId,
) -> Self {
Self {
medium,
address,
room_id,
sender,
room_alias: None,
room_avatar_url: None,
room_join_rules: None,
room_name: None,
sender_display_name: None,
sender_avatar_url: None,
}
}
/// Creates a new `Request` with the given email address, room ID and sender.
pub fn email(address: &'a str, room_id: &'a RoomId, sender: &'a UserId) -> Self {
Self::new(&Medium::Email, address, room_id, sender)
}
}
impl Response {
/// Creates a new `Response` with the given token, public keys and display name.
pub fn new(token: String, public_keys: PublicKeys, display_name: String) -> Self {
Self { token, public_keys, display_name }
}
}
/// The server's long-term public key and generated ephemeral public key.
#[derive(Debug, Clone)]
#[allow(clippy::exhaustive_structs)]
pub struct PublicKeys {
/// The server's long-term public key.
pub server_key: String,
/// The generated ephemeral public key.
pub ephemeral_key: String,
}
impl<'de> Deserialize<'de> for PublicKeys {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let [server_key, ephemeral_key] = <[String; 2]>::deserialize(deserializer)?;
Ok(Self { server_key, ephemeral_key })
}
}
impl Serialize for PublicKeys {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let mut seq = serializer.serialize_seq(Some(2))?;
seq.serialize_element(&self.server_key)?;
seq.serialize_element(&self.ephemeral_key)?;
seq.end()
}
}

View File

@ -1,3 +1,49 @@
//! `GET /_matrix/identity/*/pubkey/isvalid`
//!
//! Endpoint to check for valid public key with an identity server.
pub mod v2;
pub mod v2 {
//! `/v2/` ([spec])
//!
//! [spec]: https://spec.matrix.org/v1.2/identity-service-api/#get_matrixidentityv2pubkeyisvalid
use ruma_api::ruma_api;
use ruma_serde::Base64;
ruma_api! {
metadata: {
description: "Check whether a long-term public key is valid. The response should always be the same, provided the key exists.",
method: GET,
name: "check_public_key_validity",
stable_path: "/_matrix/identity/v2/pubkey/isvalid",
authentication: None,
rate_limited: false,
added: 1.0,
}
request: {
/// Base64-encoded (no padding) public key to check for validity.
#[ruma_api(query)]
pub public_key: &'a Base64,
}
response: {
/// Whether the public key is recognised and is currently valid.
pub valid: bool,
}
}
impl<'a> Request<'a> {
/// Create a `Request` with the given base64-encoded (unpadded) public key.
pub fn new(public_key: &'a Base64) -> Self {
Self { public_key }
}
}
impl Response {
/// Create a `Response` with the given bool indicating the validity of the public key.
pub fn new(valid: bool) -> Self {
Self { valid }
}
}
}

View File

@ -1,41 +0,0 @@
//! [GET /_matrix/identity/v2/pubkey/isvalid](https://matrix.org/docs/spec/identity_service/r0.3.0#get-matrix-identity-v2-pubkey-isvalid)
use ruma_api::ruma_api;
use ruma_serde::Base64;
ruma_api! {
metadata: {
description: "Check whether a long-term public key is valid. The response should always be the same, provided the key exists.",
method: GET,
name: "check_public_key_validity",
stable_path: "/_matrix/identity/v2/pubkey/isvalid",
authentication: None,
rate_limited: false,
added: 1.0,
}
request: {
/// Base64-encoded (no padding) public key to check for validity.
#[ruma_api(query)]
pub public_key: &'a Base64,
}
response: {
/// Whether the public key is recognised and is currently valid.
pub valid: bool,
}
}
impl<'a> Request<'a> {
/// Create a `Request` with the given base64-encoded (unpadded) public key.
pub fn new(public_key: &'a Base64) -> Self {
Self { public_key }
}
}
impl Response {
/// Create a `Response` with the given bool indicating the validity of the public key.
pub fn new(valid: bool) -> Self {
Self { valid }
}
}

View File

@ -1,3 +1,50 @@
//! `GET /_matrix/identity/*/pubkey/{keyId}`
//!
//! Endpoint to retrieve the public key for a key ID.
pub mod v2;
pub mod v2 {
//! `/v2/` ([spec])
//!
//! [spec]: https://spec.matrix.org/v1.2/identity-service-api/#get_matrixidentityv2pubkeykeyid
use ruma_api::ruma_api;
use ruma_identifiers::ServerSigningKeyId;
use ruma_serde::Base64;
ruma_api! {
metadata: {
description: "Get the public key for the given key ID.",
method: GET,
name: "get_public_key",
stable_path: "/_matrix/identity/v2/pubkey/:key_id",
rate_limited: false,
authentication: None,
added: 1.0,
}
request: {
/// The ID of the key.
#[ruma_api(path)]
pub key_id: &'a ServerSigningKeyId,
}
response: {
/// Unpadded base64-encoded public key.
pub public_key: Base64,
}
}
impl<'a> Request<'a> {
/// Create a `Request` with the given key_id.
pub fn new(key_id: &'a ServerSigningKeyId) -> Self {
Self { key_id }
}
}
impl Response {
/// Create a `Response` with the given base64-encoded (unpadded) public key.
pub fn new(public_key: Base64) -> Self {
Self { public_key }
}
}
}

View File

@ -1,42 +0,0 @@
//! [GET /_matrix/identity/v2/pubkey/{keyId}](https://matrix.org/docs/spec/identity_service/r0.3.0#get-matrix-identity-v2-pubkey-keyid)
use ruma_api::ruma_api;
use ruma_identifiers::ServerSigningKeyId;
use ruma_serde::Base64;
ruma_api! {
metadata: {
description: "Get the public key for the given key ID.",
method: GET,
name: "get_public_key",
stable_path: "/_matrix/identity/v2/pubkey/:key_id",
rate_limited: false,
authentication: None,
added: 1.0,
}
request: {
/// The ID of the key.
#[ruma_api(path)]
pub key_id: &'a ServerSigningKeyId,
}
response: {
/// Unpadded base64-encoded public key.
pub public_key: Base64,
}
}
impl<'a> Request<'a> {
/// Create a `Request` with the given key_id.
pub fn new(key_id: &'a ServerSigningKeyId) -> Self {
Self { key_id }
}
}
impl Response {
/// Create a `Response` with the given base64-encoded (unpadded) public key.
pub fn new(public_key: Base64) -> Self {
Self { public_key }
}
}

View File

@ -1,3 +1,50 @@
//! `GET /_matrix/identity/*/pubkey/ephemeral/isvalid`
//!
//! Endpoint to check for validity of short-term public key.
pub mod v2;
pub mod v2 {
//! `/v2/` ([spec])
//!
//! [spec]: https://spec.matrix.org/v1.2/identity-service-api/#get_matrixidentityv2pubkeyephemeralisvalid
use ruma_api::ruma_api;
use ruma_serde::Base64;
ruma_api! {
metadata: {
description: "Check whether a short-term public key is valid.",
method: GET,
name: "validate_ephemeral_key",
stable_path: "/_matrix/identity/v2/pubkey/ephemeral/isvalid",
authentication: None,
rate_limited: false,
added: 1.0,
}
request: {
/// The unpadded base64-encoded short-term public key to check.
#[ruma_api(query)]
pub public_key: &'a Base64,
}
response: {
/// Whether the short-term public key is recognised and is currently valid.
pub valid: bool,
}
}
impl<'a> Request<'a> {
/// Create a `Request` with the given base64-encoded (unpadded) short-term public key.
pub fn new(public_key: &'a Base64) -> Self {
Self { public_key }
}
}
impl Response {
/// Create a `Response` with the given bool indicating the validity of the short-term public
/// key.
pub fn new(valid: bool) -> Self {
Self { valid }
}
}
}

View File

@ -1,42 +0,0 @@
//! [GET /_matrix/identity/v2/pubkey/ephemeral/isvalid](https://matrix.org/docs/spec/identity_service/r0.3.0#get-matrix-identity-v2-pubkey-ephemeral-isvalid)
use ruma_api::ruma_api;
use ruma_serde::Base64;
ruma_api! {
metadata: {
description: "Check whether a short-term public key is valid.",
method: GET,
name: "validate_ephemeral_key",
stable_path: "/_matrix/identity/v2/pubkey/ephemeral/isvalid",
authentication: None,
rate_limited: false,
added: 1.0,
}
request: {
/// The unpadded base64-encoded short-term public key to check.
#[ruma_api(query)]
pub public_key: &'a Base64,
}
response: {
/// Whether the short-term public key is recognised and is currently valid.
pub valid: bool,
}
}
impl<'a> Request<'a> {
/// Create a `Request` with the given base64-encoded (unpadded) short-term public key.
pub fn new(public_key: &'a Base64) -> Self {
Self { public_key }
}
}
impl Response {
/// Create a `Response` with the given bool indicating the validity of the short-term public
/// key.
pub fn new(valid: bool) -> Self {
Self { valid }
}
}

View File

@ -3,7 +3,7 @@
//! (De)serializable types for the [Matrix Identity Service API][identity-api].
//! These types can be shared by client and identity service code.
//!
//! [identity-api]: https://matrix.org/docs/spec/identity_service/r0.3.0.html
//! [identity-api]: https://spec.matrix.org/v1.2/identity-service-api/
#![warn(missing_docs)]

View File

@ -1,3 +1,54 @@
//! `GET /_matrix/identity/*/hash_details`
//!
//! Endpoint to get details about Hashing identifiers.
pub mod v2;
pub mod v2 {
//! `/v2/` ([spec])
//!
//! [spec]: https://spec.matrix.org/v1.2/identity-service-api/#get_matrixidentityv2hash_details
use ruma_api::ruma_api;
use crate::lookup::IdentifierHashingAlgorithm;
ruma_api! {
metadata: {
description: "Gets parameters for hashing identifiers from the server. This can include any of the algorithms defined in the spec.",
method: GET,
name: "get_hash_parameters",
stable_path: "/_matrix/identity/v2/hash_details",
authentication: AccessToken,
rate_limited: false,
added: 1.0,
}
#[derive(Default)]
request: {}
response: {
/// The pepper the client MUST use in hashing identifiers, and MUST supply to the /lookup endpoint when performing lookups.
///
/// Servers SHOULD rotate this string often.
pub lookup_pepper: String,
/// The algorithms the server supports.
///
/// Must contain at least `sha256`.
pub algorithms: Vec<IdentifierHashingAlgorithm>,
}
}
impl Request {
/// Creates an empty `Request`.
pub fn new() -> Self {
Self {}
}
}
impl Response {
/// Create a new `Response` using the given pepper and `Vec` of algorithms.
pub fn new(lookup_pepper: String, algorithms: Vec<IdentifierHashingAlgorithm>) -> Self {
Self { lookup_pepper, algorithms }
}
}
}

View File

@ -1,46 +0,0 @@
//! [GET /_matrix/identity/v2/hash_details](https://matrix.org/docs/spec/identity_service/r0.3.0#get-matrix-identity-v2-hash-details)
use ruma_api::ruma_api;
use crate::lookup::IdentifierHashingAlgorithm;
ruma_api! {
metadata: {
description: "Gets parameters for hashing identifiers from the server. This can include any of the algorithms defined in the spec.",
method: GET,
name: "get_hash_parameters",
stable_path: "/_matrix/identity/v2/hash_details",
authentication: AccessToken,
rate_limited: false,
added: 1.0,
}
#[derive(Default)]
request: {}
response: {
/// The pepper the client MUST use in hashing identifiers, and MUST supply to the /lookup endpoint when performing lookups.
///
/// Servers SHOULD rotate this string often.
pub lookup_pepper: String,
/// The algorithms the server supports.
///
/// Must contain at least `sha256`.
pub algorithms: Vec<IdentifierHashingAlgorithm>,
}
}
impl Request {
/// Creates an empty `Request`.
pub fn new() -> Self {
Self {}
}
}
impl Response {
/// Create a new `Response` using the given pepper and `Vec` of algorithms.
pub fn new(lookup_pepper: String, algorithms: Vec<IdentifierHashingAlgorithm>) -> Self {
Self { lookup_pepper, algorithms }
}
}

View File

@ -1,3 +1,71 @@
//! `POST /_matrix/identity/*/lookup`
//!
//! Endpoint to look up set of Matrix IDs which are bound to 3PIDs.
pub mod v2;
pub mod v2 {
//! `/v2/` ([spec])
//!
//! [spec]: https://spec.matrix.org/v1.2/identity-service-api/#post_matrixidentityv2lookup
use std::collections::BTreeMap;
use ruma_api::ruma_api;
use ruma_identifiers::UserId;
use crate::lookup::IdentifierHashingAlgorithm;
ruma_api! {
metadata: {
description: "Looks up the set of Matrix User IDs which have bound the 3PIDs given, if bindings are available.",
method: POST,
name: "lookup_3pid",
stable_path: "/_matrix/identity/v2/lookup",
authentication: AccessToken,
rate_limited: false,
added: 1.0,
}
request: {
/// The algorithm the client is using to encode the `addresses`. This should be one of the
/// available options from `/hash_details`.
pub algorithm: &'a IdentifierHashingAlgorithm,
/// The pepper from `/hash_details`. This is required even when the `algorithm` does not
/// make use of it.
pub pepper: &'a str,
/// The addresses to look up.
///
/// The format of the entries here depend on the `algorithm` used. Note that queries which
/// have been incorrectly hashed or formatted will lead to no matches.
pub addresses: &'a [String],
}
response: {
/// Any applicable mappings of `addresses` to Matrix User IDs.
///
/// Addresses which do not have associations will not be included, which can make this
/// property be an empty object.
pub mappings: BTreeMap<String, Box<UserId>>,
}
}
impl<'a> Request<'a> {
/// Create a `Request` with algorithm, pepper and addresses to loop up.
pub fn new(
algorithm: &'a IdentifierHashingAlgorithm,
pepper: &'a str,
addresses: &'a [String],
) -> Self {
Self { algorithm, pepper, addresses }
}
}
impl Response {
/// Create a `Response` with the BTreeMap which map addresses from the request which were
/// found to their corresponding User IDs.
pub fn new(mappings: BTreeMap<String, Box<UserId>>) -> Self {
Self { mappings }
}
}
}

View File

@ -1,63 +0,0 @@
//! [POST /_matrix/identity/v2/lookup](https://matrix.org/docs/spec/identity_service/r0.3.0#post-matrix-identity-v2-lookup)
use std::collections::BTreeMap;
use ruma_api::ruma_api;
use ruma_identifiers::UserId;
use crate::lookup::IdentifierHashingAlgorithm;
ruma_api! {
metadata: {
description: "Looks up the set of Matrix User IDs which have bound the 3PIDs given, if bindings are available.",
method: POST,
name: "lookup_3pid",
stable_path: "/_matrix/identity/v2/lookup",
authentication: AccessToken,
rate_limited: false,
added: 1.0,
}
request: {
/// The algorithm the client is using to encode the `addresses`. This should be one of the
/// available options from `/hash_details`.
pub algorithm: &'a IdentifierHashingAlgorithm,
/// The pepper from `/hash_details`. This is required even when the `algorithm` does not
/// make use of it.
pub pepper: &'a str,
/// The addresses to look up.
///
/// The format of the entries here depend on the `algorithm` used. Note that queries which
/// have been incorrectly hashed or formatted will lead to no matches.
pub addresses: &'a [String],
}
response: {
/// Any applicable mappings of `addresses` to Matrix User IDs.
///
/// Addresses which do not have associations will not be included, which can make this
/// property be an empty object.
pub mappings: BTreeMap<String, Box<UserId>>,
}
}
impl<'a> Request<'a> {
/// Create a `Request` with algorithm, pepper and addresses to loop up.
pub fn new(
algorithm: &'a IdentifierHashingAlgorithm,
pepper: &'a str,
addresses: &'a [String],
) -> Self {
Self { algorithm, pepper, addresses }
}
}
impl Response {
/// Create a `Response` with the BTreeMap which map addresses from the request which were
/// found to their corresponding User IDs.
pub fn new(mappings: BTreeMap<String, Box<UserId>>) -> Self {
Self { mappings }
}
}

View File

@ -1,3 +1,43 @@
//! `GET /_matrix/identity/*`
//!
//! Endpoint to check the status of an identity server.
pub mod v2;
pub mod v2 {
//! `/v2/` ([spec])
//!
//! [spec]: https://spec.matrix.org/v1.2/identity-service-api/#get_matrixidentityv2
use ruma_api::ruma_api;
ruma_api! {
metadata: {
description: "Checks that an identity server is available at this API endpoint.",
method: GET,
name: "status",
stable_path: "/_matrix/identity/v2",
authentication: None,
rate_limited: false,
added: 1.0,
}
#[derive(Default)]
request: {}
#[derive(Default)]
response: {}
}
impl Request {
/// Creates an empty `Request`.
pub fn new() -> Self {
Self {}
}
}
impl Response {
/// Creates an empty `Response`.
pub fn new() -> Self {
Self {}
}
}
}

View File

@ -1,35 +0,0 @@
//! [GET /_matrix/identity/v2](https://matrix.org/docs/spec/identity_service/r0.3.0#get-matrix-identity-v2)
use ruma_api::ruma_api;
ruma_api! {
metadata: {
description: "Checks that an identity server is available at this API endpoint.",
method: GET,
name: "status",
stable_path: "/_matrix/identity/v2",
authentication: None,
rate_limited: false,
added: 1.0,
}
#[derive(Default)]
request: {}
#[derive(Default)]
response: {}
}
impl Request {
/// Creates an empty `Request`.
pub fn new() -> Self {
Self {}
}
}
impl Response {
/// Creates an empty `Response`.
pub fn new() -> Self {
Self {}
}
}

View File

@ -1,3 +1,47 @@
//! `POST /_matrix/identity/*/terms`
//!
//! Endpoint to send acceptance of the terms of service of an identity server.
pub mod v2;
pub mod v2 {
//! `/v2/` ([spec])
//!
//! [spec]: https://spec.matrix.org/v1.2/identity-service-api/#post_matrixidentityv2terms
use ruma_api::ruma_api;
ruma_api! {
metadata: {
description: "Called by a client to indicate that the user has accepted/agreed to the included set of URLs.",
method: POST,
name: "accept_terms_of_service",
stable_path: "/_matrix/identity/v2/terms",
authentication: AccessToken,
rate_limited: false,
added: 1.0,
}
request: {
/// The URLs the user is accepting in this request.
///
/// An example is `https://example.org/somewhere/terms-2.0-en.html`.
pub user_accepts: Vec<String>,
}
#[derive(Default)]
response: {}
}
impl Request {
/// Creates a new `Request` with the given URLs which the user accepts.
pub fn new(user_accepts: Vec<String>) -> Self {
Self { user_accepts }
}
}
impl Response {
/// Creates an empty `Response`.
pub fn new() -> Self {
Self {}
}
}
}

View File

@ -1,39 +0,0 @@
//! [POST /_matrix/identity/v2/terms](https://matrix.org/docs/spec/identity_service/r0.3.0#post-matrix-identity-v2-terms)
use ruma_api::ruma_api;
ruma_api! {
metadata: {
description: "Called by a client to indicate that the user has accepted/agreed to the included set of URLs.",
method: POST,
name: "accept_terms_of_service",
stable_path: "/_matrix/identity/v2/terms",
authentication: AccessToken,
rate_limited: false,
added: 1.0,
}
request: {
/// The URLs the user is accepting in this request.
///
/// An example is `https://example.org/somewhere/terms-2.0-en.html`.
pub user_accepts: Vec<String>,
}
#[derive(Default)]
response: {}
}
impl Request {
/// Creates a new `Request` with the given URLs which the user accepts.
pub fn new(user_accepts: Vec<String>) -> Self {
Self { user_accepts }
}
}
impl Response {
/// Creates an empty `Response`.
pub fn new() -> Self {
Self {}
}
}

View File

@ -1,3 +1,98 @@
//! `GET /_matrix/identity/*/terms`
//!
//! Endpoint to retrieve the terms of service of an identity server.
pub mod v2;
pub mod v2 {
//! `/v2/` ([spec])
//!
//! [spec]: https://spec.matrix.org/v1.2/identity-service-api/#get_matrixidentityv2terms
use std::collections::BTreeMap;
use ruma_api::ruma_api;
use serde::{Deserialize, Serialize};
ruma_api! {
metadata: {
description: "Gets all the terms of service offered by the server.",
method: GET,
name: "get_terms_of_service",
stable_path: "/_matrix/identity/v2/terms",
authentication: None,
rate_limited: false,
added: 1.0,
}
#[derive(Default)]
request: {}
response: {
/// The policies the server offers.
///
/// Mapped from arbitrary ID (unused in this version of the specification) to a Policy Object.
pub policies: BTreeMap<String, Policies>,
}
}
impl Request {
/// Creates an empty `Request`.
pub fn new() -> Self {
Self {}
}
}
impl Response {
/// Creates a new `Response` with the given `Policies`.
pub fn new(policies: BTreeMap<String, Policies>) -> Self {
Self { policies }
}
}
/// Collection of localized policies.
#[derive(Clone, Debug, Serialize, Deserialize)]
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
pub struct Policies {
/// The version for the policy.
///
/// There are no requirements on what this might be and could be
/// "alpha", semantically versioned, or arbitrary.
pub version: String,
/// Available languages for the policy.
///
/// The keys could be the language code corresponding to
/// the given `LocalizedPolicy`, for example "en" or "fr".
#[serde(flatten)]
pub localized: BTreeMap<String, LocalizedPolicy>,
}
impl Policies {
/// Create a new `Policies` with the given version and localized map.
pub fn new(version: String, localized: BTreeMap<String, LocalizedPolicy>) -> Self {
Self { version, localized }
}
}
/// A localized policy offered by a server.
#[derive(Clone, Debug, Serialize, Deserialize)]
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
pub struct LocalizedPolicy {
/// The localized name of the policy.
///
/// Examples are "Terms of Service", "Conditions d'utilisation".
pub name: String,
/// The URL at which the policy is available.
///
/// Examples are `https://example.org/somewhere/terms-2.0-en.html`
/// and `https://example.org/somewhere/terms-2.0-fr.html`.
pub url: String,
}
impl LocalizedPolicy {
/// Create a new `LocalizedPolicy` with the given name and url.
pub fn new(name: String, url: String) -> Self {
Self { name, url }
}
}
}

View File

@ -1,90 +0,0 @@
//! [GET /_matrix/identity/v2/terms](https://matrix.org/docs/spec/identity_service/r0.3.0#get-matrix-identity-v2-terms)
use std::collections::BTreeMap;
use ruma_api::ruma_api;
use serde::{Deserialize, Serialize};
ruma_api! {
metadata: {
description: "Gets all the terms of service offered by the server.",
method: GET,
name: "get_terms_of_service",
stable_path: "/_matrix/identity/v2/terms",
authentication: None,
rate_limited: false,
added: 1.0,
}
#[derive(Default)]
request: {}
response: {
/// The policies the server offers.
///
/// Mapped from arbitrary ID (unused in this version of the specification) to a Policy Object.
pub policies: BTreeMap<String, Policies>,
}
}
impl Request {
/// Creates an empty `Request`.
pub fn new() -> Self {
Self {}
}
}
impl Response {
/// Creates a new `Response` with the given `Policies`.
pub fn new(policies: BTreeMap<String, Policies>) -> Self {
Self { policies }
}
}
/// Collection of localized policies.
#[derive(Clone, Debug, Serialize, Deserialize)]
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
pub struct Policies {
/// The version for the policy.
///
/// There are no requirements on what this might be and could be
/// "alpha", semantically versioned, or arbitrary.
pub version: String,
/// Available languages for the policy.
///
/// The keys could be the language code corresponding to
/// the given `LocalizedPolicy`, for example "en" or "fr".
#[serde(flatten)]
pub localized: BTreeMap<String, LocalizedPolicy>,
}
impl Policies {
/// Create a new `Policies` with the given version and localized map.
pub fn new(version: String, localized: BTreeMap<String, LocalizedPolicy>) -> Self {
Self { version, localized }
}
}
/// A localized policy offered by a server.
#[derive(Clone, Debug, Serialize, Deserialize)]
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
pub struct LocalizedPolicy {
/// The localized name of the policy.
///
/// Examples are "Terms of Service", "Conditions d'utilisation".
pub name: String,
/// The URL at which the policy is available.
///
/// Examples are `https://example.org/somewhere/terms-2.0-en.html`
/// and `https://example.org/somewhere/terms-2.0-fr.html`.
pub url: String,
}
impl LocalizedPolicy {
/// Create a new `LocalizedPolicy` with the given name and url.
pub fn new(name: String, url: String) -> Self {
Self { name, url }
}
}