diff --git a/deltachat-ffi/src/lib.rs b/deltachat-ffi/src/lib.rs index 6f28a89b9..277588d90 100644 --- a/deltachat-ffi/src/lib.rs +++ b/deltachat-ffi/src/lib.rs @@ -26,7 +26,7 @@ use anyhow::Context as _; use deltachat::chat::{ChatId, ChatVisibility, MessageListOptions, MuteDuration, ProtectionStatus}; use deltachat::constants::DC_MSG_ID_LAST_SPECIAL; use deltachat::contact::{Contact, ContactId, Origin}; -use deltachat::context::Context; +use deltachat::context::{Context, ContextBuilder}; use deltachat::ephemeral::Timer as EphemeralTimer; use deltachat::imex::BackupProvider; use deltachat::key::preconfigure_keypair; @@ -34,7 +34,6 @@ use deltachat::message::MsgId; use deltachat::qr_code_generator::{generate_backup_qr, get_securejoin_qr_svg}; use deltachat::reaction::{get_msg_reactions, send_reaction, Reactions}; use deltachat::stock_str::StockMessage; -use deltachat::stock_str::StockStrings; use deltachat::webxdc::StatusUpdateSerial; use deltachat::*; use deltachat::{accounts::Accounts, log::LogExt}; @@ -104,12 +103,11 @@ pub unsafe extern "C" fn dc_context_new( let ctx = if blobdir.is_null() || *blobdir == 0 { // generate random ID as this functionality is not yet available on the C-api. let id = rand::thread_rng().gen(); - block_on(Context::new( - as_path(dbfile), - id, - Events::new(), - StockStrings::new(), - )) + block_on( + ContextBuilder::new(as_path(dbfile).to_path_buf()) + .with_id(id) + .open(), + ) } else { eprintln!("blobdir can not be defined explicitly anymore"); return ptr::null_mut(); @@ -133,12 +131,11 @@ pub unsafe extern "C" fn dc_context_new_closed(dbfile: *const libc::c_char) -> * } let id = rand::thread_rng().gen(); - match block_on(Context::new_closed( - as_path(dbfile), - id, - Events::new(), - StockStrings::new(), - )) { + match block_on( + ContextBuilder::new(as_path(dbfile).to_path_buf()) + .with_id(id) + .build(), + ) { Ok(context) => Box::into_raw(Box::new(context)), Err(err) => { eprintln!("failed to create context: {err:#}"); diff --git a/deltachat-repl/src/main.rs b/deltachat-repl/src/main.rs index 1151925a8..ded5abcbd 100644 --- a/deltachat-repl/src/main.rs +++ b/deltachat-repl/src/main.rs @@ -9,7 +9,6 @@ extern crate deltachat; use std::borrow::Cow::{self, Borrowed, Owned}; use std::io::{self, Write}; -use std::path::Path; use std::process::Command; use ansi_term::Color; @@ -20,8 +19,7 @@ use deltachat::context::*; use deltachat::oauth2::*; use deltachat::qr_code_generator::get_securejoin_qr_svg; use deltachat::securejoin::*; -use deltachat::stock_str::StockStrings; -use deltachat::{EventType, Events}; +use deltachat::EventType; use log::{error, info, warn}; use rustyline::completion::{Completer, FilenameCompleter, Pair}; use rustyline::error::ReadlineError; @@ -312,7 +310,10 @@ async fn start(args: Vec) -> Result<(), Error> { println!("Error: Bad arguments, expected [db-name]."); bail!("No db-name specified"); } - let context = Context::new(Path::new(&args[1]), 0, Events::new(), StockStrings::new()).await?; + let context = ContextBuilder::new(args[1].clone().into()) + .with_id(1) + .open() + .await?; let events = context.get_event_emitter(); tokio::task::spawn(async move { diff --git a/src/accounts.rs b/src/accounts.rs index 626d279ef..197bd960a 100644 --- a/src/accounts.rs +++ b/src/accounts.rs @@ -17,7 +17,7 @@ use tokio::sync::oneshot; #[cfg(not(target_os = "ios"))] use tokio::time::{sleep, Duration}; -use crate::context::Context; +use crate::context::{Context, ContextBuilder}; use crate::events::{Event, EventEmitter, EventType, Events}; use crate::stock_str::StockStrings; @@ -120,13 +120,16 @@ impl Accounts { let account_config = self.config.new_account().await?; let dbfile = account_config.dbfile(&self.dir); - let ctx = Context::new( - &dbfile, - account_config.id, - self.events.clone(), - self.stockstrings.clone(), - ) - .await?; + let ctx = ContextBuilder::new(dbfile) + .with_id(account_config.id) + .with_events(self.events.clone()) + .with_stock_strings(self.stockstrings.clone()) + .build() + .await?; + // Try to open without a passphrase, + // but do not return an error if account is passphare-protected. + ctx.open("".to_string()).await?; + self.accounts.insert(account_config.id, ctx); Ok(account_config.id) @@ -135,14 +138,14 @@ impl Accounts { /// Adds a new closed account. pub async fn add_closed_account(&mut self) -> Result { let account_config = self.config.new_account().await?; + let dbfile = account_config.dbfile(&self.dir); - let ctx = Context::new_closed( - &account_config.dbfile(&self.dir), - account_config.id, - self.events.clone(), - self.stockstrings.clone(), - ) - .await?; + let ctx = ContextBuilder::new(dbfile) + .with_id(account_config.id) + .with_events(self.events.clone()) + .with_stock_strings(self.stockstrings.clone()) + .build() + .await?; self.accounts.insert(account_config.id, ctx); Ok(account_config.id) @@ -527,19 +530,17 @@ impl Config { let mut accounts = BTreeMap::new(); for account_config in &self.inner.accounts { - let ctx = Context::new( - &account_config.dbfile(dir), - account_config.id, - events.clone(), - stockstrings.clone(), - ) - .await - .with_context(|| { - format!( - "failed to create context from file {:?}", - account_config.dbfile(dir) - ) - })?; + let dbfile = account_config.dbfile(dir); + let ctx = ContextBuilder::new(dbfile.clone()) + .with_id(account_config.id) + .with_events(events.clone()) + .with_stock_strings(stockstrings.clone()) + .build() + .await + .with_context(|| format!("failed to create context from file {:?}", &dbfile))?; + // Try to open without a passphrase, + // but do not return an error if account is passphare-protected. + ctx.open("".to_string()).await?; accounts.insert(account_config.id, ctx); }