From db6674431920b59e6178b27faada847b2a7583fa Mon Sep 17 00:00:00 2001 From: Tom Leavy Date: Fri, 19 Jul 2024 09:56:09 -0400 Subject: [PATCH 1/3] Add RemoveProposal to the Removed case of CommitEffect --- mls-rs-uniffi/src/lib.rs | 2 +- mls-rs/src/client.rs | 2 +- mls-rs/src/external_client/group.rs | 8 ++++++-- mls-rs/src/group/message_processor.rs | 14 +++++++++----- mls-rs/src/group/mod.rs | 20 +++++++++++++------- mls-rs/src/group/test_utils.rs | 7 +++++-- 6 files changed, 35 insertions(+), 18 deletions(-) diff --git a/mls-rs-uniffi/src/lib.rs b/mls-rs-uniffi/src/lib.rs index 73dda465..ec295bfa 100644 --- a/mls-rs-uniffi/src/lib.rs +++ b/mls-rs-uniffi/src/lib.rs @@ -227,7 +227,7 @@ impl From for CommitEffect { .map(|p| Arc::new(p.proposal.into())) .collect(), }, - group::CommitEffect::Removed => CommitEffect::Removed, + group::CommitEffect::Removed(_) => CommitEffect::Removed, group::CommitEffect::ReInit(_) => CommitEffect::ReInit, } } diff --git a/mls-rs/src/client.rs b/mls-rs/src/client.rs index 17526d47..95733d0b 100644 --- a/mls-rs/src/client.rs +++ b/mls-rs/src/client.rs @@ -968,7 +968,7 @@ mod tests { assert_matches!( message, ReceivedMessage::Commit(CommitMessageDescription { - effect: CommitEffect::Removed, + effect: CommitEffect::Removed(_), .. }) ); diff --git a/mls-rs/src/external_client/group.rs b/mls-rs/src/external_client/group.rs index 1357d024..8bd05013 100644 --- a/mls-rs/src/external_client/group.rs +++ b/mls-rs/src/external_client/group.rs @@ -21,6 +21,7 @@ use crate::{ ApplicationMessageDescription, CommitMessageDescription, EventOrContent, MessageProcessor, ProposalMessageDescription, ProvisionalState, }, + proposal_filter::ProposalInfo, snapshot::RawGroupState, state::GroupState, transcript_hash::InterimTranscriptHash, @@ -638,8 +639,11 @@ where &mut self.state } - fn can_continue_processing(&self, _provisional_state: &ProvisionalState) -> bool { - true + fn removal_proposal( + &self, + _provisional_state: &ProvisionalState, + ) -> Option> { + None } #[cfg(feature = "private_message")] diff --git a/mls-rs/src/group/message_processor.rs b/mls-rs/src/group/message_processor.rs index b5d4e85d..7d59ee59 100644 --- a/mls-rs/src/group/message_processor.rs +++ b/mls-rs/src/group/message_processor.rs @@ -14,7 +14,7 @@ use super::{ state::GroupState, transcript_hash::InterimTranscriptHash, transcript_hashes, validate_group_info_member, GroupContext, GroupInfo, ReInitProposal, - Welcome, + RemoveProposal, Welcome, }; use crate::{ client::MlsError, @@ -121,7 +121,7 @@ impl NewEpoch { #[derive(Clone, Debug, PartialEq)] pub enum CommitEffect { NewEpoch(Box), - Removed, + Removed(ProposalInfo), ReInit(ProposalInfo), } @@ -636,12 +636,12 @@ pub(crate) trait MessageProcessor: Send + Sync { return Err(MlsError::CommitMissingPath); } - if !self.can_continue_processing(&provisional_state) { + if let Some(removal) = self.removal_proposal(&provisional_state) { return Ok(CommitMessageDescription { is_external: matches!(auth_content.content.sender, Sender::NewMemberCommit), authenticated_data: auth_content.content.authenticated_data, committer: *sender, - effect: CommitEffect::Removed, + effect: CommitEffect::Removed(removal), }); } @@ -727,7 +727,11 @@ pub(crate) trait MessageProcessor: Send + Sync { fn identity_provider(&self) -> Self::IdentityProvider; fn cipher_suite_provider(&self) -> &Self::CipherSuiteProvider; fn psk_storage(&self) -> Self::PreSharedKeyStorage; - fn can_continue_processing(&self, provisional_state: &ProvisionalState) -> bool; + + fn removal_proposal( + &self, + provisional_state: &ProvisionalState, + ) -> Option>; #[cfg(feature = "private_message")] fn min_epoch_available(&self) -> Option; diff --git a/mls-rs/src/group/mod.rs b/mls-rs/src/group/mod.rs index 9232388a..0463366c 100644 --- a/mls-rs/src/group/mod.rs +++ b/mls-rs/src/group/mod.rs @@ -1827,13 +1827,19 @@ where &mut self.state } - fn can_continue_processing(&self, provisional_state: &ProvisionalState) -> bool { - !(provisional_state - .applied_proposals - .removals - .iter() - .any(|p| p.proposal.to_remove == self.private_tree.self_index) - && self.pending_commit.is_none()) + fn removal_proposal( + &self, + provisional_state: &ProvisionalState, + ) -> Option> { + match self.pending_commit { + Some(_) => None, + None => provisional_state + .applied_proposals + .removals + .iter() + .find(|p| p.proposal.to_remove == self.private_tree.self_index) + .cloned(), + } } #[cfg(feature = "private_message")] diff --git a/mls-rs/src/group/test_utils.rs b/mls-rs/src/group/test_utils.rs index 7cfe5217..b9736953 100644 --- a/mls-rs/src/group/test_utils.rs +++ b/mls-rs/src/group/test_utils.rs @@ -461,8 +461,11 @@ impl MessageProcessor for GroupWithoutKeySchedule { self.inner.psk_storage() } - fn can_continue_processing(&self, provisional_state: &ProvisionalState) -> bool { - self.inner.can_continue_processing(provisional_state) + fn removal_proposal( + &self, + provisional_state: &ProvisionalState, + ) -> Option> { + self.inner.removal_proposal(provisional_state) } #[cfg(feature = "private_message")] From 0c0bcc5eaf1136f60c4b356b6dc477b5b5707888 Mon Sep 17 00:00:00 2001 From: Tom Leavy Date: Fri, 19 Jul 2024 10:08:03 -0400 Subject: [PATCH 2/3] Fix CI --- mls-rs/src/group/mod.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/mls-rs/src/group/mod.rs b/mls-rs/src/group/mod.rs index 0463366c..c5fdacac 100644 --- a/mls-rs/src/group/mod.rs +++ b/mls-rs/src/group/mod.rs @@ -73,7 +73,6 @@ pub(crate) use self::commit::test_utils::CommitModifiers; #[cfg(all(test, feature = "private_message"))] pub use self::framing::PrivateMessage; -#[cfg(feature = "psk")] use self::proposal_filter::ProposalInfo; #[cfg(any(feature = "secret_tree_access", feature = "private_message"))] From 48882ec304813a8f6b1cafd28a9e1c0816a0deda Mon Sep 17 00:00:00 2001 From: Tom Leavy Date: Fri, 19 Jul 2024 11:01:21 -0400 Subject: [PATCH 3/3] Fix build again --- mls-rs/src/external_client/group.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mls-rs/src/external_client/group.rs b/mls-rs/src/external_client/group.rs index 8bd05013..940a9865 100644 --- a/mls-rs/src/external_client/group.rs +++ b/mls-rs/src/external_client/group.rs @@ -21,6 +21,7 @@ use crate::{ ApplicationMessageDescription, CommitMessageDescription, EventOrContent, MessageProcessor, ProposalMessageDescription, ProvisionalState, }, + proposal::RemoveProposal, proposal_filter::ProposalInfo, snapshot::RawGroupState, state::GroupState, @@ -57,7 +58,7 @@ use mls_rs_core::{crypto::CipherSuiteProvider, psk::ExternalPskId}; #[cfg(feature = "by_ref_proposal")] use crate::{ extension::ExternalSendersExt, - group::proposal::{AddProposal, ReInitProposal, RemoveProposal}, + group::proposal::{AddProposal, ReInitProposal}, }; #[cfg(all(feature = "by_ref_proposal", feature = "psk"))]