refactor: move dc_preconfigure_keypair() implementation into deltachat crate

This allows to hide `DcKey` trait from public API.
This commit is contained in:
link2xt
2023-07-29 18:05:05 +00:00
parent 85739ba6ad
commit b784415c57
2 changed files with 32 additions and 18 deletions

View File

@@ -29,10 +29,9 @@ use deltachat::contact::{Contact, ContactId, Origin};
use deltachat::context::Context; use deltachat::context::Context;
use deltachat::ephemeral::Timer as EphemeralTimer; use deltachat::ephemeral::Timer as EphemeralTimer;
use deltachat::imex::BackupProvider; use deltachat::imex::BackupProvider;
use deltachat::key::DcKey; use deltachat::key::preconfigure_keypair;
use deltachat::message::MsgId; use deltachat::message::MsgId;
use deltachat::net::read_url_blob; use deltachat::net::read_url_blob;
use deltachat::pgp::KeyPair;
use deltachat::qr_code_generator::{generate_backup_qr, get_securejoin_qr_svg}; use deltachat::qr_code_generator::{generate_backup_qr, get_securejoin_qr_svg};
use deltachat::reaction::{get_msg_reactions, send_reaction, Reactions}; use deltachat::reaction::{get_msg_reactions, send_reaction, Reactions};
use deltachat::stock_str::StockMessage; use deltachat::stock_str::StockMessage;
@@ -796,21 +795,13 @@ pub unsafe extern "C" fn dc_preconfigure_keypair(
return 0; return 0;
} }
let ctx = &*context; let ctx = &*context;
block_on(async move { let addr = to_string_lossy(addr);
let addr = tools::EmailAddress::new(&to_string_lossy(addr))?; let public_data = to_string_lossy(public_data);
let public = key::SignedPublicKey::from_asc(&to_string_lossy(public_data))?.0; let secret_data = to_string_lossy(secret_data);
let secret = key::SignedSecretKey::from_asc(&to_string_lossy(secret_data))?.0; block_on(preconfigure_keypair(ctx, &addr, &public_data, &secret_data))
let keypair = KeyPair { .context("Failed to save keypair")
addr, .log_err(ctx)
public, .is_ok() as libc::c_int
secret,
};
key::store_self_keypair(ctx, &keypair, key::KeyPairUse::Default).await?;
Ok::<_, anyhow::Error>(1)
})
.context("Failed to save keypair")
.log_err(ctx)
.unwrap_or(0)
} }
#[no_mangle] #[no_mangle]

View File

@@ -24,7 +24,7 @@ use crate::tools::{time, EmailAddress};
/// This trait is implemented for rPGP's [SignedPublicKey] and /// This trait is implemented for rPGP's [SignedPublicKey] and
/// [SignedSecretKey] types and makes working with them a little /// [SignedSecretKey] types and makes working with them a little
/// easier in the deltachat world. /// easier in the deltachat world.
pub trait DcKey: Serialize + Deserializable + KeyTrait + Clone { pub(crate) trait DcKey: Serialize + Deserializable + KeyTrait + Clone {
/// Create a key from some bytes. /// Create a key from some bytes.
fn from_slice(bytes: &[u8]) -> Result<Self> { fn from_slice(bytes: &[u8]) -> Result<Self> {
Ok(<Self as Deserializable>::from_bytes(Cursor::new(bytes))?) Ok(<Self as Deserializable>::from_bytes(Cursor::new(bytes))?)
@@ -307,6 +307,29 @@ pub async fn store_self_keypair(
Ok(()) Ok(())
} }
/// Saves a keypair as the default keys.
///
/// This API is used for testing purposes
/// to avoid generating the key in tests.
/// Use import/export APIs instead.
pub async fn preconfigure_keypair(
context: &Context,
addr: &str,
public_data: &str,
secret_data: &str,
) -> Result<()> {
let addr = EmailAddress::new(addr)?;
let public = SignedPublicKey::from_asc(public_data)?.0;
let secret = SignedSecretKey::from_asc(secret_data)?.0;
let keypair = KeyPair {
addr,
public,
secret,
};
store_self_keypair(context, &keypair, KeyPairUse::Default).await?;
Ok(())
}
/// A key fingerprint /// A key fingerprint
#[derive(Clone, Eq, PartialEq, Hash, serde::Serialize, serde::Deserialize)] #[derive(Clone, Eq, PartialEq, Hash, serde::Serialize, serde::Deserialize)]
pub struct Fingerprint(Vec<u8>); pub struct Fingerprint(Vec<u8>);