add feature for smElement client hacks

Signed-off-by: strawberry <strawberry@puppygock.gay>
This commit is contained in:
strawberry 2024-03-23 23:13:40 -04:00 committed by June
parent 55813e90bf
commit f4146de17d
4 changed files with 59 additions and 50 deletions

View file

@ -277,7 +277,7 @@ hyperlocal = { git = "https://github.com/softprops/hyperlocal", rev = "2ee4d1496
[features] [features]
default = ["conduit_bin", "backend_rocksdb", "systemd"] default = ["conduit_bin", "backend_rocksdb", "systemd", "element_hacks"]
conduit_bin = ["axum"] conduit_bin = ["axum"]
backend_sqlite = ["sqlite"] backend_sqlite = ["sqlite"]
backend_rocksdb = ["rocksdb"] backend_rocksdb = ["rocksdb"]
@ -303,6 +303,11 @@ perf_measurements = [
"opentelemetry-jaeger", "opentelemetry-jaeger",
] ]
# client/server interopability hacks
#
## element has various non-spec compliant behaviour
element_hacks = []
[[bin]] [[bin]]
name = "conduit" name = "conduit"

View file

@ -189,18 +189,20 @@ pub async fn get_message_events_route(
.collect(); .collect();
for (_, event) in &events_after { for (_, event) in &events_after {
/* TODO: Remove this when these are resolved: /* TODO: Remove the not "element_hacks" check when these are resolved:
* https://github.com/vector-im/element-android/issues/3417 * https://github.com/vector-im/element-android/issues/3417
* https://github.com/vector-im/element-web/issues/21034 * https://github.com/vector-im/element-web/issues/21034
if !services().rooms.lazy_loading.lazy_load_was_sent_before( */
sender_user, if !cfg!(features = "element_hacks")
sender_device, && !services().rooms.lazy_loading.lazy_load_was_sent_before(
&body.room_id, sender_user,
&event.sender, sender_device,
)? { &body.room_id,
&event.sender,
)? {
lazy_loaded.insert(event.sender.clone()); lazy_loaded.insert(event.sender.clone());
} }
*/
lazy_loaded.insert(event.sender.clone()); lazy_loaded.insert(event.sender.clone());
} }
@ -231,18 +233,20 @@ pub async fn get_message_events_route(
.collect(); .collect();
for (_, event) in &events_before { for (_, event) in &events_before {
/* TODO: Remove this when these are resolved: /* TODO: Remove the not "element_hacks" check when these are resolved:
* https://github.com/vector-im/element-android/issues/3417 * https://github.com/vector-im/element-android/issues/3417
* https://github.com/vector-im/element-web/issues/21034 * https://github.com/vector-im/element-web/issues/21034
if !services().rooms.lazy_loading.lazy_load_was_sent_before( */
sender_user, if !cfg!(features = "element_hacks")
sender_device, && !services().rooms.lazy_loading.lazy_load_was_sent_before(
&body.room_id, sender_user,
&event.sender, sender_device,
)? { &body.room_id,
&event.sender,
)? {
lazy_loaded.insert(event.sender.clone()); lazy_loaded.insert(event.sender.clone());
} }
*/
lazy_loaded.insert(event.sender.clone()); lazy_loaded.insert(event.sender.clone());
} }

View file

@ -298,7 +298,7 @@ async fn sync_helper(
|| event_type != StateEventType::RoomMember || event_type != StateEventType::RoomMember
|| full_state || full_state
// TODO: Delete the following line when this is resolved: https://github.com/vector-im/element-web/issues/22565 // TODO: Delete the following line when this is resolved: https://github.com/vector-im/element-web/issues/22565
|| *sender_user == state_key || (cfg!(features = "element_hacks") && *sender_user == state_key)
{ {
let Some(pdu) = services().rooms.timeline.get_pdu(&id)? else { let Some(pdu) = services().rooms.timeline.get_pdu(&id)? else {
error!("Pdu in state not found: {}", id); error!("Pdu in state not found: {}", id);
@ -627,7 +627,7 @@ async fn load_joined_room(
|| full_state || full_state
|| timeline_users.contains(&state_key) || timeline_users.contains(&state_key)
// TODO: Delete the following line when this is resolved: https://github.com/vector-im/element-web/issues/22565 // TODO: Delete the following line when this is resolved: https://github.com/vector-im/element-web/issues/22565
|| *sender_user == state_key || (cfg!(features = "element_hacks") && *sender_user == state_key)
{ {
let pdu = match services().rooms.timeline.get_pdu(&id)? { let pdu = match services().rooms.timeline.get_pdu(&id)? {
Some(pdu) => pdu, Some(pdu) => pdu,
@ -966,6 +966,9 @@ fn share_encrypted_room(sender_user: &UserId, user_id: &UserId, ignore_room: &Ro
.any(|encrypted| encrypted)) .any(|encrypted| encrypted))
} }
/// POST `/_matrix/client/unstable/org.matrix.msc3575/sync`
///
/// Sliding Sync endpoint (future endpoint: `/_matrix/client/v4/sync`)
pub async fn sync_events_v4_route( pub async fn sync_events_v4_route(
body: Ruma<sync_events::v4::Request>, body: Ruma<sync_events::v4::Request>,
) -> Result<sync_events::v4::Response, RumaResponse<UiaaResponse>> { ) -> Result<sync_events::v4::Response, RumaResponse<UiaaResponse>> {

View file

@ -316,43 +316,40 @@ impl Service {
continue; continue;
} }
let event: AnySyncEphemeralRoomEvent = serde_json::from_str(read_receipt.json().get()) let event = serde_json::from_str(read_receipt.json().get())
.map_err(|_| Error::bad_database("Invalid edu event in read_receipts."))?; .map_err(|_| Error::bad_database("Invalid edu event in read_receipts."))?;
let federation_event = match event { let federation_event = if let AnySyncEphemeralRoomEvent::Receipt(r) = event {
AnySyncEphemeralRoomEvent::Receipt(r) => { let mut read = BTreeMap::new();
let mut read = BTreeMap::new();
let (event_id, mut receipt) = let (event_id, mut receipt) =
r.content.0.into_iter().next().expect("we only use one event per read receipt"); r.content.0.into_iter().next().expect("we only use one event per read receipt");
let receipt = receipt let receipt = receipt
.remove(&ReceiptType::Read) .remove(&ReceiptType::Read)
.expect("our read receipts always set this") .expect("our read receipts always set this")
.remove(&user_id) .remove(&user_id)
.expect("our read receipts always have the user here"); .expect("our read receipts always have the user here");
read.insert( read.insert(
user_id, user_id,
ReceiptData { ReceiptData {
data: receipt.clone(), data: receipt.clone(),
event_ids: vec![event_id.clone()], event_ids: vec![event_id.clone()],
}, },
); );
let receipt_map = ReceiptMap { let receipt_map = ReceiptMap {
read, read,
}; };
let mut receipts = BTreeMap::new(); let mut receipts = BTreeMap::new();
receipts.insert(room_id.clone(), receipt_map); receipts.insert(room_id.clone(), receipt_map);
Edu::Receipt(ReceiptContent { Edu::Receipt(ReceiptContent {
receipts, receipts,
}) })
}, } else {
_ => { Error::bad_database("Invalid event type in read_receipts");
Error::bad_database("Invalid event type in read_receipts"); continue;
continue;
},
}; };
events.push(serde_json::to_vec(&federation_event).expect("json can be serialized")); events.push(serde_json::to_vec(&federation_event).expect("json can be serialized"));