This commit is contained in:
Stefan Schwarz 2020-08-21 20:02:44 +02:00
parent c4d44c68a0
commit c67fcc6fa3
7 changed files with 37 additions and 15 deletions

View file

@ -59,7 +59,6 @@ ORDER BY
} }
pub fn for_mac(macaddr: &'q str) -> QueryAs<'q, Self> { pub fn for_mac(macaddr: &'q str) -> QueryAs<'q, Self> {
dbg!(&macaddr);
sqlx::query_as( sqlx::query_as(
" "
SELECT DISTINCT SELECT DISTINCT

View file

@ -1,7 +1,7 @@
use crate::db; use crate::db;
use crate::middleware::ForwardAuthInfo;
use crate::Level; use crate::Level;
use crate::Message; use crate::Message;
use crate::USER;
use serde::Deserialize; use serde::Deserialize;
use std::convert::TryFrom; use std::convert::TryFrom;
@ -31,6 +31,8 @@ impl ChangeForm {
} }
pub async fn register(self, request: &crate::Request) -> Message { 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) { let privacy = match db::PrivacyLevel::try_from(self.privacy) {
Ok(privacy) => privacy, Ok(privacy) => privacy,
Err(_) => return (Level::Error, "unable to parse privacy level".to_string()), Err(_) => return (Level::Error, "unable to parse privacy level".to_string()),
@ -38,7 +40,7 @@ impl ChangeForm {
let dbresult = db::Device { let dbresult = db::Device {
id: None, id: None,
macaddr: self.macaddr, macaddr: self.macaddr,
nickname: USER.to_string(), nickname: nickname.clone(),
descr: self.descr.clone(), descr: self.descr.clone(),
privacy, privacy,
present: false, present: false,
@ -51,7 +53,7 @@ impl ChangeForm {
return match dbresult { return match dbresult {
Ok(_) => ( Ok(_) => (
Level::Info, 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()), Err(_) => (Level::Error, "unable to create device".to_string()),
}; };

View file

@ -10,8 +10,6 @@ mod routes;
mod session; mod session;
mod templates; mod templates;
pub const USER: &str = "hansi";
/// Configuration /// Configuration
#[derive(FromArgs, Debug)] #[derive(FromArgs, Debug)]
struct Config { struct Config {
@ -77,6 +75,7 @@ async fn main() -> Result<(), io::Error> {
let mut app = tide::with_state(State { pool }); let mut app = tide::with_state(State { pool });
app.with(middleware::ErrorHandler::default()); app.with(middleware::ErrorHandler::default());
app.with(middleware::ForwardAuth::default());
app.with(session_store); app.with(session_store);
app.at("/").get(routes::index); app.at("/").get(routes::index);
app.at("/change").post(routes::change); app.at("/change").post(routes::change);

View file

@ -21,3 +21,23 @@ impl Middleware<State> for ErrorHandler {
"ErrorHandler" "ErrorHandler"
} }
} }
#[derive(Default)]
pub struct ForwardAuth {}
#[derive(Default)]
pub struct ForwardAuthInfo {
pub nickname: String,
}
#[async_trait]
impl Middleware<State> 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)
}
}

View file

@ -1,8 +1,8 @@
use crate::db; use crate::db;
use crate::forms::ChangeForm; use crate::forms::ChangeForm;
use crate::middleware::ForwardAuthInfo;
use crate::session::Session; use crate::session::Session;
use crate::templates::IndexTemplate; use crate::templates::IndexTemplate;
use crate::USER;
use tide::Redirect; use tide::Redirect;
pub async fn healthz(_request: crate::Request) -> tide::Result { 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 { 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) .fetch_all(&request.state().pool)
.await .await?;
.map_err(|err| dbg!(err))?;
let unassinged = db::AliveDevice::unassinged() let unassinged = db::AliveDevice::unassinged()
.fetch_all(&request.state().pool) .fetch_all(&request.state().pool)
.await .await?;
.map_err(|err| dbg!(err))?;
let messages = Session::from(&mut request).pop_messages(); 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 { pub async fn change(mut request: crate::Request) -> tide::Result {

View file

@ -5,6 +5,7 @@ use askama::Template;
#[derive(Template, Default)] #[derive(Template, Default)]
#[template(path = "index.html")] #[template(path = "index.html")]
pub struct IndexTemplate { pub struct IndexTemplate {
nickname: String,
my: Vec<db::Device>, my: Vec<db::Device>,
unassinged: Vec<db::AliveDevice>, unassinged: Vec<db::AliveDevice>,
messages: Vec<Message>, messages: Vec<Message>,
@ -12,11 +13,13 @@ pub struct IndexTemplate {
impl IndexTemplate { impl IndexTemplate {
pub fn new( pub fn new(
nickname: String,
my: Vec<db::Device>, my: Vec<db::Device>,
unassinged: Vec<db::AliveDevice>, unassinged: Vec<db::AliveDevice>,
messages: Vec<Message>, messages: Vec<Message>,
) -> Self { ) -> Self {
Self { Self {
nickname,
my, my,
unassinged, unassinged,
messages, messages,

View file

@ -5,7 +5,6 @@
<meta charset="utf-8"> <meta charset="utf-8">
<title>macnickenson</title> <title>macnickenson</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
</head> </head>
<body> <body>
@ -18,7 +17,7 @@
{% endfor %} {% endfor %}
<div class="mt-5"> <div class="mt-5">
<h2>Your Devices:</h2> <h2>Your ({{ nickname }}) Devices:</h2>
<table class="table"> <table class="table">
<thead><tr> <thead><tr>
<th scope="col">Mac-Address</th> <th scope="col">Mac-Address</th>