1
0
Fork 0
mirror of https://github.com/deltachat/deltachat-core.git synced 2025-10-06 03:50:08 +02:00

respect show_emails settings in receive_imf()

This commit is contained in:
B. Petersen 2019-02-25 23:33:51 +01:00
parent 6887499efc
commit b50cd54121
No known key found for this signature in database
GPG key ID: 3B88E92DEA8E9AFC

View file

@ -476,7 +476,8 @@ cleanup:
******************************************************************************/ ******************************************************************************/
static void create_or_lookup_adhoc_group(dc_context_t* context, dc_mimeparser_t* mime_parser, int create_blocked, static void create_or_lookup_adhoc_group(dc_context_t* context, dc_mimeparser_t* mime_parser,
int allow_creation, int create_blocked,
int32_t from_id, const dc_array_t* to_ids,/*does not contain SELF*/ int32_t from_id, const dc_array_t* to_ids,/*does not contain SELF*/
uint32_t* ret_chat_id, int* ret_chat_id_blocked) uint32_t* ret_chat_id, int* ret_chat_id_blocked)
{ {
@ -523,6 +524,10 @@ static void create_or_lookup_adhoc_group(dc_context_t* context, dc_mimeparser_t*
} }
} }
if (!allow_creation) {
goto cleanup;
}
/* we do not check if the message is a reply to another group, this may result in /* we do not check if the message is a reply to another group, this may result in
chats with unclear member list. instead we create a new group in the following lines ... */ chats with unclear member list. instead we create a new group in the following lines ... */
@ -674,7 +679,8 @@ which tries to create or find out the chat_id by:
So when the function returns, the caller has the group id matching the current So when the function returns, the caller has the group id matching the current
state of the group. */ state of the group. */
static void create_or_lookup_group(dc_context_t* context, dc_mimeparser_t* mime_parser, int create_blocked, static void create_or_lookup_group(dc_context_t* context, dc_mimeparser_t* mime_parser,
int allow_creation, int create_blocked,
int32_t from_id, const dc_array_t* to_ids, int32_t from_id, const dc_array_t* to_ids,
uint32_t* ret_chat_id, int* ret_chat_id_blocked) uint32_t* ret_chat_id, int* ret_chat_id_blocked)
{ {
@ -734,7 +740,9 @@ static void create_or_lookup_group(dc_context_t* context, dc_mimeparser_t* mime_
if (grpid==NULL) if (grpid==NULL)
{ {
create_or_lookup_adhoc_group(context, mime_parser, create_blocked, from_id, to_ids, &chat_id, &chat_id_blocked); create_or_lookup_adhoc_group(context, mime_parser,
allow_creation, create_blocked,
from_id, to_ids, &chat_id, &chat_id_blocked);
goto cleanup; goto cleanup;
} }
} }
@ -825,6 +833,10 @@ static void create_or_lookup_group(dc_context_t* context, dc_mimeparser_t* mime_
} }
} }
if (!allow_creation) {
goto cleanup;
}
chat_id = create_group_record(context, grpid, grpname, create_blocked, create_verified); chat_id = create_group_record(context, grpid, grpname, create_blocked, create_verified);
chat_id_blocked = create_blocked; chat_id_blocked = create_blocked;
chat_id_verified = create_verified; chat_id_verified = create_verified;
@ -838,7 +850,9 @@ static void create_or_lookup_group(dc_context_t* context, dc_mimeparser_t* mime_
chat_id = DC_CHAT_ID_TRASH; /* we got a message for a chat we've deleted - do not show this even as a normal chat */ chat_id = DC_CHAT_ID_TRASH; /* we got a message for a chat we've deleted - do not show this even as a normal chat */
} }
else { else {
create_or_lookup_adhoc_group(context, mime_parser, create_blocked, from_id, to_ids, &chat_id, &chat_id_blocked); create_or_lookup_adhoc_group(context, mime_parser,
allow_creation, create_blocked,
from_id, to_ids, &chat_id, &chat_id_blocked);
} }
goto cleanup; goto cleanup;
} }
@ -936,7 +950,8 @@ static void create_or_lookup_group(dc_context_t* context, dc_mimeparser_t* mime_
int is_contact_cnt = dc_get_chat_contact_cnt(context, chat_id); int is_contact_cnt = dc_get_chat_contact_cnt(context, chat_id);
if (is_contact_cnt > 3 /* to_ids_cnt==1 may be "From: A, To: B, SELF" as SELF is not counted in to_ids_cnt. So everything up to 3 is no error. */) { if (is_contact_cnt > 3 /* to_ids_cnt==1 may be "From: A, To: B, SELF" as SELF is not counted in to_ids_cnt. So everything up to 3 is no error. */) {
chat_id = 0; chat_id = 0;
create_or_lookup_adhoc_group(context, mime_parser, create_blocked, from_id, to_ids, &chat_id, &chat_id_blocked); create_or_lookup_adhoc_group(context, mime_parser,
allow_creation, create_blocked, from_id, to_ids, &chat_id, &chat_id_blocked);
goto cleanup; goto cleanup;
} }
} }
@ -975,6 +990,7 @@ void dc_receive_imf(dc_context_t* context, const char* imf_raw_not_terminated, s
int chat_id_blocked = 0; int chat_id_blocked = 0;
int state = DC_STATE_UNDEFINED; int state = DC_STATE_UNDEFINED;
int hidden = 0; int hidden = 0;
int msgrmsg = 0;
int add_delete_job = 0; int add_delete_job = 0;
uint32_t insert_msg_id = 0; uint32_t insert_msg_id = 0;
@ -1142,6 +1158,11 @@ void dc_receive_imf(dc_context_t* context, const char* imf_raw_not_terminated, s
} }
} }
msgrmsg = mime_parser->is_send_by_messenger; /* 1 or 0 for yes/no */
if (msgrmsg==0 && dc_is_reply_to_messenger_message(context, mime_parser)) {
msgrmsg = 2; /* 2=no, but is reply to messenger message */
}
/* check if the message introduces a new chat: /* check if the message introduces a new chat:
- outgoing messages introduce a chat with the first to: address if they are sent by a messenger - outgoing messages introduce a chat with the first to: address if they are sent by a messenger
- incoming messages introduce a chat only for known contacts if they are sent by a messenger - incoming messages introduce a chat only for known contacts if they are sent by a messenger
@ -1154,6 +1175,7 @@ void dc_receive_imf(dc_context_t* context, const char* imf_raw_not_terminated, s
// handshake messages must be processed before chats are created (eg. contacs may be marked as verified) // handshake messages must be processed before chats are created (eg. contacs may be marked as verified)
assert( chat_id==0); assert( chat_id==0);
if (dc_mimeparser_lookup_field(mime_parser, "Secure-Join")) { if (dc_mimeparser_lookup_field(mime_parser, "Secure-Join")) {
msgrmsg = 1; // avoid discarding by show_emails setting
dc_sqlite3_commit(context->sql); dc_sqlite3_commit(context->sql);
int handshake = dc_handle_securejoin_handshake(context, mime_parser, from_id); int handshake = dc_handle_securejoin_handshake(context, mime_parser, from_id);
if (handshake & DC_HANDSHAKE_STOP_NORMAL_PROCESSING) { if (handshake & DC_HANDSHAKE_STOP_NORMAL_PROCESSING) {
@ -1164,6 +1186,25 @@ void dc_receive_imf(dc_context_t* context, const char* imf_raw_not_terminated, s
dc_sqlite3_begin_transaction(context->sql); dc_sqlite3_begin_transaction(context->sql);
} }
/* incoming non-chat messages may be discarded;
maybe this can be optimized later,
by checking the state before the message body is downloaded */
int allow_creation = 1;
if (msgrmsg==0) {
/* this message is a classic email -
not a chat-message nor a reply to one */
int show_emails = dc_sqlite3_get_config_int(context->sql,
"show_emails", DC_SHOW_EMAILS_DEFAULT);
if (show_emails==DC_SHOW_EMAILS_OFF) {
chat_id = DC_CHAT_ID_TRASH;
allow_creation = 0;
}
else if (show_emails==DC_SHOW_EMAILS_ACCEPTED_CONTACTS) {
allow_creation = 0;
}
}
/* test if there is a normal chat with the sender - if so, this allows us to create groups in the next step */ /* test if there is a normal chat with the sender - if so, this allows us to create groups in the next step */
uint32_t test_normal_chat_id = 0; uint32_t test_normal_chat_id = 0;
int test_normal_chat_id_blocked = 0; int test_normal_chat_id_blocked = 0;
@ -1176,7 +1217,9 @@ void dc_receive_imf(dc_context_t* context, const char* imf_raw_not_terminated, s
/* try to create a group /* try to create a group
(groups appear automatically only if the _sender_ is known, see core issue #54) */ (groups appear automatically only if the _sender_ is known, see core issue #54) */
int create_blocked = ((test_normal_chat_id&&test_normal_chat_id_blocked==DC_CHAT_NOT_BLOCKED) || incoming_origin>=DC_ORIGIN_MIN_START_NEW_NCHAT/*always false, for now*/)? DC_CHAT_NOT_BLOCKED : DC_CHAT_DEADDROP_BLOCKED; int create_blocked = ((test_normal_chat_id&&test_normal_chat_id_blocked==DC_CHAT_NOT_BLOCKED) || incoming_origin>=DC_ORIGIN_MIN_START_NEW_NCHAT/*always false, for now*/)? DC_CHAT_NOT_BLOCKED : DC_CHAT_DEADDROP_BLOCKED;
create_or_lookup_group(context, mime_parser, create_blocked, from_id, to_ids, &chat_id, &chat_id_blocked); create_or_lookup_group(context, mime_parser,
allow_creation, create_blocked,
from_id, to_ids, &chat_id, &chat_id_blocked);
if (chat_id && chat_id_blocked && !create_blocked) { if (chat_id && chat_id_blocked && !create_blocked) {
dc_unblock_chat(context, chat_id); dc_unblock_chat(context, chat_id);
chat_id_blocked = 0; chat_id_blocked = 0;
@ -1200,8 +1243,10 @@ void dc_receive_imf(dc_context_t* context, const char* imf_raw_not_terminated, s
chat_id = test_normal_chat_id; chat_id = test_normal_chat_id;
chat_id_blocked = test_normal_chat_id_blocked; chat_id_blocked = test_normal_chat_id_blocked;
} }
else { else if(allow_creation) {
dc_create_or_lookup_nchat_by_contact_id(context, from_id, create_blocked, &chat_id, &chat_id_blocked); dc_create_or_lookup_nchat_by_contact_id(context, from_id,
create_blocked,
&chat_id, &chat_id_blocked);
} }
if (chat_id && chat_id_blocked) { if (chat_id && chat_id_blocked) {
@ -1245,7 +1290,7 @@ void dc_receive_imf(dc_context_t* context, const char* imf_raw_not_terminated, s
if (chat_id==0) if (chat_id==0)
{ {
create_or_lookup_group(context, mime_parser, DC_CHAT_NOT_BLOCKED, from_id, to_ids, &chat_id, &chat_id_blocked); create_or_lookup_group(context, mime_parser, 1, DC_CHAT_NOT_BLOCKED, from_id, to_ids, &chat_id, &chat_id_blocked);
if (chat_id && chat_id_blocked) { if (chat_id && chat_id_blocked) {
dc_unblock_chat(context, chat_id); dc_unblock_chat(context, chat_id);
chat_id_blocked = 0; chat_id_blocked = 0;
@ -1319,11 +1364,6 @@ void dc_receive_imf(dc_context_t* context, const char* imf_raw_not_terminated, s
} }
} }
int msgrmsg = mime_parser->is_send_by_messenger; /* 1 or 0 for yes/no */
if (msgrmsg==0 && dc_is_reply_to_messenger_message(context, mime_parser)) {
msgrmsg = 2; /* 2=no, but is reply to messenger message */
}
/* fine, so far. now, split the message into simple parts usable as "short messages" /* fine, so far. now, split the message into simple parts usable as "short messages"
and add them to the database (mails sent by other messenger clients should result and add them to the database (mails sent by other messenger clients should result
into only one message; mails sent by other clients may result in several messages (eg. one per attachment)) */ into only one message; mails sent by other clients may result in several messages (eg. one per attachment)) */