Struct CommitBuilder
pub struct CommitBuilder<'a, T, G = &'a mut MlsGroup>{ /* private fields */ }Expand description
The CommitBuilder is used to easily and dynamically build commit messages.
It operates in a series of stages:
The Initial stage is used to populate the builder with proposals and other data using
method calls on the builder that let the builder stay in the same stage.
The next stage is LoadedPsks, and it signifies the stage after the builder loaded the the
pre-shared keys for the PreSharedKey proposals in this commit.
Then comes the Complete stage, which denotes that all data has been validated. From this
stage, the commit can be staged in the group, and the outgoing messages returned.
For example, to create a commit to a new Add proposal with a KeyPackage key_package_to_add
that does not commit to the proposals in the proposal store, one could build the commit as
follows:
let message_bundle: CommitMessageBundle = mls_group
.commit_builder()
.consume_proposal_store(false)
.add_proposal(key_package_to_add)
.load_psks(provider.storage())?
.build(provider.rand(), provider.crypto(), signer, app_policy_proposals)?
.stage_commit(provider)?;
let commit = message_bundle.commit();
let welcome = message_bundle.welcome().expect("expected a welcome since there was an add");
let group_info = message_bundle.welcome().expect("expected a group info since there was an add");In this example signer is a reference to a [Signer] and app_policy_proposals is the
application-defined policy for which proposals to accept, implemented by an
FnMut(&QueuedProposal) -> bool.
See the book for another example.
Implementations§
§impl<'a> CommitBuilder<'a, Initial, MlsGroup>
impl<'a> CommitBuilder<'a, Initial, MlsGroup>
pub fn add_psk_proposal(
self,
proposal: PreSharedKeyProposal,
) -> CommitBuilder<'a, Initial, MlsGroup>
pub fn add_psk_proposal( self, proposal: PreSharedKeyProposal, ) -> CommitBuilder<'a, Initial, MlsGroup>
Adds a PreSharedKeyProposal to the proposals to be committed.
pub fn add_psk_proposals(
self,
proposals: impl IntoIterator<Item = PreSharedKeyProposal>,
) -> CommitBuilder<'a, Initial, MlsGroup>
pub fn add_psk_proposals( self, proposals: impl IntoIterator<Item = PreSharedKeyProposal>, ) -> CommitBuilder<'a, Initial, MlsGroup>
Adds the PreSharedKeyProposal in the iterator to the proposals to be
committed.
§impl CommitBuilder<'_, Complete, MlsGroup>
impl CommitBuilder<'_, Complete, MlsGroup>
pub fn finalize<Provider>(
self,
provider: &Provider,
) -> Result<(MlsGroup, CommitMessageBundle), ExternalCommitBuilderFinalizeError<<Provider as OpenMlsProvider>::StorageError>>where
Provider: OpenMlsProvider,
pub fn finalize<Provider>(
self,
provider: &Provider,
) -> Result<(MlsGroup, CommitMessageBundle), ExternalCommitBuilderFinalizeError<<Provider as OpenMlsProvider>::StorageError>>where
Provider: OpenMlsProvider,
Finalizes and returns the MlsGroup, as well as the
[CommitMessageBundle].
In contrast to the deprecated MlsGroup::join_by_external_commit
there is no need to merge the pending commit.
§impl<'a> CommitBuilder<'a, Initial, &mut MlsGroup>
impl<'a> CommitBuilder<'a, Initial, &mut MlsGroup>
pub fn consume_proposal_store(
self,
consume_proposal_store: bool,
) -> CommitBuilder<'a, Initial, &mut MlsGroup>
pub fn consume_proposal_store( self, consume_proposal_store: bool, ) -> CommitBuilder<'a, Initial, &mut MlsGroup>
Sets whether or not the proposals in the proposal store of the group should be included in
the commit. Defaults to true.
pub fn force_self_update(
self,
force_self_update: bool,
) -> CommitBuilder<'a, Initial, &mut MlsGroup>
pub fn force_self_update( self, force_self_update: bool, ) -> CommitBuilder<'a, Initial, &mut MlsGroup>
Sets whether or not the commit should force a self-update. Defaults to false.
pub fn propose_adds(
self,
key_packages: impl IntoIterator<Item = KeyPackage>,
) -> CommitBuilder<'a, Initial, &mut MlsGroup>
pub fn propose_adds( self, key_packages: impl IntoIterator<Item = KeyPackage>, ) -> CommitBuilder<'a, Initial, &mut MlsGroup>
Adds an Add proposal to the provided KeyPackage to the list of proposals to be
committed.
pub fn propose_removals(
self,
removed: impl IntoIterator<Item = LeafNodeIndex>,
) -> CommitBuilder<'a, Initial, &mut MlsGroup>
pub fn propose_removals( self, removed: impl IntoIterator<Item = LeafNodeIndex>, ) -> CommitBuilder<'a, Initial, &mut MlsGroup>
Adds a Remove proposal for the provided LeafNodeIndexes to the list of proposals to be
committed.
pub fn propose_group_context_extensions(
self,
extensions: Extensions,
) -> CommitBuilder<'a, Initial, &mut MlsGroup>
pub fn propose_group_context_extensions( self, extensions: Extensions, ) -> CommitBuilder<'a, Initial, &mut MlsGroup>
Adds a GroupContextExtensions proposal for the provided Extensions to the list of
proposals to be committed.
pub fn add_proposal(
self,
proposal: Proposal,
) -> CommitBuilder<'a, Initial, &mut MlsGroup>
pub fn add_proposal( self, proposal: Proposal, ) -> CommitBuilder<'a, Initial, &mut MlsGroup>
Adds a proposal to the proposals to be committed. To add multiple
proposals, use Self::add_proposals.
pub fn add_proposals(
self,
proposals: impl IntoIterator<Item = Proposal>,
) -> CommitBuilder<'a, Initial, &mut MlsGroup>
pub fn add_proposals( self, proposals: impl IntoIterator<Item = Proposal>, ) -> CommitBuilder<'a, Initial, &mut MlsGroup>
Adds the proposals in the iterator to the proposals to be committed.
§impl<'a, G> CommitBuilder<'a, Initial, G>
impl<'a, G> CommitBuilder<'a, Initial, G>
pub fn new(group: G) -> CommitBuilder<'a, Initial, G>
pub fn new(group: G) -> CommitBuilder<'a, Initial, G>
returns a new CommitBuilder for the given MlsGroup.
pub fn create_group_info(
self,
create_group_info: bool,
) -> CommitBuilder<'a, Initial, G>
pub fn create_group_info( self, create_group_info: bool, ) -> CommitBuilder<'a, Initial, G>
pub fn leaf_node_parameters(
self,
leaf_node_parameters: LeafNodeParameters,
) -> CommitBuilder<'a, Initial, G>
pub fn leaf_node_parameters( self, leaf_node_parameters: LeafNodeParameters, ) -> CommitBuilder<'a, Initial, G>
Sets the leaf node parameters for the new leaf node in a self-update. Implies that a self-update takes place.
pub fn load_psks<Storage>(
self,
storage: &'a Storage,
) -> Result<CommitBuilder<'a, LoadedPsks, G>, CreateCommitError>where
Storage: StorageProvider,
pub fn load_psks<Storage>(
self,
storage: &'a Storage,
) -> Result<CommitBuilder<'a, LoadedPsks, G>, CreateCommitError>where
Storage: StorageProvider,
Loads the PSKs for the PskProposals marked for inclusion and moves on to the next phase.
§impl<'a, G> CommitBuilder<'a, LoadedPsks, G>
impl<'a, G> CommitBuilder<'a, LoadedPsks, G>
pub fn build<S>(
self,
rand: &impl OpenMlsRand,
crypto: &impl OpenMlsCrypto,
signer: &S,
f: impl FnMut(&QueuedProposal) -> bool,
) -> Result<CommitBuilder<'a, Complete, G>, CreateCommitError>where
S: Signer,
pub fn build<S>(
self,
rand: &impl OpenMlsRand,
crypto: &impl OpenMlsCrypto,
signer: &S,
f: impl FnMut(&QueuedProposal) -> bool,
) -> Result<CommitBuilder<'a, Complete, G>, CreateCommitError>where
S: Signer,
Validates the inputs and builds the commit. The last argument f is a function that lets
the caller filter the proposals that are considered for inclusion. This provides a way for
the application to enforce custom policies in the creation of commits.
pub fn build_with_new_signer<S>(
self,
rand: &impl OpenMlsRand,
crypto: &impl OpenMlsCrypto,
old_signer: &impl Signer,
new_signer: NewSignerBundle<'_, S>,
f: impl FnMut(&QueuedProposal) -> bool,
) -> Result<CommitBuilder<'a, Complete, G>, CreateCommitError>where
S: Signer,
pub fn build_with_new_signer<S>(
self,
rand: &impl OpenMlsRand,
crypto: &impl OpenMlsCrypto,
old_signer: &impl Signer,
new_signer: NewSignerBundle<'_, S>,
f: impl FnMut(&QueuedProposal) -> bool,
) -> Result<CommitBuilder<'a, Complete, G>, CreateCommitError>where
S: Signer,
Just like build, this function validates the inputs and builds the
commit. The last argument f is a function that lets the caller filter
the proposals that are considered for inclusion. This provides a way for
the application to enforce custom policies in the creation of commits.
In contrast to build, this function can be used to create commits that
rotate the own leaf node’s signature key.
§impl CommitBuilder<'_, Complete, &mut MlsGroup>
impl CommitBuilder<'_, Complete, &mut MlsGroup>
pub fn stage_commit<Provider>(
self,
provider: &Provider,
) -> Result<CommitMessageBundle, CommitBuilderStageError<<Provider as OpenMlsProvider>::StorageError>>where
Provider: OpenMlsProvider,
pub fn stage_commit<Provider>(
self,
provider: &Provider,
) -> Result<CommitMessageBundle, CommitBuilderStageError<<Provider as OpenMlsProvider>::StorageError>>where
Provider: OpenMlsProvider,
Stages the commit and returns the protocol messages.
Trait Implementations§
Auto Trait Implementations§
impl<'a, T, G> Freeze for CommitBuilder<'a, T, G>
impl<'a, T, G> RefUnwindSafe for CommitBuilder<'a, T, G>where
G: RefUnwindSafe,
T: RefUnwindSafe,
impl<'a, T, G> Send for CommitBuilder<'a, T, G>
impl<'a, T, G> Sync for CommitBuilder<'a, T, G>
impl<'a, T, G> Unpin for CommitBuilder<'a, T, G>
impl<'a, T, G> UnwindSafe for CommitBuilder<'a, T, G>where
G: UnwindSafe,
T: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Classify for T
impl<T> Classify for T
type Classified = T
fn classify(self) -> T
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> Declassify for T
impl<T> Declassify for T
type Declassified = T
fn declassify(self) -> T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.