From 9862d40f89b910fda11f3b2d0f5af395c25fa9c9 Mon Sep 17 00:00:00 2001 From: iequidoo Date: Fri, 23 Feb 2024 01:09:30 -0300 Subject: [PATCH] feat: Send Chat-Group-Avatar as inline base64 (#5253) Before group avatar was sent as an attachment. Let's do the same as with user avatar and send group avatar as base64. Receiver code uses the same functions for user and chat avatars, so base64 avatars are supported for most receivers already. --- src/mimefactory.rs | 32 +++++++++++++------------------- src/mimeparser.rs | 6 ++++-- 2 files changed, 17 insertions(+), 21 deletions(-) diff --git a/src/mimefactory.rs b/src/mimefactory.rs index c8eafdef6..32a64b6a8 100644 --- a/src/mimefactory.rs +++ b/src/mimefactory.rs @@ -933,7 +933,6 @@ impl<'a> MimeFactory<'a> { }; let command = self.msg.param.get_cmd(); let mut placeholdertext = None; - let mut meta_part = None; let send_verified_headers = match chat.typ { Chattype::Single => true, @@ -1119,17 +1118,13 @@ impl<'a> MimeFactory<'a> { if let Some(grpimage) = grpimage { info!(context, "setting group image '{}'", grpimage); - let mut meta = Message { - viewtype: Viewtype::Image, - ..Default::default() - }; - meta.param.set(Param::File, grpimage); - - let (mail, filename_as_sent) = build_body_file(context, &meta, "group-image").await?; - meta_part = Some(mail); - headers - .protected - .push(Header::new("Chat-Group-Avatar".into(), filename_as_sent)); + let avatar = build_avatar_file(context, grpimage) + .await + .context("Cannot attach group image")?; + headers.hidden.push(Header::new( + "Chat-Group-Avatar".into(), + format!("base64:{avatar}"), + )); } if self.msg.viewtype == Viewtype::Sticker { @@ -1253,10 +1248,6 @@ impl<'a> MimeFactory<'a> { parts.push(file_part); } - if let Some(meta_part) = meta_part { - parts.push(meta_part); - } - if let Some(msg_kml_part) = self.get_message_kml_part() { parts.push(msg_kml_part); } @@ -1288,7 +1279,7 @@ impl<'a> MimeFactory<'a> { if self.attach_selfavatar { match context.get_config(Config::Selfavatar).await? { - Some(path) => match build_selfavatar_file(context, &path).await { + Some(path) => match build_avatar_file(context, &path).await { Ok(avatar) => headers.hidden.push(Header::new( "Chat-User-Avatar".into(), format!("base64:{avatar}"), @@ -1497,8 +1488,11 @@ async fn build_body_file( Ok((mail, filename_to_send)) } -async fn build_selfavatar_file(context: &Context, path: &str) -> Result { - let blob = BlobObject::from_path(context, path.as_ref())?; +async fn build_avatar_file(context: &Context, path: &str) -> Result { + let blob = match path.starts_with("$BLOBDIR/") { + true => BlobObject::from_name(context, path.to_string())?, + false => BlobObject::from_path(context, path.as_ref())?, + }; let body = fs::read(blob.to_abs_path()).await?; let encoded_body = wrapped_base64_encode(&body); Ok(encoded_body) diff --git a/src/mimeparser.rs b/src/mimeparser.rs index 56b1efc79..125d43adf 100644 --- a/src/mimeparser.rs +++ b/src/mimeparser.rs @@ -265,8 +265,10 @@ impl MimeMessage { for field in &part.headers { let key = field.get_key().to_lowercase(); - // For now only Chat-User-Avatar can be hidden. - if !headers.contains_key(&key) && key == "chat-user-avatar" { + // For now only avatar headers can be hidden. + if !headers.contains_key(&key) + && (key == "chat-user-avatar" || key == "chat-group-avatar") + { headers.insert(key.to_string(), field.get_value()); } }