identity-service-api: Add store_invitation endpoint. (#631)
* identity-service-api: Add store_invitation endpoint. Signed-off-by: Adam Blanchet <adamblanchet@free.fr>
This commit is contained in:
parent
4200d6e387
commit
f43c9c6caa
@ -15,7 +15,10 @@ Improvements:
|
|||||||
check_3pid_validity::v2,
|
check_3pid_validity::v2,
|
||||||
bind_3pid::v2,
|
bind_3pid::v2,
|
||||||
},
|
},
|
||||||
invitation::sign_invitation_ed25519::v2
|
invitation::{
|
||||||
|
sign_invitation_ed25519::v2,
|
||||||
|
store_invitation::v2,
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
# 0.1.0
|
# 0.1.0
|
||||||
|
@ -1,2 +1,4 @@
|
|||||||
//! Endpoints for ephemeral invitation signing.
|
//! Endpoints to store and sign invitations.
|
||||||
|
|
||||||
pub mod sign_invitation_ed25519;
|
pub mod sign_invitation_ed25519;
|
||||||
|
pub mod store_invitation;
|
||||||
|
@ -0,0 +1,3 @@
|
|||||||
|
//! Endpoint to store pending invitations to a user's 3PID.
|
||||||
|
|
||||||
|
pub mod v2;
|
@ -0,0 +1,149 @@
|
|||||||
|
//! [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, UserId};
|
||||||
|
use serde::{ser::SerializeSeq, Deserialize, Serialize};
|
||||||
|
|
||||||
|
ruma_api! {
|
||||||
|
metadata: {
|
||||||
|
description: "Store pending invitations to a user's 3PID.",
|
||||||
|
method: POST,
|
||||||
|
name: "store_invitation",
|
||||||
|
path: "/_matrix/identity/v2/store-invite",
|
||||||
|
authentication: AccessToken,
|
||||||
|
rate_limited: false,
|
||||||
|
}
|
||||||
|
|
||||||
|
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 str>,
|
||||||
|
|
||||||
|
/// 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()
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user