pub struct GroupInfo {
pub group_id: GroupId,
pub name: Option<String>,
pub members: Vec<String>,
pub members_count: u32,
pub epoch: u64,
pub is_session: bool,
pub created_at_ms: u64,
pub last_activity_ms: u64,
pub unproven_members: u32,
}Expand description
Information about an MLS group.
Fields§
§group_id: GroupIdUnique group identifier.
name: Option<String>Human-readable group name (for multi-party groups).
members: Vec<String>List of member user IDs.
members_count: u32Count of members in the group.
epoch: u64Current epoch number.
is_session: boolWhether this is a 1:1 session (2-person group).
created_at_ms: u64Timestamp when the group was created.
last_activity_ms: u64Timestamp of the last activity.
unproven_members: u32How many leaves the roster read skipped because they do not carry the address their own signature key derives to.
Normally zero: the Welcome and commit gates refuse such a leaf before it can enter local group state, so a non-zero count means the state was written behind the SDK’s back — a direct write to the install-scoped provider store, or a group joined by a build predating those gates.
A count, not the identities. The claimed credentials are attacker-chosen
strings, and the whole reason crate::group::GroupManager::get_group_info
filters them out is that the roster must not carry an identity nobody
proved; handing the same string back through a second field would return
it by another door. It is also not what an app should act on: the leaf
holds live group secrets and reads everything sent to the group, so the
remedy is to abandon the group, not to evict one member of it.
Additive with #[serde(default)] so records written before this field
existed still load.
Trait Implementations§
Source§impl<'de> Deserialize<'de> for GroupInfo
impl<'de> Deserialize<'de> for GroupInfo
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Auto Trait Implementations§
impl Freeze for GroupInfo
impl RefUnwindSafe for GroupInfo
impl Send for GroupInfo
impl Sync for GroupInfo
impl Unpin for GroupInfo
impl UnsafeUnpin for GroupInfo
impl UnwindSafe for GroupInfo
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Declassify for T
impl<T> Declassify for T
type Declassified = T
fn declassify(self) -> T
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§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