From 1beada71234ff83d92e6e620edbfab4dcb760df5 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Tue, 26 Nov 2019 11:41:15 -0500 Subject: store more information about the login state we need to know both who we are (so that the webface can display it) and also how to log back in as that user (since oauth methods log back in without specifying the username at all) --- teleterm/src/protocol.rs | 4 +++- teleterm/src/web.rs | 12 +++++++++--- teleterm/src/web/list.rs | 4 ++-- teleterm/src/web/login.rs | 5 ++++- teleterm/src/web/watch.rs | 4 ++-- 5 files changed, 20 insertions(+), 9 deletions(-) diff --git a/teleterm/src/protocol.rs b/teleterm/src/protocol.rs index 5633b8e..85aee31 100644 --- a/teleterm/src/protocol.rs +++ b/teleterm/src/protocol.rs @@ -185,7 +185,9 @@ impl std::convert::TryFrom<&str> for AuthType { } } -#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize)] +#[derive( + Debug, Clone, PartialEq, Eq, serde::Deserialize, serde::Serialize, +)] pub enum Auth { Plain { username: String, diff --git a/teleterm/src/web.rs b/teleterm/src/web.rs index cfd33c5..48c8c3c 100644 --- a/teleterm/src/web.rs +++ b/teleterm/src/web.rs @@ -34,9 +34,15 @@ impl Config { } } +#[derive(Debug, serde::Deserialize, serde::Serialize)] +pub(crate) struct LoginState { + auth: crate::protocol::Auth, + username: String, +} + #[derive(Default, serde::Deserialize, serde::Serialize)] struct SessionData { - username: Option, + login: Option, } #[derive(Debug, serde::Serialize)] @@ -62,9 +68,9 @@ impl<'a> WebConfig<'a> { } Ok(Self { username: session - .username + .login .as_ref() - .map(std::string::String::as_str), + .map(|login| login.username.as_str()), public_address: &config.public_address, allowed_login_methods: &config.allowed_login_methods, oauth_login_urls, diff --git a/teleterm/src/web/list.rs b/teleterm/src/web/list.rs index 2acc9e5..e35efac 100644 --- a/teleterm/src/web/list.rs +++ b/teleterm/src/web/list.rs @@ -8,8 +8,8 @@ pub fn run( let session = gotham::middleware::session::SessionData::< crate::web::SessionData, >::borrow_from(&state); - let auth = if let Some(username) = &session.username { - crate::protocol::Auth::plain(username) + let auth = if let Some(login) = &session.login { + &login.auth } else { return ( state, diff --git a/teleterm/src/web/login.rs b/teleterm/src/web/login.rs index decc972..876cebe 100644 --- a/teleterm/src/web/login.rs +++ b/teleterm/src/web/login.rs @@ -25,7 +25,10 @@ pub fn run( crate::web::SessionData, >::borrow_mut_from(&mut state); - session.username = username.clone(); + session.login = username.clone().map(|username| super::LoginState { + username: username.clone(), + auth: crate::protocol::Auth::plain(&username), + }); ( state, diff --git a/teleterm/src/web/watch.rs b/teleterm/src/web/watch.rs index 8f59704..bb44639 100644 --- a/teleterm/src/web/watch.rs +++ b/teleterm/src/web/watch.rs @@ -18,8 +18,8 @@ pub fn run( let session = gotham::middleware::session::SessionData::< crate::web::SessionData, >::borrow_from(&state); - let auth = if let Some(username) = &session.username { - crate::protocol::Auth::plain(username) + let auth = if let Some(login) = &session.login { + login.auth.clone() } else { return ( state, -- cgit v1.2.3