diff --git a/deltachat-ffi/deltachat.h b/deltachat-ffi/deltachat.h index c8e27f889..5b8caa07b 100644 --- a/deltachat-ffi/deltachat.h +++ b/deltachat-ffi/deltachat.h @@ -3904,6 +3904,16 @@ int64_t dc_lot_get_timestamp (const dc_lot_t* lot); */ #define DC_EVENT_SMTP_MESSAGE_SENT 103 +/** + * Emitted when a message was successfully marked as deleted on the SMTP server. + * + * @param data1 0 + * @param data2 (const char*) Info string in english language. + * Must not be free()'d or modified and is valid only until the callback returns. + * @return 0 + */ +#define DC_EVENT_IMAP_MESSAGE_DELETED 104 + /** * The library-user should write a warning string to the log. diff --git a/deltachat-ffi/src/lib.rs b/deltachat-ffi/src/lib.rs index eaa15f8f4..e1726159f 100644 --- a/deltachat-ffi/src/lib.rs +++ b/deltachat-ffi/src/lib.rs @@ -125,6 +125,7 @@ impl ContextWrapper { | Event::SmtpConnected(msg) | Event::ImapConnected(msg) | Event::SmtpMessageSent(msg) + | Event::ImapMessageDeleted(msg) | Event::Warning(msg) | Event::Error(msg) | Event::ErrorNetwork(msg) diff --git a/python/src/deltachat/const.py b/python/src/deltachat/const.py index 534510b5e..96060c5af 100644 --- a/python/src/deltachat/const.py +++ b/python/src/deltachat/const.py @@ -8,9 +8,6 @@ from os.path import join as joinpath # this works well when you in a git-checkout # run "python deltachat/const.py" to regenerate events # begin const generated -DC_PROVIDER_STATUS_OK = 1 -DC_PROVIDER_STATUS_PREPARATION = 2 -DC_PROVIDER_STATUS_BROKEN = 3 DC_GCL_ARCHIVED_ONLY = 0x01 DC_GCL_NO_SPECIALS = 0x02 DC_GCL_ADD_ALLDONE_HINT = 0x04 @@ -55,6 +52,7 @@ DC_CONTACT_ID_LAST_SPECIAL = 9 DC_MSG_TEXT = 10 DC_MSG_IMAGE = 20 DC_MSG_GIF = 21 +DC_MSG_STICKER = 23 DC_MSG_AUDIO = 40 DC_MSG_VOICE = 41 DC_MSG_VIDEO = 50 @@ -63,6 +61,7 @@ DC_EVENT_INFO = 100 DC_EVENT_SMTP_CONNECTED = 101 DC_EVENT_IMAP_CONNECTED = 102 DC_EVENT_SMTP_MESSAGE_SENT = 103 +DC_EVENT_IMAP_MESSAGE_DELETED = 104 DC_EVENT_WARNING = 300 DC_EVENT_ERROR = 400 DC_EVENT_ERROR_NETWORK = 401 @@ -83,6 +82,9 @@ DC_EVENT_SECUREJOIN_JOINER_PROGRESS = 2061 DC_EVENT_GET_STRING = 2091 DC_EVENT_FILE_COPIED = 2055 DC_EVENT_IS_OFFLINE = 2081 +DC_PROVIDER_STATUS_OK = 1 +DC_PROVIDER_STATUS_PREPARATION = 2 +DC_PROVIDER_STATUS_BROKEN = 3 # end const generated diff --git a/python/tests/test_account.py b/python/tests/test_account.py index fc5e13aa3..3e548b578 100644 --- a/python/tests/test_account.py +++ b/python/tests/test_account.py @@ -596,6 +596,9 @@ class TestOnlineAccount: lp.sec("ac2: start QR-code based join-group protocol") ch = ac2.qr_join_chat(qr) assert ch.id >= 10 + # check that at least some of the handshake messages are deleted + ac1._evlogger.get_matching("DC_EVENT_IMAP_MESSAGE_DELETED") + ac2._evlogger.get_matching("DC_EVENT_IMAP_MESSAGE_DELETED") wait_securejoin_inviter_progress(ac1, 1000) def test_qr_verified_group_and_chatting(self, acfactory, lp): diff --git a/src/events.rs b/src/events.rs index 0477febce..19c43c37a 100644 --- a/src/events.rs +++ b/src/events.rs @@ -42,6 +42,12 @@ pub enum Event { #[strum(props(id = "103"))] SmtpMessageSent(String), + /// Emitted when an IMAP message has been marked as deleted + /// + /// @return 0 + #[strum(props(id = "104"))] + ImapMessageDeleted(String), + /// The library-user should write a warning string to the log. /// Passed to the callback given to dc_context_new(). /// diff --git a/src/imap.rs b/src/imap.rs index 9c1c4cc59..8207c34da 100644 --- a/src/imap.rs +++ b/src/imap.rs @@ -1317,15 +1317,16 @@ impl Imap { ); } else { let set = format!("{}", server_uid); + let display_imap_id = format!("{}/{}", folder.as_ref(), server_uid); + if let Some(ref mut session) = &mut *self.session.lock().unwrap() { match session.uid_fetch(set, PREFETCH_FLAGS) { Ok(msgs) => { if msgs.is_empty() { warn!( context, - "Cannot delete on IMAP, {}/{}: message-id gone '{}'", - folder.as_ref(), - server_uid, + "Cannot delete on IMAP, {}: message-id gone '{}'", + display_imap_id, message_id.as_ref(), ); } else { @@ -1336,9 +1337,8 @@ impl Imap { if remote_message_id != message_id.as_ref() { warn!( context, - "Cannot delete on IMAP, {}/{}: remote message-id '{}' != '{}'", - folder.as_ref(), - server_uid, + "Cannot delete on IMAP, {}: remote message-id '{}' != '{}'", + display_imap_id, remote_message_id, message_id.as_ref(), ); @@ -1351,9 +1351,8 @@ impl Imap { warn!( context, - "Cannot delete on IMAP, {}/{} not found.", - folder.as_ref(), - server_uid, + "Cannot delete on IMAP, {} not found.", + display_imap_id, ); *server_uid = 0; } @@ -1364,6 +1363,13 @@ impl Imap { if !self.add_flag_finalized(context, *server_uid, "\\Deleted") { warn!(context, "Cannot mark message as \"Deleted\"."); } else { + emit_event!( + context, + Event::ImapMessageDeleted(format!( + "IMAP Message {} marked as deleted [{}]", + display_imap_id, message_id.as_ref() + )) + ); self.config.write().unwrap().selected_folder_needs_expunge = true; success = true } diff --git a/src/mimefactory.rs b/src/mimefactory.rs index 0bca187b9..39cca0bbe 100644 --- a/src/mimefactory.rs +++ b/src/mimefactory.rs @@ -578,7 +578,6 @@ impl<'a> MimeFactory<'a> { wrapmime::set_body_text(mach_mime_part, &message_text2)?; mailmime_add_part(multipart, mach_mime_part); force_plaintext = DC_FP_NO_AUTOCRYPT_HEADER; - info!(context, "sending MDM {:?}", message_text2); /* currently, we do not send MDNs encrypted: - in a multi-device-setup that is not set up properly, MDNs would disturb the communication as they are send automatically which may lead to spreading outdated Autocrypt headers.