From b6cd54142cedda0c20b7ece2a592453ba8f608f3 Mon Sep 17 00:00:00 2001 From: glyph Date: Thu, 29 Sep 2022 14:26:56 +0100 Subject: [PATCH] add template builder and form handler for modifying wifi ap password --- peach-web/src/routes/settings/network/mod.rs | 1 + .../src/routes/settings/network/modify_ap.rs | 104 ++++++++++++++++++ 2 files changed, 105 insertions(+) diff --git a/peach-web/src/routes/settings/network/mod.rs b/peach-web/src/routes/settings/network/mod.rs index b9a0e3e..36b4d6a 100644 --- a/peach-web/src/routes/settings/network/mod.rs +++ b/peach-web/src/routes/settings/network/mod.rs @@ -1 +1,2 @@ pub mod menu; +pub mod modify_ap; diff --git a/peach-web/src/routes/settings/network/modify_ap.rs b/peach-web/src/routes/settings/network/modify_ap.rs index e69de29..8e7b6fd 100644 --- a/peach-web/src/routes/settings/network/modify_ap.rs +++ b/peach-web/src/routes/settings/network/modify_ap.rs @@ -0,0 +1,104 @@ +use maud::{html, Markup, PreEscaped}; +use peach_network::network; +use rouille::{post_input, try_or_400, Request, Response}; + +use crate::{ + templates, + utils::{ + flash::{FlashRequest, FlashResponse}, + theme, + }, +}; + +// ROUTE: /settings/network/wifi/modify? + +fn render_ssid_input(selected_ap: Option) -> Markup { + html! { + (PreEscaped("")) + input id="ssid" name="ssid" class="center input" type="text" placeholder="SSID" title="Network name (SSID) for WiFi access point" value=[selected_ap] autofocus; + } +} + +fn render_password_input() -> Markup { + html! { + (PreEscaped("")) + input id="pass" name="pass" class="center input" type="password" placeholder="Password" title="Password for WiFi access point"; + } +} + +fn render_buttons() -> Markup { + html! { + (PreEscaped("")) + div id="buttons" { + input id="savePassword" class="button button-primary center" title="Save" type="submit" value="Save"; + a class="button button-secondary center" href="/settings/network" title="Cancel" { "Cancel" } + } + } +} + +/// WiFi access point password modification form template builder. +pub fn build_template(request: &Request, selected_ap: Option) -> PreEscaped { + let (flash_name, flash_msg) = request.retrieve_flash(); + + let form_template = html! { + (PreEscaped("")) + div class="card center" { + form id="wifiModify" action="/settings/network/wifi/modify" method="post" { + (render_ssid_input(selected_ap)) + (render_password_input()) + (render_buttons()) + } + // render flash message if cookies were found in the request + @if let (Some(name), Some(msg)) = (flash_name, flash_msg) { + (PreEscaped("")) + (templates::flash::build_template(name, msg)) + } + } + }; + + let body = templates::nav::build_template( + form_template, + "Change WiFi Password", + Some("/settings/network"), + ); + + let theme = theme::get_theme(); + + templates::base::build_template(body, theme) +} + +/// Parse the SSID and password for an access point and save the new password. +pub fn handle_form(request: &Request) -> Response { + let data = try_or_400!(post_input!(request, { + ssid: String, + pass: String, + })); + + let (name, msg) = match network::id("wlan0", &data.ssid) { + Ok(Some(id)) => match network::modify(&id, &data.ssid, &data.pass) { + Ok(_) => ("success".to_string(), "WiFi password updated".to_string()), + Err(err) => ( + "error".to_string(), + format!("Failed to update WiFi password: {}", err), + ), + }, + Ok(None) => ( + "error".to_string(), + format!( + "Failed to update WiFi password: no saved credentials found for network {}", + &data.ssid + ), + ), + Err(err) => ( + "error".to_string(), + format!( + "Failed to update WiFi password: no ID found for network {}: {}", + &data.ssid, err + ), + ), + }; + + let (flash_name, flash_msg) = (format!("flash_name={}", name), format!("flash_msg={}", msg)); + + Response::redirect_303("/settings/network/wifi/modify").add_flash(flash_name, flash_msg) +}