From 05650eaf7614f181401cf726f034c0765badc2bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabriel=20F=C3=A9ron?= Date: Mon, 21 Oct 2024 17:05:44 +0200 Subject: [PATCH] Mirror Contact struct in new backwards-compat model package --- presage-cli/src/main.rs | 2 +- presage-store-sled/src/content.rs | 3 +- presage/Cargo.toml | 1 + presage/src/manager/registered.rs | 4 +-- presage/src/model/contacts.rs | 50 +++++++++++++++++++++++++++++++ presage/src/model/mod.rs | 1 + presage/src/store.rs | 7 +++-- 7 files changed, 61 insertions(+), 7 deletions(-) create mode 100644 presage/src/model/contacts.rs diff --git a/presage-cli/src/main.rs b/presage-cli/src/main.rs index 97fb333cd..9ff8a3621 100644 --- a/presage-cli/src/main.rs +++ b/presage-cli/src/main.rs @@ -15,7 +15,6 @@ use mime_guess::mime::APPLICATION_OCTET_STREAM; use notify_rust::Notification; use presage::libsignal_service::configuration::SignalServers; use presage::libsignal_service::content::Reaction; -use presage::libsignal_service::models::Contact; use presage::libsignal_service::pre_keys::PreKeysStore; use presage::libsignal_service::prelude::phonenumber::PhoneNumber; use presage::libsignal_service::prelude::ProfileKey; @@ -26,6 +25,7 @@ use presage::libsignal_service::sender::AttachmentSpec; use presage::libsignal_service::zkgroup::GroupMasterKeyBytes; use presage::libsignal_service::ServiceAddress; use presage::manager::ReceivingMode; +use presage::model::contacts::Contact; use presage::model::groups::Group; use presage::proto::receipt_message; use presage::proto::EditMessage; diff --git a/presage-store-sled/src/content.rs b/presage-store-sled/src/content.rs index c13248590..fb0b64aa3 100644 --- a/presage-store-sled/src/content.rs +++ b/presage-store-sled/src/content.rs @@ -6,12 +6,11 @@ use std::{ use presage::{ libsignal_service::{ content::Content, - models::Contact, prelude::Uuid, zkgroup::{profiles::ProfileKey, GroupMasterKeyBytes}, Profile, }, - model::groups::Group, + model::{contacts::Contact, groups::Group}, store::{ContentExt, ContentsStore, StickerPack, Thread}, AvatarBytes, }; diff --git a/presage/Cargo.toml b/presage/Cargo.toml index 5e60c0d19..3a61cd2e8 100644 --- a/presage/Cargo.toml +++ b/presage/Cargo.toml @@ -25,6 +25,7 @@ tracing = "0.1" url = "2.5" serde_with = "3.11.0" derivative = "2.2.0" +bytes = { version = "1.7.2", features = ["serde"] } [dev-dependencies] quickcheck = "1.0.3" diff --git a/presage/src/manager/registered.rs b/presage/src/manager/registered.rs index 6f777bf7a..ee15dc4b7 100644 --- a/presage/src/manager/registered.rs +++ b/presage/src/manager/registered.rs @@ -10,7 +10,6 @@ use libsignal_service::configuration::{ServiceConfiguration, SignalServers, Sign use libsignal_service::content::{Content, ContentBody, DataMessageFlags, Metadata}; use libsignal_service::groups_v2::{decrypt_group, GroupsManager, InMemoryCredentialsCache}; use libsignal_service::messagepipe::{Incoming, MessagePipe, ServiceCredentials}; -use libsignal_service::models::Contact; use libsignal_service::prelude::phonenumber::PhoneNumber; use libsignal_service::prelude::{MessageSenderError, ProtobufMessage, Uuid}; use libsignal_service::profile_cipher::ProfileCipher; @@ -43,6 +42,7 @@ use tokio::sync::Mutex; use tracing::{debug, error, info, trace, warn}; use url::Url; +use crate::model::contacts::Contact; use crate::serde::serde_profile_key; use crate::store::{ContentsStore, Sticker, StickerPack, StickerPackManifest, Store, Thread}; use crate::{model::groups::Group, AvatarBytes, Error, Manager}; @@ -665,7 +665,7 @@ impl Manager { info!("saving contacts"); for contact in contacts.filter_map(Result::ok) { if let Err(error) = - state.store.save_contact(&contact) + state.store.save_contact(&contact.into()) { warn!(%error, "failed to save contacts"); break; diff --git a/presage/src/model/contacts.rs b/presage/src/model/contacts.rs new file mode 100644 index 000000000..7fa7e1092 --- /dev/null +++ b/presage/src/model/contacts.rs @@ -0,0 +1,50 @@ +use bytes::Bytes; +use libsignal_service::{ + models::Attachment, + prelude::{phonenumber::PhoneNumber, Uuid}, + proto::Verified, +}; +use serde::{Deserialize, Serialize}; + +const fn default_expire_timer_version() -> u32 { + 2 +} + +/// Mirror of the protobuf ContactDetails message +/// but with stronger types (e.g. `ServiceAddress` instead of optional uuid and string phone numbers) +/// and some helper functions +#[derive(Debug, Serialize, Deserialize)] +pub struct Contact { + pub uuid: Uuid, + pub phone_number: Option, + pub name: String, + pub color: Option, + #[serde(skip)] + pub verified: Verified, + pub profile_key: Vec, + pub expire_timer: u32, + #[serde(default = "default_expire_timer_version")] + pub expire_timer_version: u32, + pub inbox_position: u32, + pub archived: bool, + #[serde(skip)] + pub avatar: Option>, +} + +impl From for Contact { + fn from(c: libsignal_service::models::Contact) -> Self { + Self { + uuid: c.uuid, + phone_number: c.phone_number, + name: c.name, + color: c.color, + verified: c.verified, + profile_key: c.profile_key, + expire_timer: c.expire_timer, + expire_timer_version: c.expire_timer_version, + inbox_position: c.inbox_position, + archived: c.archived, + avatar: c.avatar, + } + } +} diff --git a/presage/src/model/mod.rs b/presage/src/model/mod.rs index c4c132f23..8c2587fe2 100644 --- a/presage/src/model/mod.rs +++ b/presage/src/model/mod.rs @@ -1,5 +1,6 @@ use serde::{Deserialize, Serialize}; +pub mod contacts; pub mod groups; #[derive(Debug, Default, PartialEq, Eq, Deserialize, Serialize)] diff --git a/presage/src/store.rs b/presage/src/store.rs index e10dc5dec..7f9010942 100644 --- a/presage/src/store.rs +++ b/presage/src/store.rs @@ -5,7 +5,6 @@ use std::{fmt, ops::RangeBounds, time::SystemTime}; use libsignal_service::{ content::{ContentBody, Metadata}, groups_v2::Timer, - models::Contact, pre_keys::PreKeysStore, prelude::{Content, ProfileKey, Uuid, UuidError}, proto::{ @@ -20,7 +19,11 @@ use libsignal_service::{ use serde::{Deserialize, Serialize}; use tracing::{error, trace}; -use crate::{manager::RegistrationData, model::groups::Group, AvatarBytes}; +use crate::{ + manager::RegistrationData, + model::{contacts::Contact, groups::Group}, + AvatarBytes, +}; /// An error trait implemented by store error types pub trait StoreError: std::error::Error + Sync + Send {}