rustifying dc_continue_key_transfer and fix master-conflict

This commit is contained in:
holger krekel
2019-09-25 17:19:44 +02:00
parent d5383aecc9
commit 6cd3580263
4 changed files with 27 additions and 39 deletions

View File

@@ -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)
}

View File

@@ -446,9 +446,7 @@ pub unsafe fn dc_cmdline(context: &Context, line: &str) -> Result<(), failure::E
!arg1.is_empty() && !arg2.is_empty(),
"Arguments <msg-id> <setup-code> 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)?;

View File

@@ -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)

View File

@@ -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.");
}
}