base_client: Forward the sync response to our olm machine.
parent
2b389a8440
commit
8867b198f7
|
@ -375,7 +375,7 @@ impl AsyncClient {
|
||||||
timeout: sync_settings.timeout,
|
timeout: sync_settings.timeout,
|
||||||
};
|
};
|
||||||
|
|
||||||
let response = self.send(request).await?;
|
let mut response = self.send(request).await?;
|
||||||
|
|
||||||
for (room_id, room) in &response.rooms.join {
|
for (room_id, room) in &response.rooms.join {
|
||||||
let room_id = room_id.to_string();
|
let room_id = room_id.to_string();
|
||||||
|
@ -418,7 +418,7 @@ impl AsyncClient {
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut client = self.base_client.write().await;
|
let mut client = self.base_client.write().await;
|
||||||
client.receive_sync_response(&response);
|
client.receive_sync_response(&mut response).await;
|
||||||
|
|
||||||
Ok(response)
|
Ok(response)
|
||||||
}
|
}
|
||||||
|
|
|
@ -294,8 +294,20 @@ impl Client {
|
||||||
/// # Arguments
|
/// # Arguments
|
||||||
///
|
///
|
||||||
/// * `response` - The response that we received after a successful sync.
|
/// * `response` - The response that we received after a successful sync.
|
||||||
pub fn receive_sync_response(&mut self, response: &api::sync::sync_events::IncomingResponse) {
|
pub async fn receive_sync_response(
|
||||||
|
&mut self,
|
||||||
|
response: &mut api::sync::sync_events::IncomingResponse,
|
||||||
|
) {
|
||||||
self.sync_token = Some(response.next_batch.clone());
|
self.sync_token = Some(response.next_batch.clone());
|
||||||
|
|
||||||
|
#[cfg(feature = "encryption")]
|
||||||
|
{
|
||||||
|
let olm = self.olm.lock().await;
|
||||||
|
|
||||||
|
if let Some(o) = &*olm {
|
||||||
|
o.receive_sync_response(response);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Should account or one-time keys be uploaded to the server.
|
/// Should account or one-time keys be uploaded to the server.
|
||||||
|
|
|
@ -29,7 +29,11 @@ use serde_json::Value;
|
||||||
use ruma_client_api::r0::keys::{
|
use ruma_client_api::r0::keys::{
|
||||||
AlgorithmAndDeviceId, DeviceKeys, KeyAlgorithm, OneTimeKey, SignedKey,
|
AlgorithmAndDeviceId, DeviceKeys, KeyAlgorithm, OneTimeKey, SignedKey,
|
||||||
};
|
};
|
||||||
use ruma_events::Algorithm;
|
use ruma_client_api::r0::sync::sync_events::IncomingResponse as SyncResponse;
|
||||||
|
use ruma_events::{
|
||||||
|
to_device::{ToDevice as ToDeviceEvent, ToDeviceEncrypted, ToDeviceRoomKeyRequest},
|
||||||
|
Algorithm, EventResult,
|
||||||
|
};
|
||||||
use ruma_identifiers::{DeviceId, UserId};
|
use ruma_identifiers::{DeviceId, UserId};
|
||||||
|
|
||||||
pub type OneTimeKeys = HashMap<AlgorithmAndDeviceId, OneTimeKey>;
|
pub type OneTimeKeys = HashMap<AlgorithmAndDeviceId, OneTimeKey>;
|
||||||
|
@ -311,6 +315,54 @@ impl OlmMachine {
|
||||||
|
|
||||||
Ok((device_keys, one_time_keys))
|
Ok((device_keys, one_time_keys))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Decrypt a to-device event.
|
||||||
|
///
|
||||||
|
/// Returns a decrypted `ToDeviceEvent` if the decryption was successful,
|
||||||
|
/// an error indicating why decryption failed otherwise.
|
||||||
|
///
|
||||||
|
/// # Arguments
|
||||||
|
///
|
||||||
|
/// * `event` - The to-device event that should be decrypted.
|
||||||
|
fn decrypt_to_device_event(&self, _: &ToDeviceEncrypted) -> Result<ToDeviceEvent, ()> {
|
||||||
|
Err(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn handle_room_key_request(&self, _: &ToDeviceRoomKeyRequest) {
|
||||||
|
// TODO handle room key requests here.
|
||||||
|
}
|
||||||
|
|
||||||
|
fn handle_verification_event(&self, _: &ToDeviceEvent) {
|
||||||
|
// TODO handle to-device verification events here.
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn receive_sync_response(&self, response: &mut SyncResponse) {
|
||||||
|
for event in response.to_device.events.iter() {
|
||||||
|
let event = if let EventResult::Ok(e) = event {
|
||||||
|
e
|
||||||
|
} else {
|
||||||
|
// Skip invalid events.
|
||||||
|
// TODO log here
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
|
||||||
|
match event {
|
||||||
|
ToDeviceEvent::RoomEncrypted(e) => {
|
||||||
|
// TODO put the decrypted event into a vec so we can replace
|
||||||
|
// them in the sync response.
|
||||||
|
let _ = self.decrypt_to_device_event(e);
|
||||||
|
}
|
||||||
|
ToDeviceEvent::RoomKeyRequest(e) => self.handle_room_key_request(e),
|
||||||
|
ToDeviceEvent::KeyVerificationAccept(..)
|
||||||
|
| ToDeviceEvent::KeyVerificationCancel(..)
|
||||||
|
| ToDeviceEvent::KeyVerificationKey(..)
|
||||||
|
| ToDeviceEvent::KeyVerificationMac(..)
|
||||||
|
| ToDeviceEvent::KeyVerificationRequest(..)
|
||||||
|
| ToDeviceEvent::KeyVerificationStart(..) => self.handle_verification_event(event),
|
||||||
|
_ => continue,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|
Loading…
Reference in New Issue