|
|
|
@ -782,50 +782,53 @@ pub async fn send_transaction_message_route(
|
|
|
|
|
Edu::Receipt(receipt) => {
|
|
|
|
|
for (room_id, room_updates) in receipt.receipts {
|
|
|
|
|
for (user_id, user_updates) in room_updates.read {
|
|
|
|
|
if let Some((event_id, _)) = user_updates
|
|
|
|
|
.event_ids
|
|
|
|
|
.iter()
|
|
|
|
|
.filter_map(|id| {
|
|
|
|
|
if user_id.server_name() == sender_servername {
|
|
|
|
|
if let Some((event_id, _)) = user_updates
|
|
|
|
|
.event_ids
|
|
|
|
|
.iter()
|
|
|
|
|
.filter_map(|id| {
|
|
|
|
|
services()
|
|
|
|
|
.rooms
|
|
|
|
|
.timeline
|
|
|
|
|
.get_pdu_count(id)
|
|
|
|
|
.ok()
|
|
|
|
|
.flatten()
|
|
|
|
|
.map(|r| (id, r))
|
|
|
|
|
})
|
|
|
|
|
.max_by_key(|(_, count)| *count)
|
|
|
|
|
{
|
|
|
|
|
let mut user_receipts = BTreeMap::new();
|
|
|
|
|
user_receipts.insert(user_id.clone(), user_updates.data);
|
|
|
|
|
|
|
|
|
|
let mut receipts = BTreeMap::new();
|
|
|
|
|
receipts.insert(ReceiptType::Read, user_receipts);
|
|
|
|
|
|
|
|
|
|
let mut receipt_content = BTreeMap::new();
|
|
|
|
|
receipt_content.insert(event_id.to_owned(), receipts);
|
|
|
|
|
|
|
|
|
|
let event = ReceiptEvent {
|
|
|
|
|
content: ReceiptEventContent(receipt_content),
|
|
|
|
|
room_id: room_id.clone(),
|
|
|
|
|
};
|
|
|
|
|
services()
|
|
|
|
|
.rooms
|
|
|
|
|
.timeline
|
|
|
|
|
.get_pdu_count(id)
|
|
|
|
|
.ok()
|
|
|
|
|
.flatten()
|
|
|
|
|
.map(|r| (id, r))
|
|
|
|
|
})
|
|
|
|
|
.max_by_key(|(_, count)| *count)
|
|
|
|
|
{
|
|
|
|
|
let mut user_receipts = BTreeMap::new();
|
|
|
|
|
user_receipts.insert(user_id.clone(), user_updates.data);
|
|
|
|
|
|
|
|
|
|
let mut receipts = BTreeMap::new();
|
|
|
|
|
receipts.insert(ReceiptType::Read, user_receipts);
|
|
|
|
|
|
|
|
|
|
let mut receipt_content = BTreeMap::new();
|
|
|
|
|
receipt_content.insert(event_id.to_owned(), receipts);
|
|
|
|
|
|
|
|
|
|
let event = ReceiptEvent {
|
|
|
|
|
content: ReceiptEventContent(receipt_content),
|
|
|
|
|
room_id: room_id.clone(),
|
|
|
|
|
};
|
|
|
|
|
services()
|
|
|
|
|
.rooms
|
|
|
|
|
.edus
|
|
|
|
|
.read_receipt
|
|
|
|
|
.readreceipt_update(&user_id, &room_id, event)?;
|
|
|
|
|
} else {
|
|
|
|
|
// TODO fetch missing events
|
|
|
|
|
debug!("No known event ids in read receipt: {:?}", user_updates);
|
|
|
|
|
.edus
|
|
|
|
|
.read_receipt
|
|
|
|
|
.readreceipt_update(&user_id, &room_id, event)?;
|
|
|
|
|
} else {
|
|
|
|
|
// TODO fetch missing events
|
|
|
|
|
debug!("No known event ids in read receipt: {:?}", user_updates);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
Edu::Typing(typing) => {
|
|
|
|
|
if services()
|
|
|
|
|
.rooms
|
|
|
|
|
.state_cache
|
|
|
|
|
.is_joined(&typing.user_id, &typing.room_id)?
|
|
|
|
|
if typing.user_id.server_name() == sender_servername
|
|
|
|
|
&& services()
|
|
|
|
|
.rooms
|
|
|
|
|
.state_cache
|
|
|
|
|
.is_joined(&typing.user_id, &typing.room_id)?
|
|
|
|
|
{
|
|
|
|
|
if typing.typing {
|
|
|
|
|
services()
|
|
|
|
@ -849,7 +852,9 @@ pub async fn send_transaction_message_route(
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
Edu::DeviceListUpdate(DeviceListUpdateContent { user_id, .. }) => {
|
|
|
|
|
services().users.mark_device_key_update(&user_id)?;
|
|
|
|
|
if user_id.server_name() == sender_servername {
|
|
|
|
|
services().users.mark_device_key_update(&user_id)?;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
Edu::DirectToDevice(DirectDeviceContent {
|
|
|
|
|
sender,
|
|
|
|
@ -857,77 +862,75 @@ pub async fn send_transaction_message_route(
|
|
|
|
|
message_id,
|
|
|
|
|
messages,
|
|
|
|
|
}) => {
|
|
|
|
|
// Check if this is a new transaction id
|
|
|
|
|
if services()
|
|
|
|
|
.transaction_ids
|
|
|
|
|
.existing_txnid(&sender, None, &message_id)?
|
|
|
|
|
.is_some()
|
|
|
|
|
if sender.server_name() == sender_servername
|
|
|
|
|
// Check if this is a new transaction id
|
|
|
|
|
&& services()
|
|
|
|
|
.transaction_ids
|
|
|
|
|
.existing_txnid(&sender, None, &message_id)?
|
|
|
|
|
.is_none()
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (target_user_id, map) in &messages {
|
|
|
|
|
for (target_device_id_maybe, event) in map {
|
|
|
|
|
match target_device_id_maybe {
|
|
|
|
|
DeviceIdOrAllDevices::DeviceId(target_device_id) => {
|
|
|
|
|
services().users.add_to_device_event(
|
|
|
|
|
&sender,
|
|
|
|
|
target_user_id,
|
|
|
|
|
target_device_id,
|
|
|
|
|
&ev_type.to_string(),
|
|
|
|
|
event.deserialize_as().map_err(|e| {
|
|
|
|
|
warn!("To-Device event is invalid: {event:?} {e}");
|
|
|
|
|
Error::BadRequest(
|
|
|
|
|
ErrorKind::InvalidParam,
|
|
|
|
|
"Event is invalid",
|
|
|
|
|
)
|
|
|
|
|
})?,
|
|
|
|
|
)?
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DeviceIdOrAllDevices::AllDevices => {
|
|
|
|
|
for target_device_id in
|
|
|
|
|
services().users.all_device_ids(target_user_id)
|
|
|
|
|
{
|
|
|
|
|
for (target_user_id, map) in &messages {
|
|
|
|
|
for (target_device_id_maybe, event) in map {
|
|
|
|
|
match target_device_id_maybe {
|
|
|
|
|
DeviceIdOrAllDevices::DeviceId(target_device_id) => {
|
|
|
|
|
services().users.add_to_device_event(
|
|
|
|
|
&sender,
|
|
|
|
|
target_user_id,
|
|
|
|
|
&target_device_id?,
|
|
|
|
|
target_device_id,
|
|
|
|
|
&ev_type.to_string(),
|
|
|
|
|
event.deserialize_as().map_err(|_| {
|
|
|
|
|
event.deserialize_as().map_err(|e| {
|
|
|
|
|
warn!("To-Device event is invalid: {event:?} {e}");
|
|
|
|
|
Error::BadRequest(
|
|
|
|
|
ErrorKind::InvalidParam,
|
|
|
|
|
"Event is invalid",
|
|
|
|
|
)
|
|
|
|
|
})?,
|
|
|
|
|
)?;
|
|
|
|
|
)?
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DeviceIdOrAllDevices::AllDevices => {
|
|
|
|
|
for target_device_id in
|
|
|
|
|
services().users.all_device_ids(target_user_id)
|
|
|
|
|
{
|
|
|
|
|
services().users.add_to_device_event(
|
|
|
|
|
&sender,
|
|
|
|
|
target_user_id,
|
|
|
|
|
&target_device_id?,
|
|
|
|
|
&ev_type.to_string(),
|
|
|
|
|
event.deserialize_as().map_err(|_| {
|
|
|
|
|
Error::BadRequest(
|
|
|
|
|
ErrorKind::InvalidParam,
|
|
|
|
|
"Event is invalid",
|
|
|
|
|
)
|
|
|
|
|
})?,
|
|
|
|
|
)?;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Save transaction id with empty data
|
|
|
|
|
services()
|
|
|
|
|
.transaction_ids
|
|
|
|
|
.add_txnid(&sender, None, &message_id, &[])?;
|
|
|
|
|
// Save transaction id with empty data
|
|
|
|
|
services()
|
|
|
|
|
.transaction_ids
|
|
|
|
|
.add_txnid(&sender, None, &message_id, &[])?;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
Edu::SigningKeyUpdate(SigningKeyUpdateContent {
|
|
|
|
|
user_id,
|
|
|
|
|
master_key,
|
|
|
|
|
self_signing_key,
|
|
|
|
|
}) => {
|
|
|
|
|
if user_id.server_name() != sender_servername {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if let Some(master_key) = master_key {
|
|
|
|
|
services().users.add_cross_signing_keys(
|
|
|
|
|
&user_id,
|
|
|
|
|
&master_key,
|
|
|
|
|
&self_signing_key,
|
|
|
|
|
&None,
|
|
|
|
|
true,
|
|
|
|
|
)?;
|
|
|
|
|
if user_id.server_name() == sender_servername {
|
|
|
|
|
if let Some(master_key) = master_key {
|
|
|
|
|
services().users.add_cross_signing_keys(
|
|
|
|
|
&user_id,
|
|
|
|
|
&master_key,
|
|
|
|
|
&self_signing_key,
|
|
|
|
|
&None,
|
|
|
|
|
true,
|
|
|
|
|
)?;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
Edu::_Custom(_) => {}
|
|
|
|
|