diff --git a/deltachat-ffi/deltachat.h b/deltachat-ffi/deltachat.h index 6999576d9..ee50d1644 100644 --- a/deltachat-ffi/deltachat.h +++ b/deltachat-ffi/deltachat.h @@ -448,9 +448,6 @@ char* dc_get_blobdir (const dc_context_t* context); * generate Curve25519 keypair * DC_KEY_GEN_RSA4096 (3)= * generate RSA 4096 keypair - * - `save_mime_headers` = 1=save mime headers - * and make dc_get_mime_headers() work for subsequent calls, - * 0=do not save mime headers (default) * - `delete_device_after` = 0=do not delete messages from device automatically (default), * >=1=seconds, after which messages are deleted automatically from the device. * Messages in the "saved messages" chat (see dc_chat_is_self_talk()) are skipped. @@ -1960,23 +1957,6 @@ char* dc_get_msg_html (dc_context_t* context, uint32_t ms void dc_download_full_msg (dc_context_t* context, int msg_id); -/** - * Get the raw mime-headers of the given message. - * Raw headers are saved for incoming messages - * only if `dc_set_config(context, "save_mime_headers", "1")` - * was called before. - * - * @memberof dc_context_t - * @param context The context object. - * @param msg_id The message ID, must be the ID of an incoming message. - * @return Raw headers as a multi-line string, must be released using dc_str_unref() after usage. - * Returns NULL if there are no headers saved for the given message, - * e.g. because of save_mime_headers is not set - * or the message is not incoming. - */ -char* dc_get_mime_headers (dc_context_t* context, uint32_t msg_id); - - /** * Delete messages. The messages are deleted on all devices and * on the IMAP server. diff --git a/deltachat-ffi/src/lib.rs b/deltachat-ffi/src/lib.rs index 461d6873e..561307301 100644 --- a/deltachat-ffi/src/lib.rs +++ b/deltachat-ffi/src/lib.rs @@ -1953,28 +1953,6 @@ pub unsafe extern "C" fn dc_get_msg_html( .strdup() } -#[no_mangle] -pub unsafe extern "C" fn dc_get_mime_headers( - context: *mut dc_context_t, - msg_id: u32, -) -> *mut libc::c_char { - if context.is_null() { - eprintln!("ignoring careless call to dc_get_mime_headers()"); - return ptr::null_mut(); // NULL explicitly defined as "no mime headers" - } - let ctx = &*context; - - block_on(async move { - let mime = message::get_mime_headers(ctx, MsgId::new(msg_id)) - .await - .unwrap_or_log_default(ctx, "failed to get mime headers"); - if mime.is_empty() { - return ptr::null_mut(); - } - mime.strdup() - }) -} - #[no_mangle] pub unsafe extern "C" fn dc_delete_msgs( context: *mut dc_context_t, diff --git a/python/src/deltachat/message.py b/python/src/deltachat/message.py index d5e832be6..d5447d76c 100644 --- a/python/src/deltachat/message.py +++ b/python/src/deltachat/message.py @@ -285,23 +285,6 @@ class Message: """Force the message to be sent in plain text.""" lib.dc_msg_force_plaintext(self._dc_msg) - def get_mime_headers(self): - """return mime-header object for an incoming message. - - This only returns a non-None object if ``save_mime_headers`` - config option was set and the message is incoming. - - :returns: email-mime message object (with headers only, no body). - """ - import email - - mime_headers = lib.dc_get_mime_headers(self.account._dc_context, self.id) - if mime_headers: - s = ffi.string(ffi.gc(mime_headers, lib.dc_str_unref)) - if isinstance(s, bytes): - return email.message_from_bytes(s) - return email.message_from_string(s) - @property def error(self) -> Optional[str]: """Error message.""" diff --git a/python/tests/test_1_online.py b/python/tests/test_1_online.py index b5a9dd9e5..1a3ce113f 100644 --- a/python/tests/test_1_online.py +++ b/python/tests/test_1_online.py @@ -1010,7 +1010,6 @@ def test_gossip_encryption_preference(acfactory, lp): def test_send_first_message_as_long_unicode_with_cr(acfactory, lp): ac1, ac2 = acfactory.get_online_accounts(2) - ac2.set_config("save_mime_headers", "1") lp.sec("ac1: create chat with ac2") chat = acfactory.get_accepted_chat(ac1, ac2) @@ -1400,26 +1399,6 @@ def test_quote_attachment(tmp_path, acfactory, lp): assert open(received_reply.filename).read() == "data to send" -def test_saved_mime_on_received_message(acfactory, lp): - ac1, ac2 = acfactory.get_online_accounts(2) - - lp.sec("configure ac2 to save mime headers, create ac1/ac2 chat") - ac2.set_config("save_mime_headers", "1") - chat = ac1.create_chat(ac2) - - lp.sec("sending text message from ac1 to ac2") - msg_out = chat.send_text("message1") - ac1._evtracker.wait_msg_delivered(msg_out) - assert msg_out.get_mime_headers() is None - - lp.sec("wait for ac2 to receive message") - ev = ac2._evtracker.get_matching("DC_EVENT_INCOMING_MSG") - in_id = ev.data2 - mime = ac2.get_message_by_id(in_id).get_mime_headers() - assert mime.get_all("From") - assert mime.get_all("Received") - - def test_send_mark_seen_clean_incoming_events(acfactory, lp): ac1, ac2 = acfactory.get_online_accounts(2) chat = acfactory.get_accepted_chat(ac1, ac2) diff --git a/python/tests/test_3_offline.py b/python/tests/test_3_offline.py index 4e917eeb3..f0f3737aa 100644 --- a/python/tests/test_3_offline.py +++ b/python/tests/test_3_offline.py @@ -105,10 +105,6 @@ class TestOfflineAccountBasic: ac1.update_config({"mvbox_move": False}) assert ac1.get_config("mvbox_move") == "0" - def test_has_savemime(self, acfactory): - ac1 = acfactory.get_unconfigured_account() - assert "save_mime_headers" in ac1.get_config("sys.config_keys").split() - def test_has_bccself(self, acfactory): ac1 = acfactory.get_unconfigured_account() assert "bcc_self" in ac1.get_config("sys.config_keys").split() diff --git a/src/config.rs b/src/config.rs index e317c7a4e..f1db35916 100644 --- a/src/config.rs +++ b/src/config.rs @@ -220,9 +220,6 @@ pub enum Config { /// `ProviderOptions::delete_to_trash`. DeleteToTrash, - /// Save raw MIME messages with headers in the database if true. - SaveMimeHeaders, - /// The primary email address. Also see `SecondaryAddrs`. ConfiguredAddr, @@ -716,7 +713,6 @@ impl Context { | Config::OnlyFetchMvbox | Config::FetchExistingMsgs | Config::DeleteToTrash - | Config::SaveMimeHeaders | Config::Configured | Config::Bot | Config::NotifyAboutWrongPw diff --git a/src/context.rs b/src/context.rs index 4b7fa9e60..154eb999d 100644 --- a/src/context.rs +++ b/src/context.rs @@ -919,12 +919,6 @@ impl Context { "show_emails", self.get_config_int(Config::ShowEmails).await?.to_string(), ); - res.insert( - "save_mime_headers", - self.get_config_bool(Config::SaveMimeHeaders) - .await? - .to_string(), - ); res.insert( "download_limit", self.get_config_int(Config::DownloadLimit) diff --git a/src/message.rs b/src/message.rs index 4673e56d1..550c5aaa1 100644 --- a/src/message.rs +++ b/src/message.rs @@ -1596,14 +1596,12 @@ pub(crate) fn guess_msgtype_from_path_suffix(path: &Path) -> Option<(Viewtype, & } /// Get the raw mime-headers of the given message. -/// Raw headers are saved for incoming messages -/// only if `set_config(context, "save_mime_headers", "1")` -/// was called before. +/// Raw headers are saved for large messages +/// that need a "Show full message..." +/// to see HTML part. /// -/// Returns an empty vector if there are no headers saved for the given message, -/// e.g. because of save_mime_headers is not set -/// or the message is not incoming. -pub async fn get_mime_headers(context: &Context, msg_id: MsgId) -> Result> { +/// Returns an empty vector if there are no headers saved for the given message. +pub(crate) async fn get_mime_headers(context: &Context, msg_id: MsgId) -> Result> { let (headers, compressed) = context .sql .query_row( diff --git a/src/receive_imf.rs b/src/receive_imf.rs index 7596e07b2..fb13232e9 100644 --- a/src/receive_imf.rs +++ b/src/receive_imf.rs @@ -1405,10 +1405,6 @@ async fn add_parts( ) .await?; - // if the mime-headers should be saved, find out its size - // (the mime-header ends with an empty line) - let save_mime_headers = context.get_config_bool(Config::SaveMimeHeaders).await?; - let mime_in_reply_to = mime_parser .get_header(HeaderDef::InReplyTo) .unwrap_or_default(); @@ -1434,7 +1430,7 @@ async fn add_parts( // `true` finally. let mut save_mime_modified = false; - let mime_headers = if save_mime_headers || mime_parser.is_mime_modified { + let mime_headers = if mime_parser.is_mime_modified { let headers = if !mime_parser.decoded_data.is_empty() { mime_parser.decoded_data.clone() } else { @@ -1698,7 +1694,7 @@ RETURNING id }, hidden, part.bytes as isize, - if (save_mime_headers || save_mime_modified) && !(trash || hidden) { + if save_mime_modified && !(trash || hidden) { mime_headers.clone() } else { Vec::new() diff --git a/src/receive_imf/receive_imf_tests.rs b/src/receive_imf/receive_imf_tests.rs index 171753b0e..17338f9c1 100644 --- a/src/receive_imf/receive_imf_tests.rs +++ b/src/receive_imf/receive_imf_tests.rs @@ -1900,38 +1900,6 @@ async fn test_save_mime_headers_off() -> anyhow::Result<()> { Ok(()) } -#[tokio::test(flavor = "multi_thread", worker_threads = 2)] -async fn test_save_mime_headers_on() -> anyhow::Result<()> { - let alice = TestContext::new_alice().await; - alice.set_config_bool(Config::SaveMimeHeaders, true).await?; - let bob = TestContext::new_bob().await; - bob.set_config_bool(Config::SaveMimeHeaders, true).await?; - - // alice sends a message to bob, bob sees full mime - let chat_alice = alice.create_chat(&bob).await; - chat::send_text_msg(&alice, chat_alice.id, "hi!".to_string()).await?; - - let msg = bob.recv_msg(&alice.pop_sent_msg().await).await; - assert_eq!(msg.get_text(), "hi!"); - assert!(!msg.get_showpadlock()); - let mime = message::get_mime_headers(&bob, msg.id).await?; - let mime_str = String::from_utf8_lossy(&mime); - assert!(mime_str.contains("Message-ID:")); - assert!(mime_str.contains("From:")); - - // another one, from bob to alice, that gets encrypted - let chat_bob = bob.create_chat(&alice).await; - chat::send_text_msg(&bob, chat_bob.id, "ho!".to_string()).await?; - let msg = alice.recv_msg(&bob.pop_sent_msg().await).await; - assert_eq!(msg.get_text(), "ho!"); - assert!(msg.get_showpadlock()); - let mime = message::get_mime_headers(&alice, msg.id).await?; - let mime_str = String::from_utf8_lossy(&mime); - assert!(mime_str.contains("Message-ID:")); - assert!(mime_str.contains("From:")); - Ok(()) -} - async fn check_alias_reply(from_dc: bool, chat_request: bool, group_request: bool) { let mut tcm = TestContextManager::new(); let alice = tcm.alice().await;