diff --git a/Cargo.lock b/Cargo.lock index 37f6447e..6cb32d5f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -204,15 +204,6 @@ dependencies = [ "safemem", ] -[[package]] -name = "base64" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" -dependencies = [ - "byteorder", -] - [[package]] name = "base64" version = "0.13.0" @@ -473,22 +464,6 @@ dependencies = [ "version_check 0.9.3", ] -[[package]] -name = "core-foundation" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6888e10551bb93e424d8df1d07f1a8b4fceb0001a3a4b048bfc47554946f47b3" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" - [[package]] name = "cpufeatures" version = "0.2.1" @@ -1339,25 +1314,6 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" -[[package]] -name = "hyper" -version = "0.10.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a0652d9a2609a968c14be1a9ea00bf4b1d64e2e1f53a1b51b6fff3a6e829273" -dependencies = [ - "base64 0.9.3", - "httparse", - "language-tags", - "log 0.3.9", - "mime 0.2.6", - "num_cpus", - "time 0.1.44", - "traitobject", - "typeable", - "unicase 1.4.2", - "url", -] - [[package]] name = "hyper" version = "0.11.27" @@ -1372,7 +1328,7 @@ dependencies = [ "iovec", "language-tags", "log 0.4.14", - "mime 0.3.16", + "mime", "net2", "percent-encoding 1.0.1", "relay", @@ -1381,7 +1337,7 @@ dependencies = [ "tokio-io", "tokio-proto", "tokio-service", - "unicase 2.6.0", + "unicase", "want 0.0.4", ] @@ -1674,7 +1630,7 @@ dependencies = [ "jsonrpc-server-utils 11.0.0", "log 0.4.14", "net2", - "unicase 2.6.0", + "unicase", ] [[package]] @@ -1690,7 +1646,7 @@ dependencies = [ "log 0.4.14", "net2", "parking_lot 0.11.2", - "unicase 2.6.0", + "unicase", ] [[package]] @@ -1734,7 +1690,7 @@ dependencies = [ "num_cpus", "tokio 0.1.22", "tokio-codec", - "unicase 2.6.0", + "unicase", ] [[package]] @@ -1752,7 +1708,7 @@ dependencies = [ "tokio 1.13.0", "tokio-stream", "tokio-util", - "unicase 2.6.0", + "unicase", ] [[package]] @@ -1972,15 +1928,6 @@ dependencies = [ "autocfg 1.0.1", ] -[[package]] -name = "mime" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" -dependencies = [ - "log 0.3.9", -] - [[package]] name = "mime" version = "0.3.16" @@ -2119,7 +2066,7 @@ dependencies = [ "http 0.2.5", "httparse", "log 0.4.14", - "mime 0.3.16", + "mime", "spin", "tokio 1.13.0", "tokio-util", @@ -2127,24 +2074,6 @@ dependencies = [ "version_check 0.9.3", ] -[[package]] -name = "native-tls" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48ba9f7719b5a0f42f338907614285fb5fd70e53858141f69898a1fb7203b24d" -dependencies = [ - "lazy_static", - "libc", - "log 0.4.14", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - [[package]] name = "nb" version = "0.1.3" @@ -2409,12 +2338,6 @@ dependencies = [ "openssl-sys", ] -[[package]] -name = "openssl-probe" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" - [[package]] name = "openssl-src" version = "300.0.2+3.0.0" @@ -2691,7 +2614,7 @@ dependencies = [ [[package]] name = "peach-web" -version = "0.4.11" +version = "0.4.12" dependencies = [ "env_logger 0.8.4", "log 0.4.14", @@ -2706,7 +2629,6 @@ dependencies = [ "serde_json", "snafu 0.6.10", "tera", - "websocket", "xdg", ] @@ -3364,7 +3286,7 @@ dependencies = [ "indexmap", "log 0.4.14", "memchr", - "mime 0.3.16", + "mime", "parking_lot 0.11.2", "pear", "percent-encoding 2.1.0", @@ -3467,16 +3389,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "schannel" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" -dependencies = [ - "lazy_static", - "winapi 0.3.9", -] - [[package]] name = "scoped-tls" version = "0.1.2" @@ -3501,29 +3413,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" -[[package]] -name = "security-framework" -version = "2.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525bc1abfda2e1998d152c45cf13e696f76d0a4972310b22fac1658b05df7c87" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9dd14d83160b528b7bfd66439110573efcfbe281b17fc2ca9f39f550d619c7e" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "semver" version = "0.1.20" @@ -4431,17 +4320,6 @@ dependencies = [ "tokio-executor", ] -[[package]] -name = "tokio-tls" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "354b8cd83825b3c20217a9dc174d6a0c67441a2fae5c41bcb1ea6679f6ae0f7c" -dependencies = [ - "futures 0.1.31", - "native-tls", - "tokio-io", -] - [[package]] name = "tokio-udp" version = "0.1.6" @@ -4580,12 +4458,6 @@ dependencies = [ "tracing-serde", ] -[[package]] -name = "traitobject" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" - [[package]] name = "try-lock" version = "0.1.0" @@ -4608,12 +4480,6 @@ dependencies = [ "unchecked-index", ] -[[package]] -name = "typeable" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" - [[package]] name = "typenum" version = "1.14.0" @@ -4701,15 +4567,6 @@ dependencies = [ "unic-common", ] -[[package]] -name = "unicase" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" -dependencies = [ - "version_check 0.1.5", -] - [[package]] name = "unicase" version = "2.6.0" @@ -4918,47 +4775,6 @@ version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" -[[package]] -name = "websocket" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "723abe6b75286edc51d8ecabb38a2353f62a9e9b0588998b59111474f1dcd637" -dependencies = [ - "bytes 0.4.12", - "futures 0.1.31", - "hyper 0.10.16", - "native-tls", - "rand 0.6.5", - "tokio-codec", - "tokio-io", - "tokio-reactor", - "tokio-tcp", - "tokio-tls", - "unicase 1.4.2", - "url", - "websocket-base", -] - -[[package]] -name = "websocket-base" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "403f3fd505ff930da84156389639932955fb09705b3dccd1a3d60c8e7ff62776" -dependencies = [ - "base64 0.10.1", - "bitflags 1.3.2", - "byteorder", - "bytes 0.4.12", - "futures 0.1.31", - "native-tls", - "rand 0.6.5", - "sha-1", - "tokio-codec", - "tokio-io", - "tokio-tcp", - "tokio-tls", -] - [[package]] name = "winapi" version = "0.2.8" diff --git a/peach-web/Cargo.toml b/peach-web/Cargo.toml index c94e96c2..5bc93b3d 100644 --- a/peach-web/Cargo.toml +++ b/peach-web/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "peach-web" -version = "0.4.11" +version = "0.4.12" authors = ["Andrew Reid "] edition = "2018" description = "peach-web is a web application which provides a web interface for monitoring and interacting with the PeachCloud device. This allows administration of the single-board computer (ie. Raspberry Pi) running PeachCloud, as well as the ssb-server and related plugins." @@ -38,17 +38,16 @@ maintenance = { status = "actively-developed" } env_logger = "0.8" log = "0.4" nest = "1.0.0" +openssl = { version = "0.10", features = ["vendored"] } peach-lib = { path = "../peach-lib" } percent-encoding = "2.1.0" +regex = "1" rocket = { version = "0.5.0-rc.1", features = ["json", "secrets"] } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" snafu = "0.6" tera = { version = "1.12.1", features = ["builtins"] } -websocket = "0.26" -regex = "1" xdg = "2.2.0" -openssl = { version = "0.10", features = ["vendored"] } [dependencies.rocket_dyn_templates] version = "0.1.0-rc.1" diff --git a/peach-web/README.md b/peach-web/README.md index f8185cdd..018ab8d7 100644 --- a/peach-web/README.md +++ b/peach-web/README.md @@ -1,6 +1,6 @@ # peach-web -[![Build Status](https://travis-ci.com/peachcloud/peach-web.svg?branch=master)](https://travis-ci.com/peachcloud/peach-web) ![Generic badge](https://img.shields.io/badge/version-0.4.6-.svg) +[![Build Status](https://travis-ci.com/peachcloud/peach-web.svg?branch=master)](https://travis-ci.com/peachcloud/peach-web) ![Generic badge](https://img.shields.io/badge/version-0.4.12-.svg) ## Web Interface for PeachCloud @@ -39,12 +39,22 @@ _Note: Networking functionality requires peach-network microservice to be runnin ### Environment +**Deployment Mode** + The web application deployment mode is configured with the `ROCKET_ENV` environment variable: `export ROCKET_ENV=stage` Other deployment modes are `dev` and `prod`. Read the [Rocket Environment Configurations docs](https://rocket.rs/v0.5-rc/guide/configuration/#environment-variables) for further information. +**Authentication** + +Authentication is disabled in `development` mode and enabled by default when running the application in `production` mode. It can be disabled by setting the `ROCKET_DISABLE_AUTH` environment variable to `true`: + +`export ROCKET_DISABLE_AUTH=true` + +**Logging** + Logging is made available with `env_logger`: `export RUST_LOG=info` diff --git a/peach-web/Rocket.toml b/peach-web/Rocket.toml index d8fe73c3..d46d8fb6 100644 --- a/peach-web/Rocket.toml +++ b/peach-web/Rocket.toml @@ -1,5 +1,7 @@ [development] template_dir = "templates/" +disable_auth = true [production] template_dir = "templates/" +disable_auth = false diff --git a/peach-web/src/routes/authentication.rs b/peach-web/src/routes/authentication.rs index 035bde50..2743e198 100644 --- a/peach-web/src/routes/authentication.rs +++ b/peach-web/src/routes/authentication.rs @@ -1,10 +1,13 @@ use log::info; use rocket::form::{Form, FromForm}; -use rocket::request::FlashMessage; +use rocket::http::{Cookie, CookieJar, Status}; +use rocket::request::{self, FlashMessage, FromRequest, Request}; use rocket::response::{Flash, Redirect}; -use rocket::serde::json::Json; -use rocket::serde::{Deserialize, Serialize}; -use rocket::{get, post}; +use rocket::serde::{ + json::{Json, Value}, + Deserialize, Serialize, +}; +use rocket::{get, post, Config}; use rocket_dyn_templates::Template; use peach_lib::error::PeachError; @@ -12,9 +15,6 @@ use peach_lib::password_utils; use crate::error::PeachWebError; use crate::utils::{build_json_response, TemplateOrRedirect}; -use rocket::http::{Cookie, CookieJar, Status}; -use rocket::request::{self, FromRequest, Request}; -use rocket::serde::json::Value; // HELPERS AND STRUCTS FOR AUTHENTICATION WITH COOKIES @@ -42,14 +42,27 @@ impl<'r> FromRequest<'r> for Authenticated { type Error = LoginError; async fn from_request(req: &'r Request<'_>) -> request::Outcome { - let authenticated = req - .cookies() - .get_private(AUTH_COOKIE_KEY) - .and_then(|cookie| cookie.value().parse().ok()) - .map(|_value: String| Authenticated {}); - match authenticated { - Some(auth) => request::Outcome::Success(auth), - None => request::Outcome::Failure((Status::Forbidden, LoginError::UserNotLoggedIn)), + // check for `disable_auth` config value; set to `false` if unset + // can be set via the `ROCKET_DISABLE_AUTH` environment variable + // - env var, if set, takes precedence over value defined in `Rocket.toml` + let authentication_is_disabled: bool = match Config::figment().find_value("disable_auth") { + // deserialize the boolean value; set to `false` if an error is encountered + Ok(value) => value.deserialize().unwrap_or(false), + Err(_) => false, + }; + if authentication_is_disabled { + let auth = Authenticated {}; + request::Outcome::Success(auth) + } else { + let authenticated = req + .cookies() + .get_private(AUTH_COOKIE_KEY) + .and_then(|cookie| cookie.value().parse().ok()) + .map(|_value: String| Authenticated {}); + match authenticated { + Some(auth) => request::Outcome::Success(auth), + None => request::Outcome::Failure((Status::Forbidden, LoginError::UserNotLoggedIn)), + } } } } diff --git a/peach-web/src/tests.rs b/peach-web/src/tests.rs index 712fa38b..e95c794c 100644 --- a/peach-web/src/tests.rs +++ b/peach-web/src/tests.rs @@ -4,17 +4,29 @@ use std::io::Read; use rocket::http::{ContentType, Status}; use rocket::local::blocking::Client; use rocket::serde::json::{json, Value}; +use rocket::{Build, Config, Rocket}; use crate::utils::build_json_response; use super::init_rocket; +// define authentication mode +const DISABLE_AUTH: bool = true; + +/// Wrapper around `init_rocket()` to simplify the process of invoking the application with the desired authentication status. This is particularly useful for testing purposes. +fn init_test_rocket(disable_auth: bool) -> Rocket { + // set authentication based on provided `disable_auth` value + Config::figment().merge(("disable_auth", disable_auth)); + + init_rocket() +} + // helper function to test correct retrieval and content of a file fn test_query_file(path: &str, file: T, status: Status) where T: Into>, { - let client = Client::tracked(init_rocket()).unwrap(); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).unwrap(); let response = client.get(path).dispatch(); assert_eq!(response.status(), status); @@ -39,7 +51,7 @@ fn read_file_content(path: &str) -> Vec { #[test] fn index_html() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client.get("/").dispatch(); assert_eq!(response.status(), Status::Ok); assert_eq!(response.content_type(), Some(ContentType::HTML)); @@ -54,7 +66,7 @@ fn index_html() { #[test] fn help_html() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client.get("/help").dispatch(); assert_eq!(response.status(), Status::Ok); assert_eq!(response.content_type(), Some(ContentType::HTML)); @@ -64,7 +76,7 @@ fn help_html() { #[test] fn login_html() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client.get("/login").dispatch(); assert_eq!(response.status(), Status::Ok); assert_eq!(response.content_type(), Some(ContentType::HTML)); @@ -74,7 +86,7 @@ fn login_html() { #[test] fn logout_html() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client.get("/logout").dispatch(); // check for 303 status (redirect to "/login") assert_eq!(response.status(), Status::SeeOther); @@ -83,7 +95,7 @@ fn logout_html() { #[test] fn power_html() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client.get("/power").dispatch(); assert_eq!(response.status(), Status::Ok); assert_eq!(response.content_type(), Some(ContentType::HTML)); @@ -97,7 +109,7 @@ NOTE: these tests are comment-out for the moment, due to the fact that they invo #[test] fn reboot() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client.get("/power/reboot").dispatch(); // check for redirect assert_eq!(response.status(), Status::SeeOther); @@ -105,7 +117,7 @@ fn reboot() { #[test] fn shutdown() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client.get("/power/shutdown").dispatch(); // check for redirect assert_eq!(response.status(), Status::SeeOther); @@ -116,7 +128,7 @@ fn shutdown() { #[test] fn block() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client .post("/scuttlebutt/block") .header(ContentType::Form) @@ -127,7 +139,7 @@ fn block() { #[test] fn blocks_html() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client.get("/scuttlebutt/blocks").dispatch(); assert_eq!(response.status(), Status::Ok); assert_eq!(response.content_type(), Some(ContentType::HTML)); @@ -137,7 +149,7 @@ fn blocks_html() { #[test] fn follow() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client .post("/scuttlebutt/follow") .header(ContentType::Form) @@ -149,7 +161,7 @@ fn follow() { #[test] fn follows_html() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client.get("/scuttlebutt/follows").dispatch(); assert_eq!(response.status(), Status::Ok); assert_eq!(response.content_type(), Some(ContentType::HTML)); @@ -159,7 +171,7 @@ fn follows_html() { #[test] fn followers_html() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client.get("/scuttlebutt/followers").dispatch(); assert_eq!(response.status(), Status::Ok); assert_eq!(response.content_type(), Some(ContentType::HTML)); @@ -169,7 +181,7 @@ fn followers_html() { #[test] fn friends_html() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client.get("/scuttlebutt/friends").dispatch(); assert_eq!(response.status(), Status::Ok); assert_eq!(response.content_type(), Some(ContentType::HTML)); @@ -179,7 +191,7 @@ fn friends_html() { #[test] fn peers_html() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client.get("/scuttlebutt/peers").dispatch(); assert_eq!(response.status(), Status::Ok); assert_eq!(response.content_type(), Some(ContentType::HTML)); @@ -189,7 +201,7 @@ fn peers_html() { #[test] fn private_html() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client.get("/scuttlebutt/private").dispatch(); assert_eq!(response.status(), Status::Ok); assert_eq!(response.content_type(), Some(ContentType::HTML)); @@ -199,7 +211,7 @@ fn private_html() { #[test] fn profile_html() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client.get("/scuttlebutt/profile").dispatch(); assert_eq!(response.status(), Status::Ok); assert_eq!(response.content_type(), Some(ContentType::HTML)); @@ -209,7 +221,7 @@ fn profile_html() { #[test] fn publish_post() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client .post("/scuttlebutt/publish") .header(ContentType::Form) @@ -220,7 +232,7 @@ fn publish_post() { #[test] fn unfollow() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client .post("/scuttlebutt/unfollow") .header(ContentType::Form) @@ -233,7 +245,7 @@ fn unfollow() { #[test] fn admin_settings_menu_html() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client.get("/settings/admin").dispatch(); assert_eq!(response.status(), Status::Ok); assert_eq!(response.content_type(), Some(ContentType::HTML)); @@ -245,7 +257,7 @@ fn admin_settings_menu_html() { #[test] fn add_admin_html() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client.get("/settings/admin/add").dispatch(); assert_eq!(response.status(), Status::Ok); assert_eq!(response.content_type(), Some(ContentType::HTML)); @@ -258,7 +270,7 @@ fn add_admin_html() { #[test] fn add_admin() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client .post("/settings/admin/add") .header(ContentType::Form) @@ -270,21 +282,21 @@ fn add_admin() { #[test] fn change_password_html() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client.get("/settings/admin/change_password").dispatch(); assert_eq!(response.status(), Status::Ok); assert_eq!(response.content_type(), Some(ContentType::HTML)); let body = response.into_string().unwrap(); assert!(body.contains("Change Password")); - assert!(body.contains("Old Password")); - assert!(body.contains("Enter New Password")); - assert!(body.contains("Re-Enter New Password")); + assert!(body.contains("Current password")); + assert!(body.contains("New password")); + assert!(body.contains("New password duplicate")); assert!(body.contains("Save")); } #[test] fn configure_admin_html() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client.get("/settings/admin/configure").dispatch(); assert_eq!(response.status(), Status::Ok); assert_eq!(response.content_type(), Some(ContentType::HTML)); @@ -296,7 +308,7 @@ fn configure_admin_html() { #[test] fn forgot_password_html() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client.get("/settings/admin/forgot_password").dispatch(); assert_eq!(response.status(), Status::Ok); assert_eq!(response.content_type(), Some(ContentType::HTML)); @@ -308,7 +320,7 @@ fn forgot_password_html() { #[test] fn network_settings_menu_html() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client.get("/settings/network").dispatch(); assert_eq!(response.status(), Status::Ok); assert_eq!(response.content_type(), Some(ContentType::HTML)); @@ -318,7 +330,7 @@ fn network_settings_menu_html() { #[test] fn deploy_ap() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client.get("/settings/network/ap/activate").dispatch(); // check for 303 status (redirect) assert_eq!(response.status(), Status::SeeOther); @@ -327,7 +339,7 @@ fn deploy_ap() { #[test] fn dns_settings_html() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client.get("/settings/network/dns").dispatch(); assert_eq!(response.status(), Status::Ok); assert_eq!(response.content_type(), Some(ContentType::HTML)); @@ -341,7 +353,7 @@ fn dns_settings_html() { #[test] fn list_aps_html() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client.get("/settings/network/wifi").dispatch(); assert_eq!(response.status(), Status::Ok); assert_eq!(response.content_type(), Some(ContentType::HTML)); @@ -353,7 +365,7 @@ fn list_aps_html() { // TODO: needs further testing once template has been refactored #[test] fn ap_details_html() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client.get("/settings/network/wifi?ssid=Home").dispatch(); assert_eq!(response.status(), Status::Ok); assert_eq!(response.content_type(), Some(ContentType::HTML)); @@ -363,7 +375,7 @@ fn ap_details_html() { #[test] fn deploy_client() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client.get("/settings/network/wifi/activate").dispatch(); // check for 303 status (redirect) assert_eq!(response.status(), Status::SeeOther); @@ -372,7 +384,7 @@ fn deploy_client() { #[test] fn add_ap_html() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client.get("/settings/network/wifi/add").dispatch(); assert_eq!(response.status(), Status::Ok); assert_eq!(response.content_type(), Some(ContentType::HTML)); @@ -386,7 +398,7 @@ fn add_ap_html() { #[test] fn add_ap_ssid_html() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client .get("/settings/network/wifi/add?ssid=Home") .dispatch(); @@ -402,7 +414,7 @@ fn add_ap_ssid_html() { #[test] fn add_credentials() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client .post("/settings/network/wifi/add") .header(ContentType::Form) @@ -414,7 +426,7 @@ fn add_credentials() { #[test] fn forget_wifi() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client .post("/settings/network/wifi/forget") .header(ContentType::Form) @@ -426,7 +438,7 @@ fn forget_wifi() { #[test] fn modify_password() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client .post("/settings/network/wifi/modify") .header(ContentType::Form) @@ -438,7 +450,7 @@ fn modify_password() { #[test] fn data_usage_html() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client.get("/settings/network/wifi/usage").dispatch(); assert_eq!(response.status(), Status::Ok); assert_eq!(response.content_type(), Some(ContentType::HTML)); @@ -453,7 +465,7 @@ fn data_usage_html() { #[test] fn scuttlebutt_settings_menu_html() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client.get("/settings/scuttlebutt").dispatch(); assert_eq!(response.status(), Status::Ok); assert_eq!(response.content_type(), Some(ContentType::HTML)); @@ -472,7 +484,7 @@ fn scuttlebutt_settings_menu_html() { #[test] fn status_html() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client.get("/status").dispatch(); assert_eq!(response.status(), Status::Ok); assert_eq!(response.content_type(), Some(ContentType::HTML)); @@ -485,7 +497,7 @@ fn status_html() { #[test] fn network_status_html() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client.get("/status/network").dispatch(); assert_eq!(response.status(), Status::Ok); assert_eq!(response.content_type(), Some(ContentType::HTML)); @@ -502,7 +514,7 @@ fn network_status_html() { #[test] fn activate_ap() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client .post("/api/v1/network/activate_ap") .header(ContentType::JSON) @@ -513,7 +525,7 @@ fn activate_ap() { #[test] fn activate_client() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client .post("/api/v1/network/activate_client") .header(ContentType::JSON) @@ -524,7 +536,7 @@ fn activate_client() { #[test] fn return_ip() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client .get("/api/v1/network/ip") .header(ContentType::JSON) @@ -538,7 +550,7 @@ fn return_ip() { #[test] fn return_rssi() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client .get("/api/v1/network/rssi") .header(ContentType::JSON) @@ -551,7 +563,7 @@ fn return_rssi() { #[test] fn return_ssid() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client .get("/api/v1/network/ssid") .header(ContentType::JSON) @@ -564,7 +576,7 @@ fn return_ssid() { #[test] fn return_state() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client .get("/api/v1/network/state") .header(ContentType::JSON) @@ -579,7 +591,7 @@ fn return_state() { #[test] fn return_status() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client .get("/api/v1/network/status") .header(ContentType::JSON) @@ -592,7 +604,7 @@ fn return_status() { #[test] fn scan_networks() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client .get("/api/v1/network/wifi") .header(ContentType::JSON) @@ -605,7 +617,7 @@ fn scan_networks() { #[test] fn add_wifi() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client .post("/api/v1/network/wifi") .header(ContentType::JSON) @@ -619,7 +631,7 @@ fn add_wifi() { #[test] fn remove_wifi() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client .post("/api/v1/network/wifi/forget") .header(ContentType::JSON) @@ -633,7 +645,7 @@ fn remove_wifi() { #[test] fn new_password() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client .post("/api/v1/network/wifi/modify") .header(ContentType::JSON) @@ -647,7 +659,7 @@ fn new_password() { #[test] fn ping_pong() { - let client = Client::tracked(init_rocket()).expect("valid rocket instance"); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).expect("valid rocket instance"); let response = client .get("/api/v1/ping") .header(ContentType::JSON) @@ -709,7 +721,7 @@ fn invalid_path() { #[test] fn invalid_get_request() { - let client = Client::tracked(init_rocket()).unwrap(); + let client = Client::tracked(init_test_rocket(DISABLE_AUTH)).unwrap(); // try to get a path that doesn't exist let res = client