diff --git a/python/src/deltachat/events.py b/python/src/deltachat/events.py index 20f44a0b9..de733fd73 100644 --- a/python/src/deltachat/events.py +++ b/python/src/deltachat/events.py @@ -103,6 +103,14 @@ class FFIEventTracker: if rex.search(ev.data2): return ev + def get_info_regex_groups(self, regex, check_error=True): + rex = re.compile(regex) + while 1: + ev = self.get_matching("DC_EVENT_INFO", check_error=check_error) + m = rex.match(ev.data2) + if m is not None: + return m.groups() + def ensure_event_not_queued(self, event_name_regex): __tracebackhide__ = True rex = re.compile("(?:{}).*".format(event_name_regex)) diff --git a/python/src/deltachat/testplugin.py b/python/src/deltachat/testplugin.py index 8e2f63937..9d4471b52 100644 --- a/python/src/deltachat/testplugin.py +++ b/python/src/deltachat/testplugin.py @@ -503,6 +503,9 @@ def lp(): def step(self, msg): print("-" * 5, "step " + msg, "-" * 5) + def indent(self, msg): + print(" " + msg) + return Printer() diff --git a/python/tests/test_account.py b/python/tests/test_account.py index 5123f6cf4..062d429c3 100644 --- a/python/tests/test_account.py +++ b/python/tests/test_account.py @@ -668,7 +668,7 @@ class TestOnlineAccount: except Exception: pass - def test_export_import_self_keys(self, acfactory, tmpdir): + def test_export_import_self_keys(self, acfactory, tmpdir, lp): ac1, ac2 = acfactory.get_two_online_accounts() dir = tmpdir.mkdir("exportdir") @@ -676,8 +676,17 @@ class TestOnlineAccount: assert len(export_files) == 2 for x in export_files: assert x.startswith(dir.strpath) + key_id, = ac1._evtracker.get_info_regex_groups(r".*xporting.*KeyId\((.*)\).*") ac1._evtracker.consume_events() + + lp.sec("exported keys (private and public)") + for name in os.listdir(dir.strpath): + lp.indent(dir.strpath + os.sep + name) + lp.sec("importing into existing account") ac2.import_self_keys(dir.strpath) + key_id2, = ac2._evtracker.get_info_regex_groups( + r".*stored.*KeyId\((.*)\).*", check_error=False) + assert key_id2 == key_id def test_one_account_send_bcc_setting(self, acfactory, lp): ac1 = acfactory.get_online_configuring_account() diff --git a/src/imex.rs b/src/imex.rs index 4d20fd41a..9f78efd3e 100644 --- a/src/imex.rs +++ b/src/imex.rs @@ -31,6 +31,7 @@ use crate::param::*; use crate::pgp; use crate::sql::{self, Sql}; use crate::stock::StockMessage; +use ::pgp::types::KeyTrait; use async_tar::Archive; // Name of the database file in the backup. @@ -413,6 +414,8 @@ async fn set_self_key( }, ) .await?; + + info!(context, "stored self key: {:?}", keypair.secret.key_id()); Ok(()) } @@ -444,14 +447,16 @@ async fn imex_inner( what: ImexMode, param: Option>, ) -> Result<()> { - ensure!(param.is_some(), "No Import/export dir/file given."); + let path = if let Some(ref p) = param { + info!(context, "Import/export dir: {}", p.as_ref().display()); + p + } else { + return Err(format_err!("Imex: Param was None")); + }; - info!(context, "Import/export process started."); context.emit_event(EventType::ImexProgress(10)); - ensure!(context.sql.is_open().await, "Database not opened."); - let path = param.ok_or_else(|| format_err!("Imex: Param was None"))?; if what == ImexMode::ExportBackup || what == ImexMode::ExportSelfKeys { // before we export anything, make sure the private key exists if e2ee::ensure_secret_key_exists(context).await.is_err() { @@ -875,6 +880,12 @@ async fn import_self_keys(context: &Context, dir: impl AsRef) -> Result<() continue; } } + info!( + context, + "considering key file: {}", + path_plus_name.display() + ); + match dc_read_file(context, &path_plus_name).await { Ok(buf) => { let armored = std::string::String::from_utf8_lossy(&buf); @@ -972,7 +983,12 @@ where let id = id.map_or("default".into(), |i| i.to_string()); dir.as_ref().join(format!("{}-key-{}.asc", kind, &id)) }; - info!(context, "Exporting key {}", file_name.display()); + info!( + context, + "Exporting key {:?} to {}", + key.key_id(), + file_name.display() + ); dc_delete_file(context, &file_name).await; let content = key.to_asc(None).into_bytes(); @@ -1078,8 +1094,9 @@ mod tests { .await .is_ok()); - let blobdir = context.ctx.get_blobdir().to_str().unwrap(); - assert!(imex(&context.ctx, ImexMode::ImportSelfKeys, Some(blobdir)) + let context2 = TestContext::new().await; + context2.configure_alice().await; + assert!(imex(&context2.ctx, ImexMode::ImportSelfKeys, Some(blobdir)) .await .is_ok()); }