From 4b616447715b8129ae322341959e1c2bfabbd10e Mon Sep 17 00:00:00 2001 From: Cara Salter Date: Wed, 20 Jul 2022 10:31:01 -0400 Subject: emails also subnet storage --- src/handlers/auth.rs | 12 ++++++++++++ src/handlers/mod.rs | 10 +++++++++- src/handlers/nets.rs | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 src/handlers/nets.rs (limited to 'src/handlers') diff --git a/src/handlers/auth.rs b/src/handlers/auth.rs index c00fb8d..ab72bc8 100644 --- a/src/handlers/auth.rs +++ b/src/handlers/auth.rs @@ -82,6 +82,18 @@ pub async fn register_post(Form(reg): Form, state: Extension Result<(PrivateCookieJar, Redirect), ServiceError> { + if let Some(id) = jar.get("user-id") { + debug!("Found user {}", id); + + let updated_jar = jar.remove(id); + + Ok((updated_jar, Redirect::to("/dash/auth/login"))) + } else { + Ok((jar, Redirect::to("/"))) + } +} + #[instrument] pub async fn get_user_or_403(jar: PrivateCookieJar, conn: &mut PoolConnection) -> Result { debug!("Starting middleware get_user_or_403"); diff --git a/src/handlers/mod.rs b/src/handlers/mod.rs index b83d83c..24db540 100644 --- a/src/handlers/mod.rs +++ b/src/handlers/mod.rs @@ -1,11 +1,13 @@ -use axum::{Router, routing::get}; +use axum::{Router, routing::{get, post}}; pub mod auth; +mod nets; pub async fn gen_routers() -> Router { Router::new() .nest("/auth", auth_routes().await) + .nest("/nets", net_routes().await) } async fn auth_routes() -> Router { @@ -13,4 +15,10 @@ async fn auth_routes() -> Router { Router::new() .route("/login", get(auth::login).post(auth::login_post)) .route("/register", get(auth::register).post(auth::register_post)) + .route("/logout", post(auth::logout_post)) +} + +async fn net_routes() -> Router { + Router::new() + .route("/new", get(nets::new).post(nets::new_post)) } diff --git a/src/handlers/nets.rs b/src/handlers/nets.rs new file mode 100644 index 0000000..6010787 --- /dev/null +++ b/src/handlers/nets.rs @@ -0,0 +1,50 @@ +use std::sync::Arc; + +use axum::{Extension, Form}; +use axum::response::{Html, IntoResponse, Redirect}; +use axum_extra::extract::PrivateCookieJar; +use sqlx::query; +use sqlx::types::ipnetwork::IpNetwork; +use serde::Deserialize; + +use crate::State; + +use crate::errors::{HtmlResult, ServiceError}; + +use super::auth::get_user_or_403; + +#[derive(Deserialize)] +pub struct NewNetForm { + pub subnet: String, + pub description: String, +} + +pub async fn new(jar: PrivateCookieJar, state: Extension>) -> Result>, ServiceError> { + let mut conn = state.conn.acquire().await?; + + let _ = get_user_or_403(jar, &mut conn).await?; + + let mut buf = Vec::new(); + crate::templates::new_net_html(&mut buf).unwrap(); + + Ok(Html(buf)) +} + +pub async fn new_post(Form(new): Form, jar: PrivateCookieJar, state: Extension>) -> Result { + let mut conn = state.conn.acquire().await?; + + let _ = get_user_or_403(jar, &mut conn).await?; + + let id = ulid::Ulid::new(); + + let cidr: IpNetwork = match new.subnet.parse() { + Ok(c) => c, + Err(e) => { + return Err(ServiceError::Parse(e.to_string())); + } + }; + + query("INSERT INTO networks (subnet, description, id) VALUES ($1, $2, $3)").bind(cidr).bind(new.description).bind(id.to_string()).execute(&mut conn).await?; + + Ok(Redirect::to("/")) +} -- cgit v1.2.3