aboutsummaryrefslogtreecommitdiff
path: root/crates/iam/src/command.rs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--crates/iam/src/command.rs52
1 files changed, 48 insertions, 4 deletions
diff --git a/crates/iam/src/command.rs b/crates/iam/src/command.rs
index e9e0f23..980c4d0 100644
--- a/crates/iam/src/command.rs
+++ b/crates/iam/src/command.rs
@@ -1,6 +1,6 @@
use crate::{
- api,
- util::{self, get_config_profile, Result},
+ api::{self, CliError, Validation, ValidationSecretCode},
+ util::{self, error_detail, get_config_profile, Result},
CONFIG_LOGIN_TEMPLATE, CONFIG_SIGNUP_TEMPLATE,
};
use async_std::fs;
@@ -9,10 +9,13 @@ use rand::distributions::{Alphanumeric, DistString};
use secd::{AuthEmail, AuthStore};
use std::{
fs::File,
- io::{self, stdin, stdout, Write},
- str::FromStr,
+ io::{self, stdin, stdout, Read, Write},
+ net::TcpListener,
+ str::{self, FromStr},
};
use strum::VariantNames;
+use tiny_http::Server;
+use uuid::Uuid;
const DEFAULT_LOGIN_EMAIL: &str = "<!doctype html><html><body><p>You requested a login link for %secd_email_address%. Please click the following link<br/><br/>http://localhost:5500/myapp/iam/exchange/%secd_link%<br/><br/>or use code: %secd_code%</p></body></html>";
const DEFAULT_SIGNUP_EMAIL: &str = "<!doctype html><html><body><h1>Welcome to SecD IAM</h1></h1><p>If you did not request this sign up, you can safely ignore this email. Otherwise, please click the following link to validate your account<br/><br/>http://localhost:5500/myapp/iam/exchange/%secd_link%<br/><br/>or use code: %secd_code%</p></body></html>";
@@ -162,3 +165,44 @@ pub async fn admin_init(is_interactive: bool) -> Result<()> {
}
Ok(())
}
+
+pub fn dev_oauth2_listen(port: Option<u16>) -> Result<ValidationSecretCode> {
+ let server = Server::http(&format!("localhost:{}", port.unwrap_or(1337))).map_err(|_| {
+ CliError::InternalError(error_detail(
+ "53abd03d-c426-4bba-969d-f1dbed9af75b",
+ "Failure while creating a server to listen to oauth responese",
+ ))
+ })?;
+
+ let parser = |s: &str| -> Option<ValidationSecretCode> {
+ let maybe_code = s.split("code=").collect::<Vec<&str>>();
+ if maybe_code.len() != 2 {
+ None
+ } else {
+ let maybe_code = maybe_code
+ .last()
+ .map(|s| s.to_string())
+ .map(|c| {
+ c.split("&")
+ .collect::<Vec<&str>>()
+ .first()
+ .map(|s| s.to_string())
+ })
+ .flatten();
+
+ maybe_code.map(|s| s.to_string())
+ }
+ };
+
+ let mut s_code = String::new();
+ for req in server.incoming_requests() {
+ match parser(req.url()) {
+ Some(secret_code) => {
+ s_code = secret_code;
+ break;
+ }
+ None => continue,
+ }
+ }
+ Ok(urlencoding::decode(&s_code)?.to_string())
+}