From c25fd03fe3bc33fa527c8c3577678333602a68db Mon Sep 17 00:00:00 2001 From: lemonsh Date: Sun, 30 Apr 2023 21:13:32 +0200 Subject: [PATCH] _actually_ implement reauth --- connectbox/examples/devices.rs | 2 +- connectbox/src/lib.rs | 22 +++++++++++++++------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/connectbox/examples/devices.rs b/connectbox/examples/devices.rs index afc722f..2ac0343 100644 --- a/connectbox/examples/devices.rs +++ b/connectbox/examples/devices.rs @@ -11,7 +11,7 @@ async fn main() -> Result<()> { let ip = args.next().expect("no ip specified"); let code = args.next().expect("no code specified"); - let connect_box = ConnectBox::new(ip, code)?; + let connect_box = ConnectBox::new(ip, code, true)?; connect_box.login().await?; let devices = connect_box.get_devices().await?; diff --git a/connectbox/src/lib.rs b/connectbox/src/lib.rs index 0e33787..3f24b12 100644 --- a/connectbox/src/lib.rs +++ b/connectbox/src/lib.rs @@ -26,11 +26,11 @@ pub struct ConnectBox { base_url: Url, getter_url: Url, setter_url: Url, - auto_reauth: bool + auto_reauth: bool, } impl ConnectBox { - pub fn new(address: impl Display, code: String) -> Result { + pub fn new(address: impl Display, code: String, auto_reauth: bool) -> Result { let cookie_store = Arc::new(Jar::default()); let http = Client::builder() .user_agent("Mozilla/5.0") @@ -47,7 +47,7 @@ impl ConnectBox { getter_url, setter_url, code, - auto_reauth: false + auto_reauth, }) } @@ -80,9 +80,11 @@ impl ConnectBox { if resp.status().is_redirection() { if self.auto_reauth && !reauthed { reauthed = true; + tracing::debug!("session has expired, attempting reauth"); + self._login().await?; continue; } - return Err(Error::NotAuthorized) + return Err(Error::NotAuthorized); } return Ok(quick_xml::de::from_str(&resp.text().await?)?); } @@ -110,20 +112,26 @@ impl ConnectBox { if resp.status().is_redirection() { if self.auto_reauth && !reauthed { reauthed = true; + tracing::debug!("session has expired, attempting reauth"); + self._login().await?; continue; } - return Err(Error::NotAuthorized) + return Err(Error::NotAuthorized); } return Ok(resp.text().await?); } } async fn _login(&self) -> Result<()> { - let fields = vec![ + let session_token = self.cookie("sessionToken")?.ok_or(Error::NoSessionToken)?; + let form: Vec<(Cow, Cow)> = vec![ + ("token".into(), session_token.into()), + ("fun".into(), functions::LOGIN.to_string().into()), ("Username".into(), "NULL".into()), ("Password".into(), (&self.code).into()), ]; - let response = self.xml_setter(functions::LOGIN, Some(fields)).await?; + let req = self.http.post(self.setter_url.clone()).form(&form); + let response = req.send().await?.text().await?; if response == "idloginincorrect" { return Err(Error::IncorrectCode); }