From bf5edfa3b31287e2acf576ae8167c65927210244 Mon Sep 17 00:00:00 2001 From: bjoern Date: Tue, 26 Jul 2022 12:50:16 +0200 Subject: [PATCH] add ffi to get mailinglist post address (#3520) * add ffi to get mailinglist post address * Update deltachat-ffi/deltachat.h Co-authored-by: Hocuri * adapt tests to check get_mailinglist_addr() Co-authored-by: Hocuri --- CHANGELOG.md | 3 +++ deltachat-ffi/deltachat.h | 13 +++++++++++++ deltachat-ffi/src/lib.rs | 10 ++++++++++ src/chat.rs | 5 +++++ src/receive_imf.rs | 36 ++++++++++++++++++++++++++++++++---- 5 files changed, 63 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b72b35cc4..3a335c735 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## Unreleased +### API-Changes +- add `dc_chat_get_mailinglist_addr()` #3520 + ### Added ### Changes diff --git a/deltachat-ffi/deltachat.h b/deltachat-ffi/deltachat.h index 74c13edc6..3db00c2dd 100644 --- a/deltachat-ffi/deltachat.h +++ b/deltachat-ffi/deltachat.h @@ -3257,6 +3257,19 @@ uint32_t dc_chat_get_id (const dc_chat_t* chat); int dc_chat_get_type (const dc_chat_t* chat); +/** + * Returns the address where messages are sent to if the chat is a mailing list. + * If you just want to know if a mailing list can be written to, + * use dc_chat_can_send() instead. + * + * @memberof dc_chat_t + * @param chat The chat object. + * @return The mailing list address. Must be released using dc_str_unref() after usage. + * If there is no such address, an empty string is returned, NULL is never returned. + */ +char* dc_chat_get_mailinglist_addr (const dc_chat_t* chat); + + /** * Get name of a chat. For one-to-one chats, this is the name of the contact. * For group chats, this is the name given e.g. to dc_create_group_chat() or diff --git a/deltachat-ffi/src/lib.rs b/deltachat-ffi/src/lib.rs index 37596b523..7143c1f8c 100644 --- a/deltachat-ffi/src/lib.rs +++ b/deltachat-ffi/src/lib.rs @@ -2781,6 +2781,16 @@ pub unsafe extern "C" fn dc_chat_get_name(chat: *mut dc_chat_t) -> *mut libc::c_ ffi_chat.chat.get_name().strdup() } +#[no_mangle] +pub unsafe extern "C" fn dc_chat_get_mailinglist_addr(chat: *mut dc_chat_t) -> *mut libc::c_char { + if chat.is_null() { + eprintln!("ignoring careless call to dc_chat_get_mailinglist_addr()"); + return "".strdup(); + } + let ffi_chat = &*chat; + ffi_chat.chat.get_mailinglist_addr().strdup() +} + #[no_mangle] pub unsafe extern "C" fn dc_chat_get_profile_image(chat: *mut dc_chat_t) -> *mut libc::c_char { if chat.is_null() { diff --git a/src/chat.rs b/src/chat.rs index 9262d3c06..e5a6d039b 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -1129,6 +1129,11 @@ impl Chat { &self.name } + /// Returns mailing list address where messages are sent to. + pub fn get_mailinglist_addr(&self) -> &str { + self.param.get(Param::ListPost).unwrap_or_default() + } + /// Returns profile image path for the chat. pub async fn get_profile_image(&self, context: &Context) -> Result> { if let Some(image_rel) = self.param.get(Param::ProfileImage) { diff --git a/src/receive_imf.rs b/src/receive_imf.rs index ef46f265a..b545dfa84 100644 --- a/src/receive_imf.rs +++ b/src/receive_imf.rs @@ -2932,6 +2932,10 @@ mod tests { assert!(chat.is_mailing_list()); assert!(chat.can_send(&t.ctx).await?); + assert_eq!( + chat.get_mailinglist_addr(), + "reply+elernshsetushoyseshetihseusaferuhsedtisneu@reply.github.com" + ); assert_eq!(chat.name, "deltachat/deltachat-core-rust"); assert_eq!(chat::get_chat_contacts(&t.ctx, chat_id).await?.len(), 1); @@ -2939,6 +2943,7 @@ mod tests { let chat = chat::Chat::load_from_db(&t.ctx, chat_id).await?; assert!(!chat.can_send(&t.ctx).await?); + assert_eq!(chat.get_mailinglist_addr(), ""); let chats = Chatlist::try_load(&t.ctx, 0, None, None).await?; assert_eq!(chats.len(), 1); @@ -2997,6 +3002,7 @@ mod tests { let chat = Chat::load_from_db(&t.ctx, chat_id).await.unwrap(); assert_eq!(chat.name, "delta-dev"); assert!(chat.can_send(&t).await?); + assert_eq!(chat.get_mailinglist_addr(), "delta@codespeak.net"); let msg = get_chat_msg(&t, chat_id, 0, 1).await; let contact1 = Contact::load_from_db(&t.ctx, msg.from_id).await.unwrap(); @@ -3225,7 +3231,7 @@ Hello mailinglist!\r\n" } #[tokio::test(flavor = "multi_thread", worker_threads = 2)] - async fn test_majordomo_mailing_list() { + async fn test_majordomo_mailing_list() -> Result<()> { let t = TestContext::new_alice().await; t.set_config(Config::ShowEmails, Some("2")).await.unwrap(); @@ -3252,6 +3258,8 @@ Hello mailinglist!\r\n" assert_eq!(chat.grpid, "mylist@bar.org"); assert_eq!(chat.name, "ola"); assert_eq!(chat::get_chat_msgs(&t, chat.id, 0).await.unwrap().len(), 1); + assert!(!chat.can_send(&t).await?); + assert_eq!(chat.get_mailinglist_addr(), ""); // receive another message with no sender name but the same address, // make sure this lands in the same chat @@ -3271,10 +3279,12 @@ Hello mailinglist!\r\n" .await .unwrap(); assert_eq!(chat::get_chat_msgs(&t, chat.id, 0).await.unwrap().len(), 2); + + Ok(()) } #[tokio::test(flavor = "multi_thread", worker_threads = 2)] - async fn test_mailchimp_mailing_list() { + async fn test_mailchimp_mailing_list() -> Result<()> { let t = TestContext::new_alice().await; t.set_config(Config::ShowEmails, Some("2")).await.unwrap(); @@ -3301,10 +3311,14 @@ Hello mailinglist!\r\n" "399fc0402f1b154b67965632e.100761.list-id.mcsv.net" ); assert_eq!(chat.name, "Atlas Obscura"); + assert!(!chat.can_send(&t).await?); + assert_eq!(chat.get_mailinglist_addr(), ""); + + Ok(()) } #[tokio::test(flavor = "multi_thread", worker_threads = 2)] - async fn test_dhl_mailing_list() { + async fn test_dhl_mailing_list() -> Result<()> { let t = TestContext::new_alice().await; t.set_config(Config::ShowEmails, Some("2")).await.unwrap(); @@ -3326,10 +3340,14 @@ Hello mailinglist!\r\n" assert_eq!(chat.blocked, Blocked::Request); assert_eq!(chat.grpid, "1234ABCD-123LMNO.mailing.dhl.de"); assert_eq!(chat.name, "DHL Paket"); + assert!(!chat.can_send(&t).await?); + assert_eq!(chat.get_mailinglist_addr(), ""); + + Ok(()) } #[tokio::test(flavor = "multi_thread", worker_threads = 2)] - async fn test_dpd_mailing_list() { + async fn test_dpd_mailing_list() -> Result<()> { let t = TestContext::new_alice().await; t.set_config(Config::ShowEmails, Some("2")).await.unwrap(); @@ -3351,6 +3369,10 @@ Hello mailinglist!\r\n" assert_eq!(chat.blocked, Blocked::Request); assert_eq!(chat.grpid, "dpdde.mxmail.service.dpd.de"); assert_eq!(chat.name, "DPD"); + assert!(!chat.can_send(&t).await?); + assert_eq!(chat.get_mailinglist_addr(), ""); + + Ok(()) } #[tokio::test(flavor = "multi_thread", worker_threads = 2)] @@ -3368,6 +3390,8 @@ Hello mailinglist!\r\n" assert_eq!(chat.typ, Chattype::Mailinglist); assert_eq!(chat.grpid, "96540.xt.local"); assert_eq!(chat.name, "Microsoft Store"); + assert!(!chat.can_send(&t).await?); + assert_eq!(chat.get_mailinglist_addr(), ""); receive_imf( &t, @@ -3379,6 +3403,8 @@ Hello mailinglist!\r\n" assert_eq!(chat.typ, Chattype::Mailinglist); assert_eq!(chat.grpid, "121231234.xt.local"); assert_eq!(chat.name, "DER SPIEGEL Kundenservice"); + assert!(!chat.can_send(&t).await?); + assert_eq!(chat.get_mailinglist_addr(), ""); Ok(()) } @@ -3400,6 +3426,8 @@ Hello mailinglist!\r\n" assert_eq!(chat.typ, Chattype::Mailinglist); assert_eq!(chat.grpid, "51231231231231231231231232869f58.xing.com"); assert_eq!(chat.name, "xing.com"); + assert!(!chat.can_send(&t).await?); + assert_eq!(chat.get_mailinglist_addr(), ""); Ok(()) }