diff --git a/crates/atuin-server/src/handlers/mod.rs b/crates/atuin-server/src/handlers/mod.rs index ce10f4b70d8..d4c1700defd 100644 --- a/crates/atuin-server/src/handlers/mod.rs +++ b/crates/atuin-server/src/handlers/mod.rs @@ -1,3 +1,5 @@ +use std::fmt; + use atuin_common::api::{ErrorResponse, IndexResponse}; use atuin_server_database::Database; use axum::{extract::State, http, response::IntoResponse, Json}; @@ -32,6 +34,12 @@ pub async fn index(state: State>) -> Json fmt::Display for ErrorResponseStatus<'a> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "status={}", self.status) + } +} + impl<'a> IntoResponse for ErrorResponseStatus<'a> { fn into_response(self) -> axum::response::Response { (self.status, Json(self.error)).into_response() diff --git a/crates/atuin-server/src/handlers/user.rs b/crates/atuin-server/src/handlers/user.rs index 50defc4ae85..996bc40d59a 100644 --- a/crates/atuin-server/src/handlers/user.rs +++ b/crates/atuin-server/src/handlers/user.rs @@ -1,5 +1,6 @@ use std::borrow::Borrow; use std::collections::HashMap; +use std::net::SocketAddr; use std::time::Duration; use argon2::{ @@ -7,7 +8,7 @@ use argon2::{ PasswordVerifier, Version, }; use axum::{ - extract::{Path, State}, + extract::{ConnectInfo, Path, State}, http::StatusCode, Json, }; @@ -311,8 +312,9 @@ pub async fn change_password( Ok(Json(ChangePasswordResponse {})) } -#[instrument(skip_all, fields(user.username = login.username.as_str()))] +#[instrument(skip_all, err, fields(ip = addr.ip().to_string(), user.username = login.username.as_str()))] pub async fn login( + ConnectInfo(addr): ConnectInfo, state: State>, login: Json, ) -> Result, ErrorResponseStatus<'static>> { diff --git a/crates/atuin-server/src/lib.rs b/crates/atuin-server/src/lib.rs index 4c1619bcdd0..6a22c7a4f28 100644 --- a/crates/atuin-server/src/lib.rs +++ b/crates/atuin-server/src/lib.rs @@ -70,9 +70,12 @@ pub async fn launch_with_tcp_listener( ) -> Result<()> { let r = make_router::(settings).await?; - serve(listener, r.into_make_service()) - .with_graceful_shutdown(shutdown) - .await?; + serve( + listener, + r.into_make_service_with_connect_info::(), + ) + .with_graceful_shutdown(shutdown) + .await?; Ok(()) } @@ -102,7 +105,7 @@ async fn launch_with_tls( let server = axum_server::bind_rustls(addr, rustls_config) .handle(handle.clone()) - .serve(r.into_make_service()); + .serve(r.into_make_service_with_connect_info::()); tokio::select! { _ = server => {}