From ba2e573c2358f7c29bf3ad3bb082dd74da167261 Mon Sep 17 00:00:00 2001 From: iequidoo Date: Mon, 29 Sep 2025 13:47:34 -0300 Subject: [PATCH] fix: Allow Exif for stickers, don't recode them because of that (#6447) Core doesn't auto-assign `Viewtype::Sticker` to messages and stickers coming from UIs shouldn't contain sensitive Exif info. --- src/blob.rs | 7 ++++--- src/blob/blob_tests.rs | 28 ++++++++++++++++++++++++++-- test-data/image/logo-exif.png | Bin 0 -> 13284 bytes 3 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 test-data/image/logo-exif.png diff --git a/src/blob.rs b/src/blob.rs index 0c0cf3072..c3d34d406 100644 --- a/src/blob.rs +++ b/src/blob.rs @@ -367,11 +367,12 @@ impl<'a> BlobObject<'a> { || img.get_pixel(x_max, y_max).0[3] == 0) { *vt = Viewtype::Image; + } else { + // Core doesn't auto-assign `Viewtype::Sticker` to messages and stickers coming + // from UIs shouldn't contain sensitive Exif info. + return Ok(name); } } - if *vt == Viewtype::Sticker && exif.is_none() { - return Ok(name); - } img = match orientation { Some(90) => img.rotate90(), diff --git a/src/blob/blob_tests.rs b/src/blob/blob_tests.rs index d4170bcc2..68472f867 100644 --- a/src/blob/blob_tests.rs +++ b/src/blob/blob_tests.rs @@ -416,6 +416,28 @@ async fn test_recode_image_balanced_png() { .unwrap(); } +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn test_sticker_with_exif() { + let bytes = include_bytes!("../../test-data/image/logo.png"); + SendImageCheckMediaquality { + viewtype: Viewtype::Sticker, + bytes, + extension: "png", + // TODO: Pretend there's no Exif. Currently `exif` crate doesn't detect Exif in this image, + // so the test doesn't check all the logic it should. + has_exif: false, + original_width: 135, + original_height: 135, + res_viewtype: Some(Viewtype::Sticker), + compressed_width: 135, + compressed_height: 135, + ..Default::default() + } + .test() + .await + .unwrap(); +} + /// Tests that RGBA PNG can be recoded into JPEG /// by dropping alpha channel. #[tokio::test(flavor = "multi_thread", worker_threads = 2)] @@ -485,6 +507,7 @@ struct SendImageCheckMediaquality<'a> { pub(crate) original_width: u32, pub(crate) original_height: u32, pub(crate) orientation: i32, + pub(crate) res_viewtype: Option, pub(crate) compressed_width: u32, pub(crate) compressed_height: u32, pub(crate) set_draft: bool, @@ -500,6 +523,7 @@ impl SendImageCheckMediaquality<'_> { let original_width = self.original_width; let original_height = self.original_height; let orientation = self.orientation; + let res_viewtype = self.res_viewtype.unwrap_or(Viewtype::Image); let compressed_width = self.compressed_width; let compressed_height = self.compressed_height; let set_draft = self.set_draft; @@ -550,7 +574,7 @@ impl SendImageCheckMediaquality<'_> { } let bob_msg = bob.recv_msg(&sent).await; - assert_eq!(bob_msg.get_viewtype(), Viewtype::Image); + assert_eq!(bob_msg.get_viewtype(), res_viewtype); assert_eq!(bob_msg.get_width() as u32, compressed_width); assert_eq!(bob_msg.get_height() as u32, compressed_height); let file_saved = bob @@ -564,7 +588,7 @@ impl SendImageCheckMediaquality<'_> { } let (_, exif) = image_metadata(&std::fs::File::open(&file_saved)?)?; - assert!(exif.is_none()); + assert!(res_viewtype != Viewtype::Image || exif.is_none()); let img = check_image_size(file_saved, compressed_width, compressed_height); diff --git a/test-data/image/logo-exif.png b/test-data/image/logo-exif.png new file mode 100644 index 0000000000000000000000000000000000000000..2942931f072cb78ee736274dda0bdef3bbcc8569 GIT binary patch literal 13284 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 E00>AsX8-^I literal 0 HcmV?d00001