diff --git a/src/constants.rs b/src/constants.rs index 11d1953bd..5b11081ed 100644 --- a/src/constants.rs +++ b/src/constants.rs @@ -165,8 +165,16 @@ pub const DC_MSG_ID_MARKER1: u32 = 1; pub const DC_MSG_ID_DAYMARKER: u32 = 9; pub const DC_MSG_ID_LAST_SPECIAL: u32 = 9; +/// string that indicates sth. is left out or truncated +pub const DC_ELLIPSE: &str = "[...]"; + +/// to keep bubbles and chat flow usable, we limit the text length to DC_DESIRED_TEXT_LEN. +/// if the text is longer, the full text can be retrieved usind has_html()/get_html(). +pub const DC_DESIRED_TEXT_LEN: usize = 20000; + /// approx. max. length returned by dc_msg_get_text() pub const DC_MAX_GET_TEXT_LEN: usize = 30000; + /// approx. max. length returned by dc_get_msg_info() pub const DC_MAX_GET_INFO_LEN: usize = 100_000; diff --git a/src/dc_tools.rs b/src/dc_tools.rs index 6d80274b8..5b5075641 100644 --- a/src/dc_tools.rs +++ b/src/dc_tools.rs @@ -17,7 +17,7 @@ use chrono::{Local, TimeZone}; use rand::{thread_rng, Rng}; use crate::chat::{add_device_msg, add_device_msg_with_importance}; -use crate::constants::{Viewtype, DC_OUTDATED_WARNING_DAYS}; +use crate::constants::{Viewtype, DC_ELLIPSE, DC_OUTDATED_WARNING_DAYS}; use crate::context::Context; use crate::events::EventType; use crate::message::Message; @@ -28,10 +28,8 @@ use crate::stock_str; /// end of the shortened string. #[allow(clippy::indexing_slicing)] pub(crate) fn dc_truncate(buf: &str, approx_chars: usize) -> Cow { - let ellipse = "[...]"; - let count = buf.chars().count(); - if approx_chars > 0 && count > approx_chars + ellipse.len() { + if approx_chars > 0 && count > approx_chars + DC_ELLIPSE.len() { let end_pos = buf .char_indices() .nth(approx_chars) @@ -39,9 +37,9 @@ pub(crate) fn dc_truncate(buf: &str, approx_chars: usize) -> Cow { .unwrap_or_default(); if let Some(index) = buf[..end_pos].rfind(|c| c == ' ' || c == '\n') { - Cow::Owned(format!("{}{}", &buf[..=index], ellipse)) + Cow::Owned(format!("{}{}", &buf[..=index], DC_ELLIPSE)) } else { - Cow::Owned(format!("{}{}", &buf[..end_pos], ellipse)) + Cow::Owned(format!("{}{}", &buf[..end_pos], DC_ELLIPSE)) } } else { Cow::Borrowed(buf) diff --git a/src/mimeparser.rs b/src/mimeparser.rs index 8c560f3cb..795f489af 100644 --- a/src/mimeparser.rs +++ b/src/mimeparser.rs @@ -12,10 +12,10 @@ use percent_encoding::percent_decode_str; use crate::aheader::Aheader; use crate::blob::BlobObject; -use crate::constants::Viewtype; +use crate::constants::{Viewtype, DC_DESIRED_TEXT_LEN, DC_ELLIPSE}; use crate::contact::addr_normalize; use crate::context::Context; -use crate::dc_tools::dc_get_filemeta; +use crate::dc_tools::{dc_get_filemeta, dc_truncate}; use crate::dehtml::dehtml; use crate::e2ee; use crate::events::EventType; @@ -817,6 +817,14 @@ impl MimeMessage { (simplified_txt, top_quote) }; + let simplified_txt = + if simplified_txt.len() > DC_DESIRED_TEXT_LEN + DC_ELLIPSE.len() { + self.is_mime_modified = true; + dc_truncate(&*simplified_txt, DC_DESIRED_TEXT_LEN).to_string() + } else { + simplified_txt + }; + if !simplified_txt.is_empty() || simplified_quote.is_some() { let mut part = Part { dehtml_failed, @@ -2781,6 +2789,7 @@ On 2020-10-25, Bob wrote: static REPEAT_TXT: &str = "this text with 42 chars is just repeated.\n"; static REPEAT_CNT: usize = 2000; // results in a text of 84k, should be more than DC_MAX_GET_TEXT_LEN let long_txt = format!("From: alice@c.de\n\n{}", REPEAT_TXT.repeat(REPEAT_CNT)); + assert!(DC_DESIRED_TEXT_LEN + DC_ELLIPSE.len() < DC_MAX_GET_TEXT_LEN); let mimemsg = MimeMessage::from_bytes(&t, long_txt.as_ref()) .await