diff --git a/src/configure/auto_mozilla.rs b/src/configure/auto_mozilla.rs index 005cc5fcb..ffc28b156 100644 --- a/src/configure/auto_mozilla.rs +++ b/src/configure/auto_mozilla.rs @@ -1,10 +1,8 @@ -use libc::free; use quick_xml; use quick_xml::events::{BytesEnd, BytesStart, BytesText}; use crate::constants::*; use crate::context::Context; -use crate::dc_tools::*; use crate::login_param::LoginParam; use super::read_autoconf_file; @@ -24,26 +22,28 @@ struct moz_autoconfigure_t<'a> { pub tag_config: libc::c_int, } -pub unsafe fn moz_autoconfigure( +pub fn moz_autoconfigure( context: &Context, url: &str, param_in: &LoginParam, ) -> Option { - let xml_raw = read_autoconf_file(context, url); - if xml_raw.is_null() { - return None; - } + let xml_raw = match read_autoconf_file(context, url) { + Err(err) => { + info!(context, "can't read file: {}", err); + return None; + } + Ok(content) => content, + }; // Split address into local part and domain part. let p = param_in.addr.find("@"); if p.is_none() { - free(xml_raw as *mut libc::c_void); return None; } let (in_emaillocalpart, in_emaildomain) = param_in.addr.split_at(p.unwrap()); let in_emaildomain = &in_emaildomain[1..]; - let mut reader = quick_xml::Reader::from_str(as_str(xml_raw)); + let mut reader = quick_xml::Reader::from_str(&xml_raw); reader.trim_text(true); let mut buf = Vec::new(); @@ -88,11 +88,9 @@ pub unsafe fn moz_autoconfigure( { let r = moz_ac.out.to_string(); warn!(context, "Bad or incomplete autoconfig: {}", r,); - free(xml_raw as *mut libc::c_void); return None; } - free(xml_raw as *mut libc::c_void); Some(moz_ac.out) } diff --git a/src/configure/auto_outlook.rs b/src/configure/auto_outlook.rs index 4c172c85f..96888a4bf 100644 --- a/src/configure/auto_outlook.rs +++ b/src/configure/auto_outlook.rs @@ -23,13 +23,12 @@ struct outlk_autodiscover_t<'a> { pub config: [*mut libc::c_char; 6], } -pub unsafe fn outlk_autodiscover( +pub fn outlk_autodiscover( context: &Context, url__: &str, param_in: &LoginParam, ) -> Option { - let mut xml_raw: *mut libc::c_char = ptr::null_mut(); - let mut url = url__.strdup(); + let mut url = url__.to_string(); let mut outlk_ad = outlk_autodiscover_t { in_0: param_in, out: LoginParam::new(), @@ -45,18 +44,21 @@ pub unsafe fn outlk_autodiscover( ok_to_continue = true; break; } - libc::memset( - &mut outlk_ad as *mut outlk_autodiscover_t as *mut libc::c_void, - 0, - ::std::mem::size_of::(), - ); - xml_raw = read_autoconf_file(context, as_str(url)); - if xml_raw.is_null() { + unsafe { + libc::memset( + &mut outlk_ad as *mut outlk_autodiscover_t as *mut libc::c_void, + 0, + ::std::mem::size_of::(), + ); + } + let xml_raw = read_autoconf_file(context, &url); + if xml_raw.is_err() { ok_to_continue = false; break; } + let xml_raw = xml_raw.unwrap(); - let mut reader = quick_xml::Reader::from_str(as_str(xml_raw)); + let mut reader = quick_xml::Reader::from_str(&xml_raw); reader.trim_text(true); let mut buf = Vec::new(); @@ -86,18 +88,17 @@ pub unsafe fn outlk_autodiscover( buf.clear(); } - if !(!outlk_ad.config[5].is_null() - && 0 != *outlk_ad.config[5usize].offset(0isize) as libc::c_int) - { - ok_to_continue = true; - break; + unsafe { + if !(!outlk_ad.config[5].is_null() + && 0 != *outlk_ad.config[5usize].offset(0isize) as libc::c_int) + { + ok_to_continue = true; + break; + } } - free(url as *mut libc::c_void); - url = dc_strdup(outlk_ad.config[5usize]); + url = to_string(outlk_ad.config[5usize]); outlk_clean_config(&mut outlk_ad); - free(xml_raw as *mut libc::c_void); - xml_raw = ptr::null_mut(); i += 1; } @@ -109,23 +110,21 @@ pub unsafe fn outlk_autodiscover( { let r = outlk_ad.out.to_string(); warn!(context, "Bad or incomplete autoconfig: {}", r,); - free(url as *mut libc::c_void); - free(xml_raw as *mut libc::c_void); outlk_clean_config(&mut outlk_ad); return None; } } - free(url as *mut libc::c_void); - free(xml_raw as *mut libc::c_void); outlk_clean_config(&mut outlk_ad); Some(outlk_ad.out) } -unsafe fn outlk_clean_config(mut outlk_ad: *mut outlk_autodiscover_t) { +fn outlk_clean_config(mut outlk_ad: *mut outlk_autodiscover_t) { for i in 0..6 { - free((*outlk_ad).config[i] as *mut libc::c_void); - (*outlk_ad).config[i] = ptr::null_mut(); + unsafe { + free((*outlk_ad).config[i] as *mut libc::c_void); + (*outlk_ad).config[i] = ptr::null_mut(); + } } } @@ -142,53 +141,55 @@ fn outlk_autodiscover_text_cb( } } -unsafe fn outlk_autodiscover_endtag_cb(event: &BytesEnd, outlk_ad: &mut outlk_autodiscover_t) { +fn outlk_autodiscover_endtag_cb(event: &BytesEnd, outlk_ad: &mut outlk_autodiscover_t) { let tag = String::from_utf8_lossy(event.name()).trim().to_lowercase(); if tag == "protocol" { - if !outlk_ad.config[1].is_null() { - let port = dc_atoi_null_is_0(outlk_ad.config[3]); - let ssl_on = (!outlk_ad.config[4].is_null() - && strcasecmp( - outlk_ad.config[4], - b"on\x00" as *const u8 as *const libc::c_char, - ) == 0) as libc::c_int; - let ssl_off = (!outlk_ad.config[4].is_null() - && strcasecmp( - outlk_ad.config[4], - b"off\x00" as *const u8 as *const libc::c_char, - ) == 0) as libc::c_int; - if strcasecmp( - outlk_ad.config[1], - b"imap\x00" as *const u8 as *const libc::c_char, - ) == 0 - && outlk_ad.out_imap_set == 0 - { - outlk_ad.out.mail_server = to_string_lossy(outlk_ad.config[2]); - outlk_ad.out.mail_port = port; - if 0 != ssl_on { - outlk_ad.out.server_flags |= DC_LP_IMAP_SOCKET_SSL as i32 - } else if 0 != ssl_off { - outlk_ad.out.server_flags |= DC_LP_IMAP_SOCKET_PLAIN as i32 + unsafe { + if !outlk_ad.config[1].is_null() { + let port = dc_atoi_null_is_0(outlk_ad.config[3]); + let ssl_on = (!outlk_ad.config[4].is_null() + && strcasecmp( + outlk_ad.config[4], + b"on\x00" as *const u8 as *const libc::c_char, + ) == 0) as libc::c_int; + let ssl_off = (!outlk_ad.config[4].is_null() + && strcasecmp( + outlk_ad.config[4], + b"off\x00" as *const u8 as *const libc::c_char, + ) == 0) as libc::c_int; + if strcasecmp( + outlk_ad.config[1], + b"imap\x00" as *const u8 as *const libc::c_char, + ) == 0 + && outlk_ad.out_imap_set == 0 + { + outlk_ad.out.mail_server = to_string_lossy(outlk_ad.config[2]); + outlk_ad.out.mail_port = port; + if 0 != ssl_on { + outlk_ad.out.server_flags |= DC_LP_IMAP_SOCKET_SSL as i32 + } else if 0 != ssl_off { + outlk_ad.out.server_flags |= DC_LP_IMAP_SOCKET_PLAIN as i32 + } + outlk_ad.out_imap_set = 1 + } else if strcasecmp( + outlk_ad.config[1usize], + b"smtp\x00" as *const u8 as *const libc::c_char, + ) == 0 + && outlk_ad.out_smtp_set == 0 + { + outlk_ad.out.send_server = to_string_lossy(outlk_ad.config[2]); + outlk_ad.out.send_port = port; + if 0 != ssl_on { + outlk_ad.out.server_flags |= DC_LP_SMTP_SOCKET_SSL as i32 + } else if 0 != ssl_off { + outlk_ad.out.server_flags |= DC_LP_SMTP_SOCKET_PLAIN as i32 + } + outlk_ad.out_smtp_set = 1 } - outlk_ad.out_imap_set = 1 - } else if strcasecmp( - outlk_ad.config[1usize], - b"smtp\x00" as *const u8 as *const libc::c_char, - ) == 0 - && outlk_ad.out_smtp_set == 0 - { - outlk_ad.out.send_server = to_string_lossy(outlk_ad.config[2]); - outlk_ad.out.send_port = port; - if 0 != ssl_on { - outlk_ad.out.server_flags |= DC_LP_SMTP_SOCKET_SSL as i32 - } else if 0 != ssl_off { - outlk_ad.out.server_flags |= DC_LP_SMTP_SOCKET_PLAIN as i32 - } - outlk_ad.out_smtp_set = 1 } + outlk_clean_config(outlk_ad); } - outlk_clean_config(outlk_ad); } outlk_ad.tag_config = 0; } @@ -197,7 +198,7 @@ fn outlk_autodiscover_starttag_cb(event: &BytesStart, outlk_ad: &mut outlk_autod let tag = String::from_utf8_lossy(event.name()).trim().to_lowercase(); if tag == "protocol" { - unsafe { outlk_clean_config(outlk_ad) }; + outlk_clean_config(outlk_ad); } else if tag == "type" { outlk_ad.tag_config = 1 } else if tag == "server" { diff --git a/src/configure/mod.rs b/src/configure/mod.rs index 8a0fba1d4..2fb7bf7ab 100644 --- a/src/configure/mod.rs +++ b/src/configure/mod.rs @@ -5,6 +5,7 @@ use crate::constants::*; use crate::context::Context; use crate::dc_tools::*; use crate::e2ee; +use crate::error::*; use crate::imap::*; use crate::job::*; use crate::login_param::LoginParam; @@ -27,7 +28,7 @@ macro_rules! progress { } // connect -pub unsafe fn configure(context: &Context) { +pub fn configure(context: &Context) { if dc_has_ongoing(context) { warn!(context, "There is already another ongoing process running.",); return; @@ -46,7 +47,7 @@ pub fn dc_is_configured(context: &Context) -> bool { ******************************************************************************/ // the other dc_job_do_DC_JOB_*() functions are declared static in the c-file #[allow(non_snake_case, unused_must_use)] -pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &Context) { +pub fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &Context) { let mut success = false; let mut imap_connected_here = false; let mut smtp_connected_here = false; @@ -633,7 +634,7 @@ pub fn dc_stop_ongoing_process(context: &Context) { }; } -pub fn read_autoconf_file(context: &Context, url: &str) -> *mut libc::c_char { +pub fn read_autoconf_file(context: &Context, url: &str) -> Result { info!(context, "Testing {} ...", url); match reqwest::Client::new() @@ -641,12 +642,10 @@ pub fn read_autoconf_file(context: &Context, url: &str) -> *mut libc::c_char { .send() .and_then(|mut res| res.text()) { - Ok(res) => unsafe { res.strdup() }, - Err(_err) => { - info!(context, "Can\'t read file.",); - - std::ptr::null_mut() + Err(err) => { + bail!("{}", err); } + Ok(res) => Ok(res.to_string()), } } @@ -664,8 +663,6 @@ mod tests { .set_config(Config::Addr, Some("probably@unexistant.addr")) .unwrap(); t.ctx.set_config(Config::MailPw, Some("123456")).unwrap(); - unsafe { - dc_job_do_DC_JOB_CONFIGURE_IMAP(&t.ctx); - } + dc_job_do_DC_JOB_CONFIGURE_IMAP(&t.ctx); } } diff --git a/src/job.rs b/src/job.rs index af36a6171..4b2ba162f 100644 --- a/src/job.rs +++ b/src/job.rs @@ -781,8 +781,8 @@ fn job_perform(context: &Context, thread: Thread, probe_network: bool) { Action::MarkseenMdnOnImap => job.do_DC_JOB_MARKSEEN_MDN_ON_IMAP(context), Action::MoveMsg => job.do_DC_JOB_MOVE_MSG(context), Action::SendMdn => job.do_DC_JOB_SEND(context), - Action::ConfigureImap => unsafe { dc_job_do_DC_JOB_CONFIGURE_IMAP(context) }, - Action::ImexImap => match job_do_DC_JOB_IMEX_IMAP(context, &job) { + Action::ConfigureImap => dc_job_do_DC_JOB_CONFIGURE_IMAP(context), + Action::ImexImap => match dc_job_do_DC_JOB_IMEX_IMAP(context) { Ok(()) => {} Err(err) => { error!(context, "{}", err);