mirror of
https://forgejo.ellis.link/continuwuation/continuwuity.git
synced 2026-05-26 20:49:55 +00:00
refactor: Fix errors in api/client/membership/
This commit is contained in:
@@ -9,7 +9,7 @@ use futures::FutureExt;
|
|||||||
use ruma::{
|
use ruma::{
|
||||||
RoomId, UserId,
|
RoomId, UserId,
|
||||||
api::{
|
api::{
|
||||||
client::membership::invite_user,
|
client::membership::invite_user::{self, v3::InviteUserId},
|
||||||
federation::membership::{RawStrippedState, create_invite},
|
federation::membership::{RawStrippedState, create_invite},
|
||||||
},
|
},
|
||||||
events::room::member::{MembershipState, RoomMemberEventContent},
|
events::room::member::{MembershipState, RoomMemberEventContent},
|
||||||
@@ -52,7 +52,11 @@ pub(crate) async fn invite_user_route(
|
|||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
match &body.recipient {
|
match &body.recipient {
|
||||||
| invite_user::v3::InvitationRecipient::UserId { user_id: recipient_user } => {
|
| invite_user::v3::InvitationRecipient::UserId(InviteUserId {
|
||||||
|
user_id: recipient_user,
|
||||||
|
reason,
|
||||||
|
..
|
||||||
|
}) => {
|
||||||
let sender_filter_level = services
|
let sender_filter_level = services
|
||||||
.users
|
.users
|
||||||
.invite_filter_level(recipient_user, sender_user)
|
.invite_filter_level(recipient_user, sender_user)
|
||||||
@@ -96,7 +100,7 @@ pub(crate) async fn invite_user_route(
|
|||||||
sender_user,
|
sender_user,
|
||||||
recipient_user,
|
recipient_user,
|
||||||
&body.room_id,
|
&body.room_id,
|
||||||
body.reason.clone(),
|
reason.clone(),
|
||||||
false,
|
false,
|
||||||
)
|
)
|
||||||
.boxed()
|
.boxed()
|
||||||
@@ -200,10 +204,15 @@ pub(crate) async fn invite_helper(
|
|||||||
|
|
||||||
// We do not add the event_id field to the pdu here because of signature and
|
// We do not add the event_id field to the pdu here because of signature and
|
||||||
// hashes checks
|
// hashes checks
|
||||||
let (event_id, value) = gen_event_id_canonical_json(&response.event, &room_version_id)
|
let (event_id, value) = gen_event_id_canonical_json(
|
||||||
.map_err(|e| {
|
&response.event,
|
||||||
err!(Request(BadJson(warn!("Could not convert event to canonical JSON: {e}"))))
|
&room_version_id
|
||||||
})?;
|
.rules()
|
||||||
|
.expect("room version should have defined rules"),
|
||||||
|
)
|
||||||
|
.map_err(|e| {
|
||||||
|
err!(Request(BadJson(warn!("Could not convert event to canonical JSON: {e}"))))
|
||||||
|
})?;
|
||||||
|
|
||||||
if pdu.event_id != event_id {
|
if pdu.event_id != event_id {
|
||||||
return Err!(Request(BadJson(warn!(
|
return Err!(Request(BadJson(warn!(
|
||||||
|
|||||||
@@ -24,10 +24,8 @@ use ruma::{
|
|||||||
CanonicalJsonObject, CanonicalJsonValue, OwnedRoomId, OwnedServerName, OwnedUserId, RoomId,
|
CanonicalJsonObject, CanonicalJsonValue, OwnedRoomId, OwnedServerName, OwnedUserId, RoomId,
|
||||||
RoomVersionId, UserId,
|
RoomVersionId, UserId,
|
||||||
api::{
|
api::{
|
||||||
client::{
|
client::membership::{join_room_by_id, join_room_by_id_or_alias},
|
||||||
error::ErrorKind,
|
error::{ErrorKind, IncompatibleRoomVersionErrorData},
|
||||||
membership::{join_room_by_id, join_room_by_id_or_alias},
|
|
||||||
},
|
|
||||||
federation::{self},
|
federation::{self},
|
||||||
},
|
},
|
||||||
canonical_json::to_canonical_value,
|
canonical_json::to_canonical_value,
|
||||||
@@ -379,12 +377,15 @@ async fn join_room_by_id_helper_remote(
|
|||||||
|
|
||||||
info!("make_join finished");
|
info!("make_join finished");
|
||||||
|
|
||||||
let room_version_id = make_join_response.room_version.unwrap_or(RoomVersionId::V1);
|
let room_version = make_join_response.room_version.unwrap_or(RoomVersionId::V1);
|
||||||
|
let room_version_rules = room_version
|
||||||
|
.rules()
|
||||||
|
.expect("room version should have defined rules");
|
||||||
|
|
||||||
if !services.server.supported_room_version(&room_version_id) {
|
if !services.server.supported_room_version(&room_version) {
|
||||||
// How did we get here?
|
// How did we get here?
|
||||||
return Err!(BadServerResponse(
|
return Err!(BadServerResponse(
|
||||||
"Remote room version {room_version_id} is not supported by conduwuit"
|
"Remote room version {room_version} is not supported by conduwuit"
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -397,7 +398,7 @@ async fn join_room_by_id_helper_remote(
|
|||||||
|
|
||||||
let join_authorized_via_users_server = {
|
let join_authorized_via_users_server = {
|
||||||
use RoomVersionId::*;
|
use RoomVersionId::*;
|
||||||
if !matches!(room_version_id, V1 | V2 | V3 | V4 | V5 | V6 | V7) {
|
if !matches!(room_version, V1 | V2 | V3 | V4 | V5 | V6 | V7) {
|
||||||
join_event_stub
|
join_event_stub
|
||||||
.get("content")
|
.get("content")
|
||||||
.map(|s| {
|
.map(|s| {
|
||||||
@@ -432,23 +433,17 @@ async fn join_room_by_id_helper_remote(
|
|||||||
to_canonical_value(join_content).expect("event is valid, we just created it"),
|
to_canonical_value(join_content).expect("event is valid, we just created it"),
|
||||||
);
|
);
|
||||||
|
|
||||||
// We keep the "event_id" in the pdu only in v1 or
|
// Remove event id if it exists
|
||||||
// v2 rooms
|
join_event_stub.remove("event_id");
|
||||||
match room_version_id {
|
|
||||||
| RoomVersionId::V1 | RoomVersionId::V2 => {},
|
|
||||||
| _ => {
|
|
||||||
join_event_stub.remove("event_id");
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
// In order to create a compatible ref hash (EventID) the `hashes` field needs
|
// In order to create a compatible ref hash (EventID) the `hashes` field needs
|
||||||
// to be present
|
// to be present
|
||||||
services
|
services
|
||||||
.server_keys
|
.server_keys
|
||||||
.hash_and_sign_event(&mut join_event_stub, &room_version_id)?;
|
.hash_and_sign_event(&mut join_event_stub, &room_version_rules)?;
|
||||||
|
|
||||||
// Generate event id
|
// Generate event id
|
||||||
let event_id = gen_event_id(&join_event_stub, &room_version_id)?;
|
let event_id = gen_event_id(&join_event_stub, &room_version_rules)?;
|
||||||
|
|
||||||
// Add event_id back
|
// Add event_id back
|
||||||
join_event_stub
|
join_event_stub
|
||||||
@@ -489,7 +484,7 @@ async fn join_room_by_id_helper_remote(
|
|||||||
);
|
);
|
||||||
|
|
||||||
let (signed_event_id, signed_value) =
|
let (signed_event_id, signed_value) =
|
||||||
gen_event_id_canonical_json(signed_raw, &room_version_id).map_err(|e| {
|
gen_event_id_canonical_json(signed_raw, &room_version_rules).map_err(|e| {
|
||||||
err!(Request(BadJson(warn!(
|
err!(Request(BadJson(warn!(
|
||||||
"Could not convert event to canonical JSON: {e}"
|
"Could not convert event to canonical JSON: {e}"
|
||||||
))))
|
))))
|
||||||
@@ -564,7 +559,7 @@ async fn join_room_by_id_helper_remote(
|
|||||||
.then(|pdu| {
|
.then(|pdu| {
|
||||||
services
|
services
|
||||||
.server_keys
|
.server_keys
|
||||||
.validate_and_add_event_id_no_fetch(pdu, &room_version_id)
|
.validate_and_add_event_id_no_fetch(pdu, &room_version_rules)
|
||||||
.inspect_err(|e| {
|
.inspect_err(|e| {
|
||||||
debug_warn!("Could not validate send_join response room_state event: {e:?}");
|
debug_warn!("Could not validate send_join response room_state event: {e:?}");
|
||||||
})
|
})
|
||||||
@@ -612,7 +607,7 @@ async fn join_room_by_id_helper_remote(
|
|||||||
.then(|pdu| {
|
.then(|pdu| {
|
||||||
services
|
services
|
||||||
.server_keys
|
.server_keys
|
||||||
.validate_and_add_event_id_no_fetch(pdu, &room_version_id)
|
.validate_and_add_event_id_no_fetch(pdu, &room_version_rules)
|
||||||
})
|
})
|
||||||
.ready_filter_map(Result::ok)
|
.ready_filter_map(Result::ok)
|
||||||
.ready_for_each(|(event_id, value)| {
|
.ready_for_each(|(event_id, value)| {
|
||||||
@@ -633,7 +628,7 @@ async fn join_room_by_id_helper_remote(
|
|||||||
};
|
};
|
||||||
|
|
||||||
let auth_check = state_res::event_auth::auth_check(
|
let auth_check = state_res::event_auth::auth_check(
|
||||||
&room_version_id.rules().unwrap(),
|
&room_version.rules().unwrap(),
|
||||||
&parsed_join_pdu,
|
&parsed_join_pdu,
|
||||||
None, // TODO: third party invite
|
None, // TODO: third party invite
|
||||||
|k, s| state_fetch(k.clone(), s.into()),
|
|k, s| state_fetch(k.clone(), s.into()),
|
||||||
@@ -857,7 +852,10 @@ async fn make_join_request(
|
|||||||
rules, but is unable to authorise a join for us. Will continue trying."
|
rules, but is unable to authorise a join for us. Will continue trying."
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
| ErrorKind::IncompatibleRoomVersion { room_version } => {
|
| ErrorKind::IncompatibleRoomVersion(IncompatibleRoomVersionErrorData {
|
||||||
|
room_version,
|
||||||
|
..
|
||||||
|
}) => {
|
||||||
warn!(
|
warn!(
|
||||||
"{remote_server} reports the room we are trying to join is \
|
"{remote_server} reports the room we are trying to join is \
|
||||||
v{room_version}, which we do not support."
|
v{room_version}, which we do not support."
|
||||||
|
|||||||
@@ -1,9 +1,6 @@
|
|||||||
use axum::extract::State;
|
use axum::extract::State;
|
||||||
use conduwuit::{Err, Result, matrix::pdu::PduBuilder};
|
use conduwuit::{Err, Result, matrix::pdu::PduBuilder};
|
||||||
use ruma::{
|
use ruma::{api::client::membership::kick_user, events::room::member::MembershipState};
|
||||||
api::client::membership::kick_user,
|
|
||||||
events::room::member::{MembershipState, RoomMemberEventContent},
|
|
||||||
};
|
|
||||||
|
|
||||||
use crate::Ruma;
|
use crate::Ruma;
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ use conduwuit::{
|
|||||||
use futures::{FutureExt, StreamExt};
|
use futures::{FutureExt, StreamExt};
|
||||||
use ruma::{
|
use ruma::{
|
||||||
CanonicalJsonObject, CanonicalJsonValue, OwnedEventId, OwnedRoomId, OwnedServerName,
|
CanonicalJsonObject, CanonicalJsonValue, OwnedEventId, OwnedRoomId, OwnedServerName,
|
||||||
OwnedUserId, RoomId, RoomVersionId, UserId,
|
OwnedUserId, RoomId, UserId,
|
||||||
api::{
|
api::{
|
||||||
client::knock::knock_room,
|
client::knock::knock_room,
|
||||||
federation::{self},
|
federation::{self},
|
||||||
@@ -334,17 +334,12 @@ async fn knock_room_helper_local(
|
|||||||
) -> Result {
|
) -> Result {
|
||||||
debug_info!("We can knock locally");
|
debug_info!("We can knock locally");
|
||||||
|
|
||||||
let room_version_id = services.rooms.state.get_room_version(room_id).await?;
|
let room_version = services.rooms.state.get_room_version(room_id).await?;
|
||||||
|
let room_version_rules = room_version
|
||||||
|
.rules()
|
||||||
|
.expect("room version should have defined rules");
|
||||||
|
|
||||||
if matches!(
|
if !room_version_rules.authorization.knocking {
|
||||||
room_version_id,
|
|
||||||
RoomVersionId::V1
|
|
||||||
| RoomVersionId::V2
|
|
||||||
| RoomVersionId::V3
|
|
||||||
| RoomVersionId::V4
|
|
||||||
| RoomVersionId::V5
|
|
||||||
| RoomVersionId::V6
|
|
||||||
) {
|
|
||||||
return Err!(Request(Forbidden("This room does not support knocking.")));
|
return Err!(Request(Forbidden("This room does not support knocking.")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -374,19 +369,18 @@ async fn knock_room_helper_local(
|
|||||||
return Err(error);
|
return Err(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
warn!("We couldn't do the knock locally, maybe federation can help to satisfy the knock");
|
|
||||||
|
|
||||||
let (make_knock_response, remote_server) =
|
let (make_knock_response, remote_server) =
|
||||||
make_knock_request(services, sender_user, room_id, servers).await?;
|
make_knock_request(services, sender_user, room_id, servers).await?;
|
||||||
|
|
||||||
info!("make_knock finished");
|
info!("make_knock finished");
|
||||||
|
|
||||||
let room_version_id = make_knock_response.room_version;
|
let room_version = make_knock_response.room_version;
|
||||||
|
let room_version_rules = room_version
|
||||||
|
.rules()
|
||||||
|
.expect("room version should have defined rules");
|
||||||
|
|
||||||
if !services.server.supported_room_version(&room_version_id) {
|
if !services.server.supported_room_version(&room_version) {
|
||||||
return Err!(BadServerResponse(
|
return Err!(BadServerResponse("Remote room version {room_version} is not supported"));
|
||||||
"Remote room version {room_version_id} is not supported by conduwuit"
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut knock_event_stub = serde_json::from_str::<CanonicalJsonObject>(
|
let mut knock_event_stub = serde_json::from_str::<CanonicalJsonObject>(
|
||||||
@@ -424,10 +418,10 @@ async fn knock_room_helper_local(
|
|||||||
// to be present
|
// to be present
|
||||||
services
|
services
|
||||||
.server_keys
|
.server_keys
|
||||||
.hash_and_sign_event(&mut knock_event_stub, &room_version_id)?;
|
.hash_and_sign_event(&mut knock_event_stub, &room_version_rules)?;
|
||||||
|
|
||||||
// Generate event id
|
// Generate event id
|
||||||
let event_id = gen_event_id(&knock_event_stub, &room_version_id)?;
|
let event_id = gen_event_id(&knock_event_stub, &room_version_rules)?;
|
||||||
|
|
||||||
// Add event_id
|
// Add event_id
|
||||||
knock_event_stub
|
knock_event_stub
|
||||||
@@ -506,11 +500,14 @@ async fn knock_room_helper_remote(
|
|||||||
|
|
||||||
info!("make_knock finished");
|
info!("make_knock finished");
|
||||||
|
|
||||||
let room_version_id = make_knock_response.room_version;
|
let room_version = make_knock_response.room_version;
|
||||||
|
let room_version_rules = room_version
|
||||||
|
.rules()
|
||||||
|
.expect("room version should have defined rules");
|
||||||
|
|
||||||
if !services.server.supported_room_version(&room_version_id) {
|
if !services.server.supported_room_version(&room_version) {
|
||||||
return Err!(BadServerResponse(
|
return Err!(BadServerResponse(
|
||||||
"Remote room version {room_version_id} is not supported by conduwuit"
|
"Remote room version {room_version} is not supported by conduwuit"
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -547,10 +544,10 @@ async fn knock_room_helper_remote(
|
|||||||
// to be present
|
// to be present
|
||||||
services
|
services
|
||||||
.server_keys
|
.server_keys
|
||||||
.hash_and_sign_event(&mut knock_event_stub, &room_version_id)?;
|
.hash_and_sign_event(&mut knock_event_stub, &room_version_rules)?;
|
||||||
|
|
||||||
// Generate event id
|
// Generate event id
|
||||||
let event_id = gen_event_id(&knock_event_stub, &room_version_id)?;
|
let event_id = gen_event_id(&knock_event_stub, &room_version_rules)?;
|
||||||
|
|
||||||
// Add event_id
|
// Add event_id
|
||||||
knock_event_stub
|
knock_event_stub
|
||||||
@@ -625,7 +622,7 @@ async fn knock_room_helper_remote(
|
|||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
|
|
||||||
let event_id = gen_event_id(&event, &room_version_id)?;
|
let event_id = gen_event_id(&event, &room_version_rules)?;
|
||||||
let shortstatekey = services
|
let shortstatekey = services
|
||||||
.rooms
|
.rooms
|
||||||
.short
|
.short
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ use conduwuit::{
|
|||||||
};
|
};
|
||||||
use futures::{FutureExt, StreamExt, pin_mut};
|
use futures::{FutureExt, StreamExt, pin_mut};
|
||||||
use ruma::{
|
use ruma::{
|
||||||
CanonicalJsonObject, CanonicalJsonValue, OwnedServerName, RoomId, RoomVersionId, UserId,
|
CanonicalJsonObject, CanonicalJsonValue, OwnedServerName, RoomId, UserId,
|
||||||
api::{
|
api::{
|
||||||
client::membership::leave_room,
|
client::membership::leave_room,
|
||||||
federation::{self},
|
federation::{self},
|
||||||
@@ -323,6 +323,10 @@ pub async fn remote_leave_room<S: ::std::hash::BuildHasher>(
|
|||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let room_version_rules = room_version_id
|
||||||
|
.rules()
|
||||||
|
.expect("room version should have defined rules");
|
||||||
|
|
||||||
let mut leave_event_stub = serde_json::from_str::<CanonicalJsonObject>(
|
let mut leave_event_stub = serde_json::from_str::<CanonicalJsonObject>(
|
||||||
make_leave_response.event.get(),
|
make_leave_response.event.get(),
|
||||||
)
|
)
|
||||||
@@ -360,21 +364,16 @@ pub async fn remote_leave_room<S: ::std::hash::BuildHasher>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// room v3 and above removed the "event_id" field from remote PDU format
|
// room v3 and above removed the "event_id" field from remote PDU format
|
||||||
match room_version_id {
|
leave_event_stub.remove("event_id");
|
||||||
| RoomVersionId::V1 | RoomVersionId::V2 => {},
|
|
||||||
| _ => {
|
|
||||||
leave_event_stub.remove("event_id");
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
// In order to create a compatible ref hash (EventID) the `hashes` field needs
|
// In order to create a compatible ref hash (EventID) the `hashes` field needs
|
||||||
// to be present
|
// to be present
|
||||||
services
|
services
|
||||||
.server_keys
|
.server_keys
|
||||||
.hash_and_sign_event(&mut leave_event_stub, &room_version_id)?;
|
.hash_and_sign_event(&mut leave_event_stub, &room_version_rules)?;
|
||||||
|
|
||||||
// Generate event id
|
// Generate event id
|
||||||
let event_id = gen_event_id(&leave_event_stub, &room_version_id)?;
|
let event_id = gen_event_id(&leave_event_stub, &room_version_rules)?;
|
||||||
|
|
||||||
// Add event_id back
|
// Add event_id back
|
||||||
leave_event_stub
|
leave_event_stub
|
||||||
|
|||||||
Reference in New Issue
Block a user