From c67fcc6fa38257e0cd6517f7e2bf7716238033cf Mon Sep 17 00:00:00 2001 From: Stefan Schwarz Date: Fri, 21 Aug 2020 20:02:44 +0200 Subject: [PATCH] cleanup --- src/db.rs | 1 - src/forms.rs | 8 +++++--- src/main.rs | 3 +-- src/middleware.rs | 20 ++++++++++++++++++++ src/routes.rs | 14 +++++++------- src/templates.rs | 3 +++ templates/index.html | 3 +-- 7 files changed, 37 insertions(+), 15 deletions(-) diff --git a/src/db.rs b/src/db.rs index fdebc6c..a49a4a2 100644 --- a/src/db.rs +++ b/src/db.rs @@ -59,7 +59,6 @@ ORDER BY } pub fn for_mac(macaddr: &'q str) -> QueryAs<'q, Self> { - dbg!(&macaddr); sqlx::query_as( " SELECT DISTINCT diff --git a/src/forms.rs b/src/forms.rs index 0b5d6ef..71707ff 100644 --- a/src/forms.rs +++ b/src/forms.rs @@ -1,7 +1,7 @@ use crate::db; +use crate::middleware::ForwardAuthInfo; use crate::Level; use crate::Message; -use crate::USER; use serde::Deserialize; use std::convert::TryFrom; @@ -31,6 +31,8 @@ impl ChangeForm { } pub async fn register(self, request: &crate::Request) -> Message { + let forward_auth: &ForwardAuthInfo = request.ext().unwrap(); + let nickname = forward_auth.nickname.clone(); let privacy = match db::PrivacyLevel::try_from(self.privacy) { Ok(privacy) => privacy, Err(_) => return (Level::Error, "unable to parse privacy level".to_string()), @@ -38,7 +40,7 @@ impl ChangeForm { let dbresult = db::Device { id: None, macaddr: self.macaddr, - nickname: USER.to_string(), + nickname: nickname.clone(), descr: self.descr.clone(), privacy, present: false, @@ -51,7 +53,7 @@ impl ChangeForm { return match dbresult { Ok(_) => ( Level::Info, - format!("assinged device \"{}\" to {}", self.descr, USER), + format!("assinged device \"{}\" to {}", &self.descr, &nickname), ), Err(_) => (Level::Error, "unable to create device".to_string()), }; diff --git a/src/main.rs b/src/main.rs index 99e911b..2ec4348 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,8 +10,6 @@ mod routes; mod session; mod templates; -pub const USER: &str = "hansi"; - /// Configuration #[derive(FromArgs, Debug)] struct Config { @@ -77,6 +75,7 @@ async fn main() -> Result<(), io::Error> { let mut app = tide::with_state(State { pool }); app.with(middleware::ErrorHandler::default()); + app.with(middleware::ForwardAuth::default()); app.with(session_store); app.at("/").get(routes::index); app.at("/change").post(routes::change); diff --git a/src/middleware.rs b/src/middleware.rs index 5653610..9cf2def 100644 --- a/src/middleware.rs +++ b/src/middleware.rs @@ -21,3 +21,23 @@ impl Middleware for ErrorHandler { "ErrorHandler" } } + +#[derive(Default)] +pub struct ForwardAuth {} + +#[derive(Default)] +pub struct ForwardAuthInfo { + pub nickname: String, +} + +#[async_trait] +impl Middleware for ForwardAuth { + async fn handle(&self, mut request: Request, next: Next<'_, State>) -> Result { + let mut nickname = "Anonymous".to_string(); + if let Some(cookie) = request.cookie("_forward_auth_name") { + nickname = cookie.value().to_string(); + } + request.set_ext(ForwardAuthInfo { nickname }); + Ok(next.run(request).await) + } +} diff --git a/src/routes.rs b/src/routes.rs index d50480f..e826f70 100644 --- a/src/routes.rs +++ b/src/routes.rs @@ -1,8 +1,8 @@ use crate::db; use crate::forms::ChangeForm; +use crate::middleware::ForwardAuthInfo; use crate::session::Session; use crate::templates::IndexTemplate; -use crate::USER; use tide::Redirect; pub async fn healthz(_request: crate::Request) -> tide::Result { @@ -10,16 +10,16 @@ pub async fn healthz(_request: crate::Request) -> tide::Result { } pub async fn index(mut request: crate::Request) -> tide::Result { - let my = db::Device::for_user(USER) + let forward_auth: &ForwardAuthInfo = request.ext().unwrap(); + let nickname = forward_auth.nickname.clone(); + let my = db::Device::for_user(&nickname) .fetch_all(&request.state().pool) - .await - .map_err(|err| dbg!(err))?; + .await?; let unassinged = db::AliveDevice::unassinged() .fetch_all(&request.state().pool) - .await - .map_err(|err| dbg!(err))?; + .await?; let messages = Session::from(&mut request).pop_messages(); - Ok(IndexTemplate::new(my, unassinged, messages).into()) + Ok(IndexTemplate::new(nickname, my, unassinged, messages).into()) } pub async fn change(mut request: crate::Request) -> tide::Result { diff --git a/src/templates.rs b/src/templates.rs index 81a23ce..7464414 100644 --- a/src/templates.rs +++ b/src/templates.rs @@ -5,6 +5,7 @@ use askama::Template; #[derive(Template, Default)] #[template(path = "index.html")] pub struct IndexTemplate { + nickname: String, my: Vec, unassinged: Vec, messages: Vec, @@ -12,11 +13,13 @@ pub struct IndexTemplate { impl IndexTemplate { pub fn new( + nickname: String, my: Vec, unassinged: Vec, messages: Vec, ) -> Self { Self { + nickname, my, unassinged, messages, diff --git a/templates/index.html b/templates/index.html index 06b0852..7f79dff 100644 --- a/templates/index.html +++ b/templates/index.html @@ -5,7 +5,6 @@ macnickenson - @@ -18,7 +17,7 @@ {% endfor %}
-

Your Devices:

+

Your ({{ nickname }}) Devices:

Mac-Address