use crate::{
binary_tree::LeafNodeIndex,
extensions::{Extensions, SenderExtensionIndex},
framing::{mls_auth_content::AuthenticatedContent, MlsMessageOut, PublicMessage},
group::{
errors::{CreateGroupContextExtProposalError, ProposeRemoveMemberError},
mls_group::errors::ProposeAddMemberError,
GroupContext, GroupEpoch, GroupId,
},
key_packages::KeyPackage,
messages::{AddProposal, Proposal},
storage::{OpenMlsProvider, StorageProvider},
};
use openmls_traits::signatures::Signer;
use super::proposals::{GroupContextExtensionProposal, RemoveProposal};
pub struct JoinProposal;
pub struct ExternalProposal;
impl JoinProposal {
#[allow(clippy::new_ret_no_self)]
pub fn new<Storage: StorageProvider>(
key_package: KeyPackage,
group_id: GroupId,
epoch: GroupEpoch,
signer: &impl Signer,
) -> Result<MlsMessageOut, ProposeAddMemberError<Storage::Error>> {
AuthenticatedContent::new_join_proposal(
Proposal::add(AddProposal { key_package }),
group_id,
epoch,
signer,
)
.map(PublicMessage::from)
.map(MlsMessageOut::from)
.map_err(ProposeAddMemberError::from)
}
}
impl ExternalProposal {
pub fn new_group_context_extensions<Provider: OpenMlsProvider>(
extensions: Extensions<GroupContext>,
group_id: GroupId,
epoch: GroupEpoch,
signer: &impl Signer,
sender_index: SenderExtensionIndex,
) -> Result<MlsMessageOut, CreateGroupContextExtProposalError<Provider::StorageError>> {
let proposal = GroupContextExtensionProposal::new(extensions);
AuthenticatedContent::new_external_proposal(
Proposal::GroupContextExtensions(Box::new(proposal)),
group_id,
epoch,
signer,
sender_index,
)
.map(PublicMessage::from)
.map(MlsMessageOut::from)
.map_err(CreateGroupContextExtProposalError::from)
}
pub fn new_remove<Provider: OpenMlsProvider>(
removed: LeafNodeIndex,
group_id: GroupId,
epoch: GroupEpoch,
signer: &impl Signer,
sender_index: SenderExtensionIndex,
) -> Result<MlsMessageOut, ProposeRemoveMemberError<Provider::StorageError>> {
AuthenticatedContent::new_external_proposal(
Proposal::remove(RemoveProposal { removed }),
group_id,
epoch,
signer,
sender_index,
)
.map(PublicMessage::from)
.map(MlsMessageOut::from)
.map_err(ProposeRemoveMemberError::from)
}
pub fn new_add<Provider: OpenMlsProvider>(
key_package: KeyPackage,
group_id: GroupId,
epoch: GroupEpoch,
signer: &impl Signer,
sender_index: SenderExtensionIndex,
) -> Result<MlsMessageOut, ProposeAddMemberError<Provider::StorageError>> {
AuthenticatedContent::new_external_proposal(
Proposal::add(AddProposal { key_package }),
group_id,
epoch,
signer,
sender_index,
)
.map(PublicMessage::from)
.map(MlsMessageOut::from)
.map_err(ProposeAddMemberError::from)
}
}