Skip to content

Commit b463f36

Browse files
author
Ellen Arteca
committed
allow server remove by value during commit creation
1 parent 4f8ed01 commit b463f36

File tree

2 files changed

+49
-3
lines changed

2 files changed

+49
-3
lines changed

mls-rs/src/group/commit.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,15 @@ where
225225
Ok(self)
226226
}
227227

228+
/// Insert a [`ServerRemoveProposal`](crate::group::proposal::RemoveProposal) into
229+
/// the current commit that is being built.
230+
#[cfg(feature = "server_remove_proposal")]
231+
pub fn server_remove_member(mut self, index: u32) -> Result<Self, MlsError> {
232+
let proposal = self.group.server_remove_proposal(index)?;
233+
self.proposals.push(proposal);
234+
Ok(self)
235+
}
236+
228237
/// Insert a
229238
/// [`GroupContextExtensions`](crate::group::proposal::Proposal::GroupContextExtensions)
230239
/// into the current commit that is being built.

mls-rs/src/group/mod.rs

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1086,15 +1086,21 @@ where
10861086
index: u32,
10871087
authenticated_data: Vec<u8>,
10881088
) -> Result<MlsMessage, MlsError> {
1089+
let proposal = self.server_remove_proposal(index)?;
1090+
self.proposal_message(proposal, authenticated_data).await
1091+
}
1092+
1093+
#[cfg(feature = "server_remove_proposal")]
1094+
#[cfg_attr(feature = "ffi", safer_ffi_gen::safer_ffi_gen_ignore)]
1095+
fn server_remove_proposal(&self, index: u32) -> Result<Proposal, MlsError> {
10891096
let leaf_index = LeafIndex(index);
10901097

10911098
// Verify that this leaf is actually in the tree
10921099
self.current_epoch_tree().get_leaf_node(leaf_index)?;
10931100

1094-
let proposal = Proposal::ServerRemove(ServerRemoveProposal {
1101+
Ok(Proposal::ServerRemove(ServerRemoveProposal {
10951102
to_remove: leaf_index,
1096-
});
1097-
self.proposal_message(proposal, authenticated_data).await
1103+
}))
10981104
}
10991105

11001106
/// Create a proposal message that adds an external pre shared key to the group.
@@ -4621,6 +4627,37 @@ mod tests {
46214627
};
46224628
}
46234629

4630+
#[cfg(feature = "server_remove_proposal")]
4631+
#[maybe_async::test(not(mls_build_async), async(mls_build_async, crate::futures_test))]
4632+
async fn server_remove_removes_client_by_value() {
4633+
let (mut alice, mut bob) = custom_proposal_setup(ProposalType::SERVER_REMOVE).await;
4634+
4635+
let commit_builder = alice.commit_builder();
4636+
let commit_builder = commit_builder.server_remove_member(1).await.unwrap();
4637+
let commit = commit_builder.build().await.unwrap().commit_message;
4638+
4639+
let ReceivedMessage::Commit(CommitMessageDescription {
4640+
effect: CommitEffect::NewEpoch(new_epoch),
4641+
..
4642+
}) = alice
4643+
.process_incoming_message(commit.clone())
4644+
.await
4645+
.unwrap()
4646+
else {
4647+
panic!("unexpected commit effect");
4648+
};
4649+
4650+
assert_eq!(new_epoch.applied_proposals.len(), 1);
4651+
4652+
let ReceivedMessage::Commit(CommitMessageDescription {
4653+
effect: CommitEffect::Removed { .. },
4654+
..
4655+
}) = bob.process_incoming_message(commit).await.unwrap()
4656+
else {
4657+
panic!("unexpected commit effect");
4658+
};
4659+
}
4660+
46244661
#[cfg(feature = "server_remove_proposal")]
46254662
#[maybe_async::test(not(mls_build_async), async(mls_build_async, crate::futures_test))]
46264663
async fn commit_with_both_remove_and_server_remove_for_same_client_leaves_server_remove_unused()

0 commit comments

Comments
 (0)