diff --git a/core/archipelago/src/appgate/listener.rs b/core/archipelago/src/appgate/listener.rs index e789609e..10af2946 100644 --- a/core/archipelago/src/appgate/listener.rs +++ b/core/archipelago/src/appgate/listener.rs @@ -208,12 +208,7 @@ async fn sweep( port = app.port, %addr, app = %app.app_id, "app gate claimed an app port" ); - spawn_accept_loop( - listener, - gate.clone(), - app.clone(), - shutdown_rx.clone(), - ); + spawn_accept_loop(listener, gate.clone(), app.clone(), shutdown_rx.clone()); } // Almost always the app itself holding 0.0.0.0:. Err(_) => blocked = true, diff --git a/core/archipelago/src/appgate/mod.rs b/core/archipelago/src/appgate/mod.rs index 4d2e0367..8ac1ef43 100644 --- a/core/archipelago/src/appgate/mod.rs +++ b/core/archipelago/src/appgate/mod.rs @@ -187,12 +187,7 @@ impl AppGate { } } - async fn do_login( - &self, - app: &GatedPort, - form: &Form, - client_ip: IpAddr, - ) -> Response { + async fn do_login(&self, app: &GatedPort, form: &Form, client_ip: IpAddr) -> Response { let password = field(form, "password").unwrap_or_default(); match self.auth.verify_password(&password).await { @@ -245,7 +240,11 @@ impl AppGate { }; let Some(secret) = self.sessions.get_pending_secret(&pending).await else { - return login_page(app, Some("Session expired. Start again."), StatusCode::UNAUTHORIZED); + return login_page( + app, + Some("Session expired. Start again."), + StatusCode::UNAUTHORIZED, + ); }; let totp_data = self.auth.get_totp_data().await.ok().flatten(); @@ -294,7 +293,9 @@ impl AppGate { fn bearer_token(headers: &HeaderMap) -> Option { let value = headers.get(header::AUTHORIZATION)?.to_str().ok()?; - let token = value.strip_prefix("Bearer ").or_else(|| value.strip_prefix("bearer "))?; + let token = value + .strip_prefix("Bearer ") + .or_else(|| value.strip_prefix("bearer "))?; let token = token.trim(); (!token.is_empty()).then(|| token.to_string()) } @@ -381,9 +382,9 @@ fn set_session_cookie(resp: &mut Response, token: &str) { // which is what makes one sign-in cover the dashboard and every app port // on the same host — and equally why an app on a *different* host (its // own onion) is a separate sign-in. - if let Ok(value) = header::HeaderValue::from_str(&format!( - "session={token}; HttpOnly; SameSite=Lax; Path=/" - )) { + if let Ok(value) = + header::HeaderValue::from_str(&format!("session={token}; HttpOnly; SameSite=Lax; Path=/")) + { resp.headers_mut().append(header::SET_COOKIE, value); } } @@ -430,10 +431,7 @@ fn esc(s: &str) -> String { fn icon_markup(app: &GatedPort) -> String { if let Some(path) = &app.icon { if let Some(data_uri) = read_icon_data_uri(path) { - return format!( - r#""#, - esc(&data_uri) - ); + return format!(r#""#, esc(&data_uri)); } } let letter = app @@ -540,7 +538,9 @@ fn login_page(app: &GatedPort, error: Option<&str>, status: StatusCode) -> Respo "#, icon = icon_markup(app), name = esc(&app.app_name), - err = error.map(|e| format!(r#"
{}
"#, esc(e))).unwrap_or_default(), + err = error + .map(|e| format!(r#"
{}
"#, esc(e))) + .unwrap_or_default(), prefix = GATE_PREFIX, ); page("Sign in", app, &body, status) @@ -560,7 +560,9 @@ fn totp_page(app: &GatedPort, error: Option<&str>, status: StatusCode) -> Respon "#, icon = icon_markup(app), name = esc(&app.app_name), - err = error.map(|e| format!(r#"
{}
"#, esc(e))).unwrap_or_default(), + err = error + .map(|e| format!(r#"
{}
"#, esc(e))) + .unwrap_or_default(), prefix = GATE_PREFIX, ); page("Two-factor", app, &body, status) @@ -623,7 +625,11 @@ mod tests { #[tokio::test] async fn error_messages_are_escaped() { - let resp = login_page(&app(), Some(""), StatusCode::UNAUTHORIZED); + let resp = login_page( + &app(), + Some(""), + StatusCode::UNAUTHORIZED, + ); let body = hyper::body::to_bytes(resp.into_body()).await.unwrap(); let html = String::from_utf8_lossy(&body); assert!(!html.contains("