Upgrade Ruma
Co-authored-by: Timo Kösters <timo@koesters.xyz>
This commit is contained in:
parent
47f3263396
commit
09895a20c8
21 changed files with 628 additions and 623 deletions
|
@ -1,10 +1,9 @@
|
|||
use crate::{
|
||||
client_server,
|
||||
database::DatabaseGuard,
|
||||
pdu::{PduBuilder, PduEvent},
|
||||
pdu::{EventHash, PduBuilder, PduEvent},
|
||||
server_server, utils, ConduitResult, Database, Error, Result, Ruma,
|
||||
};
|
||||
use member::{MemberEventContent, MembershipState};
|
||||
use ruma::{
|
||||
api::{
|
||||
client::{
|
||||
|
@ -18,14 +17,17 @@ use ruma::{
|
|||
federation::{self, membership::create_invite},
|
||||
},
|
||||
events::{
|
||||
pdu::Pdu,
|
||||
room::{create::CreateEventContent, member},
|
||||
room::{
|
||||
create::RoomCreateEventContent,
|
||||
member::{MembershipState, RoomMemberEventContent},
|
||||
},
|
||||
EventType,
|
||||
},
|
||||
serde::{to_canonical_value, CanonicalJsonObject, CanonicalJsonValue, Raw},
|
||||
serde::{to_canonical_value, CanonicalJsonObject, CanonicalJsonValue},
|
||||
state_res::{self, RoomVersion},
|
||||
uint, EventId, RoomId, RoomVersionId, ServerName, UserId,
|
||||
};
|
||||
use serde_json::value::{to_raw_value, RawValue as RawJsonValue};
|
||||
use std::{
|
||||
collections::{hash_map::Entry, BTreeMap, HashMap, HashSet},
|
||||
convert::{TryFrom, TryInto},
|
||||
|
@ -204,7 +206,7 @@ pub async fn kick_user_route(
|
|||
) -> ConduitResult<kick_user::Response> {
|
||||
let sender_user = body.sender_user.as_ref().expect("user is authenticated");
|
||||
|
||||
let mut event = serde_json::from_value::<Raw<ruma::events::room::member::MemberEventContent>>(
|
||||
let mut event: RoomMemberEventContent = serde_json::from_str(
|
||||
db.rooms
|
||||
.room_state_get(
|
||||
&body.room_id,
|
||||
|
@ -216,13 +218,11 @@ pub async fn kick_user_route(
|
|||
"Cannot kick member that's not in the room.",
|
||||
))?
|
||||
.content
|
||||
.clone(),
|
||||
.get(),
|
||||
)
|
||||
.expect("Raw::from_value always works")
|
||||
.deserialize()
|
||||
.map_err(|_| Error::bad_database("Invalid member event in database."))?;
|
||||
|
||||
event.membership = ruma::events::room::member::MembershipState::Leave;
|
||||
event.membership = MembershipState::Leave;
|
||||
// TODO: reason
|
||||
|
||||
let mutex_state = Arc::clone(
|
||||
|
@ -238,7 +238,7 @@ pub async fn kick_user_route(
|
|||
db.rooms.build_and_append_pdu(
|
||||
PduBuilder {
|
||||
event_type: EventType::RoomMember,
|
||||
content: serde_json::to_value(event).expect("event is valid, we just created it"),
|
||||
content: to_raw_value(&event).expect("event is valid, we just created it"),
|
||||
unsigned: None,
|
||||
state_key: Some(body.user_id.to_string()),
|
||||
redacts: None,
|
||||
|
@ -280,8 +280,8 @@ pub async fn ban_user_route(
|
|||
&body.user_id.to_string(),
|
||||
)?
|
||||
.map_or(
|
||||
Ok::<_, Error>(member::MemberEventContent {
|
||||
membership: member::MembershipState::Ban,
|
||||
Ok::<_, Error>(RoomMemberEventContent {
|
||||
membership: MembershipState::Ban,
|
||||
displayname: db.users.displayname(&body.user_id)?,
|
||||
avatar_url: db.users.avatar_url(&body.user_id)?,
|
||||
is_direct: None,
|
||||
|
@ -290,13 +290,9 @@ pub async fn ban_user_route(
|
|||
reason: None,
|
||||
}),
|
||||
|event| {
|
||||
let mut event = serde_json::from_value::<Raw<member::MemberEventContent>>(
|
||||
event.content.clone(),
|
||||
)
|
||||
.expect("Raw::from_value always works")
|
||||
.deserialize()
|
||||
.map_err(|_| Error::bad_database("Invalid member event in database."))?;
|
||||
event.membership = ruma::events::room::member::MembershipState::Ban;
|
||||
let mut event = serde_json::from_str::<RoomMemberEventContent>(event.content.get())
|
||||
.map_err(|_| Error::bad_database("Invalid member event in database."))?;
|
||||
event.membership = MembershipState::Ban;
|
||||
Ok(event)
|
||||
},
|
||||
)?;
|
||||
|
@ -314,7 +310,7 @@ pub async fn ban_user_route(
|
|||
db.rooms.build_and_append_pdu(
|
||||
PduBuilder {
|
||||
event_type: EventType::RoomMember,
|
||||
content: serde_json::to_value(event).expect("event is valid, we just created it"),
|
||||
content: to_raw_value(&event).expect("event is valid, we just created it"),
|
||||
unsigned: None,
|
||||
state_key: Some(body.user_id.to_string()),
|
||||
redacts: None,
|
||||
|
@ -346,7 +342,7 @@ pub async fn unban_user_route(
|
|||
) -> ConduitResult<unban_user::Response> {
|
||||
let sender_user = body.sender_user.as_ref().expect("user is authenticated");
|
||||
|
||||
let mut event = serde_json::from_value::<Raw<ruma::events::room::member::MemberEventContent>>(
|
||||
let mut event = serde_json::from_str::<RoomMemberEventContent>(
|
||||
db.rooms
|
||||
.room_state_get(
|
||||
&body.room_id,
|
||||
|
@ -358,13 +354,11 @@ pub async fn unban_user_route(
|
|||
"Cannot unban a user who is not banned.",
|
||||
))?
|
||||
.content
|
||||
.clone(),
|
||||
.get(),
|
||||
)
|
||||
.expect("from_value::<Raw<..>> can never fail")
|
||||
.deserialize()
|
||||
.map_err(|_| Error::bad_database("Invalid member event in database."))?;
|
||||
|
||||
event.membership = ruma::events::room::member::MembershipState::Leave;
|
||||
event.membership = MembershipState::Leave;
|
||||
|
||||
let mutex_state = Arc::clone(
|
||||
db.globals
|
||||
|
@ -379,7 +373,7 @@ pub async fn unban_user_route(
|
|||
db.rooms.build_and_append_pdu(
|
||||
PduBuilder {
|
||||
event_type: EventType::RoomMember,
|
||||
content: serde_json::to_value(event).expect("event is valid, we just created it"),
|
||||
content: to_raw_value(&event).expect("event is valid, we just created it"),
|
||||
unsigned: None,
|
||||
state_key: Some(body.user_id.to_string()),
|
||||
redacts: None,
|
||||
|
@ -584,10 +578,9 @@ async fn join_room_by_id_helper(
|
|||
};
|
||||
|
||||
let mut join_event_stub =
|
||||
serde_json::from_str::<CanonicalJsonObject>(make_join_response.event.json().get())
|
||||
.map_err(|_| {
|
||||
Error::BadServerResponse("Invalid make_join event json received from server.")
|
||||
})?;
|
||||
serde_json::from_str::<CanonicalJsonObject>(make_join_response.event.get()).map_err(
|
||||
|_| Error::BadServerResponse("Invalid make_join event json received from server."),
|
||||
)?;
|
||||
|
||||
// TODO: Is origin needed?
|
||||
join_event_stub.insert(
|
||||
|
@ -604,8 +597,8 @@ async fn join_room_by_id_helper(
|
|||
);
|
||||
join_event_stub.insert(
|
||||
"content".to_owned(),
|
||||
to_canonical_value(member::MemberEventContent {
|
||||
membership: member::MembershipState::Join,
|
||||
to_canonical_value(RoomMemberEventContent {
|
||||
membership: MembershipState::Join,
|
||||
displayname: db.users.displayname(sender_user)?,
|
||||
avatar_url: db.users.avatar_url(sender_user)?,
|
||||
is_direct: None,
|
||||
|
@ -653,7 +646,7 @@ async fn join_room_by_id_helper(
|
|||
federation::membership::create_join_event::v2::Request {
|
||||
room_id,
|
||||
event_id: &event_id,
|
||||
pdu: PduEvent::convert_to_outgoing_federation_event(join_event.clone()),
|
||||
pdu: &PduEvent::convert_to_outgoing_federation_event(join_event.clone()),
|
||||
},
|
||||
)
|
||||
.await?;
|
||||
|
@ -756,8 +749,8 @@ async fn join_room_by_id_helper(
|
|||
// where events in the current room state do not exist
|
||||
db.rooms.set_room_state(room_id, statehashid)?;
|
||||
} else {
|
||||
let event = member::MemberEventContent {
|
||||
membership: member::MembershipState::Join,
|
||||
let event = RoomMemberEventContent {
|
||||
membership: MembershipState::Join,
|
||||
displayname: db.users.displayname(sender_user)?,
|
||||
avatar_url: db.users.avatar_url(sender_user)?,
|
||||
is_direct: None,
|
||||
|
@ -769,7 +762,7 @@ async fn join_room_by_id_helper(
|
|||
db.rooms.build_and_append_pdu(
|
||||
PduBuilder {
|
||||
event_type: EventType::RoomMember,
|
||||
content: serde_json::to_value(event).expect("event is valid, we just created it"),
|
||||
content: to_raw_value(&event).expect("event is valid, we just created it"),
|
||||
unsigned: None,
|
||||
state_key: Some(sender_user.to_string()),
|
||||
redacts: None,
|
||||
|
@ -789,12 +782,12 @@ async fn join_room_by_id_helper(
|
|||
}
|
||||
|
||||
fn validate_and_add_event_id(
|
||||
pdu: &Raw<Pdu>,
|
||||
pdu: &RawJsonValue,
|
||||
room_version: &RoomVersionId,
|
||||
pub_key_map: &RwLock<BTreeMap<String, BTreeMap<String, String>>>,
|
||||
db: &Database,
|
||||
) -> Result<(EventId, CanonicalJsonObject)> {
|
||||
let mut value = serde_json::from_str::<CanonicalJsonObject>(pdu.json().get()).map_err(|e| {
|
||||
let mut value = serde_json::from_str::<CanonicalJsonObject>(pdu.get()).map_err(|e| {
|
||||
error!("Invalid PDU in server response: {:?}: {:?}", pdu, e);
|
||||
Error::BadServerResponse("Invalid PDU in server response")
|
||||
})?;
|
||||
|
@ -884,9 +877,7 @@ pub(crate) async fn invite_helper<'a>(
|
|||
let create_event_content = create_event
|
||||
.as_ref()
|
||||
.map(|create_event| {
|
||||
serde_json::from_value::<Raw<CreateEventContent>>(create_event.content.clone())
|
||||
.expect("Raw::from_value always works.")
|
||||
.deserialize()
|
||||
serde_json::from_str::<RoomCreateEventContent>(create_event.content.get())
|
||||
.map_err(|e| {
|
||||
warn!("Invalid create event: {}", e);
|
||||
Error::bad_database("Invalid create event in db.")
|
||||
|
@ -910,7 +901,7 @@ pub(crate) async fn invite_helper<'a>(
|
|||
let room_version =
|
||||
RoomVersion::new(&room_version_id).expect("room version is supported");
|
||||
|
||||
let content = serde_json::to_value(MemberEventContent {
|
||||
let content = to_raw_value(&RoomMemberEventContent {
|
||||
avatar_url: None,
|
||||
displayname: None,
|
||||
is_direct: Some(is_direct),
|
||||
|
@ -946,7 +937,7 @@ pub(crate) async fn invite_helper<'a>(
|
|||
unsigned.insert("prev_content".to_owned(), prev_pdu.content.clone());
|
||||
unsigned.insert(
|
||||
"prev_sender".to_owned(),
|
||||
serde_json::to_value(&prev_pdu.sender).expect("UserId::to_value always works"),
|
||||
serde_json::from_str(prev_pdu.sender.as_str()).expect("UserId is valid string"),
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -967,11 +958,15 @@ pub(crate) async fn invite_helper<'a>(
|
|||
.map(|(_, pdu)| pdu.event_id.clone())
|
||||
.collect(),
|
||||
redacts: None,
|
||||
unsigned,
|
||||
hashes: ruma::events::pdu::EventHash {
|
||||
unsigned: if unsigned.is_empty() {
|
||||
None
|
||||
} else {
|
||||
Some(to_raw_value(&unsigned).expect("to_raw_value always works"))
|
||||
},
|
||||
hashes: EventHash {
|
||||
sha256: "aaa".to_owned(),
|
||||
},
|
||||
signatures: BTreeMap::new(),
|
||||
signatures: None,
|
||||
};
|
||||
|
||||
let auth_check = state_res::auth_check(
|
||||
|
@ -1035,11 +1030,11 @@ pub(crate) async fn invite_helper<'a>(
|
|||
&db.globals,
|
||||
user_id.server_name(),
|
||||
create_invite::v2::Request {
|
||||
room_id: room_id.clone(),
|
||||
event_id: expected_event_id.clone(),
|
||||
room_version: room_version_id,
|
||||
event: PduEvent::convert_to_outgoing_federation_event(pdu_json.clone()),
|
||||
invite_room_state,
|
||||
room_id,
|
||||
event_id: &expected_event_id,
|
||||
room_version: &room_version_id,
|
||||
event: &PduEvent::convert_to_outgoing_federation_event(pdu_json.clone()),
|
||||
invite_room_state: &invite_room_state,
|
||||
},
|
||||
)
|
||||
.await?;
|
||||
|
@ -1116,8 +1111,8 @@ pub(crate) async fn invite_helper<'a>(
|
|||
db.rooms.build_and_append_pdu(
|
||||
PduBuilder {
|
||||
event_type: EventType::RoomMember,
|
||||
content: serde_json::to_value(member::MemberEventContent {
|
||||
membership: member::MembershipState::Invite,
|
||||
content: to_raw_value(&RoomMemberEventContent {
|
||||
membership: MembershipState::Invite,
|
||||
displayname: db.users.displayname(user_id)?,
|
||||
avatar_url: db.users.avatar_url(user_id)?,
|
||||
is_direct: Some(is_direct),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue