From 64134b9e72d6d3aff19354f77d211c046bd9086b Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Mon, 25 Nov 2019 13:46:51 -0500 Subject: make logins persistent so if the server knows we're logged in, don't show the login page --- teleterm-web/src/config.rs | 1 + teleterm-web/src/lib.rs | 11 +++++++---- teleterm-web/src/model.rs | 42 +++++++++++++++++++++++++++++++++-------- teleterm-web/src/protocol.rs | 5 +++++ teleterm-web/src/views/login.rs | 2 +- teleterm-web/src/views/page.rs | 12 +++++++++++- 6 files changed, 59 insertions(+), 14 deletions(-) (limited to 'teleterm-web') diff --git a/teleterm-web/src/config.rs b/teleterm-web/src/config.rs index d9308de..f671e10 100644 --- a/teleterm-web/src/config.rs +++ b/teleterm-web/src/config.rs @@ -9,6 +9,7 @@ extern "C" { #[derive(Clone, Debug, serde::Deserialize)] pub(crate) struct Config { pub(crate) title: String, + pub(crate) username: Option, pub(crate) public_address: String, } diff --git a/teleterm-web/src/lib.rs b/teleterm-web/src/lib.rs index cd0e158..37c7d0d 100644 --- a/teleterm-web/src/lib.rs +++ b/teleterm-web/src/lib.rs @@ -10,8 +10,8 @@ use crate::prelude::*; #[allow(clippy::large_enum_variant)] #[derive(Clone)] enum Msg { - Login(String), - LoggedIn(seed::fetch::ResponseDataResult<()>), + Login, + LoggedIn(seed::fetch::ResponseDataResult), Refresh, List(seed::fetch::ResponseDataResult>), StartWatching(String), @@ -19,9 +19,12 @@ enum Msg { StopWatching, } -fn init(_: Url, _orders: &mut impl Orders) -> Init { +fn init(_: Url, orders: &mut impl Orders) -> Init { log::trace!("init"); - Init::new(crate::model::Model::new(crate::config::Config::load())) + Init::new(crate::model::Model::new( + crate::config::Config::load(), + orders, + )) } fn update( diff --git a/teleterm-web/src/model.rs b/teleterm-web/src/model.rs index acd3e97..67cd984 100644 --- a/teleterm-web/src/model.rs +++ b/teleterm-web/src/model.rs @@ -35,11 +35,19 @@ pub(crate) struct Model { } impl Model { - pub(crate) fn new(config: crate::config::Config) -> Self { - Self { + pub(crate) fn new( + config: crate::config::Config, + orders: &mut impl Orders, + ) -> Self { + let logged_in = config.username.is_some(); + let self_ = Self { config, state: State::Login, + }; + if logged_in { + self_.list(orders); } + self_ } pub(crate) fn update( @@ -48,14 +56,28 @@ impl Model { orders: &mut impl Orders, ) { match msg { - crate::Msg::Login(username) => { - log::debug!("login"); + crate::Msg::Login => { + let username = seed::to_input( + &seed::document().get_element_by_id("username").unwrap(), + ) + .value(); + log::debug!("login for username {}", username); self.login(&username, orders); } - crate::Msg::LoggedIn(..) => { - log::debug!("logged in"); - orders.send_msg(crate::Msg::Refresh); - } + crate::Msg::LoggedIn(response) => match response { + Ok(response) => { + self.config.username = response.username.clone(); + if let Some(username) = response.username { + log::debug!("logged in as {}", username); + orders.send_msg(crate::Msg::Refresh); + } else { + log::error!("failed to log in"); + } + } + Err(e) => { + log::error!("error logging in: {:?}", e); + } + }, crate::Msg::Refresh => { log::debug!("refreshing"); self.list(orders); @@ -135,6 +157,10 @@ impl Model { &self.config.title } + pub(crate) fn username(&self) -> Option<&str> { + self.config.username.as_ref().map(|s| s.as_str()) + } + pub(crate) fn sessions(&self) -> &[crate::protocol::Session] { if let State::List(sessions) = &self.state { sessions diff --git a/teleterm-web/src/protocol.rs b/teleterm-web/src/protocol.rs index 4cbedf2..7b12f5e 100644 --- a/teleterm-web/src/protocol.rs +++ b/teleterm-web/src/protocol.rs @@ -24,3 +24,8 @@ pub(crate) struct Size { pub rows: u16, pub cols: u16, } + +#[derive(Clone, Debug, serde::Deserialize)] +pub(crate) struct LoginResponse { + pub username: Option, +} diff --git a/teleterm-web/src/views/login.rs b/teleterm-web/src/views/login.rs index 571098e..bf2ae9a 100644 --- a/teleterm-web/src/views/login.rs +++ b/teleterm-web/src/views/login.rs @@ -12,6 +12,6 @@ pub(crate) fn render(_: &crate::model::Model) -> Vec> { seed::input![ seed::attrs! { At::Type => "submit", At::Value => "login" } ], - input_ev(Ev::Submit, crate::Msg::Login), + simple_ev(Ev::Submit, crate::Msg::Login), ]] } diff --git a/teleterm-web/src/views/page.rs b/teleterm-web/src/views/page.rs index ed2f65c..1d2b5cd 100644 --- a/teleterm-web/src/views/page.rs +++ b/teleterm-web/src/views/page.rs @@ -3,8 +3,18 @@ use crate::prelude::*; pub(crate) fn render(model: &crate::model::Model) -> Vec> { let mut view = vec![seed::h1![model.title()]]; + if let Some(username) = model.username() { + view.push(seed::p![format!("logged in as {}", username)]); + } else { + view.push(seed::p!["not logged in"]); + } + if model.logging_in() { - view.extend(super::login::render(model)) + if model.username().is_some() { + view.push(seed::p!["loading..."]); + } else { + view.extend(super::login::render(model)) + } } else if model.choosing() { view.extend(super::list::render(model)) } else if model.watching() { -- cgit v1.2.3-54-g00ecf