Skip to content

Commit a6d0454

Browse files
committed
refactor: allow retrieving the login state from the session
1 parent 9013b28 commit a6d0454

File tree

2 files changed

+43
-21
lines changed

2 files changed

+43
-21
lines changed

src/agent/mod.rs

+5-20
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,19 @@ mod state;
99
pub use client::*;
1010
pub use error::*;
1111
pub use ops::*;
12+
pub use state::LoginState;
1213

1314
pub(crate) use config::*;
1415

1516
use crate::context::{Authentication, OAuth2Context, Reason};
16-
use gloo_storage::{errors::StorageError, SessionStorage, Storage};
17+
use gloo_storage::{SessionStorage, Storage};
1718
use gloo_timers::callback::Timeout;
1819
use gloo_utils::{history, window};
1920
use js_sys::Date;
2021
use log::error;
2122
use num_traits::cast::ToPrimitive;
2223
use reqwest::Url;
2324
use state::*;
24-
use std::fmt::Display;
2525
use std::{collections::HashMap, fmt::Debug, time::Duration};
2626
use tokio::sync::mpsc::{channel, Receiver, Sender};
2727
use wasm_bindgen::JsValue;
@@ -412,7 +412,7 @@ where
412412
))
413413
}
414414
Some(state) => {
415-
let stored_state = Self::get_from_store(STORAGE_KEY_CSRF_TOKEN)?;
415+
let stored_state = get_from_store(STORAGE_KEY_CSRF_TOKEN)?;
416416

417417
if state != stored_state {
418418
return Err(OAuth2Error::LoginResult("State mismatch".to_string()));
@@ -427,7 +427,7 @@ where
427427

428428
log::debug!("Login state: {state:?}");
429429

430-
let redirect_url = Self::get_from_store(STORAGE_KEY_REDIRECT_URL)?;
430+
let redirect_url = get_from_store(STORAGE_KEY_REDIRECT_URL)?;
431431
log::debug!("Redirect URL: {redirect_url}");
432432
let redirect_url = Url::parse(&redirect_url).map_err(|err| {
433433
OAuth2Error::LoginResult(format!("Failed to parse redirect URL: {err}"))
@@ -454,7 +454,7 @@ where
454454
else {
455455
return Ok(());
456456
};
457-
let Some(url) = Self::get_from_store_optional(STORAGE_KEY_POST_LOGIN_URL)? else {
457+
let Some(url) = get_from_store_optional(STORAGE_KEY_POST_LOGIN_URL)? else {
458458
return Ok(());
459459
};
460460
SessionStorage::delete(STORAGE_KEY_POST_LOGIN_URL);
@@ -506,21 +506,6 @@ where
506506
}
507507
}
508508

509-
fn get_from_store<K: AsRef<str> + Display>(key: K) -> Result<String, OAuth2Error> {
510-
Self::get_from_store_optional(&key)?.ok_or_else(|| OAuth2Error::storage_key_empty(key))
511-
}
512-
513-
fn get_from_store_optional<K: AsRef<str> + Display>(
514-
key: K,
515-
) -> Result<Option<String>, OAuth2Error> {
516-
match SessionStorage::get::<String>(key.as_ref()) {
517-
Err(StorageError::KeyNotFound(_)) => Ok(None),
518-
Err(err) => Err(OAuth2Error::Storage(err.to_string())),
519-
Ok(value) if value.is_empty() => Err(OAuth2Error::storage_key_empty(key)),
520-
Ok(value) => Ok(Some(value)),
521-
}
522-
}
523-
524509
/// Extract the state from the query.
525510
fn find_query_state() -> Option<State> {
526511
if let Ok(url) = Self::current_url() {

src/agent/state.rs

+38-1
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,48 @@
1+
use super::OAuth2Error;
2+
use gloo_storage::errors::StorageError;
3+
use gloo_storage::{SessionStorage, Storage};
4+
use std::fmt::Display;
5+
16
pub(crate) const STORAGE_KEY_CSRF_TOKEN: &str = "ctron/oauth2/csrfToken";
27
pub(crate) const STORAGE_KEY_LOGIN_STATE: &str = "ctron/oauth2/loginState";
38
pub(crate) const STORAGE_KEY_REDIRECT_URL: &str = "ctron/oauth2/redirectUrl";
49
pub(crate) const STORAGE_KEY_POST_LOGIN_URL: &str = "ctron/oauth2/postLoginUrl";
510

611
#[derive(Debug)]
7-
pub struct State {
12+
pub(crate) struct State {
813
pub code: Option<String>,
914
pub state: Option<String>,
1015
pub error: Option<String>,
1116
}
17+
18+
pub(crate) fn get_from_store<K: AsRef<str> + Display>(key: K) -> Result<String, OAuth2Error> {
19+
get_from_store_optional(&key)?.ok_or_else(|| OAuth2Error::storage_key_empty(key))
20+
}
21+
22+
pub(crate) fn get_from_store_optional<K: AsRef<str> + Display>(
23+
key: K,
24+
) -> Result<Option<String>, OAuth2Error> {
25+
match SessionStorage::get::<String>(key.as_ref()) {
26+
Err(StorageError::KeyNotFound(_)) => Ok(None),
27+
Err(err) => Err(OAuth2Error::Storage(err.to_string())),
28+
Ok(value) if value.is_empty() => Err(OAuth2Error::storage_key_empty(key)),
29+
Ok(value) => Ok(Some(value)),
30+
}
31+
}
32+
33+
/// Login state, stored in the session
34+
#[derive(Clone, Debug, PartialEq, Eq)]
35+
pub struct LoginState {
36+
pub redirect_url: Option<String>,
37+
pub post_login_url: Option<String>,
38+
}
39+
40+
impl LoginState {
41+
/// Read the state from the session
42+
pub fn from_storage() -> Result<Self, OAuth2Error> {
43+
Ok(Self {
44+
redirect_url: get_from_store_optional(STORAGE_KEY_REDIRECT_URL)?,
45+
post_login_url: get_from_store_optional(STORAGE_KEY_POST_LOGIN_URL)?,
46+
})
47+
}
48+
}

0 commit comments

Comments
 (0)