0
0
mirror of https://github.com/signalapp/libsignal.git synced 2024-09-19 19:42:19 +02:00

backup: Sort group invitees when serializing

This commit is contained in:
Jordan Rose 2024-08-13 17:51:38 -07:00
parent 52912c7c75
commit f1b93b508d
3 changed files with 20 additions and 7 deletions

View File

@ -32,7 +32,7 @@ pub(crate) mod chat_style;
mod gift_badge;
use gift_badge::*;
mod group;
pub(crate) mod group;
use group::*;
mod link;

View File

@ -14,6 +14,7 @@ use libsignal_protocol::{Aci, Pni, ServiceId};
use macro_rules_attribute::macro_rules_derive;
use protobuf::{EnumOrUnknown, Message};
use crate::backup::serialize::UnorderedList;
use crate::backup::time::Duration;
use crate::backup::{serialize, uuid_bytes_to_aci};
use crate::proto::backup::{
@ -190,7 +191,7 @@ pub enum GroupChatUpdate {
GroupInvitationRevokedUpdate {
#[serde(serialize_with = "serialize::optional_service_id_as_string")]
updaterAci: Option<Aci>,
invitees: Vec<Invitee>,
invitees: UnorderedList<Invitee>,
},
GroupJoinRequestUpdate {
#[serde(serialize_with = "serialize::service_id_as_string")]
@ -365,7 +366,7 @@ impl ValidateFrom<EnumOrUnknown<proto::GroupV2AccessLevel>> for AccessLevel {
}
}
impl ValidateFrom<Vec<proto::group_invitation_revoked_update::Invitee>> for Vec<Invitee> {
impl ValidateFrom<Vec<proto::group_invitation_revoked_update::Invitee>> for UnorderedList<Invitee> {
fn validate_from(
invitees: Vec<proto::group_invitation_revoked_update::Invitee>,
) -> Result<Self, GroupUpdateFieldError> {
@ -514,7 +515,7 @@ mod test {
]
}
fn validated_invitees() -> Vec<Invitee> {
fn validated_invitees() -> UnorderedList<Invitee> {
vec![
Invitee {
inviter: None,
@ -527,6 +528,7 @@ mod test {
invitee_aci: None,
},
]
.into()
}
fn invitee_invalid_aci() -> Vec<group_invitation_revoked_update::Invitee> {
@ -556,11 +558,11 @@ mod test {
#[test_case(ACI.service_id_binary(), Ok(ServiceId::Aci(ACI)))]
#[test_case(vec![], Err::<ServiceId, _>(InvalidServiceId))]
#[test_case(valid_invitees(), Ok(validated_invitees()))]
#[test_case(vec![], Ok(vec![]))]
#[test_case(invitee_invalid_aci(), Err::<Vec<Invitee>,_>(InvalidInvitee(InviteeError::InviteeAci)))]
#[test_case(vec![], Ok(UnorderedList::from(vec![])))]
#[test_case(invitee_invalid_aci(), Err::<UnorderedList<Invitee>,_>(InvalidInvitee(InviteeError::InviteeAci)))]
#[test_case(
invitee_pni_service_id_binary(),
Err::<Vec<Invitee>, _>(InvalidInvitee(InviteeError::InviteePni))
Err::<UnorderedList<Invitee>, _>(InvalidInvitee(InviteeError::InviteePni))
)]
#[test_case(
EnumOrUnknown::default(),

View File

@ -11,6 +11,7 @@ use uuid::Uuid;
use crate::backup::account_data::AccountData;
use crate::backup::call::AdHocCall;
use crate::backup::chat::group::Invitee;
use crate::backup::chat::text::{TextEffect, TextRange};
use crate::backup::chat::{ChatData, OutgoingSend};
use crate::backup::frame::RecipientId;
@ -250,6 +251,16 @@ impl SerializeOrder for OutgoingSend {
}
}
impl SerializeOrder for Invitee {
fn serialize_cmp(&self, other: &Self) -> std::cmp::Ordering {
(self.invitee_aci, self.invitee_pni, self.inviter).cmp(&(
other.invitee_aci,
other.invitee_pni,
other.inviter,
))
}
}
impl serde::Serialize for proto::contact_attachment::Name {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where