diff --git a/src/configure/auto_mozilla.rs b/src/configure/auto_mozilla.rs index cc1fa00d5..c5dbf9ad5 100644 --- a/src/configure/auto_mozilla.rs +++ b/src/configure/auto_mozilla.rs @@ -10,16 +10,29 @@ use super::read_autoconf_file; * Thunderbird's Autoconfigure ******************************************************************************/ /* documentation: https://developer.mozilla.org/en-US/docs/Mozilla/Thunderbird/Autoconfiguration */ -#[repr(C)] -struct moz_autoconfigure_t<'a> { +struct MozAutoconfigure<'a> { pub in_0: &'a LoginParam, pub in_emaildomain: &'a str, pub in_emaillocalpart: &'a str, pub out: LoginParam, - pub out_imap_set: libc::c_int, - pub out_smtp_set: libc::c_int, - pub tag_server: libc::c_int, - pub tag_config: libc::c_int, + pub out_imap_set: bool, + pub out_smtp_set: bool, + pub tag_server: MozServer, + pub tag_config: MozConfigTag, +} + +enum MozServer { + Undefined, + Imap, + Smtp, +} + +enum MozConfigTag { + Undefined, + Hostname, + Port, + Sockettype, + Username, } pub fn moz_autoconfigure( @@ -30,11 +43,8 @@ pub fn moz_autoconfigure( let xml_raw = read_autoconf_file(context, url)?; // Split address into local part and domain part. - let p = param_in.addr.find("@"); - if p.is_none() { - return None; - } - let (in_emaillocalpart, in_emaildomain) = param_in.addr.split_at(p.unwrap()); + let p = param_in.addr.find('@')?; + let (in_emaillocalpart, in_emaildomain) = param_in.addr.split_at(p); let in_emaildomain = &in_emaildomain[1..]; let mut reader = quick_xml::Reader::from_str(&xml_raw); @@ -42,15 +52,15 @@ pub fn moz_autoconfigure( let mut buf = Vec::new(); - let mut moz_ac = moz_autoconfigure_t { + let mut moz_ac = MozAutoconfigure { in_0: param_in, in_emaildomain, in_emaillocalpart, out: LoginParam::new(), - out_imap_set: 0, - out_smtp_set: 0, - tag_server: 0, - tag_config: 0, + out_imap_set: false, + out_smtp_set: false, + tag_server: MozServer::Undefined, + tag_config: MozConfigTag::Undefined, }; loop { match reader.read_event(&mut buf) { @@ -90,7 +100,7 @@ pub fn moz_autoconfigure( fn moz_autoconfigure_text_cb( event: &BytesText, - moz_ac: &mut moz_autoconfigure_t, + moz_ac: &mut MozAutoconfigure, reader: &quick_xml::Reader, ) { let val = event.unescape_and_decode(reader).unwrap_or_default(); @@ -105,12 +115,12 @@ fn moz_autoconfigure_text_cb( .replace("%EMAILLOCALPART%", email_local) .replace("%EMAILDOMAIN%", email_domain); - if moz_ac.tag_server == 1 { - match moz_ac.tag_config { - 10 => moz_ac.out.mail_server = val, - 11 => moz_ac.out.mail_port = val.parse().unwrap_or_default(), - 12 => moz_ac.out.mail_user = val, - 13 => { + match moz_ac.tag_server { + MozServer::Imap => match moz_ac.tag_config { + MozConfigTag::Hostname => moz_ac.out.mail_server = val, + MozConfigTag::Port => moz_ac.out.mail_port = val.parse().unwrap_or_default(), + MozConfigTag::Username => moz_ac.out.mail_user = val, + MozConfigTag::Sockettype => { let val_lower = val.to_lowercase(); if val_lower == "ssl" { moz_ac.out.server_flags |= DC_LP_IMAP_SOCKET_SSL as i32 @@ -123,13 +133,12 @@ fn moz_autoconfigure_text_cb( } } _ => {} - } - } else if moz_ac.tag_server == 2 { - match moz_ac.tag_config { - 10 => moz_ac.out.send_server = val, - 11 => moz_ac.out.send_port = val.parse().unwrap_or_default(), - 12 => moz_ac.out.send_user = val, - 13 => { + }, + MozServer::Smtp => match moz_ac.tag_config { + MozConfigTag::Hostname => moz_ac.out.send_server = val, + MozConfigTag::Port => moz_ac.out.send_port = val.parse().unwrap_or_default(), + MozConfigTag::Username => moz_ac.out.send_user = val, + MozConfigTag::Sockettype => { let val_lower = val.to_lowercase(); if val_lower == "ssl" { moz_ac.out.server_flags |= DC_LP_SMTP_SOCKET_SSL as i32 @@ -142,29 +151,30 @@ fn moz_autoconfigure_text_cb( } } _ => {} - } + }, + MozServer::Undefined => {} } } -fn moz_autoconfigure_endtag_cb(event: &BytesEnd, moz_ac: &mut moz_autoconfigure_t) { +fn moz_autoconfigure_endtag_cb(event: &BytesEnd, moz_ac: &mut MozAutoconfigure) { let tag = String::from_utf8_lossy(event.name()).trim().to_lowercase(); if tag == "incomingserver" { - moz_ac.tag_server = 0; - moz_ac.tag_config = 0; - moz_ac.out_imap_set = 1; + moz_ac.tag_server = MozServer::Undefined; + moz_ac.tag_config = MozConfigTag::Undefined; + moz_ac.out_imap_set = true; } else if tag == "outgoingserver" { - moz_ac.tag_server = 0; - moz_ac.tag_config = 0; - moz_ac.out_smtp_set = 1; + moz_ac.tag_server = MozServer::Undefined; + moz_ac.tag_config = MozConfigTag::Undefined; + moz_ac.out_smtp_set = true; } else { - moz_ac.tag_config = 0; + moz_ac.tag_config = MozConfigTag::Undefined; } } fn moz_autoconfigure_starttag_cb( event: &BytesStart, - moz_ac: &mut moz_autoconfigure_t, + moz_ac: &mut MozAutoconfigure, reader: &quick_xml::Reader, ) { let tag = String::from_utf8_lossy(event.name()).trim().to_lowercase(); @@ -181,25 +191,29 @@ fn moz_autoconfigure_starttag_cb( .unwrap_or_default() .to_lowercase(); - if typ == "imap" && moz_ac.out_imap_set == 0 { - 1 + if typ == "imap" && !moz_ac.out_imap_set { + MozServer::Imap } else { - 0 + MozServer::Undefined } } else { - 0 + MozServer::Undefined }; - moz_ac.tag_config = 0; + moz_ac.tag_config = MozConfigTag::Undefined; } else if tag == "outgoingserver" { - moz_ac.tag_server = if moz_ac.out_smtp_set == 0 { 2 } else { 0 }; - moz_ac.tag_config = 0; + moz_ac.tag_server = if !moz_ac.out_smtp_set { + MozServer::Smtp + } else { + MozServer::Undefined + }; + moz_ac.tag_config = MozConfigTag::Undefined; } else if tag == "hostname" { - moz_ac.tag_config = 10; + moz_ac.tag_config = MozConfigTag::Hostname; } else if tag == "port" { - moz_ac.tag_config = 11; + moz_ac.tag_config = MozConfigTag::Port; } else if tag == "sockettype" { - moz_ac.tag_config = 13; + moz_ac.tag_config = MozConfigTag::Sockettype; } else if tag == "username" { - moz_ac.tag_config = 12; + moz_ac.tag_config = MozConfigTag::Username; } }