diff --git a/deltachat-ffi/src/lib.rs b/deltachat-ffi/src/lib.rs index 60dfe7934..878222b7e 100644 --- a/deltachat-ffi/src/lib.rs +++ b/deltachat-ffi/src/lib.rs @@ -1580,7 +1580,13 @@ pub unsafe extern "C" fn dc_continue_key_transfer( let ffi_context = &*context; ffi_context .with_inner(|ctx| { - dc_imex::dc_continue_key_transfer(ctx, msg_id, as_str(setup_code)) as libc::c_int + match dc_imex::dc_continue_key_transfer(ctx, msg_id, as_str(setup_code)) { + Ok(()) => 1, + Err(err) => { + error!(ctx, "dc_continue_key_transfer: {}", err); + 0 + } + } }) .unwrap_or(0) } diff --git a/examples/repl/cmdline.rs b/examples/repl/cmdline.rs index 896ecc174..9826b959b 100644 --- a/examples/repl/cmdline.rs +++ b/examples/repl/cmdline.rs @@ -446,9 +446,7 @@ pub unsafe fn dc_cmdline(context: &Context, line: &str) -> Result<(), failure::E !arg1.is_empty() && !arg2.is_empty(), "Arguments expected" ); - if !dc_continue_key_transfer(context, arg1.parse()?, &arg2) { - bail!("Continue key transfer failed"); - } + dc_continue_key_transfer(context, arg1.parse()?, &arg2)?; } "has-backup" => { dc_imex_has_backup(context, blobdir)?; diff --git a/python/tests/test_account.py b/python/tests/test_account.py index d47bb074d..72404a77b 100644 --- a/python/tests/test_account.py +++ b/python/tests/test_account.py @@ -533,7 +533,7 @@ class TestOnlineAccount: assert len(messages) == 1 assert messages[0].text == "msg1" - def test_ac_setup_message(self, acfactory): + def test_ac_setup_message(self, acfactory, lp): # note that the receiving account needs to be configured and running # before ther setup message is send. DC does not read old messages # as of Jul2019 @@ -541,6 +541,7 @@ class TestOnlineAccount: ac2 = acfactory.clone_online_account(ac1) wait_configuration_progress(ac2, 1000) wait_configuration_progress(ac1, 1000) + lp.sec("trigger ac setup message and return setupcode") assert ac1.get_info()["fingerprint"] != ac2.get_info()["fingerprint"] setup_code = ac1.initiate_key_transfer() ac2._evlogger.set_timeout(30) @@ -548,9 +549,10 @@ class TestOnlineAccount: msg = ac2.get_message_by_id(ev[2]) assert msg.is_setup_message() assert msg.get_setupcodebegin() == setup_code[:2] - # first try a bad setup code + lp.sec("try a bad setup code") with pytest.raises(ValueError): msg.continue_key_transfer(str(reversed(setup_code))) + lp.sec("try a good setup code") print("*************** Incoming ASM File at: ", msg.filename) print("*************** Setup Code: ", setup_code) msg.continue_key_transfer(setup_code) diff --git a/src/dc_imex.rs b/src/dc_imex.rs index 97a59f48c..62b9ac57d 100644 --- a/src/dc_imex.rs +++ b/src/dc_imex.rs @@ -231,57 +231,39 @@ pub fn dc_create_setup_code(_context: &Context) -> String { ret } -pub unsafe fn dc_continue_key_transfer(context: &Context, msg_id: u32, setup_code: &str) -> bool { +pub fn dc_continue_key_transfer(context: &Context, msg_id: u32, setup_code: &str) -> Result<()> { if msg_id <= DC_MSG_ID_LAST_SPECIAL { - return false; + bail!("wrong id"); } let msg = Message::load_from_db(context, msg_id); if msg.is_err() { - error!(context, "Message is no Autocrypt Setup Message."); - return false; + bail!("Message is no Autocrypt Setup Message."); } let msg = msg.unwrap(); if !msg.is_setupmessage() { - error!(context, "Message is no Autocrypt Setup Message."); - return false; + bail!("Message is no Autocrypt Setup Message."); } if let Some(filename) = msg.get_file(context) { if let Ok(buf) = dc_read_file(context, filename) { let norm_sc = CString::yolo(dc_normalize_setup_code(setup_code)); - let armored_key = dc_decrypt_setup_file(context, norm_sc.as_ptr(), buf.as_ptr().cast()); - if armored_key.is_null() { - warn!(context, "Cannot decrypt Autocrypt Setup Message.",); - false - } else if set_self_key(context, armored_key, 1) { - /*set default*/ - /* error already logged */ - free(armored_key as *mut libc::c_void); - true - } else { - armored_key = dc_decrypt_setup_file(context, norm_sc, buf.as_ptr().cast()); - if armored_key.is_null() { - error!(context, "Cannot decrypt Autocrypt Setup Message.",); - } else { - let armored_key_r = as_str(armored_key); - match set_self_key(context, armored_key_r, true, true) { - Ok(()) => { - success = true; - } - Err(err) => { - warn!(context, "set-self-key failed: {}", err); - } - } + let armored_key: &str; + unsafe { + let sc = dc_decrypt_setup_file(context, norm_sc.as_ptr(), buf.as_ptr().cast()); + if sc.is_null() { + bail!("bad setup code"); } + armored_key = as_str(sc); + free(sc as *mut libc::c_void); } + set_self_key(context, &armored_key, true, true)?; + Ok(()) } else { - error!(context, "Cannot read Autocrypt Setup Message file.",); - false + bail!("Cannot read Autocrypt Setup Message file."); } } else { - error!(context, "Message is no Autocrypt Setup Message."); - false + bail!("Message is no Autocrypt Setup Message."); } }