diff --git a/src/configure/auto_mozilla.rs b/src/configure/auto_mozilla.rs index 0da737fcd..2aa1a1af1 100644 --- a/src/configure/auto_mozilla.rs +++ b/src/configure/auto_mozilla.rs @@ -14,8 +14,8 @@ use super::read_autoconf_file; #[repr(C)] struct moz_autoconfigure_t<'a> { pub in_0: &'a dc_loginparam_t, - pub in_emaildomain: *mut libc::c_char, - pub in_emaillocalpart: *mut libc::c_char, + pub in_emaildomain: &'a str, + pub in_emaillocalpart: &'a str, pub out: dc_loginparam_t, pub out_imap_set: libc::c_int, pub out_smtp_set: libc::c_int, @@ -28,42 +28,35 @@ pub unsafe fn moz_autoconfigure( url: &str, param_in: &dc_loginparam_t, ) -> Option { - let mut moz_ac = moz_autoconfigure_t { - in_0: param_in, - in_emaildomain: std::ptr::null_mut(), - in_emaillocalpart: std::ptr::null_mut(), - out: dc_loginparam_new(), - out_imap_set: 0, - out_smtp_set: 0, - tag_server: 0, - tag_config: 0, - }; - - let url_c = url.strdup(); - let xml_raw = read_autoconf_file(context, url_c); - free(url_c as *mut libc::c_void); + let xml_raw = read_autoconf_file(context, url); if xml_raw.is_null() { return None; } - moz_ac.in_emaillocalpart = param_in.addr.strdup(); - let p = strchr(moz_ac.in_emaillocalpart, '@' as i32); - - if p.is_null() { + // 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); - free(moz_ac.in_emaildomain as *mut libc::c_void); - free(moz_ac.in_emaillocalpart as *mut libc::c_void); return None; } - - *p = 0 as libc::c_char; - moz_ac.in_emaildomain = dc_strdup(p.offset(1isize)); + 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)); reader.trim_text(true); let mut buf = Vec::new(); + let mut moz_ac = moz_autoconfigure_t { + in_0: param_in, + in_emaildomain, + in_emaillocalpart, + out: dc_loginparam_new(), + out_imap_set: 0, + out_smtp_set: 0, + tag_server: 0, + tag_config: 0, + }; loop { match reader.read_event(&mut buf) { Ok(quick_xml::events::Event::Start(ref e)) => { @@ -96,14 +89,10 @@ pub unsafe fn moz_autoconfigure( let r = dc_loginparam_get_readable(&moz_ac.out); warn!(context, 0, "Bad or incomplete autoconfig: {}", r,); free(xml_raw as *mut libc::c_void); - free(moz_ac.in_emaildomain as *mut libc::c_void); - free(moz_ac.in_emaillocalpart as *mut libc::c_void); return None; } free(xml_raw as *mut libc::c_void); - free(moz_ac.in_emaildomain as *mut libc::c_void); - free(moz_ac.in_emaillocalpart as *mut libc::c_void); Some(moz_ac.out) } @@ -115,8 +104,8 @@ fn moz_autoconfigure_text_cb( let val = event.unescape_and_decode(reader).unwrap_or_default(); let addr = &moz_ac.in_0.addr; - let email_local = as_str(moz_ac.in_emaillocalpart); - let email_domain = as_str(moz_ac.in_emaildomain); + let email_local = moz_ac.in_emaillocalpart; + let email_domain = moz_ac.in_emaildomain; let val = val .trim() diff --git a/src/configure/auto_outlook.rs b/src/configure/auto_outlook.rs index 52f7e0d4b..b69c1cb50 100644 --- a/src/configure/auto_outlook.rs +++ b/src/configure/auto_outlook.rs @@ -50,7 +50,7 @@ pub unsafe fn outlk_autodiscover( 0, ::std::mem::size_of::(), ); - xml_raw = read_autoconf_file(context, url); + xml_raw = read_autoconf_file(context, as_str(url)); if xml_raw.is_null() { ok_to_continue = false; break; diff --git a/src/configure/mod.rs b/src/configure/mod.rs index 6746e7e2d..f4e5d5fbb 100644 --- a/src/configure/mod.rs +++ b/src/configure/mod.rs @@ -663,11 +663,11 @@ pub fn dc_stop_ongoing_process(context: &Context) { }; } -pub fn read_autoconf_file(context: &Context, url: *const libc::c_char) -> *mut libc::c_char { - info!(context, 0, "Testing {} ...", to_string(url)); +pub fn read_autoconf_file(context: &Context, url: &str) -> *mut libc::c_char { + info!(context, 0, "Testing {} ...", url); match reqwest::Client::new() - .get(as_str(url)) + .get(url) .send() .and_then(|mut res| res.text()) {