From d036ad585308eafb58e75635c0454ac8ec842233 Mon Sep 17 00:00:00 2001 From: link2xt Date: Tue, 23 Apr 2024 17:03:42 +0000 Subject: [PATCH] fix: do not fail if Autocrypt Setup Message has no encryption preference According to Autocrypt specification Autocrypt Setup Message SHOULD contain Autocrypt-Prefer-Encrypt header, but K-9 6.802 does not include it. --- src/imex.rs | 70 ++++++++++++------- .../message/k-9-autocrypt-setup-message.eml | 65 +++++++++++++++++ 2 files changed, 108 insertions(+), 27 deletions(-) create mode 100644 test-data/message/k-9-autocrypt-setup-message.eml diff --git a/src/imex.rs b/src/imex.rs index 99e12d3b2..8e5099638 100644 --- a/src/imex.rs +++ b/src/imex.rs @@ -284,7 +284,7 @@ pub async fn continue_key_transfer( let file = open_file_std(context, filename)?; let sc = normalize_setup_code(setup_code); let armored_key = decrypt_setup_file(&sc, file).await?; - set_self_key(context, &armored_key, true, true).await?; + set_self_key(context, &armored_key, true).await?; maybe_add_bcc_self_device_msg(context).await?; Ok(()) @@ -293,35 +293,32 @@ pub async fn continue_key_transfer( } } -async fn set_self_key( - context: &Context, - armored: &str, - set_default: bool, - prefer_encrypt_required: bool, -) -> Result<()> { +async fn set_self_key(context: &Context, armored: &str, set_default: bool) -> Result<()> { // try hard to only modify key-state let (private_key, header) = SignedSecretKey::from_asc(armored)?; let public_key = private_key.split_public_key()?; - let preferencrypt = header.get("Autocrypt-Prefer-Encrypt"); - match preferencrypt.map(|s| s.as_str()) { - Some(headerval) => { - let e2ee_enabled = match headerval { - "nopreference" => 0, - "mutual" => 1, - _ => { - bail!("invalid Autocrypt-Prefer-Encrypt header: {:?}", header); - } - }; - context - .sql - .set_raw_config_int("e2ee_enabled", e2ee_enabled) - .await?; - } - None => { - if prefer_encrypt_required { - bail!("missing Autocrypt-Prefer-Encrypt header"); + if let Some(preferencrypt) = header.get("Autocrypt-Prefer-Encrypt") { + let e2ee_enabled = match preferencrypt.as_str() { + "nopreference" => 0, + "mutual" => 1, + _ => { + bail!("invalid Autocrypt-Prefer-Encrypt header: {:?}", header); } - } + }; + context + .sql + .set_raw_config_int("e2ee_enabled", e2ee_enabled) + .await?; + } else { + // `Autocrypt-Prefer-Encrypt` is not included + // in keys exported to file. + // + // `Autocrypt-Prefer-Encrypt` also SHOULD be sent + // in Autocrypt Setup Message according to Autocrypt specification, + // but K-9 6.802 does not include this header. + // + // We keep current setting in this case. + info!(context, "No Autocrypt-Prefer-Encrypt header."); }; let self_addr = context.get_primary_self_addr().await?; @@ -604,7 +601,7 @@ async fn export_backup_inner( async fn import_secret_key(context: &Context, path: &Path, set_default: bool) -> Result<()> { let buf = read_file(context, &path).await?; let armored = std::string::String::from_utf8_lossy(&buf); - set_self_key(context, &armored, set_default, false).await?; + set_self_key(context, &armored, set_default).await?; Ok(()) } @@ -825,6 +822,7 @@ mod tests { use super::*; use crate::pgp::{split_armored_data, HEADER_AUTOCRYPT, HEADER_SETUPCODE}; + use crate::receive_imf::receive_imf; use crate::stock_str::StockMessage; use crate::test_utils::{alice_keypair, TestContext, TestContextManager}; @@ -1193,4 +1191,22 @@ mod tests { Ok(()) } + + /// Tests reception of Autocrypt Setup Message from K-9 6.802. + /// + /// Unlike Autocrypt Setup Message sent by Delta Chat, + /// this message does not contain `Autocrypt-Prefer-Encrypt` header. + #[tokio::test(flavor = "multi_thread", worker_threads = 2)] + async fn test_key_transfer_k_9() -> Result<()> { + let t = &TestContext::new().await; + t.configure_addr("autocrypt@nine.testrun.org").await; + + let raw = include_bytes!("../test-data/message/k-9-autocrypt-setup-message.eml"); + let received = receive_imf(t, raw, false).await?.unwrap(); + + let setup_code = "0655-9868-8252-5455-4232-5158-1237-5333-2638"; + continue_key_transfer(t, *received.msg_ids.last().unwrap(), setup_code).await?; + + Ok(()) + } } diff --git a/test-data/message/k-9-autocrypt-setup-message.eml b/test-data/message/k-9-autocrypt-setup-message.eml new file mode 100644 index 000000000..7ca246a32 --- /dev/null +++ b/test-data/message/k-9-autocrypt-setup-message.eml @@ -0,0 +1,65 @@ +Return-Path: +Delivered-To: autocrypt@nine.testrun.org +Received: from nine.testrun.org + by nine with LMTP + id wNinAKX2J2YWDwEAPdT8mA + (envelope-from ) + for ; Tue, 23 Apr 2024 19:57:57 +0200 +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=nine.testrun.org; + s=opendkim; t=1713895076; + bh=yuHuHSbYX5hE/xr8aU2fy/SlqfTL7XjfV2m1eEePTz4=; + h=Subject:Date:From:To:From; + b=ZbVNpJ8zjHmgrCqiRnqzENcR/PwR/G182hL18U5bp5CZmkyWcuhQU0EkhkJpCCv1n + 8bZ9WlOT0cmzBHpWU43t7HufuUM56NwwuVqEuz2agpVzQV8zKIPhthrBzbYIeR4Prg + 1DgwWr8EhotoV6yPgzxi9sMyO3l4spJeaREisB5MPOIdKeIxtRPLR+Woo5hQWNTFoh + ZQtCcY7w5vxXGhBMVPXOjbrrzOCsE5gGB5QYSAR8Bv3ZdJn/mHvIRCEJG5hJGSxXjQ + fD0UGJ5m5RVrF0tWnZ7U5tpoRD/UVV1+Us9Woq733R97ZchpoE4hNpMG9zYW90z4QU + kBajbsH81Nm0A== +MIME-Version: 1.0 +Content-Type: multipart/mixed; + boundary=----X2OJUZLGILKJEHMTO29ZMST9701ZDH +Content-Transfer-Encoding: 7bit +Subject: Autocrypt Setup Message +Autocrypt-Setup-Message: v1 +Date: Tue, 23 Apr 2024 19:57:57 +0200 +From: autocrypt@nine.testrun.org +To: autocrypt@nine.testrun.org +Message-Id: <20240423175756.F19EB17C214A@nine.testrun.org> + +------X2OJUZLGILKJEHMTO29ZMST9701ZDH +Content-Type: text/plain; + charset=utf-8 +Content-Transfer-Encoding: quoted-printable + +This message contains all information to transfer your Autocrypt settings a= +long with your secret key securely from your original device=2E To set up y= +our new device for Autocrypt, please follow the instructions that should be= + presented by your new device=2E You can keep this message and use it as a = +backup for your secret key=2E If you want to do this, you should write down= + the password and store it securely=2E +------X2OJUZLGILKJEHMTO29ZMST9701ZDH +Content-Transfer-Encoding: 7bit +Content-Type: application/autocrypt-setup +Content-Disposition: attachment; filename="autocrypt-setup-message" + +-----BEGIN PGP MESSAGE----- +Passphrase-Format: numeric9x4 +Passphrase-Begin: 06 + +ww0ECQMCAhlJ+TRwb2Fg0sGXAUc+92rmg4k57Sd4D3O/SPQNzShbVdlKsoFzyH+B +YhimOr/8C5ZHyg/WjRGlk4pD+t57WfVdE7LYnv8qsK86h2kffZAGlj+B9Lh9+qbV +KgJLpHUKg7ZGa/9aMq7KuFoNSNTbcHtzJ/Ml9GVe+opimER87mpFCjmaEHCcCp0a +ZeS5VU8gTV7AKuPW40BBipyEmKpUvE/ZWfz3KSI4RZyIwM8v8kXBMojT4WLqWm93 +JoEKUyeh+3JKMvsfyRbmHXrHprG9f2e8PLvNkAiie68YJniFnwA8nmNSnPv9S9rf +7oUHtnTDKJ4FIpmfPgj1v/KIWWW9KaZWHi7K5mFUCTb4pBoCRIGaFh+JzbSlNL9i +fz7HIiN95bFJ4xXXL4gcU9wO5//npkVDUncaeHhUy1VBLu0NFYvze+s+eAIesqec +X3x++U9d+Slbpa1G2Z5Knj50mBY+k9aNwVMZGu50hzhPvdwesqmbr+GTSh0O1bxI +gw/cDq5s58Ewze3WvYaLxJz/RcwOCGSV8k21FM4WTnEahs4yfLbzNuusYvvciU6l +w0eZC+vEmh+bINSSRX/mcvkQcIkkCsqvfWyxdSNIBCwmR86oalWnxZniBLbbbZHD +0KAsv0w7t00Y715gyyFWyiEiT5Lyl4TA+cUIHKmmpKOaVubz50UD1z5rqT7joJ7G +KRmWtQW8MScgcmK7+tyavLQOxwe8i8i9JkUy+d9jhj17XZil/If26Q3V3epqCXq3 +FdvEvvNGJF0DyJ4YAe9QMBumf22sMmX/XVock9/k0pB46mciMhPL3VA= +=LYx9 +-----END PGP MESSAGE----- + +------X2OJUZLGILKJEHMTO29ZMST9701ZDH--