mirror of
https://gitlab.com/famedly/conduit.git
synced 2024-11-17 10:48:18 -07:00
fix: room version warnings and other bugs when joining rooms
This commit is contained in:
parent
989d843c40
commit
3e2f742f30
@ -546,12 +546,6 @@ async fn join_room_by_id_helper(
|
|||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
let count = db.globals.next_count()?;
|
|
||||||
|
|
||||||
let mut pdu_id = room_id.as_bytes().to_vec();
|
|
||||||
pdu_id.push(0xff);
|
|
||||||
pdu_id.extend_from_slice(&count.to_be_bytes());
|
|
||||||
|
|
||||||
let pdu = PduEvent::from_id_val(&event_id, join_event.clone())
|
let pdu = PduEvent::from_id_val(&event_id, join_event.clone())
|
||||||
.map_err(|_| Error::BadServerResponse("Invalid join event PDU."))?;
|
.map_err(|_| Error::BadServerResponse("Invalid join event PDU."))?;
|
||||||
|
|
||||||
@ -579,36 +573,6 @@ async fn join_room_by_id_helper(
|
|||||||
|
|
||||||
db.rooms.add_pdu_outlier(&event_id, &value)?;
|
db.rooms.add_pdu_outlier(&event_id, &value)?;
|
||||||
if let Some(state_key) = &pdu.state_key {
|
if let Some(state_key) = &pdu.state_key {
|
||||||
if pdu.kind == EventType::RoomMember {
|
|
||||||
let target_user_id = UserId::try_from(state_key.clone()).map_err(|e| {
|
|
||||||
warn!(
|
|
||||||
"Invalid user id in send_join response: {}: {}",
|
|
||||||
state_key, e
|
|
||||||
);
|
|
||||||
Error::BadServerResponse("Invalid user id in send_join response.")
|
|
||||||
})?;
|
|
||||||
|
|
||||||
let invite_state = Vec::new(); // TODO add a few important events
|
|
||||||
|
|
||||||
// Update our membership info, we do this here incase a user is invited
|
|
||||||
// and immediately leaves we need the DB to record the invite event for auth
|
|
||||||
db.rooms.update_membership(
|
|
||||||
&pdu.room_id,
|
|
||||||
&target_user_id,
|
|
||||||
serde_json::from_value::<member::MembershipState>(
|
|
||||||
pdu.content
|
|
||||||
.get("membership")
|
|
||||||
.ok_or(Error::BadServerResponse("Invalid member event content"))?
|
|
||||||
.clone(),
|
|
||||||
)
|
|
||||||
.map_err(|_| {
|
|
||||||
Error::BadServerResponse("Invalid membership state content.")
|
|
||||||
})?,
|
|
||||||
&pdu.sender,
|
|
||||||
Some(invite_state),
|
|
||||||
db,
|
|
||||||
)?;
|
|
||||||
}
|
|
||||||
state.insert((pdu.kind.clone(), state_key.clone()), pdu.event_id.clone());
|
state.insert((pdu.kind.clone(), state_key.clone()), pdu.event_id.clone());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -648,10 +612,15 @@ async fn join_room_by_id_helper(
|
|||||||
// pdu without it's state. This is okay because append_pdu can't fail.
|
// pdu without it's state. This is okay because append_pdu can't fail.
|
||||||
let statehashid = db.rooms.append_to_state(&pdu, &db.globals)?;
|
let statehashid = db.rooms.append_to_state(&pdu, &db.globals)?;
|
||||||
|
|
||||||
|
let count = db.globals.next_count()?;
|
||||||
|
let mut pdu_id = room_id.as_bytes().to_vec();
|
||||||
|
pdu_id.push(0xff);
|
||||||
|
pdu_id.extend_from_slice(&count.to_be_bytes());
|
||||||
|
|
||||||
db.rooms.append_pdu(
|
db.rooms.append_pdu(
|
||||||
&pdu,
|
&pdu,
|
||||||
utils::to_canonical_object(&pdu).expect("Pdu is valid canonical object"),
|
utils::to_canonical_object(&pdu).expect("Pdu is valid canonical object"),
|
||||||
db.globals.next_count()?,
|
count,
|
||||||
pdu_id.into(),
|
pdu_id.into(),
|
||||||
&[pdu.event_id.clone()],
|
&[pdu.event_id.clone()],
|
||||||
db,
|
db,
|
||||||
|
@ -103,11 +103,6 @@ pub async fn sync_events_route(
|
|||||||
// The inner Option is None when there is an event, but there is no state hash associated
|
// The inner Option is None when there is an event, but there is no state hash associated
|
||||||
// with it. This can happen for the RoomCreate event, so all updates should arrive.
|
// with it. This can happen for the RoomCreate event, so all updates should arrive.
|
||||||
let first_pdu_before_since = db.rooms.pdus_until(sender_user, &room_id, since).next();
|
let first_pdu_before_since = db.rooms.pdus_until(sender_user, &room_id, since).next();
|
||||||
let pdus_after_since = db
|
|
||||||
.rooms
|
|
||||||
.pdus_after(sender_user, &room_id, since)
|
|
||||||
.next()
|
|
||||||
.is_some();
|
|
||||||
|
|
||||||
let since_shortstatehash = first_pdu_before_since.as_ref().map(|pdu| {
|
let since_shortstatehash = first_pdu_before_since.as_ref().map(|pdu| {
|
||||||
db.rooms
|
db.rooms
|
||||||
@ -121,7 +116,7 @@ pub async fn sync_events_route(
|
|||||||
invited_member_count,
|
invited_member_count,
|
||||||
joined_since_last_sync,
|
joined_since_last_sync,
|
||||||
state_events,
|
state_events,
|
||||||
) = if pdus_after_since && Some(current_shortstatehash) != since_shortstatehash {
|
) = if Some(current_shortstatehash) != since_shortstatehash {
|
||||||
let current_state = db.rooms.room_state_full(&room_id)?;
|
let current_state = db.rooms.room_state_full(&room_id)?;
|
||||||
let current_members = current_state
|
let current_members = current_state
|
||||||
.iter()
|
.iter()
|
||||||
@ -224,6 +219,7 @@ pub async fn sync_events_route(
|
|||||||
device_list_updates.insert(user_id);
|
device_list_updates.insert(user_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// TODO: Remove, this should never happen here, right?
|
||||||
(MembershipState::Join, MembershipState::Leave) => {
|
(MembershipState::Join, MembershipState::Leave) => {
|
||||||
// Write down users that have left encrypted rooms we are in
|
// Write down users that have left encrypted rooms we are in
|
||||||
left_encrypted_users.insert(user_id);
|
left_encrypted_users.insert(user_id);
|
||||||
|
@ -374,7 +374,7 @@ impl Rooms {
|
|||||||
|
|
||||||
for event_id in new_state.difference(&old_state) {
|
for event_id in new_state.difference(&old_state) {
|
||||||
if let Some(pdu) = self.get_pdu_json(event_id)? {
|
if let Some(pdu) = self.get_pdu_json(event_id)? {
|
||||||
if pdu.get("event_type").and_then(|val| val.as_str()) == Some("m.room.member") {
|
if pdu.get("type").and_then(|val| val.as_str()) == Some("m.room.member") {
|
||||||
if let Ok(pdu) = serde_json::from_value::<PduEvent>(
|
if let Ok(pdu) = serde_json::from_value::<PduEvent>(
|
||||||
serde_json::to_value(&pdu).expect("CanonicalJsonObj is a valid JsonValue"),
|
serde_json::to_value(&pdu).expect("CanonicalJsonObj is a valid JsonValue"),
|
||||||
) {
|
) {
|
||||||
@ -1158,6 +1158,9 @@ impl Rooms {
|
|||||||
) -> Result<Vec<Raw<AnyStrippedStateEvent>>> {
|
) -> Result<Vec<Raw<AnyStrippedStateEvent>>> {
|
||||||
let mut state = Vec::new();
|
let mut state = Vec::new();
|
||||||
// Add recommended events
|
// Add recommended events
|
||||||
|
if let Some(e) = self.room_state_get(&invite_event.room_id, &EventType::RoomCreate, "")? {
|
||||||
|
state.push(e.to_stripped_state_event());
|
||||||
|
}
|
||||||
if let Some(e) =
|
if let Some(e) =
|
||||||
self.room_state_get(&invite_event.room_id, &EventType::RoomJoinRules, "")?
|
self.room_state_get(&invite_event.room_id, &EventType::RoomJoinRules, "")?
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user