crypto: Connect the responding to secret request logic

This commit is contained in:
Damir Jelić 2021-08-10 15:54:30 +02:00
parent 4f46212d1a
commit da82fbab4f
3 changed files with 28 additions and 16 deletions

View file

@ -137,7 +137,6 @@ impl GossipMachine {
} }
} }
#[allow(dead_code)]
pub fn receive_incoming_secret_request( pub fn receive_incoming_secret_request(
&self, &self,
event: &ToDeviceEvent<SecretRequestEventContent>, event: &ToDeviceEvent<SecretRequestEventContent>,
@ -169,11 +168,7 @@ impl GossipMachine {
/// Store the key share request for later, once we get an Olm session with /// Store the key share request for later, once we get an Olm session with
/// the given device [`retry_keyshare`](#method.retry_keyshare) should be /// the given device [`retry_keyshare`](#method.retry_keyshare) should be
/// called. /// called.
fn handle_key_share_without_session( fn handle_key_share_without_session(&self, device: Device, event: RequestEvent) {
&self,
device: Device,
event: &ToDeviceEvent<RoomKeyRequestToDeviceEventContent>,
) {
self.users_for_key_claim self.users_for_key_claim
.entry(device.user_id().to_owned()) .entry(device.user_id().to_owned())
.or_insert_with(DashSet::new) .or_insert_with(DashSet::new)
@ -226,7 +221,7 @@ impl GossipMachine {
let content = if let Some(secret) = self.store.export_secret(secret_name).await { let content = if let Some(secret) = self.store.export_secret(secret_name).await {
SecretSendEventContent::new(event.content.request_id.to_owned(), secret) SecretSendEventContent::new(event.content.request_id.to_owned(), secret)
} else { } else {
info!(secret_name =? secret_name, "Can't server a secret request, secret isn't found"); info!(secret_name =? secret_name, "Can't serve a secret request, secret isn't found");
return Ok(None); return Ok(None);
}; };
@ -243,7 +238,22 @@ impl GossipMachine {
"Sharing a secret with a device", "Sharing a secret with a device",
); );
Some(self.share_secret(&device, content).await?) match self.share_secret(&device, content).await {
Ok(s) => Ok(Some(s)),
Err(OlmError::MissingSession) => {
info!(
user_id = device.user_id().as_str(),
device_id = device.device_id().as_str(),
secret_name = secret_name.as_ref(),
"Secret request is missing an Olm session, \
putting the request in the wait queue",
);
self.handle_key_share_without_session(device, event.clone().into());
Ok(None)
}
Err(e) => Err(e),
}?
} else { } else {
info!( info!(
user_id = device.user_id().as_str(), user_id = device.user_id().as_str(),
@ -366,7 +376,7 @@ impl GossipMachine {
"Key request is missing an Olm session, \ "Key request is missing an Olm session, \
putting the request in the wait queue", putting the request in the wait queue",
); );
self.handle_key_share_without_session(device, event); self.handle_key_share_without_session(device, event.to_owned().into());
Ok(None) Ok(None)
} }

View file

@ -267,19 +267,18 @@ impl WaitQueue {
self.requests_ids_waiting.is_empty() && self.requests_waiting_for_session.is_empty() self.requests_ids_waiting.is_empty() && self.requests_waiting_for_session.is_empty()
} }
fn insert(&self, device: &Device, event: &ToDeviceEvent<RoomKeyRequestToDeviceEventContent>) { fn insert(&self, device: &Device, event: RequestEvent) {
let request_id = event.request_id().to_owned();
let key = RequestInfo::new( let key = RequestInfo::new(
device.user_id().to_owned(), device.user_id().to_owned(),
device.device_id().into(), device.device_id().into(),
event.content.request_id.to_owned(), request_id.clone(),
); );
self.requests_waiting_for_session.insert(key, event.clone().into()); self.requests_waiting_for_session.insert(key, event);
let key = (device.user_id().to_owned(), device.device_id().into()); let key = (device.user_id().to_owned(), device.device_id().into());
self.requests_ids_waiting self.requests_ids_waiting.entry(key).or_insert_with(DashSet::new).insert(request_id);
.entry(key)
.or_insert_with(DashSet::new)
.insert(event.content.request_id.clone());
} }
fn remove(&self, user_id: &UserId, device_id: &DeviceId) -> Vec<(RequestInfo, RequestEvent)> { fn remove(&self, user_id: &UserId, device_id: &DeviceId) -> Vec<(RequestInfo, RequestEvent)> {

View file

@ -767,6 +767,9 @@ impl OlmMachine {
AnyToDeviceEvent::RoomKeyRequest(e) => { AnyToDeviceEvent::RoomKeyRequest(e) => {
self.key_request_machine.receive_incoming_key_request(e) self.key_request_machine.receive_incoming_key_request(e)
} }
AnyToDeviceEvent::SecretRequest(e) => {
self.key_request_machine.receive_incoming_secret_request(e)
}
AnyToDeviceEvent::KeyVerificationAccept(..) AnyToDeviceEvent::KeyVerificationAccept(..)
| AnyToDeviceEvent::KeyVerificationCancel(..) | AnyToDeviceEvent::KeyVerificationCancel(..)
| AnyToDeviceEvent::KeyVerificationKey(..) | AnyToDeviceEvent::KeyVerificationKey(..)