support mailinglists based on Sender: header

This commit is contained in:
B. Petersen
2021-02-15 15:01:10 +01:00
committed by bjoern
parent e7c6667347
commit 0c2b3e838e

View File

@@ -22,7 +22,9 @@ use crate::events::EventType;
use crate::headerdef::{HeaderDef, HeaderDefMap}; use crate::headerdef::{HeaderDef, HeaderDefMap};
use crate::job::{self, Action}; use crate::job::{self, Action};
use crate::message::{self, rfc724_mid_exists, Message, MessageState, MessengerMessage, MsgId}; use crate::message::{self, rfc724_mid_exists, Message, MessageState, MessengerMessage, MsgId};
use crate::mimeparser::{parse_message_ids, AvatarAction, MimeMessage, SystemMessage}; use crate::mimeparser::{
parse_message_ids, AvatarAction, MailinglistType, MimeMessage, SystemMessage,
};
use crate::param::{Param, Params}; use crate::param::{Param, Params};
use crate::peerstate::{Peerstate, PeerstateKeyType, PeerstateVerifiedStatus}; use crate::peerstate::{Peerstate, PeerstateKeyType, PeerstateVerifiedStatus};
use crate::securejoin::{self, handle_securejoin_handshake, observe_securejoin_on_other_device}; use crate::securejoin::{self, handle_securejoin_handshake, observe_securejoin_on_other_device};
@@ -103,8 +105,6 @@ pub(crate) async fn dc_receive_imf_inner(
let mut created_db_entries = Vec::new(); let mut created_db_entries = Vec::new();
let mut create_event_to_send = Some(CreateEvent::MsgsChanged); let mut create_event_to_send = Some(CreateEvent::MsgsChanged);
let list_id_header: Option<&String> = mime_parser.get(HeaderDef::ListId);
// helper method to handle early exit and memory cleanup // helper method to handle early exit and memory cleanup
let cleanup = |context: &Context, let cleanup = |context: &Context,
create_event_to_send: &Option<CreateEvent>, create_event_to_send: &Option<CreateEvent>,
@@ -125,7 +125,8 @@ pub(crate) async fn dc_receive_imf_inner(
sent_timestamp = mailparse::dateparse(value).unwrap_or_default(); sent_timestamp = mailparse::dateparse(value).unwrap_or_default();
} }
let prevent_rename = list_id_header.is_some() || mime_parser.get(HeaderDef::Sender).is_some(); let prevent_rename =
mime_parser.is_mailinglist_message() || mime_parser.get(HeaderDef::Sender).is_some();
// get From: (it can be an address list!) and check if it is known (for known From:'s we add // get From: (it can be an address list!) and check if it is known (for known From:'s we add
// the other To:/Cc: in the 3rd pass) // the other To:/Cc: in the 3rd pass)
@@ -521,27 +522,36 @@ async fn add_parts(
if chat_id.is_unset() { if chat_id.is_unset() {
// check if the message belongs to a mailing list // check if the message belongs to a mailing list
if let Some(list_id_header) = mime_parser.get(HeaderDef::ListId) { match mime_parser.get_mailinglist_type() {
let create_blocked = Blocked::Deaddrop; MailinglistType::ListIdBased => {
if let Some(list_id) = mime_parser.get(HeaderDef::ListId) {
let (new_chat_id, new_chat_id_blocked) = create_or_lookup_mailinglist( let (new_chat_id, new_chat_id_blocked) = create_or_lookup_mailinglist(
context, context,
allow_creation, allow_creation,
create_blocked, Blocked::Deaddrop,
list_id_header, list_id,
&mime_parser.get_subject().unwrap_or_default(), &mime_parser.get_subject().unwrap_or_default(),
) )
.await; .await;
*chat_id = new_chat_id;
*chat_id = new_chat_id; chat_id_blocked = new_chat_id_blocked;
chat_id_blocked = new_chat_id_blocked;
if let Some(from) = mime_parser.from.first() {
if let Some(from_name) = &from.display_name {
for part in mime_parser.parts.iter_mut() {
part.param.set(Param::OverrideSenderDisplayname, from_name);
}
} }
} }
MailinglistType::SenderBased => {
if let Some(sender) = mime_parser.get(HeaderDef::Sender) {
let (new_chat_id, new_chat_id_blocked) = create_or_lookup_mailinglist(
context,
allow_creation,
Blocked::Deaddrop,
sender,
&mime_parser.get_subject().unwrap_or_default(),
)
.await;
*chat_id = new_chat_id;
chat_id_blocked = new_chat_id_blocked;
}
}
MailinglistType::None => {}
} }
} }