From e91c40355a1a107ae12a197b49ff7dd88bb8e5b9 Mon Sep 17 00:00:00 2001 From: glyph Date: Mon, 10 Oct 2022 10:39:29 +0100 Subject: [PATCH] add template builder and form handler for adding wifi ap --- .../src/routes/settings/network/add_ap.rs | 96 +++++++++++++++++++ peach-web/src/routes/settings/network/mod.rs | 1 + 2 files changed, 97 insertions(+) diff --git a/peach-web/src/routes/settings/network/add_ap.rs b/peach-web/src/routes/settings/network/add_ap.rs index e69de29..1efc972 100644 --- a/peach-web/src/routes/settings/network/add_ap.rs +++ b/peach-web/src/routes/settings/network/add_ap.rs @@ -0,0 +1,96 @@ +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/add + +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="addWifi" class="button button-primary center" title="Add" type="submit" value="Add"; + a class="button button-secondary center" href="/settings/network" title="Cancel" { "Cancel" } + } + } +} + +/// WiFi access point credentials 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="wifiCreds" action="/settings/network/wifi/add" method="post" { + (render_ssid_input(selected_ap)) + (render_password_input()) + (render_buttons()) + } + @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, + "Add WiFi Network", + 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 credentials. +pub fn handle_form(request: &Request) -> Response { + let data = try_or_400!(post_input!(request, { + ssid: String, + pass: String, + })); + + let (name, msg) = match network::add("wlan0", &data.ssid, &data.pass) { + Ok(_) => match network::reconfigure() { + Ok(_) => ("success".to_string(), "Added WiFi credentials".to_string()), + Err(err) => ( + "error".to_string(), + format!( + "Added WiFi credentials but failed to reconfigure interface: {}", + err + ), + ), + }, + Err(err) => ( + "error".to_string(), + format!("Failed to add WiFi credentials for {}: {}", &data.ssid, err), + ), + }; + + let (flash_name, flash_msg) = (format!("flash_name={}", name), format!("flash_msg={}", msg)); + + Response::redirect_303("/settings/network/wifi/add").add_flash(flash_name, flash_msg) +} diff --git a/peach-web/src/routes/settings/network/mod.rs b/peach-web/src/routes/settings/network/mod.rs index 0c0979d..a55a2f0 100644 --- a/peach-web/src/routes/settings/network/mod.rs +++ b/peach-web/src/routes/settings/network/mod.rs @@ -1,3 +1,4 @@ +pub mod add_ap; pub mod configure_dns; // TODO: uncomment this once data usage feature is in place // pub mod data_usage_limits;