feat: kick,ban,unban user route
This commit is contained in:
parent
a8df1acdfd
commit
b7f7a39973
3 changed files with 161 additions and 34 deletions
|
@ -25,7 +25,7 @@ use ruma_client_api::{
|
||||||
media::{create_content, get_content, get_content_thumbnail, get_media_config},
|
media::{create_content, get_content, get_content_thumbnail, get_media_config},
|
||||||
membership::{
|
membership::{
|
||||||
forget_room, get_member_events, invite_user, join_room_by_id, join_room_by_id_or_alias,
|
forget_room, get_member_events, invite_user, join_room_by_id, join_room_by_id_or_alias,
|
||||||
leave_room,
|
kick_user, leave_room, ban_user, unban_user,
|
||||||
},
|
},
|
||||||
message::{create_message_event, get_message_events},
|
message::{create_message_event, get_message_events},
|
||||||
presence::set_presence,
|
presence::set_presence,
|
||||||
|
@ -381,7 +381,7 @@ pub fn get_pushrules_all_route(
|
||||||
.map(|edu| edu.deserialize().expect("PushRules event in db is valid"))
|
.map(|edu| edu.deserialize().expect("PushRules event in db is valid"))
|
||||||
{
|
{
|
||||||
MatrixResult(Ok(get_pushrules_all::Response {
|
MatrixResult(Ok(get_pushrules_all::Response {
|
||||||
global: pushrules.content.global
|
global: pushrules.content.global,
|
||||||
}))
|
}))
|
||||||
} else {
|
} else {
|
||||||
MatrixResult(Err(Error {
|
MatrixResult(Err(Error {
|
||||||
|
@ -1433,13 +1433,28 @@ pub fn leave_room_route(
|
||||||
_room_id: String,
|
_room_id: String,
|
||||||
) -> MatrixResult<leave_room::Response> {
|
) -> MatrixResult<leave_room::Response> {
|
||||||
let user_id = body.user_id.as_ref().expect("user is authenticated");
|
let user_id = body.user_id.as_ref().expect("user is authenticated");
|
||||||
|
let state = db.rooms.room_state(&body.room_id).unwrap();
|
||||||
|
|
||||||
|
let mut event =
|
||||||
|
serde_json::from_value::<EventJson<ruma_events::room::member::MemberEventContent>>(
|
||||||
|
state
|
||||||
|
.get(&(EventType::RoomMember, user_id.to_string()))
|
||||||
|
.unwrap() // TODO: error handling
|
||||||
|
.content
|
||||||
|
.clone(),
|
||||||
|
)
|
||||||
|
.unwrap()
|
||||||
|
.deserialize()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
event.membership = ruma_events::room::member::MembershipState::Leave;
|
||||||
|
|
||||||
db.rooms
|
db.rooms
|
||||||
.append_pdu(
|
.append_pdu(
|
||||||
body.room_id.clone(),
|
body.room_id.clone(),
|
||||||
user_id.clone(),
|
user_id.clone(),
|
||||||
EventType::RoomMember,
|
EventType::RoomMember,
|
||||||
json!({"membership": "leave"}),
|
serde_json::to_value(event).unwrap(),
|
||||||
None,
|
None,
|
||||||
Some(user_id.to_string()),
|
Some(user_id.to_string()),
|
||||||
None,
|
None,
|
||||||
|
@ -1450,6 +1465,125 @@ pub fn leave_room_route(
|
||||||
MatrixResult(Ok(leave_room::Response))
|
MatrixResult(Ok(leave_room::Response))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[post("/_matrix/client/r0/rooms/<_room_id>/kick", data = "<body>")]
|
||||||
|
pub fn kick_user_route(
|
||||||
|
db: State<'_, Database>,
|
||||||
|
body: Ruma<kick_user::Request>,
|
||||||
|
_room_id: String,
|
||||||
|
) -> MatrixResult<kick_user::Response> {
|
||||||
|
let user_id = body.user_id.as_ref().expect("user is authenticated");
|
||||||
|
let state = db.rooms.room_state(&body.room_id).unwrap();
|
||||||
|
|
||||||
|
let mut event =
|
||||||
|
serde_json::from_value::<EventJson<ruma_events::room::member::MemberEventContent>>(
|
||||||
|
state
|
||||||
|
.get(&(EventType::RoomMember, user_id.to_string()))
|
||||||
|
.unwrap() // TODO: error handling
|
||||||
|
.content
|
||||||
|
.clone(),
|
||||||
|
)
|
||||||
|
.unwrap()
|
||||||
|
.deserialize()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
event.membership = ruma_events::room::member::MembershipState::Leave;
|
||||||
|
// TODO: reason
|
||||||
|
|
||||||
|
db.rooms
|
||||||
|
.append_pdu(
|
||||||
|
body.room_id.clone(),
|
||||||
|
user_id.clone(), // Sender
|
||||||
|
EventType::RoomMember,
|
||||||
|
serde_json::to_value(event).unwrap(),
|
||||||
|
None,
|
||||||
|
Some(body.body.user_id.to_string()),
|
||||||
|
None,
|
||||||
|
&db.globals,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
MatrixResult(Ok(kick_user::Response))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[post("/_matrix/client/r0/rooms/<_room_id>/ban", data = "<body>")]
|
||||||
|
pub fn ban_user_route(
|
||||||
|
db: State<'_, Database>,
|
||||||
|
body: Ruma<ban_user::Request>,
|
||||||
|
_room_id: String,
|
||||||
|
) -> MatrixResult<ban_user::Response> {
|
||||||
|
let user_id = body.user_id.as_ref().expect("user is authenticated");
|
||||||
|
let state = db.rooms.room_state(&body.room_id).unwrap();
|
||||||
|
|
||||||
|
let mut event =
|
||||||
|
serde_json::from_value::<EventJson<ruma_events::room::member::MemberEventContent>>(
|
||||||
|
state
|
||||||
|
.get(&(EventType::RoomMember, user_id.to_string()))
|
||||||
|
.unwrap() // TODO: error handling
|
||||||
|
.content
|
||||||
|
.clone(),
|
||||||
|
)
|
||||||
|
.unwrap()
|
||||||
|
.deserialize()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
event.membership = ruma_events::room::member::MembershipState::Ban;
|
||||||
|
// TODO: reason
|
||||||
|
|
||||||
|
db.rooms
|
||||||
|
.append_pdu(
|
||||||
|
body.room_id.clone(),
|
||||||
|
user_id.clone(), // Sender
|
||||||
|
EventType::RoomMember,
|
||||||
|
serde_json::to_value(event).unwrap(),
|
||||||
|
None,
|
||||||
|
Some(body.body.user_id.to_string()),
|
||||||
|
None,
|
||||||
|
&db.globals,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
MatrixResult(Ok(ban_user::Response))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[post("/_matrix/client/r0/rooms/<_room_id>/unban", data = "<body>")]
|
||||||
|
pub fn unban_user_route(
|
||||||
|
db: State<'_, Database>,
|
||||||
|
body: Ruma<unban_user::Request>,
|
||||||
|
_room_id: String,
|
||||||
|
) -> MatrixResult<unban_user::Response> {
|
||||||
|
let user_id = body.user_id.as_ref().expect("user is authenticated");
|
||||||
|
let state = db.rooms.room_state(&body.room_id).unwrap();
|
||||||
|
|
||||||
|
let mut event =
|
||||||
|
serde_json::from_value::<EventJson<ruma_events::room::member::MemberEventContent>>(
|
||||||
|
state
|
||||||
|
.get(&(EventType::RoomMember, user_id.to_string()))
|
||||||
|
.unwrap() // TODO: error handling
|
||||||
|
.content
|
||||||
|
.clone(),
|
||||||
|
)
|
||||||
|
.unwrap()
|
||||||
|
.deserialize()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
event.membership = ruma_events::room::member::MembershipState::Leave;
|
||||||
|
|
||||||
|
db.rooms
|
||||||
|
.append_pdu(
|
||||||
|
body.room_id.clone(),
|
||||||
|
user_id.clone(), // Sender
|
||||||
|
EventType::RoomMember,
|
||||||
|
serde_json::to_value(event).unwrap(),
|
||||||
|
None,
|
||||||
|
Some(body.body.user_id.to_string()),
|
||||||
|
None,
|
||||||
|
&db.globals,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
MatrixResult(Ok(unban_user::Response))
|
||||||
|
}
|
||||||
|
|
||||||
#[post("/_matrix/client/r0/rooms/<_room_id>/forget", data = "<body>")]
|
#[post("/_matrix/client/r0/rooms/<_room_id>/forget", data = "<body>")]
|
||||||
pub fn forget_room_route(
|
pub fn forget_room_route(
|
||||||
db: State<'_, Database>,
|
db: State<'_, Database>,
|
||||||
|
@ -1470,20 +1604,19 @@ pub fn invite_user_route(
|
||||||
_room_id: String,
|
_room_id: String,
|
||||||
) -> MatrixResult<invite_user::Response> {
|
) -> MatrixResult<invite_user::Response> {
|
||||||
if let invite_user::InvitationRecipient::UserId { user_id } = &body.recipient {
|
if let invite_user::InvitationRecipient::UserId { user_id } = &body.recipient {
|
||||||
let event = member::MemberEventContent {
|
|
||||||
membership: member::MembershipState::Invite,
|
|
||||||
displayname: db.users.displayname(&user_id).unwrap(),
|
|
||||||
avatar_url: db.users.avatar_url(&user_id).unwrap(),
|
|
||||||
is_direct: None,
|
|
||||||
third_party_invite: None,
|
|
||||||
};
|
|
||||||
|
|
||||||
db.rooms
|
db.rooms
|
||||||
.append_pdu(
|
.append_pdu(
|
||||||
body.room_id.clone(),
|
body.room_id.clone(),
|
||||||
body.user_id.clone().expect("user is authenticated"),
|
body.user_id.clone().expect("user is authenticated"),
|
||||||
EventType::RoomMember,
|
EventType::RoomMember,
|
||||||
serde_json::to_value(event).unwrap(),
|
serde_json::to_value(member::MemberEventContent {
|
||||||
|
membership: member::MembershipState::Invite,
|
||||||
|
displayname: db.users.displayname(&user_id).unwrap(),
|
||||||
|
avatar_url: db.users.avatar_url(&user_id).unwrap(),
|
||||||
|
is_direct: None,
|
||||||
|
third_party_invite: None,
|
||||||
|
})
|
||||||
|
.unwrap(),
|
||||||
None,
|
None,
|
||||||
Some(user_id.to_string()),
|
Some(user_id.to_string()),
|
||||||
None,
|
None,
|
||||||
|
@ -2302,8 +2435,7 @@ pub fn get_context_route(
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(base_event) = db.rooms.get_pdu(&body.event_id).unwrap() {
|
if let Some(base_event) = db.rooms.get_pdu(&body.event_id).unwrap() {
|
||||||
let base_event = base_event
|
let base_event = base_event.to_room_event();
|
||||||
.to_room_event();
|
|
||||||
|
|
||||||
let base_token = db
|
let base_token = db
|
||||||
.rooms
|
.rooms
|
||||||
|
@ -2358,7 +2490,7 @@ pub fn get_context_route(
|
||||||
.values()
|
.values()
|
||||||
.map(|pdu| pdu.to_state_event())
|
.map(|pdu| pdu.to_state_event())
|
||||||
.collect(),
|
.collect(),
|
||||||
}))
|
}))
|
||||||
} else {
|
} else {
|
||||||
MatrixResult(Err(Error {
|
MatrixResult(Err(Error {
|
||||||
kind: ErrorKind::Unknown,
|
kind: ErrorKind::Unknown,
|
||||||
|
@ -2384,9 +2516,9 @@ pub fn get_message_events_route(
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
match body.dir {
|
if let Ok(from) = body.from.clone().parse() {
|
||||||
get_message_events::Direction::Forward => {
|
match body.dir {
|
||||||
if let Ok(from) = body.from.clone().parse() {
|
get_message_events::Direction::Forward => {
|
||||||
let events_after = db
|
let events_after = db
|
||||||
.rooms
|
.rooms
|
||||||
.pdus_after(&body.room_id, from)
|
.pdus_after(&body.room_id, from)
|
||||||
|
@ -2410,16 +2542,8 @@ pub fn get_message_events_route(
|
||||||
chunk: events_after,
|
chunk: events_after,
|
||||||
state: Vec::new(),
|
state: Vec::new(),
|
||||||
}))
|
}))
|
||||||
} else {
|
|
||||||
MatrixResult(Err(Error {
|
|
||||||
kind: ErrorKind::Unknown,
|
|
||||||
message: "Invalid from.".to_owned(),
|
|
||||||
status_code: http::StatusCode::BAD_REQUEST,
|
|
||||||
}))
|
|
||||||
}
|
}
|
||||||
}
|
get_message_events::Direction::Backward => {
|
||||||
get_message_events::Direction::Backward => {
|
|
||||||
if let Ok(from) = body.from.clone().parse() {
|
|
||||||
let events_before = db
|
let events_before = db
|
||||||
.rooms
|
.rooms
|
||||||
.pdus_until(&body.room_id, from)
|
.pdus_until(&body.room_id, from)
|
||||||
|
@ -2443,16 +2567,15 @@ pub fn get_message_events_route(
|
||||||
chunk: events_before,
|
chunk: events_before,
|
||||||
state: Vec::new(),
|
state: Vec::new(),
|
||||||
}))
|
}))
|
||||||
} else {
|
|
||||||
MatrixResult(Err(Error {
|
|
||||||
kind: ErrorKind::Unknown,
|
|
||||||
message: "Invalid from.".to_owned(),
|
|
||||||
status_code: http::StatusCode::BAD_REQUEST,
|
|
||||||
}))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
MatrixResult(Err(Error {
|
||||||
|
kind: ErrorKind::Unknown,
|
||||||
|
message: "Invalid from.".to_owned(),
|
||||||
|
status_code: http::StatusCode::BAD_REQUEST,
|
||||||
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[get("/_matrix/client/r0/voip/turnServer")]
|
#[get("/_matrix/client/r0/voip/turnServer")]
|
||||||
|
|
|
@ -55,6 +55,9 @@ fn setup_rocket() -> rocket::Rocket {
|
||||||
client_server::join_room_by_id_or_alias_route,
|
client_server::join_room_by_id_or_alias_route,
|
||||||
client_server::leave_room_route,
|
client_server::leave_room_route,
|
||||||
client_server::forget_room_route,
|
client_server::forget_room_route,
|
||||||
|
client_server::kick_user_route,
|
||||||
|
client_server::ban_user_route,
|
||||||
|
client_server::unban_user_route,
|
||||||
client_server::invite_user_route,
|
client_server::invite_user_route,
|
||||||
client_server::set_room_visibility_route,
|
client_server::set_room_visibility_route,
|
||||||
client_server::get_room_visibility_route,
|
client_server::get_room_visibility_route,
|
||||||
|
|
|
@ -77,3 +77,4 @@ User appears in user directory
|
||||||
User directory correctly update on display name change
|
User directory correctly update on display name change
|
||||||
User in shared private room does appear in user directory
|
User in shared private room does appear in user directory
|
||||||
User in dir while user still shares private rooms
|
User in dir while user still shares private rooms
|
||||||
|
POST /rooms/:room_id/ban can ban a user
|
||||||
|
|
Loading…
Reference in a new issue