mirror of
https://github.com/chatmail/core.git
synced 2026-05-09 01:46:30 +03:00
fix implementation of Autocrypt to encrypt if answering to an encrypted message.
Previously, if any of a chat's peers set prefer_encrypt to false (i.e. "e2ee_enabled=0" in the config, a misnomer btw) then a previously encrypted chat would drop to cleartext easily.
This commit is contained in:
@@ -629,6 +629,45 @@ class TestOnlineAccount:
|
|||||||
ev = ac1._evlogger.get_matching("DC_EVENT_SMTP_MESSAGE_SENT")
|
ev = ac1._evlogger.get_matching("DC_EVENT_SMTP_MESSAGE_SENT")
|
||||||
assert not msg.is_encrypted()
|
assert not msg.is_encrypted()
|
||||||
|
|
||||||
|
def test_reply_encrypted(self, acfactory, lp):
|
||||||
|
ac1, ac2 = acfactory.get_two_online_accounts()
|
||||||
|
|
||||||
|
lp.sec("ac1: create chat with ac2")
|
||||||
|
chat = self.get_chat(ac1, ac2)
|
||||||
|
|
||||||
|
lp.sec("sending text message from ac1 to ac2")
|
||||||
|
msg_out = chat.send_text("message1")
|
||||||
|
assert not msg_out.is_encrypted()
|
||||||
|
|
||||||
|
lp.sec("wait for ac2 to receive message")
|
||||||
|
ev = ac2._evlogger.get_matching("DC_EVENT_MSGS_CHANGED")
|
||||||
|
msg_in = ac2.get_message_by_id(msg_out.id)
|
||||||
|
assert msg_in.text == "message1"
|
||||||
|
assert not msg_in.is_encrypted()
|
||||||
|
|
||||||
|
lp.sec("create new chat with contact and send back (encrypted) message")
|
||||||
|
chat2b = ac2.create_chat_by_message(msg_in)
|
||||||
|
chat2b.send_text("message-back")
|
||||||
|
|
||||||
|
lp.sec("wait for ac1 to receive message")
|
||||||
|
ev = ac1._evlogger.get_matching("DC_EVENT_INCOMING_MSG")
|
||||||
|
assert ev[1] == chat.id
|
||||||
|
msg_back = ac1.get_message_by_id(ev[2])
|
||||||
|
assert msg_back.text == "message-back"
|
||||||
|
assert msg_back.is_encrypted()
|
||||||
|
|
||||||
|
lp.sec("ac1: e2ee_enabled=0 and see if reply is encrypted")
|
||||||
|
print("ac1: e2ee_enabled={}".format(ac1.get_config("e2ee_enabled")))
|
||||||
|
print("ac2: e2ee_enabled={}".format(ac2.get_config("e2ee_enabled")))
|
||||||
|
ac1.set_config("e2ee_enabled", "0")
|
||||||
|
chat.send_text("message2 -- should be encrypted")
|
||||||
|
|
||||||
|
lp.sec("wait for ac2 to receive message")
|
||||||
|
ev = ac2._evlogger.get_matching("DC_EVENT_INCOMING_MSG")
|
||||||
|
msg_in = ac2.get_message_by_id(ev[2])
|
||||||
|
assert msg_in.text == "message2 -- should be encrypted"
|
||||||
|
assert msg_in.is_encrypted()
|
||||||
|
|
||||||
def test_saved_mime_on_received_message(self, acfactory, lp):
|
def test_saved_mime_on_received_message(self, acfactory, lp):
|
||||||
ac1, ac2 = acfactory.get_two_online_accounts()
|
ac1, ac2 = acfactory.get_two_online_accounts()
|
||||||
|
|
||||||
|
|||||||
20
src/chat.rs
20
src/chat.rs
@@ -259,8 +259,6 @@ impl Chat {
|
|||||||
msg: &mut Message,
|
msg: &mut Message,
|
||||||
timestamp: i64,
|
timestamp: i64,
|
||||||
) -> Result<MsgId, Error> {
|
) -> Result<MsgId, Error> {
|
||||||
let mut do_guarantee_e2ee: bool;
|
|
||||||
let e2ee_enabled: bool;
|
|
||||||
let mut new_references = "".into();
|
let mut new_references = "".into();
|
||||||
let mut new_in_reply_to = "".into();
|
let mut new_in_reply_to = "".into();
|
||||||
let mut msg_id = 0;
|
let mut msg_id = 0;
|
||||||
@@ -319,15 +317,12 @@ impl Chat {
|
|||||||
self.update_param(context)?;
|
self.update_param(context)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check if we can guarantee E2EE for this message.
|
/* check if we want to encrypt this message. If yes and circumstances change
|
||||||
if we guarantee E2EE, and circumstances change
|
|
||||||
so that E2EE is no longer available at a later point (reset, changed settings),
|
so that E2EE is no longer available at a later point (reset, changed settings),
|
||||||
we do not send the message out at all */
|
we might not send the message out at all */
|
||||||
do_guarantee_e2ee = false;
|
if msg.param.get_int(Param::ForcePlaintext).unwrap_or_default() == 0 {
|
||||||
e2ee_enabled = context.get_config_bool(Config::E2eeEnabled);
|
|
||||||
if e2ee_enabled && msg.param.get_int(Param::ForcePlaintext).unwrap_or_default() == 0 {
|
|
||||||
let mut can_encrypt = true;
|
let mut can_encrypt = true;
|
||||||
let mut all_mutual = true;
|
let mut all_mutual = context.get_config_bool(Config::E2eeEnabled);
|
||||||
|
|
||||||
// take care that this statement returns NULL rows
|
// take care that this statement returns NULL rows
|
||||||
// if there is no peerstates for a chat member!
|
// if there is no peerstates for a chat member!
|
||||||
@@ -377,13 +372,10 @@ impl Chat {
|
|||||||
if can_encrypt
|
if can_encrypt
|
||||||
&& (all_mutual || last_msg_in_chat_encrypted(context, &context.sql, self.id))
|
&& (all_mutual || last_msg_in_chat_encrypted(context, &context.sql, self.id))
|
||||||
{
|
{
|
||||||
do_guarantee_e2ee = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if do_guarantee_e2ee {
|
|
||||||
msg.param.set_int(Param::GuaranteeE2ee, 1);
|
msg.param.set_int(Param::GuaranteeE2ee, 1);
|
||||||
}
|
}
|
||||||
// reset eg. for forwarding
|
}
|
||||||
|
// reset encrypt error state eg. for forwarding
|
||||||
msg.param.remove(Param::ErroneousE2ee);
|
msg.param.remove(Param::ErroneousE2ee);
|
||||||
|
|
||||||
// set "In-Reply-To:" to identify the message to which the composed message is a reply;
|
// set "In-Reply-To:" to identify the message to which the composed message is a reply;
|
||||||
|
|||||||
Reference in New Issue
Block a user