aboutsummaryrefslogtreecommitdiffstats
path: root/teleterm-web
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2019-11-26 11:50:06 -0500
committerJesse Luehrs <doy@tozt.net>2019-11-26 11:50:06 -0500
commit0ecea0fde96ac0409f346511f1c8108e1aa73078 (patch)
treefee8e1167ad61d46e942bfec3e03bf77413e5603 /teleterm-web
parent1beada71234ff83d92e6e620edbfab4dcb760df5 (diff)
downloadteleterm-0ecea0fde96ac0409f346511f1c8108e1aa73078.tar.gz
teleterm-0ecea0fde96ac0409f346511f1c8108e1aa73078.zip
read the oauth method configs in the webface
the oauth login link doesn't work yet, but the ui works at least
Diffstat (limited to 'teleterm-web')
-rw-r--r--teleterm-web/src/config.rs4
-rw-r--r--teleterm-web/src/model.rs14
-rw-r--r--teleterm-web/src/protocol.rs7
-rw-r--r--teleterm-web/src/views/login.rs36
4 files changed, 60 insertions, 1 deletions
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<String>,
pub(crate) public_address: String,
+ pub(crate) allowed_login_methods:
+ std::collections::HashSet<crate::protocol::AuthType>,
+ pub(crate) oauth_login_urls:
+ std::collections::HashMap<crate::protocol::AuthType, String>,
}
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<crate::Msg>) {
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<u8> },
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<Node<crate::Msg>> {
+pub(crate) fn render(model: &crate::model::Model) -> Vec<Node<crate::Msg>> {
+ 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<Node<crate::Msg>> {
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<Node<crate::Msg>> {
}),
]]
}
+
+fn render_recurse_center(url: &str) -> Vec<Node<crate::Msg>> {
+ vec![seed::a![
+ seed::attrs! {
+ At::Href => url,
+ },
+ "login via oauth"
+ ]]
+}