diff --git a/src/dc_imex.rs b/src/dc_imex.rs index c972def4a..602cabc6b 100644 --- a/src/dc_imex.rs +++ b/src/dc_imex.rs @@ -5,6 +5,7 @@ use mmime::mmapstring::*; use mmime::other::*; use rand::{thread_rng, Rng}; +use crate::config::Config; use crate::constants::*; use crate::context::Context; use crate::dc_chat::*; @@ -194,27 +195,22 @@ pub unsafe fn dc_initiate_key_transfer(context: &Context) -> *mut libc::c_char { dc_strdup(setup_code.as_ptr()) } -pub unsafe extern "C" fn dc_render_setup_file( +pub unsafe fn dc_render_setup_file( context: &Context, passphrase: *const libc::c_char, ) -> *mut libc::c_char { - let stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; - - let mut passphrase_begin: [libc::c_char; 8] = [0; 8]; let mut ret_setupfilecontent: *mut libc::c_char = 0 as *mut libc::c_char; if !(passphrase.is_null() || strlen(passphrase) < 2) { - strncpy(passphrase_begin.as_mut_ptr(), passphrase, 2); - passphrase_begin[2usize] = 0i32 as libc::c_char; /* create the payload */ if !(0 == dc_ensure_secret_key_exists(context)) { let self_addr = context .sql - .get_config(context, "configured_addr") + .get_config(context, Config::ConfiguredAddr) .unwrap_or_default(); let curr_private_key = Key::from_self_private(context, self_addr, &context.sql); let e2ee_enabled = context .sql - .get_config_int(context, "e2ee_enabled") + .get_config_int(context, Config::E2eeEnabled) .unwrap_or_else(|| 1); let headers = if 0 != e2ee_enabled { @@ -230,39 +226,40 @@ pub unsafe extern "C" fn dc_render_setup_file( payload_key_asc_c.as_ptr() as *const libc::c_void, payload_key_asc_c.as_bytes().len(), ) { - let encr_string_c = CString::new(encr).unwrap(); - let mut encr_string = strdup(encr_string_c.as_ptr()); - - let replacement: *mut libc::c_char = - dc_mprintf(b"-----BEGIN PGP MESSAGE-----\r\nPassphrase-Format: numeric9x4\r\nPassphrase-Begin: %s\x00" - as *const u8 as *const libc::c_char, - passphrase_begin.as_mut_ptr()); - dc_str_replace( - &mut encr_string, - b"-----BEGIN PGP MESSAGE-----\x00" as *const u8 as *const libc::c_char, - replacement, + let replacement = format!( + concat!( + "-----BEGIN PGP MESSAGE-----\r\n", + "Passphrase-Format: numeric9x4\r\n", + "Passphrase-Begin: {}" + ), + &as_str(passphrase)[..2] ); - free(replacement as *mut libc::c_void); - let setup_message_title = - CString::new(context.stock_str(StockMessage::AcSetupMsgSubject).as_ref()) - .unwrap(); - let setup_message_body = context.stock_str(StockMessage::AcSetupMsgBody); - let msg_body_head: &str = setup_message_body.split('\r').next().unwrap(); - let msg_body_html = CString::new(msg_body_head.replace("\n", "
")).unwrap(); - ret_setupfilecontent = - dc_mprintf(b"\r\n\r\n\r\n%s\r\n\r\n\r\n

%s

\r\n

%s

\r\n
\r\n%s\r\n
\r\n\r\n\r\n\x00" - as *const u8 as *const libc::c_char, - setup_message_title.as_ptr(), - setup_message_title.as_ptr(), - msg_body_html.as_ptr(), - encr_string); - free(encr_string as *mut libc::c_void); + let pgp_msg = encr.replace("-----BEGIN PGP MESSAGE-----", &replacement); + + let msg_subj = context.stock_str(StockMessage::AcSetupMsgSubject); + let msg_body = context.stock_str(StockMessage::AcSetupMsgBody); + let msg_body_head: &str = msg_body.split('\r').next().unwrap(); + let msg_body_html = msg_body_head.replace("\n", "
"); + ret_setupfilecontent = to_cstring(format!( + concat!( + "\r\n", + "\r\n", + " \r\n", + " {}\r\n", + " \r\n", + " \r\n", + "

{}

\r\n", + "

{}

\r\n", + "
\r\n{}\r\n
\r\n", + " \r\n", + "\r\n" + ), + msg_subj, msg_subj, msg_body_html, pgp_msg + )); } } } } - sqlite3_finalize(stmt); - ret_setupfilecontent }