mirror of
https://github.com/chatmail/core.git
synced 2026-04-17 21:46:35 +03:00
rustifying dc_continue_key_transfer and fix master-conflict
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)?;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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.");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user