add feature for smElement client hacks
Signed-off-by: strawberry <strawberry@puppygock.gay>
This commit is contained in:
parent
55813e90bf
commit
f4146de17d
4 changed files with 59 additions and 50 deletions
|
@ -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"
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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>> {
|
||||||
|
|
|
@ -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"));
|
||||||
|
|
Loading…
Add table
Reference in a new issue