Move Outlook autodiscovery into separate function

This commit is contained in:
Alexander Krotov
2019-10-06 17:06:39 +03:00
parent 5154f27f72
commit 59c22a5626

View File

@@ -3,6 +3,7 @@ use quick_xml::events::BytesEnd;
use crate::constants::*; use crate::constants::*;
use crate::context::Context; use crate::context::Context;
use crate::error::Error;
use crate::login_param::LoginParam; use crate::login_param::LoginParam;
use super::read_autoconf_file; use super::read_autoconf_file;
@@ -19,26 +20,23 @@ struct OutlookAutodiscover {
pub config_redirecturl: Option<String>, pub config_redirecturl: Option<String>,
} }
pub fn outlk_autodiscover( enum ParsingResult {
context: &Context, LoginParam(LoginParam),
url: &str, RedirectUrl(String),
_param_in: &LoginParam, }
) -> Option<LoginParam> {
let mut url = url.to_string(); fn outlk_parse_xml(xml_raw: &str) -> Result<ParsingResult, Error> {
/* Follow up to 10 xml-redirects (http-redirects are followed in read_autoconf_file() */ let mut outlk_ad = OutlookAutodiscover {
for _i in 0..10 { out: LoginParam::new(),
let mut outlk_ad = OutlookAutodiscover { out_imap_set: false,
out: LoginParam::new(), out_smtp_set: false,
out_imap_set: false, config_type: None,
out_smtp_set: false, config_server: String::new(),
config_type: None, config_port: 0,
config_server: String::new(), config_ssl: String::new(),
config_port: 0, config_redirecturl: None,
config_ssl: String::new(), };
config_redirecturl: None,
};
if let Some(xml_raw) = read_autoconf_file(context, &url) {
let mut reader = quick_xml::Reader::from_str(&xml_raw); let mut reader = quick_xml::Reader::from_str(&xml_raw);
reader.trim_text(true); reader.trim_text(true);
@@ -74,20 +72,15 @@ pub fn outlk_autodiscover(
match tag.as_str() { match tag.as_str() {
"type" => outlk_ad.config_type = Some(val.trim().to_string()), "type" => outlk_ad.config_type = Some(val.trim().to_string()),
"server" => outlk_ad.config_server = val.trim().to_string(), "server" => outlk_ad.config_server = val.trim().to_string(),
"port" => { "port" => outlk_ad.config_port = val.trim().parse().unwrap_or_default(),
outlk_ad.config_port = val.trim().parse().unwrap_or_default()
}
"ssl" => outlk_ad.config_ssl = val.trim().to_string(), "ssl" => outlk_ad.config_ssl = val.trim().to_string(),
"redirecturl" => { "redirecturl" => outlk_ad.config_redirecturl = Some(val.trim().to_string()),
outlk_ad.config_redirecturl = Some(val.trim().to_string())
}
_ => {} _ => {}
}; };
} }
} }
Err(e) => { Err(e) => {
error!( bail!(
context,
"Configure xml: Error at position {}: {:?}", "Configure xml: Error at position {}: {:?}",
reader.buffer_position(), reader.buffer_position(),
e e
@@ -109,12 +102,34 @@ pub fn outlk_autodiscover(
|| outlk_ad.out.send_port == 0 || outlk_ad.out.send_port == 0
{ {
let r = outlk_ad.out.to_string(); let r = outlk_ad.out.to_string();
warn!(context, "Bad or incomplete autoconfig: {}", r,); bail!("Bad or incomplete autoconfig: {}", r,);
}
Ok(ParsingResult::LoginParam(outlk_ad.out))
} else {
Ok(ParsingResult::RedirectUrl(
outlk_ad.config_redirecturl.unwrap(),
))
}
}
pub fn outlk_autodiscover(
context: &Context,
url: &str,
_param_in: &LoginParam,
) -> Option<LoginParam> {
let mut url = url.to_string();
/* Follow up to 10 xml-redirects (http-redirects are followed in read_autoconf_file() */
for _i in 0..10 {
if let Some(xml_raw) = read_autoconf_file(context, &url) {
match outlk_parse_xml(&xml_raw) {
Err(err) => {
warn!(context, "{}", err);
return None; return None;
} }
return Some(outlk_ad.out); Ok(res) => match res {
} else { ParsingResult::RedirectUrl(redirect_url) => url = redirect_url,
url = outlk_ad.config_redirecturl.unwrap(); ParsingResult::LoginParam(login_param) => return Some(login_param),
},
} }
} else { } else {
return None; return None;