From 0ecea0fde96ac0409f346511f1c8108e1aa73078 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Tue, 26 Nov 2019 11:50:06 -0500 Subject: read the oauth method configs in the webface the oauth login link doesn't work yet, but the ui works at least --- teleterm-web/src/config.rs | 4 ++++ teleterm-web/src/model.rs | 14 ++++++++++++++ teleterm-web/src/protocol.rs | 7 +++++++ teleterm-web/src/views/login.rs | 36 +++++++++++++++++++++++++++++++++++- 4 files changed, 60 insertions(+), 1 deletion(-) (limited to 'teleterm-web') diff --git a/teleterm-web/src/config.rs b/teleterm-web/src/config.rs index 70aa64a..3c8e03b 100644 --- a/teleterm-web/src/config.rs +++ b/teleterm-web/src/config.rs @@ -10,6 +10,10 @@ extern "C" { pub(crate) struct Config { pub(crate) username: Option, pub(crate) public_address: String, + pub(crate) allowed_login_methods: + std::collections::HashSet, + pub(crate) oauth_login_urls: + std::collections::HashMap, } impl Config { diff --git a/teleterm-web/src/model.rs b/teleterm-web/src/model.rs index 05e3152..c500600 100644 --- a/teleterm-web/src/model.rs +++ b/teleterm-web/src/model.rs @@ -187,6 +187,20 @@ impl Model { } } + pub(crate) fn allowed_login_method( + &self, + ty: crate::protocol::AuthType, + ) -> bool { + self.config.allowed_login_methods.contains(&ty) + } + + pub(crate) fn oauth_login_url( + &self, + ty: crate::protocol::AuthType, + ) -> Option<&str> { + self.config.oauth_login_urls.get(&ty).map(|s| s.as_str()) + } + fn login(&self, username: &str, orders: &mut impl Orders) { let url = format!( "http://{}/login?username={}", diff --git a/teleterm-web/src/protocol.rs b/teleterm-web/src/protocol.rs index 7b12f5e..afcfad1 100644 --- a/teleterm-web/src/protocol.rs +++ b/teleterm-web/src/protocol.rs @@ -1,6 +1,13 @@ // it's possible we should just consider pulling the real protocol out into a // crate or something? but ideally in a way that doesn't require pulling in // tokio + +#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq, serde::Deserialize)] +pub enum AuthType { + Plain, + RecurseCenter, +} + #[derive(Clone, Debug, serde::Deserialize)] pub(crate) enum Message { TerminalOutput { data: Vec }, diff --git a/teleterm-web/src/views/login.rs b/teleterm-web/src/views/login.rs index a7d50c8..7f84f4d 100644 --- a/teleterm-web/src/views/login.rs +++ b/teleterm-web/src/views/login.rs @@ -1,6 +1,31 @@ use crate::prelude::*; -pub(crate) fn render(_: &crate::model::Model) -> Vec> { +pub(crate) fn render(model: &crate::model::Model) -> Vec> { + let plain = model.allowed_login_method(crate::protocol::AuthType::Plain); + let recurse_center_url = if model + .allowed_login_method(crate::protocol::AuthType::RecurseCenter) + { + model.oauth_login_url(crate::protocol::AuthType::RecurseCenter) + } else { + None + }; + + let mut view = vec![]; + + if plain { + view.extend(render_plain()); + } + if plain && recurse_center_url.is_some() { + view.push(seed::p!["or"]) + } + if let Some(url) = recurse_center_url { + view.extend(render_recurse_center(&url)); + } + + view +} + +fn render_plain() -> Vec> { vec![seed::form![ seed::label![seed::attrs! { At::For => "username" }, "username"], seed::input![seed::attrs! { @@ -21,3 +46,12 @@ pub(crate) fn render(_: &crate::model::Model) -> Vec> { }), ]] } + +fn render_recurse_center(url: &str) -> Vec> { + vec![seed::a![ + seed::attrs! { + At::Href => url, + }, + "login via oauth" + ]] +} -- cgit v1.2.3-54-g00ecf