From 3e07f2c1730adfd3c80e211a203d6b55d0d2b339 Mon Sep 17 00:00:00 2001 From: iequidoo Date: Mon, 14 Aug 2023 17:51:05 -0300 Subject: [PATCH] fix: prepare_msg_blob(): If cannot recode image, don't use it if it has Exif We mustn't send images with Exif as it can leak metadata such as location, camera model, etc. --- src/blob.rs | 23 ++++++++++++++++++++--- src/chat.rs | 9 ++------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/blob.rs b/src/blob.rs index a75021747..40072cb53 100644 --- a/src/blob.rs +++ b/src/blob.rs @@ -388,9 +388,12 @@ impl<'a> BlobObject<'a> { max_bytes: usize, strict_limits: bool, ) -> Result> { - tokio::task::block_in_place(move || { - let mut img = image::open(&blob_abs).context("image decode failure")?; + let mut no_exif = false; + let no_exif_ref = &mut no_exif; + let res = tokio::task::block_in_place(move || { let (nr_bytes, exif) = self.metadata()?; + *no_exif_ref = exif.is_none(); + let mut img = image::open(&blob_abs).context("image decode failure")?; let orientation = exif.as_ref().map(|exif| exif_orientation(exif, context)); let mut encoded = Vec::new(); let mut changed_name = None; @@ -505,7 +508,21 @@ impl<'a> BlobObject<'a> { } Ok(changed_name) - }) + }); + match res { + Ok(_) => res, + Err(err) => { + if !strict_limits && no_exif { + warn!( + context, + "Cannot recode image, using original data: {err:#}.", + ); + Ok(None) + } else { + Err(err) + } + } + } } /// Returns image file size and Exif. diff --git a/src/chat.rs b/src/chat.rs index 27fa71c73..387593e90 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -2035,13 +2035,8 @@ async fn prepare_msg_blob(context: &Context, msg: &mut Message) -> Result<()> { let mut maybe_sticker = msg.viewtype == Viewtype::Sticker; if msg.viewtype == Viewtype::Image || maybe_sticker { - // TODO: Ignore errors only if the image has no Exif. - if let Err(err) = blob.recode_to_image_size(context, &mut maybe_sticker).await { - warn!( - context, - "Cannot recode image, using original data: {err:#}." - ); - } + blob.recode_to_image_size(context, &mut maybe_sticker) + .await?; if !maybe_sticker { msg.viewtype = Viewtype::Image; }