aboutsummaryrefslogtreecommitdiffstats
path: root/teleterm-web
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2019-11-25 13:46:51 -0500
committerJesse Luehrs <doy@tozt.net>2019-11-25 13:46:51 -0500
commit64134b9e72d6d3aff19354f77d211c046bd9086b (patch)
treeeb83f6a5cb0ee27e0fc0b531964935a21fe677aa /teleterm-web
parentfb08af01454c5dff7690a1cc86718d0d29d01092 (diff)
downloadteleterm-64134b9e72d6d3aff19354f77d211c046bd9086b.tar.gz
teleterm-64134b9e72d6d3aff19354f77d211c046bd9086b.zip
make logins persistent
so if the server knows we're logged in, don't show the login page
Diffstat (limited to 'teleterm-web')
-rw-r--r--teleterm-web/src/config.rs1
-rw-r--r--teleterm-web/src/lib.rs11
-rw-r--r--teleterm-web/src/model.rs42
-rw-r--r--teleterm-web/src/protocol.rs5
-rw-r--r--teleterm-web/src/views/login.rs2
-rw-r--r--teleterm-web/src/views/page.rs12
6 files changed, 59 insertions, 14 deletions
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<String>,
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<crate::protocol::LoginResponse>),
Refresh,
List(seed::fetch::ResponseDataResult<Vec<crate::protocol::Session>>),
StartWatching(String),
@@ -19,9 +19,12 @@ enum Msg {
StopWatching,
}
-fn init(_: Url, _orders: &mut impl Orders<Msg>) -> Init<crate::model::Model> {
+fn init(_: Url, orders: &mut impl Orders<Msg>) -> Init<crate::model::Model> {
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<crate::Msg>,
+ ) -> 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<crate::Msg>,
) {
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<String>,
+}
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<Node<crate::Msg>> {
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<Node<crate::Msg>> {
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() {