mirror of
https://github.com/chatmail/core.git
synced 2026-05-23 00:36:32 +03:00
api!: remove save_mime_headers config option and dc_get_mime_headers()
This was only used in tests. `msgs.mime_headers` coulmn remains as it is used for HTML messages.
This commit is contained in:
@@ -448,9 +448,6 @@ char* dc_get_blobdir (const dc_context_t* context);
|
|||||||
* generate Curve25519 keypair
|
* generate Curve25519 keypair
|
||||||
* DC_KEY_GEN_RSA4096 (3)=
|
* DC_KEY_GEN_RSA4096 (3)=
|
||||||
* generate RSA 4096 keypair
|
* 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),
|
* - `delete_device_after` = 0=do not delete messages from device automatically (default),
|
||||||
* >=1=seconds, after which messages are deleted automatically from the device.
|
* >=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.
|
* 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);
|
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
|
* Delete messages. The messages are deleted on all devices and
|
||||||
* on the IMAP server.
|
* on the IMAP server.
|
||||||
|
|||||||
@@ -1953,28 +1953,6 @@ pub unsafe extern "C" fn dc_get_msg_html(
|
|||||||
.strdup()
|
.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]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn dc_delete_msgs(
|
pub unsafe extern "C" fn dc_delete_msgs(
|
||||||
context: *mut dc_context_t,
|
context: *mut dc_context_t,
|
||||||
|
|||||||
@@ -285,23 +285,6 @@ class Message:
|
|||||||
"""Force the message to be sent in plain text."""
|
"""Force the message to be sent in plain text."""
|
||||||
lib.dc_msg_force_plaintext(self._dc_msg)
|
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
|
@property
|
||||||
def error(self) -> Optional[str]:
|
def error(self) -> Optional[str]:
|
||||||
"""Error message."""
|
"""Error message."""
|
||||||
|
|||||||
@@ -1010,7 +1010,6 @@ def test_gossip_encryption_preference(acfactory, lp):
|
|||||||
|
|
||||||
def test_send_first_message_as_long_unicode_with_cr(acfactory, lp):
|
def test_send_first_message_as_long_unicode_with_cr(acfactory, lp):
|
||||||
ac1, ac2 = acfactory.get_online_accounts(2)
|
ac1, ac2 = acfactory.get_online_accounts(2)
|
||||||
ac2.set_config("save_mime_headers", "1")
|
|
||||||
|
|
||||||
lp.sec("ac1: create chat with ac2")
|
lp.sec("ac1: create chat with ac2")
|
||||||
chat = acfactory.get_accepted_chat(ac1, 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"
|
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):
|
def test_send_mark_seen_clean_incoming_events(acfactory, lp):
|
||||||
ac1, ac2 = acfactory.get_online_accounts(2)
|
ac1, ac2 = acfactory.get_online_accounts(2)
|
||||||
chat = acfactory.get_accepted_chat(ac1, ac2)
|
chat = acfactory.get_accepted_chat(ac1, ac2)
|
||||||
|
|||||||
@@ -105,10 +105,6 @@ class TestOfflineAccountBasic:
|
|||||||
ac1.update_config({"mvbox_move": False})
|
ac1.update_config({"mvbox_move": False})
|
||||||
assert ac1.get_config("mvbox_move") == "0"
|
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):
|
def test_has_bccself(self, acfactory):
|
||||||
ac1 = acfactory.get_unconfigured_account()
|
ac1 = acfactory.get_unconfigured_account()
|
||||||
assert "bcc_self" in ac1.get_config("sys.config_keys").split()
|
assert "bcc_self" in ac1.get_config("sys.config_keys").split()
|
||||||
|
|||||||
@@ -220,9 +220,6 @@ pub enum Config {
|
|||||||
/// `ProviderOptions::delete_to_trash`.
|
/// `ProviderOptions::delete_to_trash`.
|
||||||
DeleteToTrash,
|
DeleteToTrash,
|
||||||
|
|
||||||
/// Save raw MIME messages with headers in the database if true.
|
|
||||||
SaveMimeHeaders,
|
|
||||||
|
|
||||||
/// The primary email address. Also see `SecondaryAddrs`.
|
/// The primary email address. Also see `SecondaryAddrs`.
|
||||||
ConfiguredAddr,
|
ConfiguredAddr,
|
||||||
|
|
||||||
@@ -716,7 +713,6 @@ impl Context {
|
|||||||
| Config::OnlyFetchMvbox
|
| Config::OnlyFetchMvbox
|
||||||
| Config::FetchExistingMsgs
|
| Config::FetchExistingMsgs
|
||||||
| Config::DeleteToTrash
|
| Config::DeleteToTrash
|
||||||
| Config::SaveMimeHeaders
|
|
||||||
| Config::Configured
|
| Config::Configured
|
||||||
| Config::Bot
|
| Config::Bot
|
||||||
| Config::NotifyAboutWrongPw
|
| Config::NotifyAboutWrongPw
|
||||||
|
|||||||
@@ -919,12 +919,6 @@ impl Context {
|
|||||||
"show_emails",
|
"show_emails",
|
||||||
self.get_config_int(Config::ShowEmails).await?.to_string(),
|
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(
|
res.insert(
|
||||||
"download_limit",
|
"download_limit",
|
||||||
self.get_config_int(Config::DownloadLimit)
|
self.get_config_int(Config::DownloadLimit)
|
||||||
|
|||||||
@@ -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.
|
/// Get the raw mime-headers of the given message.
|
||||||
/// Raw headers are saved for incoming messages
|
/// Raw headers are saved for large messages
|
||||||
/// only if `set_config(context, "save_mime_headers", "1")`
|
/// that need a "Show full message..."
|
||||||
/// was called before.
|
/// to see HTML part.
|
||||||
///
|
///
|
||||||
/// Returns an empty vector if there are no headers saved for the given message,
|
/// Returns an empty vector if there are no headers saved for the given message.
|
||||||
/// e.g. because of save_mime_headers is not set
|
pub(crate) async fn get_mime_headers(context: &Context, msg_id: MsgId) -> Result<Vec<u8>> {
|
||||||
/// or the message is not incoming.
|
|
||||||
pub async fn get_mime_headers(context: &Context, msg_id: MsgId) -> Result<Vec<u8>> {
|
|
||||||
let (headers, compressed) = context
|
let (headers, compressed) = context
|
||||||
.sql
|
.sql
|
||||||
.query_row(
|
.query_row(
|
||||||
|
|||||||
@@ -1405,10 +1405,6 @@ async fn add_parts(
|
|||||||
)
|
)
|
||||||
.await?;
|
.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
|
let mime_in_reply_to = mime_parser
|
||||||
.get_header(HeaderDef::InReplyTo)
|
.get_header(HeaderDef::InReplyTo)
|
||||||
.unwrap_or_default();
|
.unwrap_or_default();
|
||||||
@@ -1434,7 +1430,7 @@ async fn add_parts(
|
|||||||
// `true` finally.
|
// `true` finally.
|
||||||
let mut save_mime_modified = false;
|
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() {
|
let headers = if !mime_parser.decoded_data.is_empty() {
|
||||||
mime_parser.decoded_data.clone()
|
mime_parser.decoded_data.clone()
|
||||||
} else {
|
} else {
|
||||||
@@ -1698,7 +1694,7 @@ RETURNING id
|
|||||||
},
|
},
|
||||||
hidden,
|
hidden,
|
||||||
part.bytes as isize,
|
part.bytes as isize,
|
||||||
if (save_mime_headers || save_mime_modified) && !(trash || hidden) {
|
if save_mime_modified && !(trash || hidden) {
|
||||||
mime_headers.clone()
|
mime_headers.clone()
|
||||||
} else {
|
} else {
|
||||||
Vec::new()
|
Vec::new()
|
||||||
|
|||||||
@@ -1900,38 +1900,6 @@ async fn test_save_mime_headers_off() -> anyhow::Result<()> {
|
|||||||
Ok(())
|
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) {
|
async fn check_alias_reply(from_dc: bool, chat_request: bool, group_request: bool) {
|
||||||
let mut tcm = TestContextManager::new();
|
let mut tcm = TestContextManager::new();
|
||||||
let alice = tcm.alice().await;
|
let alice = tcm.alice().await;
|
||||||
|
|||||||
Reference in New Issue
Block a user